Commit 960578fd authored by unknown's avatar unknown
Browse files

Merge rurik.mysql.com:/home/igor/mysql-5.0

into  rurik.mysql.com:/home/igor/dev/mysql-5.0-0


sql/sql_select.cc:
  Auto merged
mysql-test/r/view.result:
  Manual merge
mysql-test/t/view.test:
  Manual merge
parents f3de1b85 db5d1974
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -2694,3 +2694,45 @@ Age
38
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx');
INSERT INTO t1(id) VALUES (1), (2), (3), (4);
INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy');
SELECT * FROM t1;
id	a
1	xxx
2	xxx
3	xxx
4	xxx
5	yyy
6	yyy
CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a;
SELECT * FROM v1;
a	m
xxx	1
yyy	5
CREATE TABLE t2 SELECT * FROM v1;
INSERT INTO t2(m) VALUES (0);
SELECT * FROM t2;
a	m
xxx	1
yyy	5
NULL	0
DROP VIEW v1;
DROP TABLE t1,t2;
CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b');
INSERT INTO t1(id) VALUES (1), (2), (3);
INSERT INTO t1 VALUES (4,'a');
SELECT * FROM t1;
id	e
1	b
2	b
3	b
4	a
CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e;
CREATE TABLE t2 SELECT * FROM v1;
SELECT * FROM t2;
m	e
4	a
1	b
DROP VIEW v1;
DROP TABLE IF EXISTS t1,t2;
+29 −0
Original line number Diff line number Diff line
@@ -2566,4 +2566,33 @@ SELECT * FROM v1;
DROP VIEW v1;
DROP TABLE t1;

#
# Bug #19089: wrong inherited dafault values in temp table views
#

CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx');
INSERT INTO t1(id) VALUES (1), (2), (3), (4);
INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy');
SELECT * FROM t1;

CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a;
SELECT * FROM v1;

CREATE TABLE t2 SELECT * FROM v1;
INSERT INTO t2(m) VALUES (0);
SELECT * FROM t2;

DROP VIEW v1;
DROP TABLE t1,t2;

CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b');
INSERT INTO t1(id) VALUES (1), (2), (3);
INSERT INTO t1 VALUES (4,'a');
SELECT * FROM t1;

CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e;
CREATE TABLE t2 SELECT * FROM v1;
SELECT * FROM t2;

DROP VIEW v1;
DROP TABLE IF EXISTS t1,t2;
+1 −0
Original line number Diff line number Diff line
@@ -1233,6 +1233,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
  flags=null_ptr ? 0: NOT_NULL_FLAG;
  comment.str= (char*) "";
  comment.length=0;
  dflt_field= 0;
}

uint Field::offset()
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ class Field

  char		*ptr;			// Position to field in record
  uchar		*null_ptr;		// Byte where null_bit is
  Field         *dflt_field;            // Field to copy default value from
  /*
    Note that you can use table->in_use as replacement for current_thd member 
    only inside of val_*() and store() members (e.g. you can't use it in cons)
+32 −6
Original line number Diff line number Diff line
@@ -8138,6 +8138,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
                        bool make_copy_field,
                        uint convert_blob_length)
{
  Field *result;
  Item::Type orig_type= type;
  Item *orig_item= 0;

@@ -8154,7 +8155,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
  case Item::SUM_FUNC_ITEM:
  {
    Item_sum *item_sum=(Item_sum*) item;
    Field *result= item_sum->create_tmp_field(group, table, convert_blob_length);
    result= item_sum->create_tmp_field(group, table, convert_blob_length);
    if (!result)
      thd->fatal_error();
    return result;
@@ -8164,7 +8165,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
  {
    Item_field *field= (Item_field*) item;
    bool orig_modify= modify_item;
    Field *result;
    if (orig_type == Item::REF_ITEM)
      modify_item= 0;
    /*
@@ -8198,6 +8198,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
                                          convert_blob_length);
    if (orig_type == Item::REF_ITEM && orig_modify)
      ((Item_ref*)orig_item)->set_result_field(result);
    if (field->field->eq_def(result))
      result->dflt_field= field->field;
    return result;
  }
  /* Fall through */
@@ -8220,9 +8222,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
      DBUG_ASSERT(((Item_result_field*)item)->result_field);
      *from_field= ((Item_result_field*)item)->result_field;
    }
    return create_tmp_field_from_item(thd, item, table, (make_copy_field ? 0 :
                                      copy_func), modify_item,
                                      convert_blob_length);
    return create_tmp_field_from_item(thd, item, table,
                                      (make_copy_field ? 0 : copy_func),
                                       modify_item, convert_blob_length);
  case Item::TYPE_HOLDER:  
    return ((Item_type_holder *)item)->make_field_by_type(table);
  default:					// Dosen't have to be stored
@@ -8674,6 +8676,30 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
      null_count+= (field->field_length & 7);
    }
    field->reset();

    if (field->dflt_field && field->dflt_field->ptr)
    {
      /* 
        field->dflt_field is set only in the cases  when 'field' can
        inherit the default value that is defined for the field referred
        by the Item_field object from which 'field' has been created.
        For a field created not from a Item_field item dflt_field == 0.
      */
      my_ptrdiff_t diff;
      Field *orig_field= field->dflt_field;
      /* Get the value from default_values */
      diff= (my_ptrdiff_t) (orig_field->table->s->default_values-
                            orig_field->table->record[0]);
      orig_field->move_field(diff);        // Points now at default_values
      bool is_null= orig_field->is_real_null();
      char *from= orig_field->ptr;
      orig_field->move_field(-diff);       // Back to record[0]
      if (is_null)
        field->set_null();
      else
        memcpy(field->ptr, from, field->pack_length());
    } 

    if (from_field[i])
    {						/* Not a table Item */
      copy->set(field,from_field[i],save_sum_fields);