Changeset: 48f55044d126 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=48f55044d126 Modified Files: sql/server/rel_psm.c sql/server/sql_parser.y Branch: scoping Log Message:
Adapted SQL parser to bind variables into schemas. Variables are now bound to schemas. If no schema is given, then the variable will be bound to the current sessions's schema. Removed name_commalist rule as it was identical to ident_commalist. diffs (224 lines): diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -93,7 +93,7 @@ psm_set_exp(sql_query *query, dnode *n) sql_subtype *tpe = NULL; sql_rel *rel = NULL; sql_exp *res = NULL; - int single = (n->type == type_string); + int single = (dlist_length(n->data.lval) == 1); if (single) { exp_kind ek = {type_value, card_value, FALSE}; diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -450,7 +450,6 @@ int yydebug=1; ident_commalist interval_qualifier merge_when_list - name_commalist object_privileges old_or_new_values_alias old_or_new_values_alias_list @@ -508,6 +507,9 @@ int yydebug=1; typelist value_commalist variable_list + variable_ref + variable_ref_commalist + variable_ref_commalist_parens when_search_list when_search_statements when_statements @@ -864,32 +866,35 @@ opt_minmax: ; declare_statement: - declare variable_list - { $$ = _symbol_create_list( SQL_DECLARE, $2); } - | declare table_def { $$ = $2; if ($$) $$->token = SQL_DECLARE_TABLE; } - ; + declare variable_list { $$ = _symbol_create_list( SQL_DECLARE, $2); } + | declare table_def { $$ = $2; if ($$) $$->token = SQL_DECLARE_TABLE; } + ; + +variable_ref_commalist: + variable_ref { $$ = append_list(L(), $1); } + | variable_ref_commalist ',' variable_ref { $$ = append_list( $1, $3 ); } + ; variable_list: - ident_commalist data_type + variable_ref_commalist data_type { dlist *l = L(); append_list(l, $1 ); append_type(l, &$2 ); $$ = append_symbol(L(), _symbol_create_list( SQL_DECLARE, l)); } - | variable_list ',' ident_commalist data_type + | variable_list ',' variable_ref_commalist data_type { dlist *l = L(); append_list(l, $3 ); append_type(l, &$4 ); $$ = append_symbol($1, _symbol_create_list( SQL_DECLARE, l)); } - ; + ; set_statement: - /*set ident '=' simple_atom*/ - set ident '=' search_condition + set variable_ref '=' search_condition { dlist *l = L(); - append_string(l, $2 ); + append_list(l, $2 ); append_symbol(l, $4 ); $$ = _symbol_create_list( SQL_SET, l); } - | set column_commalist_parens '=' subquery + | set variable_ref_commalist_parens '=' subquery { dlist *l = L(); append_list(l, $2); append_symbol(l, $4); @@ -897,8 +902,8 @@ set_statement: | set sqlSESSION AUTHORIZATION ident { dlist *l = L(); sql_subtype t; - sql_find_subtype(&t, "char", UTF8_strlen($4), 0 ); - append_string(l, sa_strdup(SA, "current_user")); + sql_find_subtype(&t, "char", UTF8_strlen($4), 0 ); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_user"))); append_symbol(l, _newAtomNode( _atom_string(&t, $4)) ); $$ = _symbol_create_list( SQL_SET, l); } @@ -906,7 +911,7 @@ set_statement: { dlist *l = L(); sql_subtype t; sql_find_subtype(&t, "char", UTF8_strlen($3), 0 ); - append_string(l, sa_strdup(SA, "current_schema")); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_schema"))); append_symbol(l, _newAtomNode( _atom_string(&t, $3)) ); $$ = _symbol_create_list( SQL_SET, l); } @@ -914,7 +919,7 @@ set_statement: { dlist *l = L(); sql_subtype t; sql_find_subtype(&t, "char", UTF8_strlen($4), 0 ); - append_string(l, sa_strdup(SA, "current_user")); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_user"))); append_symbol(l, _newAtomNode( _atom_string(&t, $4)) ); $$ = _symbol_create_list( SQL_SET, l); } @@ -922,23 +927,23 @@ set_statement: { dlist *l = L(); sql_subtype t; sql_find_subtype(&t, "char", UTF8_strlen($3), 0); - append_string(l, sa_strdup(SA, "current_role")); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_role"))); append_symbol(l, _newAtomNode( _atom_string(&t, $3)) ); $$ = _symbol_create_list( SQL_SET, l); } | set TIME ZONE LOCAL { dlist *l = L(); - sql_subtype t; - append_string(l, sa_strdup(SA, "current_timezone")); + sql_subtype t; sql_find_subtype(&t, "sec_interval", inttype2digits(ihour, isec), 0); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_timezone"))); append_symbol(l, _newAtomNode(atom_int(SA, &t, 0))); $$ = _symbol_create_list( SQL_SET, l); } | set TIME ZONE interval_expression { dlist *l = L(); - append_string(l, sa_strdup(SA, "current_timezone")); + append_list(l, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_timezone"))); append_symbol(l, $4 ); $$ = _symbol_create_list( SQL_SET, l); } - ; + ; schema: create SCHEMA if_not_exists schema_name_clause opt_schema_default_char_set @@ -2062,6 +2067,10 @@ column_commalist_parens: '(' ident_commalist ')' { $$ = $2; } ; +variable_ref_commalist_parens: + '(' variable_ref_commalist ')' { $$ = $2; } + ; + type_def: create TYPE qname EXTERNAL sqlNAME ident { dlist *l = L(); @@ -3449,7 +3458,7 @@ table_ref: ; table_name: - AS ident '(' name_commalist ')' + AS ident '(' ident_commalist ')' { dlist *l = L(); append_string(l, $2); append_list(l, $4); @@ -3459,7 +3468,7 @@ table_name: append_string(l, $2); append_list(l, NULL); $$ = _symbol_create_list(SQL_NAME, l); } - | ident '(' name_commalist ')' + | ident '(' ident_commalist ')' { dlist *l = L(); append_string(l, $1); append_list(l, $3); @@ -4079,7 +4088,7 @@ value_exp: | case_exp | cast_exp | column_ref { $$ = _symbol_create_list(SQL_COLUMN, $1); } - | CURRENT_ROLE { $$ = _symbol_create_list(SQL_COLUMN, append_string(L(), sa_strdup(SA, "current_role"))); } + | CURRENT_ROLE { $$ = _symbol_create_list(SQL_COLUMN, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_role"))); } | datetime_funcs | GROUPING '(' column_ref_commalist ')' { dlist *l = L(); append_list(l, append_string(L(), "grouping")); @@ -4093,7 +4102,7 @@ value_exp: | null | param | string_funcs - | user { $$ = _symbol_create_list(SQL_COLUMN, append_string(L(), sa_strdup(SA, "current_user"))); } + | user { $$ = _symbol_create_list(SQL_COLUMN, append_string(append_string(L(), sa_strdup(SA, "tmp")), sa_strdup(SA, "current_user"))); } | var_ref | XML_value_function ; @@ -5079,6 +5088,15 @@ column_ref: L(), $1), $3), $5);} ; +variable_ref: + ident { $$ = append_string( + L(), $1); } + + | ident '.' ident { $$ = append_string( + append_string( + L(), $1), $3);} + ; + cast_exp: CAST '(' cast_value AS data_type ')' { dlist *l = L(); @@ -5652,12 +5670,6 @@ non_reserved_word: | WHITESPACE { $$ = sa_strdup(SA, "whitespace"); } ; -name_commalist: - ident { $$ = append_string(L(), $1); } - | name_commalist ',' ident - { $$ = append_string($1, $3); } - ; - lngval: sqlINT { @@ -5848,8 +5860,7 @@ path_specification: PATH schema_name_list { $$ = _symbol_create_list( SQL_PATH, $2); } ; -schema_name_list: name_commalist ; - +schema_name_list: ident_commalist ; comment_on_statement: COMMENT ON catalog_object IS string _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list