Pass parser state ptr to each parser executor callback.
This commit is contained in:
368
sql.y
368
sql.y
@ -369,29 +369,29 @@ stmt_list: error ';'
|
||||
|
||||
/* statements: select statement */
|
||||
|
||||
stmt: select_stmt { sqlp_stmt(); }
|
||||
stmt: select_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
select_stmt: SELECT select_opts select_expr_list
|
||||
{ sqlp_select_nodata($2, $3); } ;
|
||||
{ sqlp_select_nodata(pstate, $2, $3); } ;
|
||||
| SELECT select_opts select_expr_list
|
||||
FROM table_references
|
||||
opt_where opt_groupby opt_having opt_orderby opt_limit
|
||||
opt_into_list { sqlp_select($2, $3, $5); } ;
|
||||
opt_into_list { sqlp_select(pstate, $2, $3, $5); } ;
|
||||
;
|
||||
|
||||
opt_where: /* nil */
|
||||
| WHERE expr { sqlp_where(); };
|
||||
| WHERE expr { sqlp_where(pstate); };
|
||||
|
||||
opt_groupby: /* nil */
|
||||
| GROUP BY groupby_list opt_with_rollup
|
||||
{ sqlp_group_by_list($3, $4); }
|
||||
{ sqlp_group_by_list(pstate, $3, $4); }
|
||||
;
|
||||
|
||||
groupby_list: expr opt_asc_desc
|
||||
{ sqlp_group_by($2); $$ = 1; }
|
||||
{ sqlp_group_by(pstate, $2); $$ = 1; }
|
||||
| groupby_list ',' expr opt_asc_desc
|
||||
{ sqlp_group_by($4); $$ = $1 + 1; }
|
||||
{ sqlp_group_by(pstate, $4); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
opt_asc_desc: /* nil */ { $$ = 0; }
|
||||
@ -403,25 +403,25 @@ opt_with_rollup: /* nil */ { $$ = 0; }
|
||||
| WITH ROLLUP { $$ = 1; }
|
||||
;
|
||||
|
||||
opt_having: /* nil */ | HAVING expr { sqlp_having(); };
|
||||
opt_having: /* nil */ | HAVING expr { sqlp_having(pstate); };
|
||||
|
||||
opt_orderby: /* nil */ | ORDER BY groupby_list { sqlp_order_by($3); }
|
||||
opt_orderby: /* nil */ | ORDER BY groupby_list { sqlp_order_by(pstate, $3); }
|
||||
;
|
||||
|
||||
opt_limit: /* nil */ | LIMIT expr { sqlp_limit(0); }
|
||||
| LIMIT expr ',' expr { sqlp_limit(1); }
|
||||
opt_limit: /* nil */ | LIMIT expr { sqlp_limit(pstate, 0); }
|
||||
| LIMIT expr ',' expr { sqlp_limit(pstate, 1); }
|
||||
;
|
||||
|
||||
opt_into_list: /* nil */
|
||||
| INTO column_list { sqlp_into($2); }
|
||||
| INTO column_list { sqlp_into(pstate, $2); }
|
||||
;
|
||||
|
||||
column_list: NAME { sqlp_column($1); free($1); $$ = 1; }
|
||||
column_list: NAME { sqlp_column(pstate, $1); free($1); $$ = 1; }
|
||||
| STRING { lyyerror(@1, "string %s found where name required", $1);
|
||||
sqlp_column($1); free($1); $$ = 1; }
|
||||
| column_list ',' NAME { sqlp_column($3); free($3); $$ = $1 + 1; }
|
||||
sqlp_column(pstate, $1); free($1); $$ = 1; }
|
||||
| column_list ',' NAME { sqlp_column(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
| column_list ',' STRING { lyyerror(@3, "string %s found where name required", $1);
|
||||
sqlp_column($3); free($3); $$ = $1 + 1; }
|
||||
sqlp_column(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
select_opts: { $$ = 0; }
|
||||
@ -437,7 +437,7 @@ select_opts: { $$ = 0; }
|
||||
|
||||
select_expr_list: select_expr { $$ = 1; }
|
||||
| select_expr_list ',' select_expr {$$ = $1 + 1; }
|
||||
| '*' { sqlp_select_all(); $$ = 1; }
|
||||
| '*' { sqlp_select_all(pstate); $$ = 1; }
|
||||
;
|
||||
|
||||
select_expr: expr opt_as_alias ;
|
||||
@ -451,33 +451,33 @@ table_reference: table_factor
|
||||
;
|
||||
|
||||
table_factor:
|
||||
NAME opt_as_alias index_hint { sqlp_table(NULL, $1); free($1); }
|
||||
| NAME '.' NAME opt_as_alias index_hint { sqlp_table($1, $3);
|
||||
NAME opt_as_alias index_hint { sqlp_table(pstate, NULL, $1); free($1); }
|
||||
| NAME '.' NAME opt_as_alias index_hint { sqlp_table(pstate, $1, $3);
|
||||
free($1); free($3); }
|
||||
| table_subquery opt_as NAME { sqlp_subquery_as($3); free($3); }
|
||||
| '(' table_references ')' { sqlp_table_refs($2); }
|
||||
| table_subquery opt_as NAME { sqlp_subquery_as(pstate, $3); free($3); }
|
||||
| '(' table_references ')' { sqlp_table_refs(pstate, $2); }
|
||||
;
|
||||
|
||||
opt_as: AS
|
||||
| /* nil */
|
||||
;
|
||||
|
||||
opt_as_alias: AS NAME { sqlp_alias($2); free($2); }
|
||||
| NAME { sqlp_alias($1); free($1); }
|
||||
opt_as_alias: AS NAME { sqlp_alias(pstate, $2); free($2); }
|
||||
| NAME { sqlp_alias(pstate, $1); free($1); }
|
||||
| /* nil */
|
||||
;
|
||||
|
||||
join_table:
|
||||
table_reference opt_inner_cross JOIN table_factor opt_join_condition
|
||||
{ sqlp_join(0100+$2); }
|
||||
{ sqlp_join(pstate, 0100+$2); }
|
||||
| table_reference STRAIGHT_JOIN table_factor
|
||||
{ sqlp_join(0200); }
|
||||
{ sqlp_join(pstate, 0200); }
|
||||
| table_reference STRAIGHT_JOIN table_factor ON expr
|
||||
{ sqlp_join(0200); }
|
||||
{ sqlp_join(pstate, 0200); }
|
||||
| table_reference left_or_right opt_outer JOIN table_factor join_condition
|
||||
{ sqlp_join(0300+$2+$3); }
|
||||
{ sqlp_join(pstate, 0300+$2+$3); }
|
||||
| table_reference NATURAL opt_left_or_right_outer JOIN table_factor
|
||||
{ sqlp_join(0400+$3); }
|
||||
{ sqlp_join(pstate, 0400+$3); }
|
||||
;
|
||||
|
||||
opt_inner_cross: /* nil */ { $$ = 0; }
|
||||
@ -501,17 +501,17 @@ opt_left_or_right_outer: LEFT opt_outer { $$ = 1 + $2; }
|
||||
opt_join_condition: join_condition | /* nil */ ;
|
||||
|
||||
join_condition:
|
||||
ON expr { sqlp_join_expr(); }
|
||||
| USING '(' column_list ')' { sqlp_join_using($3); }
|
||||
ON expr { sqlp_join_expr(pstate); }
|
||||
| USING '(' column_list ')' { sqlp_join_using(pstate, $3); }
|
||||
;
|
||||
|
||||
index_hint:
|
||||
USE KEY opt_for_join '(' index_list ')'
|
||||
{ sqlp_index_hint($5, 010+$3); }
|
||||
{ sqlp_index_hint(pstate, $5, 010+$3); }
|
||||
| IGNORE KEY opt_for_join '(' index_list ')'
|
||||
{ sqlp_index_hint($5, 020+$3); }
|
||||
{ sqlp_index_hint(pstate, $5, 020+$3); }
|
||||
| FORCE KEY opt_for_join '(' index_list ')'
|
||||
{ sqlp_index_hint($5, 030+$3); }
|
||||
{ sqlp_index_hint(pstate, $5, 030+$3); }
|
||||
| /* nil */
|
||||
;
|
||||
|
||||
@ -519,21 +519,21 @@ opt_for_join: FOR JOIN { $$ = 1; }
|
||||
| /* nil */ { $$ = 0; }
|
||||
;
|
||||
|
||||
index_list: NAME { sqlp_index($1); free($1); $$ = 1; }
|
||||
| index_list ',' NAME { sqlp_index($3); free($3); $$ = $1 + 1; }
|
||||
index_list: NAME { sqlp_index(pstate, $1); free($1); $$ = 1; }
|
||||
| index_list ',' NAME { sqlp_index(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
table_subquery: '(' select_stmt ')' { sqlp_subquery(); }
|
||||
table_subquery: '(' select_stmt ')' { sqlp_subquery(pstate); }
|
||||
;
|
||||
|
||||
/* statements: delete statement */
|
||||
|
||||
stmt: delete_stmt { sqlp_stmt(); }
|
||||
stmt: delete_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
delete_stmt: DELETE delete_opts FROM NAME
|
||||
opt_where opt_orderby opt_limit
|
||||
{ sqlp_delete($2, $4); free($4); }
|
||||
{ sqlp_delete(pstate, $2, $4); free($4); }
|
||||
;
|
||||
|
||||
delete_opts: delete_opts LOW_PRIORITY { $$ = $1 + 01; }
|
||||
@ -545,11 +545,11 @@ delete_opts: delete_opts LOW_PRIORITY { $$ = $1 + 01; }
|
||||
delete_stmt: DELETE delete_opts
|
||||
delete_list
|
||||
FROM table_references opt_where
|
||||
{ sqlp_delete_multi($2, $3, $5); }
|
||||
{ sqlp_delete_multi(pstate, $2, $3, $5); }
|
||||
|
||||
delete_list: NAME opt_dot_star { sqlp_table(NULL, $1); free($1); $$ = 1; }
|
||||
delete_list: NAME opt_dot_star { sqlp_table(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| delete_list ',' NAME opt_dot_star
|
||||
{ sqlp_table(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
{ sqlp_table(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
opt_dot_star: /* nil */ | '.' '*' ;
|
||||
@ -557,22 +557,22 @@ opt_dot_star: /* nil */ | '.' '*' ;
|
||||
delete_stmt: DELETE delete_opts
|
||||
FROM delete_list
|
||||
USING table_references opt_where
|
||||
{ sqlp_delete_multi($2, $4, $6); }
|
||||
{ sqlp_delete_multi(pstate, $2, $4, $6); }
|
||||
;
|
||||
|
||||
/* statements: insert statement */
|
||||
|
||||
stmt: insert_stmt { sqlp_stmt(); }
|
||||
stmt: insert_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
insert_stmt: INSERT insert_opts opt_into NAME
|
||||
opt_col_names
|
||||
VALUES insert_vals_list
|
||||
opt_ondupupdate { sqlp_insert($2, $7, $4); free($4); }
|
||||
opt_ondupupdate { sqlp_insert(pstate, $2, $7, $4); free($4); }
|
||||
;
|
||||
|
||||
opt_ondupupdate: /* nil */
|
||||
| ONDUPLICATE KEY UPDATE insert_asgn_list { sqlp_ins_dup_update($4); }
|
||||
| ONDUPLICATE KEY UPDATE insert_asgn_list { sqlp_ins_dup_update(pstate, $4); }
|
||||
;
|
||||
|
||||
insert_opts: /* nil */ { $$ = 0; }
|
||||
@ -586,75 +586,75 @@ opt_into: INTO | /* nil */
|
||||
;
|
||||
|
||||
opt_col_names: /* nil */
|
||||
| '(' column_list ')' { sqlp_ins_cols($2); }
|
||||
| '(' column_list ')' { sqlp_ins_cols(pstate, $2); }
|
||||
;
|
||||
|
||||
insert_vals_list: '(' insert_vals ')' { sqlp_values($2); $$ = 1; }
|
||||
| insert_vals_list ',' '(' insert_vals ')' { sqlp_values($4); $$ = $1 + 1; }
|
||||
insert_vals_list: '(' insert_vals ')' { sqlp_values(pstate, $2); $$ = 1; }
|
||||
| insert_vals_list ',' '(' insert_vals ')' { sqlp_values(pstate, $4); $$ = $1 + 1; }
|
||||
|
||||
insert_vals:
|
||||
expr { $$ = 1; }
|
||||
| DEFAULT { sqlp_ins_default(); $$ = 1; }
|
||||
| DEFAULT { sqlp_ins_default(pstate); $$ = 1; }
|
||||
| insert_vals ',' expr { $$ = $1 + 1; }
|
||||
| insert_vals ',' DEFAULT { sqlp_ins_default(); $$ = $1 + 1; }
|
||||
| insert_vals ',' DEFAULT { sqlp_ins_default(pstate); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
insert_stmt: INSERT insert_opts opt_into NAME
|
||||
SET insert_asgn_list
|
||||
opt_ondupupdate
|
||||
{ sqlp_insert_assn($2, $6, $4); free($4); }
|
||||
{ sqlp_insert_assn(pstate, $2, $6, $4); free($4); }
|
||||
;
|
||||
|
||||
insert_stmt: INSERT insert_opts opt_into NAME opt_col_names
|
||||
select_stmt
|
||||
opt_ondupupdate { sqlp_insert_sel($2, $4); free($4); }
|
||||
opt_ondupupdate { sqlp_insert_sel(pstate, $2, $4); free($4); }
|
||||
;
|
||||
|
||||
insert_asgn_list:
|
||||
NAME COMPARISON expr
|
||||
{ if ($2 != 4) { lyyerror(@2,"bad insert assignment to %s", $1); YYERROR; }
|
||||
sqlp_assign(NULL, $1); free($1); $$ = 1; }
|
||||
sqlp_assign(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| NAME COMPARISON DEFAULT
|
||||
{ if ($2 != 4) { lyyerror(@2,"bad insert assignment to %s", $1); YYERROR; }
|
||||
sqlp_ins_default(); sqlp_assign(NULL, $1); free($1); $$ = 1; }
|
||||
sqlp_ins_default(pstate); sqlp_assign(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| insert_asgn_list ',' NAME COMPARISON expr
|
||||
{ if ($4 != 4) { lyyerror(@4,"bad insert assignment to %s", $1); YYERROR; }
|
||||
sqlp_assign(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_assign(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
| insert_asgn_list ',' NAME COMPARISON DEFAULT
|
||||
{ if ($4 != 4) { lyyerror(@4,"bad insert assignment to %s", $1); YYERROR; }
|
||||
sqlp_ins_default(); sqlp_assign(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_ins_default(pstate); sqlp_assign(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
/** replace just like insert **/
|
||||
stmt: replace_stmt { sqlp_stmt(); }
|
||||
stmt: replace_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
replace_stmt: REPLACE insert_opts opt_into NAME
|
||||
opt_col_names
|
||||
VALUES insert_vals_list
|
||||
opt_ondupupdate { sqlp_replace_vals($2, $7, $4); free($4); }
|
||||
opt_ondupupdate { sqlp_replace_vals(pstate, $2, $7, $4); free($4); }
|
||||
;
|
||||
|
||||
replace_stmt: REPLACE insert_opts opt_into NAME
|
||||
SET insert_asgn_list
|
||||
opt_ondupupdate
|
||||
{ sqlp_replace_assn($2, $6, $4); free($4); }
|
||||
{ sqlp_replace_assn(pstate, $2, $6, $4); free($4); }
|
||||
;
|
||||
|
||||
replace_stmt: REPLACE insert_opts opt_into NAME opt_col_names
|
||||
select_stmt
|
||||
opt_ondupupdate { sqlp_replace_sel($2, $4); free($4); }
|
||||
opt_ondupupdate { sqlp_replace_sel(pstate, $2, $4); free($4); }
|
||||
;
|
||||
|
||||
/** update **/
|
||||
stmt: update_stmt { sqlp_stmt(); }
|
||||
stmt: update_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
update_stmt: UPDATE update_opts table_references
|
||||
SET update_asgn_list
|
||||
opt_where
|
||||
opt_orderby
|
||||
opt_limit { sqlp_update($2, $3, $5); }
|
||||
opt_limit { sqlp_update(pstate, $2, $3, $5); }
|
||||
;
|
||||
|
||||
update_opts: /* nil */ { $$ = 0; }
|
||||
@ -665,27 +665,27 @@ update_opts: /* nil */ { $$ = 0; }
|
||||
update_asgn_list:
|
||||
NAME COMPARISON expr
|
||||
{ if ($2 != 4) { lyyerror(@2,"bad update assignment to %s", $1); YYERROR; }
|
||||
sqlp_assign(NULL, $1); free($1); $$ = 1; }
|
||||
sqlp_assign(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| NAME '.' NAME COMPARISON expr
|
||||
{ if ($4 != 4) { lyyerror(@4,"bad update assignment to %s", $1); YYERROR; }
|
||||
sqlp_assign($1, $3); free($1); free($3); $$ = 1; }
|
||||
sqlp_assign(pstate, $1, $3); free($1); free($3); $$ = 1; }
|
||||
| update_asgn_list ',' NAME COMPARISON expr
|
||||
{ if ($4 != 4) { lyyerror(@4,"bad update assignment to %s", $3); YYERROR; }
|
||||
sqlp_assign(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_assign(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
| update_asgn_list ',' NAME '.' NAME COMPARISON expr
|
||||
{ if ($6 != 4) { lyyerror(@6,"bad update assignment to %s.$s", $3, $5); YYERROR; }
|
||||
sqlp_assign($3, $5); free($3); free($5); $$ = 1; }
|
||||
sqlp_assign(pstate, $3, $5); free($3); free($5); $$ = 1; }
|
||||
;
|
||||
|
||||
|
||||
/** create database **/
|
||||
|
||||
stmt: create_database_stmt { sqlp_stmt(); }
|
||||
stmt: create_database_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
create_database_stmt:
|
||||
CREATE DATABASE opt_if_not_exists NAME { sqlp_create_db($3, $4); free($4); }
|
||||
| CREATE SCHEMA opt_if_not_exists NAME { sqlp_create_db($3, $4); free($4); }
|
||||
CREATE DATABASE opt_if_not_exists NAME { sqlp_create_db(pstate, $3, $4); free($4); }
|
||||
| CREATE SCHEMA opt_if_not_exists NAME { sqlp_create_db(pstate, $3, $4); free($4); }
|
||||
;
|
||||
|
||||
opt_if_not_exists: /* nil */ { $$ = 0; }
|
||||
@ -695,12 +695,12 @@ opt_if_not_exists: /* nil */ { $$ = 0; }
|
||||
|
||||
/** drop database **/
|
||||
|
||||
stmt: drop_database_stmt { sqlp_stmt(); }
|
||||
stmt: drop_database_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
drop_database_stmt:
|
||||
DROP DATABASE opt_if_exists NAME { sqlp_drop_db($3, $4); free($4); }
|
||||
| DROP SCHEMA opt_if_exists NAME { sqlp_drop_db($3, $4); free($4); }
|
||||
DROP DATABASE opt_if_exists NAME { sqlp_drop_db(pstate, $3, $4); free($4); }
|
||||
| DROP SCHEMA opt_if_exists NAME { sqlp_drop_db(pstate, $3, $4); free($4); }
|
||||
;
|
||||
|
||||
opt_if_exists: /* nil */ { $$ = 0; }
|
||||
@ -709,35 +709,35 @@ opt_if_exists: /* nil */ { $$ = 0; }
|
||||
|
||||
|
||||
/** create table **/
|
||||
stmt: create_table_stmt { sqlp_stmt(); }
|
||||
stmt: create_table_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME
|
||||
'(' create_col_list ')' { sqlp_create_tbl($2, $4, $7, NULL, $5); free($5); }
|
||||
'(' create_col_list ')' { sqlp_create_tbl(pstate, $2, $4, $7, NULL, $5); free($5); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME '.' NAME
|
||||
'(' create_col_list ')' { sqlp_create_tbl($2, $4, $9, $5, $7);
|
||||
'(' create_col_list ')' { sqlp_create_tbl(pstate, $2, $4, $9, $5, $7);
|
||||
free($5); free($7); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME
|
||||
'(' create_col_list ')'
|
||||
create_select_statement { sqlp_create_tbl_sel($2, $4, $7, NULL, $5); free($5); }
|
||||
create_select_statement { sqlp_create_tbl_sel(pstate, $2, $4, $7, NULL, $5); free($5); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME
|
||||
create_select_statement { sqlp_create_tbl_sel($2, $4, 0, NULL, $5); free($5); }
|
||||
create_select_statement { sqlp_create_tbl_sel(pstate, $2, $4, 0, NULL, $5); free($5); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME '.' NAME
|
||||
'(' create_col_list ')'
|
||||
create_select_statement { sqlp_create_tbl_sel($2, $4, 0, $5, $7);
|
||||
create_select_statement { sqlp_create_tbl_sel(pstate, $2, $4, 0, $5, $7);
|
||||
free($5); free($7); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME '.' NAME
|
||||
create_select_statement { sqlp_create_tbl_sel($2, $4, 0, $5, $7);
|
||||
create_select_statement { sqlp_create_tbl_sel(pstate, $2, $4, 0, $5, $7);
|
||||
free($5); free($7); }
|
||||
;
|
||||
|
||||
@ -745,29 +745,29 @@ create_col_list: create_definition { $$ = 1; }
|
||||
| create_col_list ',' create_definition { $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
create_definition: { sqlp_start_col(); } NAME data_type column_atts
|
||||
{ sqlp_def_col($3, $2); free($2); }
|
||||
create_definition: { sqlp_start_col(pstate); } NAME data_type column_atts
|
||||
{ sqlp_def_col(pstate, $3, $2); free($2); }
|
||||
|
||||
| PRIMARY KEY '(' column_list ')' { sqlp_col_key_pri($4); }
|
||||
| KEY '(' column_list ')' { sqlp_col_key($3); }
|
||||
| INDEX '(' column_list ')' { sqlp_col_key($3); }
|
||||
| FULLTEXT INDEX '(' column_list ')' { sqlp_col_key_textidx($4); }
|
||||
| FULLTEXT KEY '(' column_list ')' { sqlp_col_key_textidx($4); }
|
||||
| PRIMARY KEY '(' column_list ')' { sqlp_col_key_pri(pstate, $4); }
|
||||
| KEY '(' column_list ')' { sqlp_col_key(pstate, $3); }
|
||||
| INDEX '(' column_list ')' { sqlp_col_key(pstate, $3); }
|
||||
| FULLTEXT INDEX '(' column_list ')' { sqlp_col_key_textidx(pstate, $4); }
|
||||
| FULLTEXT KEY '(' column_list ')' { sqlp_col_key_textidx(pstate, $4); }
|
||||
;
|
||||
|
||||
column_atts: /* nil */ { $$ = 0; }
|
||||
| column_atts NOT NULLX { sqlp_col_attr(SCA_NOTNULL); $$ = $1 + 1; }
|
||||
| column_atts NOT NULLX { sqlp_col_attr(pstate, SCA_NOTNULL); $$ = $1 + 1; }
|
||||
| column_atts NULLX
|
||||
| column_atts DEFAULT STRING { sqlp_col_def_str($3); free($3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT INTNUM { sqlp_col_def_num($3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT APPROXNUM { sqlp_col_def_float($3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT BOOL { sqlp_col_def_bool($3); $$ = $1 + 1; }
|
||||
| column_atts AUTO_INCREMENT { sqlp_col_attr(SCA_AUTOINC); $$ = $1 + 1; }
|
||||
| column_atts UNIQUE '(' column_list ')' { sqlp_col_attr_uniq($4); $$ = $1 + 1; }
|
||||
| column_atts UNIQUE KEY { sqlp_col_attr_uniq(0); $$ = $1 + 1; }
|
||||
| column_atts PRIMARY KEY { sqlp_col_attr(SCA_PRIMARY_KEY); $$ = $1 + 1; }
|
||||
| column_atts KEY { sqlp_col_attr(SCA_PRIMARY_KEY); $$ = $1 + 1; }
|
||||
| column_atts COMMENT STRING { sqlp_col_attr_comm($3); free($3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT STRING { sqlp_col_def_str(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT INTNUM { sqlp_col_def_num(pstate, $3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT APPROXNUM { sqlp_col_def_float(pstate, $3); $$ = $1 + 1; }
|
||||
| column_atts DEFAULT BOOL { sqlp_col_def_bool(pstate, $3); $$ = $1 + 1; }
|
||||
| column_atts AUTO_INCREMENT { sqlp_col_attr(pstate, SCA_AUTOINC); $$ = $1 + 1; }
|
||||
| column_atts UNIQUE '(' column_list ')' { sqlp_col_attr_uniq(pstate, $4); $$ = $1 + 1; }
|
||||
| column_atts UNIQUE KEY { sqlp_col_attr_uniq(pstate, 0); $$ = $1 + 1; }
|
||||
| column_atts PRIMARY KEY { sqlp_col_attr(pstate, SCA_PRIMARY_KEY); $$ = $1 + 1; }
|
||||
| column_atts KEY { sqlp_col_attr(pstate, SCA_PRIMARY_KEY); $$ = $1 + 1; }
|
||||
| column_atts COMMENT STRING { sqlp_col_attr_comm(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
opt_length: /* nil */ { $$ = 0; }
|
||||
@ -785,8 +785,8 @@ opt_uz: /* nil */ { $$ = 0; }
|
||||
;
|
||||
|
||||
opt_csc: /* nil */
|
||||
| opt_csc CHAR SET STRING { sqlp_col_charset($4); free($4); }
|
||||
| opt_csc COLLATE STRING { sqlp_col_collate($3); free($3); }
|
||||
| opt_csc CHAR SET STRING { sqlp_col_charset(pstate, $4); free($4); }
|
||||
| opt_csc COLLATE STRING { sqlp_col_collate(pstate, $3); free($3); }
|
||||
;
|
||||
|
||||
data_type:
|
||||
@ -822,11 +822,11 @@ data_type:
|
||||
| SET '(' enum_list ')' opt_csc { $$ = 210000 + $3; }
|
||||
;
|
||||
|
||||
enum_list: STRING { sqlp_enum_val($1); free($1); $$ = 1; }
|
||||
| enum_list ',' STRING { sqlp_enum_val($3); free($3); $$ = $1 + 1; }
|
||||
enum_list: STRING { sqlp_enum_val(pstate, $1); free($1); $$ = 1; }
|
||||
| enum_list ',' STRING { sqlp_enum_val(pstate, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
create_select_statement: opt_ignore_replace opt_as select_stmt { sqlp_create_sel($1); }
|
||||
create_select_statement: opt_ignore_replace opt_as select_stmt { sqlp_create_sel(pstate, $1); }
|
||||
;
|
||||
|
||||
opt_ignore_replace: /* nil */ { $$ = 0; }
|
||||
@ -840,24 +840,24 @@ opt_temporary: /* nil */ { $$ = 0; }
|
||||
|
||||
/** drop table **/
|
||||
|
||||
stmt: drop_table_stmt { sqlp_stmt(); }
|
||||
stmt: drop_table_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
drop_table_stmt:
|
||||
DROP opt_temporary TABLE opt_if_exists table_list { sqlp_drop_table($2, $4, $5); }
|
||||
DROP opt_temporary TABLE opt_if_exists table_list { sqlp_drop_table(pstate, $2, $4, $5); }
|
||||
;
|
||||
|
||||
table_list: NAME { sqlp_table(NULL, $1); free($1); $$ = 1; }
|
||||
table_list: NAME { sqlp_table(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| STRING { lyyerror(@1, "string %s found where name required", $1);
|
||||
sqlp_table(NULL, $1); free($1); $$ = 1; }
|
||||
| table_list ',' NAME { sqlp_table(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_table(pstate, NULL, $1); free($1); $$ = 1; }
|
||||
| table_list ',' NAME { sqlp_table(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
| table_list ',' STRING { lyyerror(@3, "string %s found where name required", $1);
|
||||
sqlp_table(NULL, $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_table(pstate, NULL, $3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
/**** set user variables ****/
|
||||
|
||||
stmt: set_stmt { sqlp_stmt(); }
|
||||
stmt: set_stmt { sqlp_stmt(pstate); }
|
||||
;
|
||||
|
||||
set_stmt: SET set_list ;
|
||||
@ -866,52 +866,52 @@ set_list: set_expr | set_list ',' set_expr ;
|
||||
|
||||
set_expr:
|
||||
USERVAR COMPARISON expr { if ($2 != 4) { lyyerror(@2,"bad set to @%s", $1); YYERROR; }
|
||||
sqlp_set($1); free($1); }
|
||||
| USERVAR ASSIGN expr { sqlp_set($1); free($1); }
|
||||
sqlp_set(pstate, $1); free($1); }
|
||||
| USERVAR ASSIGN expr { sqlp_set(pstate, $1); free($1); }
|
||||
;
|
||||
|
||||
/**** expressions ****/
|
||||
|
||||
expr: NAME { sqlp_name($1); free($1); }
|
||||
| USERVAR { sqlp_uservar($1); free($1); }
|
||||
| NAME '.' NAME { sqlp_fieldname($1, $3); free($1); free($3); }
|
||||
| STRING { sqlp_string($1); free($1); }
|
||||
| INTNUM { sqlp_number($1); }
|
||||
| APPROXNUM { sqlp_float($1); }
|
||||
| BOOL { sqlp_bool($1); }
|
||||
expr: NAME { sqlp_name(pstate, $1); free($1); }
|
||||
| USERVAR { sqlp_uservar(pstate, $1); free($1); }
|
||||
| NAME '.' NAME { sqlp_fieldname(pstate, $1, $3); free($1); free($3); }
|
||||
| STRING { sqlp_string(pstate, $1); free($1); }
|
||||
| INTNUM { sqlp_number(pstate, $1); }
|
||||
| APPROXNUM { sqlp_float(pstate, $1); }
|
||||
| BOOL { sqlp_bool(pstate, $1); }
|
||||
;
|
||||
|
||||
expr: expr '+' expr { sqlp_expr_op(SEO_ADD); }
|
||||
| expr '-' expr { sqlp_expr_op(SEO_SUB); }
|
||||
| expr '*' expr { sqlp_expr_op(SEO_MUL); }
|
||||
| expr '/' expr { sqlp_expr_op(SEO_DIV); }
|
||||
| expr '%' expr { sqlp_expr_op(SEO_MOD); }
|
||||
| expr MOD expr { sqlp_expr_op(SEO_MOD); }
|
||||
| '-' expr %prec UMINUS { sqlp_expr_op(SEO_NEG); }
|
||||
| expr ANDOP expr { sqlp_expr_op(SEO_AND); }
|
||||
| expr OR expr { sqlp_expr_op(SEO_OR); }
|
||||
| expr XOR expr { sqlp_expr_op(SEO_XOR); }
|
||||
| expr COMPARISON expr { sqlp_expr_cmp($2); }
|
||||
| expr COMPARISON '(' select_stmt ')' { sqlp_expr_cmp_sel(0, $2); }
|
||||
| expr COMPARISON ANY '(' select_stmt ')' { sqlp_expr_cmp_sel(1, $2); }
|
||||
| expr COMPARISON SOME '(' select_stmt ')' { sqlp_expr_cmp_sel(2, $2); }
|
||||
| expr COMPARISON ALL '(' select_stmt ')' { sqlp_expr_cmp_sel(3, $2); }
|
||||
| expr '|' expr { sqlp_expr_op(SEO_BITOR); }
|
||||
| expr '&' expr { sqlp_expr_op(SEO_BITAND); }
|
||||
| expr '^' expr { sqlp_expr_op(SEO_BITXOR); }
|
||||
| expr SHIFT expr { sqlp_expr_op($2 == 1 ? SEO_SHL : SEO_SHR); }
|
||||
| NOT expr { sqlp_expr_op(SEO_NOT); }
|
||||
| '!' expr { sqlp_expr_op(SEO_NOT); }
|
||||
| USERVAR ASSIGN expr { sqlp_assign_at($1); free($1); }
|
||||
expr: expr '+' expr { sqlp_expr_op(pstate, SEO_ADD); }
|
||||
| expr '-' expr { sqlp_expr_op(pstate, SEO_SUB); }
|
||||
| expr '*' expr { sqlp_expr_op(pstate, SEO_MUL); }
|
||||
| expr '/' expr { sqlp_expr_op(pstate, SEO_DIV); }
|
||||
| expr '%' expr { sqlp_expr_op(pstate, SEO_MOD); }
|
||||
| expr MOD expr { sqlp_expr_op(pstate, SEO_MOD); }
|
||||
| '-' expr %prec UMINUS { sqlp_expr_op(pstate, SEO_NEG); }
|
||||
| expr ANDOP expr { sqlp_expr_op(pstate, SEO_AND); }
|
||||
| expr OR expr { sqlp_expr_op(pstate, SEO_OR); }
|
||||
| expr XOR expr { sqlp_expr_op(pstate, SEO_XOR); }
|
||||
| expr COMPARISON expr { sqlp_expr_cmp(pstate, $2); }
|
||||
| expr COMPARISON '(' select_stmt ')' { sqlp_expr_cmp_sel(pstate, 0, $2); }
|
||||
| expr COMPARISON ANY '(' select_stmt ')' { sqlp_expr_cmp_sel(pstate, 1, $2); }
|
||||
| expr COMPARISON SOME '(' select_stmt ')' { sqlp_expr_cmp_sel(pstate, 2, $2); }
|
||||
| expr COMPARISON ALL '(' select_stmt ')' { sqlp_expr_cmp_sel(pstate, 3, $2); }
|
||||
| expr '|' expr { sqlp_expr_op(pstate, SEO_BITOR); }
|
||||
| expr '&' expr { sqlp_expr_op(pstate, SEO_BITAND); }
|
||||
| expr '^' expr { sqlp_expr_op(pstate, SEO_BITXOR); }
|
||||
| expr SHIFT expr { sqlp_expr_op(pstate, $2 == 1 ? SEO_SHL : SEO_SHR); }
|
||||
| NOT expr { sqlp_expr_op(pstate, SEO_NOT); }
|
||||
| '!' expr { sqlp_expr_op(pstate, SEO_NOT); }
|
||||
| USERVAR ASSIGN expr { sqlp_assign_at(pstate, $1); free($1); }
|
||||
;
|
||||
|
||||
expr: expr IS NULLX { sqlp_expr_op(SEO_IS_NULL); }
|
||||
| expr IS NOT NULLX { sqlp_expr_op(SEO_IS_NULL); sqlp_expr_op(SEO_NOT); }
|
||||
| expr IS BOOL { sqlp_expr_is_bool($3); }
|
||||
| expr IS NOT BOOL { sqlp_expr_is_bool($4); sqlp_expr_op(SEO_NOT); }
|
||||
expr: expr IS NULLX { sqlp_expr_op(pstate, SEO_IS_NULL); }
|
||||
| expr IS NOT NULLX { sqlp_expr_op(pstate, SEO_IS_NULL); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
| expr IS BOOL { sqlp_expr_is_bool(pstate, $3); }
|
||||
| expr IS NOT BOOL { sqlp_expr_is_bool(pstate, $4); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
;
|
||||
|
||||
expr: expr BETWEEN expr AND expr %prec BETWEEN { sqlp_expr_op(SEO_BETWEEN); }
|
||||
expr: expr BETWEEN expr AND expr %prec BETWEEN { sqlp_expr_op(pstate, SEO_BETWEEN); }
|
||||
;
|
||||
|
||||
|
||||
@ -923,71 +923,71 @@ opt_val_list: /* nil */ { $$ = 0; }
|
||||
| val_list
|
||||
;
|
||||
|
||||
expr: expr IN '(' val_list ')' { sqlp_expr_is_in($4); }
|
||||
| expr NOT IN '(' val_list ')' { sqlp_expr_is_in($5); sqlp_expr_op(SEO_NOT); }
|
||||
| expr IN '(' select_stmt ')' { sqlp_expr_op(SEO_IN_SELECT); }
|
||||
| expr NOT IN '(' select_stmt ')' { sqlp_expr_op(SEO_IN_SELECT); sqlp_expr_op(SEO_NOT); }
|
||||
| EXISTS '(' select_stmt ')' { sqlp_expr_op(SEO_EXISTS); if($1)sqlp_expr_op(SEO_NOT); }
|
||||
expr: expr IN '(' val_list ')' { sqlp_expr_is_in(pstate, $4); }
|
||||
| expr NOT IN '(' val_list ')' { sqlp_expr_is_in(pstate, $5); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
| expr IN '(' select_stmt ')' { sqlp_expr_op(pstate, SEO_IN_SELECT); }
|
||||
| expr NOT IN '(' select_stmt ')' { sqlp_expr_op(pstate, SEO_IN_SELECT); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
| EXISTS '(' select_stmt ')' { sqlp_expr_op(pstate, SEO_EXISTS); if($1)sqlp_expr_op(pstate, SEO_NOT); }
|
||||
;
|
||||
|
||||
expr: NAME '(' opt_val_list ')' { sqlp_call($3, $1); free($1); }
|
||||
expr: NAME '(' opt_val_list ')' { sqlp_call(pstate, $3, $1); free($1); }
|
||||
;
|
||||
|
||||
/* functions with special syntax */
|
||||
expr: FCOUNT '(' '*' ')' { sqlp_call(0, "COUNTALL"); }
|
||||
| FCOUNT '(' expr ')' { sqlp_call(1, "COUNT"); }
|
||||
expr: FCOUNT '(' '*' ')' { sqlp_call(pstate, 0, "COUNTALL"); }
|
||||
| FCOUNT '(' expr ')' { sqlp_call(pstate, 1, "COUNT"); }
|
||||
|
||||
expr: FSUBSTRING '(' val_list ')' { sqlp_call($3, "SUBSTR");}
|
||||
| FSUBSTRING '(' expr FROM expr ')' { sqlp_call(2, "SUBSTR"); }
|
||||
| FSUBSTRING '(' expr FROM expr FOR expr ')' { sqlp_call(3, "SUBSTR"); }
|
||||
| FTRIM '(' val_list ')' { sqlp_call($3, "TRIM"); }
|
||||
| FTRIM '(' trim_ltb expr FROM val_list ')' { sqlp_call(3, "TRIM"); }
|
||||
expr: FSUBSTRING '(' val_list ')' { sqlp_call(pstate, $3, "SUBSTR");}
|
||||
| FSUBSTRING '(' expr FROM expr ')' { sqlp_call(pstate, 2, "SUBSTR"); }
|
||||
| FSUBSTRING '(' expr FROM expr FOR expr ')' { sqlp_call(pstate, 3, "SUBSTR"); }
|
||||
| FTRIM '(' val_list ')' { sqlp_call(pstate, $3, "TRIM"); }
|
||||
| FTRIM '(' trim_ltb expr FROM val_list ')' { sqlp_call(pstate, 3, "TRIM"); }
|
||||
;
|
||||
|
||||
trim_ltb: LEADING { sqlp_call_trim_opts(0); }
|
||||
| TRAILING { sqlp_call_trim_opts(1); }
|
||||
| BOTH { sqlp_call_trim_opts(2); }
|
||||
trim_ltb: LEADING { sqlp_call_trim_opts(pstate, 0); }
|
||||
| TRAILING { sqlp_call_trim_opts(pstate, 1); }
|
||||
| BOTH { sqlp_call_trim_opts(pstate, 2); }
|
||||
;
|
||||
|
||||
expr: FDATE_ADD '(' expr ',' interval_exp ')' { sqlp_call_date(3, SEO_ADD); }
|
||||
| FDATE_SUB '(' expr ',' interval_exp ')' { sqlp_call_date(3, SEO_SUB); }
|
||||
expr: FDATE_ADD '(' expr ',' interval_exp ')' { sqlp_call_date(pstate, 3, SEO_ADD); }
|
||||
| FDATE_SUB '(' expr ',' interval_exp ')' { sqlp_call_date(pstate, 3, SEO_SUB); }
|
||||
;
|
||||
|
||||
interval_exp: INTERVAL expr DAY_HOUR { sqlp_date_interval(SDI_DAY_HOUR); }
|
||||
| INTERVAL expr DAY_MICROSECOND { sqlp_date_interval(SDI_DAY_MICROSECOND); }
|
||||
| INTERVAL expr DAY_MINUTE { sqlp_date_interval(SDI_DAY_MINUTE); }
|
||||
| INTERVAL expr DAY_SECOND { sqlp_date_interval(SDI_DAY_SECOND); }
|
||||
| INTERVAL expr YEAR_MONTH { sqlp_date_interval(SDI_YEAR_MONTH); }
|
||||
| INTERVAL expr YEAR { sqlp_date_interval(SDI_YEAR); }
|
||||
| INTERVAL expr HOUR_MICROSECOND { sqlp_date_interval(SDI_HOUR_MICROSECOND); }
|
||||
| INTERVAL expr HOUR_MINUTE { sqlp_date_interval(SDI_HOUR_MINUTE); }
|
||||
| INTERVAL expr HOUR_SECOND { sqlp_date_interval(SDI_HOUR_SECOND); }
|
||||
interval_exp: INTERVAL expr DAY_HOUR { sqlp_date_interval(pstate, SDI_DAY_HOUR); }
|
||||
| INTERVAL expr DAY_MICROSECOND { sqlp_date_interval(pstate, SDI_DAY_MICROSECOND); }
|
||||
| INTERVAL expr DAY_MINUTE { sqlp_date_interval(pstate, SDI_DAY_MINUTE); }
|
||||
| INTERVAL expr DAY_SECOND { sqlp_date_interval(pstate, SDI_DAY_SECOND); }
|
||||
| INTERVAL expr YEAR_MONTH { sqlp_date_interval(pstate, SDI_YEAR_MONTH); }
|
||||
| INTERVAL expr YEAR { sqlp_date_interval(pstate, SDI_YEAR); }
|
||||
| INTERVAL expr HOUR_MICROSECOND { sqlp_date_interval(pstate, SDI_HOUR_MICROSECOND); }
|
||||
| INTERVAL expr HOUR_MINUTE { sqlp_date_interval(pstate, SDI_HOUR_MINUTE); }
|
||||
| INTERVAL expr HOUR_SECOND { sqlp_date_interval(pstate, SDI_HOUR_SECOND); }
|
||||
;
|
||||
|
||||
expr: CASE expr case_list END { sqlp_caseval($3, 0); }
|
||||
| CASE expr case_list ELSE expr END { sqlp_caseval($3, 1); }
|
||||
| CASE case_list END { sqlp_case($2, 0); }
|
||||
| CASE case_list ELSE expr END { sqlp_case($2, 1); }
|
||||
expr: CASE expr case_list END { sqlp_caseval(pstate, $3, 0); }
|
||||
| CASE expr case_list ELSE expr END { sqlp_caseval(pstate, $3, 1); }
|
||||
| CASE case_list END { sqlp_case(pstate, $2, 0); }
|
||||
| CASE case_list ELSE expr END { sqlp_case(pstate, $2, 1); }
|
||||
;
|
||||
|
||||
case_list: WHEN expr THEN expr { $$ = 1; }
|
||||
| case_list WHEN expr THEN expr { $$ = $1+1; }
|
||||
;
|
||||
|
||||
expr: expr LIKE expr { sqlp_expr_op(SEO_LIKE); }
|
||||
| expr NOT LIKE expr { sqlp_expr_op(SEO_LIKE); sqlp_expr_op(SEO_NOT); }
|
||||
expr: expr LIKE expr { sqlp_expr_op(pstate, SEO_LIKE); }
|
||||
| expr NOT LIKE expr { sqlp_expr_op(pstate, SEO_LIKE); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
;
|
||||
|
||||
expr: expr REGEXP expr { sqlp_expr_op(SEO_REGEX); }
|
||||
| expr NOT REGEXP expr { sqlp_expr_op(SEO_REGEX); sqlp_expr_op(SEO_NOT); }
|
||||
expr: expr REGEXP expr { sqlp_expr_op(pstate, SEO_REGEX); }
|
||||
| expr NOT REGEXP expr { sqlp_expr_op(pstate, SEO_REGEX); sqlp_expr_op(pstate, SEO_NOT); }
|
||||
;
|
||||
|
||||
expr: CURRENT_TIMESTAMP { sqlp_now(); };
|
||||
| CURRENT_DATE { sqlp_now(); };
|
||||
| CURRENT_TIME { sqlp_now(); };
|
||||
expr: CURRENT_TIMESTAMP { sqlp_now(pstate); };
|
||||
| CURRENT_DATE { sqlp_now(pstate); };
|
||||
| CURRENT_TIME { sqlp_now(pstate); };
|
||||
;
|
||||
|
||||
expr: BINARY expr %prec UMINUS { sqlp_expr_op(SEO_STRTOBIN); }
|
||||
expr: BINARY expr %prec UMINUS { sqlp_expr_op(pstate, SEO_STRTOBIN); }
|
||||
;
|
||||
|
||||
%%
|
||||
|
Reference in New Issue
Block a user