Loading mysql-test/r/insert_select.result +29 −0 Original line number Diff line number Diff line Loading @@ -744,3 +744,32 @@ f1 f2 2 2 10 10 DROP TABLE t1, t2; SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; CREATE TABLE t1 (c VARCHAR(30), INDEX ix_c (c(10))); CREATE TABLE t2 (d VARCHAR(10)); INSERT INTO t1 (c) VALUES ('7_chars'), ('13_characters'); EXPLAIN SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 2 2 SUBQUERY t1 ref ix_c ix_c 13 const 1 Using where SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') 13 13 INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='7_chars') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c IN (SELECT t1.c FROM t1)) FROM t1; SELECT * FROM t2; d 13 13 7 7 20 20 DROP TABLE t1,t2; mysql-test/t/insert_select.test +26 −1 Original line number Diff line number Diff line Loading @@ -306,4 +306,29 @@ INSERT INTO t2 (f1, f2) SELECT * FROM t2; DROP TABLE t1, t2; # # Bug #26207: inserts don't work with shortened index # SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; CREATE TABLE t1 (c VARCHAR(30), INDEX ix_c (c(10))); CREATE TABLE t2 (d VARCHAR(10)); INSERT INTO t1 (c) VALUES ('7_chars'), ('13_characters'); EXPLAIN SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='7_chars') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c IN (SELECT t1.c FROM t1)) FROM t1; SELECT * FROM t2; DROP TABLE t1,t2; sql/sql_select.h +41 −12 Original line number Diff line number Diff line Loading @@ -488,15 +488,11 @@ extern "C" int refpos_order_cmp(void* arg, const void *a,const void *b); class store_key :public Sql_alloc { protected: Field *to_field; // Store data here char *null_ptr; char err; public: bool null_key; /* TRUE <=> the value of the key has a null part */ enum store_key_result { STORE_KEY_OK, STORE_KEY_FATAL, STORE_KEY_CONV }; store_key(THD *thd, Field *field_arg, char *ptr, char *null, uint length) :null_ptr(null), err(0), null_key(0) :null_key(0), null_ptr(null), err(0) { if (field_arg->type() == FIELD_TYPE_BLOB) { Loading @@ -510,8 +506,35 @@ class store_key :public Sql_alloc ptr, (uchar*) null, 1); } virtual ~store_key() {} /* Not actually needed */ virtual enum store_key_result copy()=0; virtual const char *name() const=0; /** @brief sets ignore truncation warnings mode and calls the real copy method @details this function makes sure truncation warnings when preparing the key buffers don't end up as errors (because of an enclosing INSERT/UPDATE). */ enum store_key_result copy() { enum store_key_result result; enum_check_fields saved_count_cuted_fields= to_field->table->in_use->count_cuted_fields; to_field->table->in_use->count_cuted_fields= CHECK_FIELD_IGNORE; result= copy_inner(); to_field->table->in_use->count_cuted_fields= saved_count_cuted_fields; return result; } protected: Field *to_field; // Store data here char *null_ptr; char err; virtual enum store_key_result copy_inner()=0; }; Loading @@ -531,13 +554,15 @@ class store_key_field: public store_key copy_field.set(to_field,from_field,0); } } enum store_key_result copy() const char *name() const { return field_name; } protected: enum store_key_result copy_inner() { copy_field.do_copy(©_field); null_key= to_field->is_null(); return err != 0 ? STORE_KEY_FATAL : STORE_KEY_OK; } const char *name() const { return field_name; } }; Loading @@ -552,13 +577,15 @@ class store_key_item :public store_key null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ? &err : NullS, length), item(item_arg) {} enum store_key_result copy() const char *name() const { return "func"; } protected: enum store_key_result copy_inner() { int res= item->save_in_field(to_field, 1); null_key= to_field->is_null() || item->null_value; return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res); } const char *name() const { return "func"; } }; Loading @@ -574,7 +601,10 @@ class store_key_const_item :public store_key_item &err : NullS, length, item_arg), inited(0) { } enum store_key_result copy() const char *name() const { return "const"; } protected: enum store_key_result copy_inner() { int res; if (!inited) Loading @@ -589,7 +619,6 @@ class store_key_const_item :public store_key_item null_key= to_field->is_null() || item->null_value; return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err); } const char *name() const { return "const"; } }; bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); Loading Loading
mysql-test/r/insert_select.result +29 −0 Original line number Diff line number Diff line Loading @@ -744,3 +744,32 @@ f1 f2 2 2 10 10 DROP TABLE t1, t2; SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; CREATE TABLE t1 (c VARCHAR(30), INDEX ix_c (c(10))); CREATE TABLE t2 (d VARCHAR(10)); INSERT INTO t1 (c) VALUES ('7_chars'), ('13_characters'); EXPLAIN SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 2 2 SUBQUERY t1 ref ix_c ix_c 13 const 1 Using where SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') 13 13 INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='7_chars') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c IN (SELECT t1.c FROM t1)) FROM t1; SELECT * FROM t2; d 13 13 7 7 20 20 DROP TABLE t1,t2;
mysql-test/t/insert_select.test +26 −1 Original line number Diff line number Diff line Loading @@ -306,4 +306,29 @@ INSERT INTO t2 (f1, f2) SELECT * FROM t2; DROP TABLE t1, t2; # # Bug #26207: inserts don't work with shortened index # SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; CREATE TABLE t1 (c VARCHAR(30), INDEX ix_c (c(10))); CREATE TABLE t2 (d VARCHAR(10)); INSERT INTO t1 (c) VALUES ('7_chars'), ('13_characters'); EXPLAIN SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='13_characters') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c='7_chars') FROM t1; INSERT INTO t2 (d) SELECT (SELECT SUM(LENGTH(c)) FROM t1 WHERE c IN (SELECT t1.c FROM t1)) FROM t1; SELECT * FROM t2; DROP TABLE t1,t2;
sql/sql_select.h +41 −12 Original line number Diff line number Diff line Loading @@ -488,15 +488,11 @@ extern "C" int refpos_order_cmp(void* arg, const void *a,const void *b); class store_key :public Sql_alloc { protected: Field *to_field; // Store data here char *null_ptr; char err; public: bool null_key; /* TRUE <=> the value of the key has a null part */ enum store_key_result { STORE_KEY_OK, STORE_KEY_FATAL, STORE_KEY_CONV }; store_key(THD *thd, Field *field_arg, char *ptr, char *null, uint length) :null_ptr(null), err(0), null_key(0) :null_key(0), null_ptr(null), err(0) { if (field_arg->type() == FIELD_TYPE_BLOB) { Loading @@ -510,8 +506,35 @@ class store_key :public Sql_alloc ptr, (uchar*) null, 1); } virtual ~store_key() {} /* Not actually needed */ virtual enum store_key_result copy()=0; virtual const char *name() const=0; /** @brief sets ignore truncation warnings mode and calls the real copy method @details this function makes sure truncation warnings when preparing the key buffers don't end up as errors (because of an enclosing INSERT/UPDATE). */ enum store_key_result copy() { enum store_key_result result; enum_check_fields saved_count_cuted_fields= to_field->table->in_use->count_cuted_fields; to_field->table->in_use->count_cuted_fields= CHECK_FIELD_IGNORE; result= copy_inner(); to_field->table->in_use->count_cuted_fields= saved_count_cuted_fields; return result; } protected: Field *to_field; // Store data here char *null_ptr; char err; virtual enum store_key_result copy_inner()=0; }; Loading @@ -531,13 +554,15 @@ class store_key_field: public store_key copy_field.set(to_field,from_field,0); } } enum store_key_result copy() const char *name() const { return field_name; } protected: enum store_key_result copy_inner() { copy_field.do_copy(©_field); null_key= to_field->is_null(); return err != 0 ? STORE_KEY_FATAL : STORE_KEY_OK; } const char *name() const { return field_name; } }; Loading @@ -552,13 +577,15 @@ class store_key_item :public store_key null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ? &err : NullS, length), item(item_arg) {} enum store_key_result copy() const char *name() const { return "func"; } protected: enum store_key_result copy_inner() { int res= item->save_in_field(to_field, 1); null_key= to_field->is_null() || item->null_value; return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res); } const char *name() const { return "func"; } }; Loading @@ -574,7 +601,10 @@ class store_key_const_item :public store_key_item &err : NullS, length, item_arg), inited(0) { } enum store_key_result copy() const char *name() const { return "const"; } protected: enum store_key_result copy_inner() { int res; if (!inited) Loading @@ -589,7 +619,6 @@ class store_key_const_item :public store_key_item null_key= to_field->is_null() || item->null_value; return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err); } const char *name() const { return "const"; } }; bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); Loading