diff options
author | unknown <serg@serg.mylan> | 2003-06-30 22:24:03 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2003-06-30 22:24:03 +0200 |
commit | e359c56808f66b248eb0453cfa3e5395de47d2f2 (patch) | |
tree | b51cfc06193e28686d3e21a5f51e936a10a3c6c4 | |
parent | 9e6471caf850a9c565cfde0a1545cb14ebd19bf8 (diff) | |
download | mariadb-git-e359c56808f66b248eb0453cfa3e5395de47d2f2.tar.gz |
new syntax:
CREATE TABLE ...(SELECT ...) UNION ...
INSERT ... (SELECT ...) UNION ...
-rw-r--r-- | sql/sql_yacc.yy | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 0ff09a52a9e..cf580b3f3df 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -803,18 +803,35 @@ create: }; create2: - '(' field_list ')' opt_create_table_options create3 {} + '(' create2a {} | opt_create_table_options create3 {}; +create2a: + field_list ')' opt_create_table_options create3 {} + | create_select ')' { Select->braces= 1;} union_opt {} + ; + create3: /* empty */ {} - | opt_duplicate opt_as SELECT_SYM + | opt_duplicate opt_as create_select + { Select->braces= 0;} opt_union {} + | opt_duplicate opt_as '(' create_select ')' + { Select->braces= 1;} union_opt {} + ; + +create_select: + SELECT_SYM { LEX *lex=Lex; lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; + switch(lex->sql_command) { + case SQLCOM_INSERT: lex->sql_command=SQLCOM_INSERT_SELECT; break; + case SQLCOM_REPLACE: lex->sql_command=SQLCOM_REPLACE_SELECT; break; + } mysql_init_select(lex); } - select_options select_item_list opt_select_from opt_union {}; + select_options select_item_list opt_select_from + ; opt_as: /* empty */ {} @@ -1490,7 +1507,7 @@ select: select_init: SELECT_SYM select_part2 { Select->braces= 0; } opt_union | - '(' SELECT_SYM select_part2 ')' { Select->braces= 1;} union_opt; + '(' SELECT_SYM select_part2 ')' { Select->braces= 1;} union_opt; select_part2: @@ -2565,7 +2582,7 @@ opt_temporary: insert: INSERT { Lex->sql_command = SQLCOM_INSERT; } insert_lock_option - opt_ignore insert2 + opt_ignore insert2 { set_lock_for_tables($3); } @@ -2576,7 +2593,7 @@ insert: replace: REPLACE { - LEX *lex=Lex; + LEX *lex=Lex; lex->sql_command = SQLCOM_REPLACE; lex->duplicates= DUP_REPLACE; } @@ -2593,7 +2610,7 @@ insert_lock_option: | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } | DELAYED_SYM { $$= TL_WRITE_DELAYED; } | HIGH_PRIORITY { $$= TL_WRITE; } - ; + ; replace_lock_option: opt_low_priority { $$= $1; } @@ -2613,7 +2630,9 @@ insert_table: }; insert_field_spec: - opt_field_spec insert_values {} + insert_values {} + | '(' ')' insert_values {} + | '(' fields ')' insert_values {} | SET { LEX *lex=Lex; @@ -2634,16 +2653,9 @@ fields: insert_values: VALUES values_list {} - | SELECT_SYM - { - LEX *lex=Lex; - lex->sql_command = (lex->sql_command == SQLCOM_INSERT ? - SQLCOM_INSERT_SELECT : SQLCOM_REPLACE_SELECT); - lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; - mysql_init_select(lex); - } - select_options select_item_list select_from select_lock_type - opt_union {}; + | create_select { Select->braces= 0;} opt_union {} + | '(' create_select ')' { Select->braces= 1;} union_opt {} + ; values_list: values_list ',' no_braces |