Hi, Igor!

OK to push, but as you figured it out ORACLE-compatible mode parser also have to be changed.

On Mon, Aug 20, 2018 at 8:02 PM IgorBabaev <igor@mariadb.com> wrote:
revision-id: 066a826bbebd6b058a070dfeda2b43a3ed9292f8 (mariadb-10.3.7-139-g066a826)
parent(s): dbc7c3562d523e194734c206c0f0e1cb78164cf0
author: Igor Babaev
committer: Igor Babaev
timestamp: 2018-08-20 11:02:01 -0700
message:

MDEV-16930 Crash when VALUES in derived table contains expressions

This patch always provides columns of the temporary table used for
materialization of a table value constructor with some names.
Before this patch these names were always borrowed from the items
of the first row of the table value constructor. When this row
contained expressions and expressions were not named then it could cause
different kinds of problems. In particular if the TVC is used as the
specification of a derived table this could cause a crash.
The names given to the expressions used in a TVC are the same as those
given to the columns of the result set from the corresponding SELECT.

---
 mysql-test/main/table_value_constr.result | 35 ++++++++++++++++++++++++++
 mysql-test/main/table_value_constr.test   | 21 ++++++++++++++++
 sql/sql_yacc.yy                           | 42 ++++++++++++++++++++++++++++++-
 3 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/mysql-test/main/table_value_constr.result b/mysql-test/main/table_value_constr.result
index b0b0fa8..1d485af 100644
--- a/mysql-test/main/table_value_constr.result
+++ b/mysql-test/main/table_value_constr.result
@@ -2154,3 +2154,38 @@ id       select_type     table   type    possible_keys   key     key_len ref     rows    Extra
 3      UNION   t1      ALL     NULL    NULL    NULL    NULL    3       
 NULL   UNION RESULT    <union2,3>      ALL     NULL    NULL    NULL    NULL    NULL   
 drop table t1;
+#
+# MDEV-16930: expression in the first row of TVC specifying derived table
+#
+SELECT 1 + 1, 2, "abc";
+1 + 1  2       abc
+2      2       abc
+SELECT * FROM (SELECT 1 + 1, 2, "abc") t;
+1 + 1  2       abc
+2      2       abc
+WITH cte AS (SELECT 1 + 1, 2, "abc") SELECT * FROM cte;
+1 + 1  2       abc
+2      2       abc
+SELECT 1 + 1, 2, "abc" UNION SELECT 3+4, 3, "abc";
+1 + 1  2       abc
+2      2       abc
+7      3       abc
+CREATE VIEW v1 AS SELECT 1 + 1, 2, "abc";
+SELECT * FROM v1;
+1 + 1  2       abc
+2      2       abc
+DROP VIEW v1;
+VALUES(1 + 1,2,"abc");
+1 + 1  2       abc
+2      2       abc
+SELECT * FROM (VALUES(1 + 1,2,"abc")) t;
+1 + 1  2       abc
+2      2       abc
+PREPARE stmt FROM "SELECT * FROM (VALUES(1 + 1,2,'abc')) t";
+EXECUTE stmt;
+1 + 1  2       abc
+2      2       abc
+EXECUTE stmt;
+1 + 1  2       abc
+2      2       abc
+DEALLOCATE PREPARE stmt;
diff --git a/mysql-test/main/table_value_constr.test b/mysql-test/main/table_value_constr.test
index eb30f00..5df40d10 100644
--- a/mysql-test/main/table_value_constr.test
+++ b/mysql-test/main/table_value_constr.test
@@ -1104,3 +1104,24 @@ eval $q4;
 eval explain $q4;

 drop table t1;
+
+--echo #
+--echo # MDEV-16930: expression in the first row of TVC specifying derived table
+--echo #
+
+SELECT 1 + 1, 2, "abc";
+SELECT * FROM (SELECT 1 + 1, 2, "abc") t;
+WITH cte AS (SELECT 1 + 1, 2, "abc") SELECT * FROM cte;
+SELECT 1 + 1, 2, "abc" UNION SELECT 3+4, 3, "abc";
+CREATE VIEW v1 AS SELECT 1 + 1, 2, "abc";
+SELECT * FROM v1;
+DROP VIEW v1;
+
+VALUES(1 + 1,2,"abc");
+SELECT * FROM (VALUES(1 + 1,2,"abc")) t;
+PREPARE stmt FROM "SELECT * FROM (VALUES(1 + 1,2,'abc')) t";
+EXECUTE stmt;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index f915895..1ec7317 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2044,6 +2044,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
         preload_list preload_list_or_parts preload_keys preload_keys_parts
         select_item_list select_item values_list no_braces
         opt_limit_clause delete_limit_clause fields opt_values values
+        no_braces_with_names opt_values_with_names values_with_names
         procedure_list procedure_list2 procedure_item
         field_def handler opt_generated_always
         opt_ignore opt_column opt_restrict
@@ -13247,7 +13248,7 @@ insert_values:

 values_list:
           values_list ','  no_braces
-        | no_braces
+        | no_braces_with_names
         ;

 ident_eq_list:
@@ -13300,11 +13301,31 @@ no_braces:
           }
         ;

+no_braces_with_names:
+          '('
+          {
+            if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item)))
+              MYSQL_YYABORT;
+          }
+          opt_values_with_names ')'
+          {
+            LEX *lex=Lex;
+            if (unlikely(lex->many_values.push_back(lex->insert_list,
+                                                    thd->mem_root)))
+              MYSQL_YYABORT;
+          }
+        ;
+
 opt_values:
           /* empty */ {}
         | values
         ;

+opt_values_with_names:
+          /* empty */ {}
+        | values_with_names
+        ;
+
 values:
           values ','  expr_or_default
           {
@@ -13318,6 +13339,25 @@ values:
           }
         ;

+values_with_names:
+          values_with_names ','  remember_name expr_or_default remember_end
+          {
+            if (unlikely(Lex->insert_list->push_back($4, thd->mem_root)))
+               MYSQL_YYABORT;
+            // give some name in case of using in table value constuctor (TVC)
+            if (!$4->name.str)
+              $4->set_name(thd, $3, (uint) ($5 - $3), thd->charset());
+           }
+        | remember_name expr_or_default remember_end
+          {
+            if (unlikely(Lex->insert_list->push_back($2, thd->mem_root)))
+               MYSQL_YYABORT;
+            // give some name in case of using in table value constuctor (TVC)
+            if (!$2->name.str)
+              $2->set_name(thd, $1, (uint) ($3 - $1), thd->charset());
+          }
+        ;
+
 expr_or_default:
           expr { $$= $1;}
         | DEFAULT
_______________________________________________
commits mailing list
commits@mariadb.org
https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits