sql: fix arbitrary path parentheses placement interfering with functions

This commit is contained in:
bob620
2021-07-13 16:25:32 -05:00
parent f7662e18ea
commit cf0f5f249c
2 changed files with 17 additions and 10 deletions

View File

@@ -74,8 +74,8 @@ like { return LIKE; }
limit { return LIMIT; } limit { return LIMIT; }
top { return TOP; } top { return TOP; }
percent { return PERCENT; } percent { return PERCENT; }
count* { return COUNT; } count\( { return COUNT; }
strptime* { return STRPTIME; } strptime\( { return STRPTIME; }
[ \t\r] ; [ \t\r] ;
\"[^"]*\"\" { \"[^"]*\"\" {
@@ -114,7 +114,14 @@ strptime* { return STRPTIME; }
(-?[0-9]+|(-?[0-9]*\.[0-9]+)(e[-+]?[0-9]+)?) { (-?[0-9]+|(-?[0-9]*\.[0-9]+)(e[-+]?[0-9]+)?) {
yylval->name = g_strdup(yytext); return NUMBER; yylval->name = g_strdup(yytext); return NUMBER;
} }
~?(\/?[a-z0-9\.\-\_\!\~\'\%\xa0-\xff]+)+ { ~?(\/?[a-z0-9\.\-\_\!\~\'\(\)\%\xa0-\xff]+)+ {
if (yytext[0] == ')' && strlen(yytext) == 1) {
return CLOSING;
}
if (yytext[0] == '(' && strlen(yytext) == 1) {
return OPENING;
}
yylval->name = g_strdup(yytext); return PATH; yylval->name = g_strdup(yytext); return PATH;
} }

View File

@@ -60,7 +60,7 @@ typedef struct sql_context
%start stmt %start stmt
%token <name> IDENT NAME PATH STRING NUMBER %token <name> IDENT NAME PATH STRING NUMBER OPENING CLOSING
%token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES AND OR NOT LIMIT COUNT STRPTIME %token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES AND OR NOT LIMIT COUNT STRPTIME
%token DESCRIBE TABLE TOP PERCENT %token DESCRIBE TABLE TOP PERCENT
%token LTEQ GTEQ LIKE IS NUL %token LTEQ GTEQ LIKE IS NUL
@@ -138,7 +138,7 @@ limit_clause:
sarg_list: sarg_list:
sarg sarg
| '(' sarg_list ')' | OPENING sarg_list CLOSING
| NOT sarg_list { mdb_sql_add_not(parser_ctx->mdb); } | NOT sarg_list { mdb_sql_add_not(parser_ctx->mdb); }
| sarg_list OR sarg_list { mdb_sql_add_or(parser_ctx->mdb); } | sarg_list OR sarg_list { mdb_sql_add_or(parser_ctx->mdb); }
| sarg_list AND sarg_list { mdb_sql_add_and(parser_ctx->mdb); } | sarg_list AND sarg_list { mdb_sql_add_and(parser_ctx->mdb); }
@@ -201,10 +201,10 @@ nulloperator:
; ;
constant: constant:
STRPTIME '(' constant ',' constant ')' { STRPTIME constant ',' constant CLOSING {
$$ = mdb_sql_strptime(parser_ctx->mdb, $3, $5); $$ = mdb_sql_strptime(parser_ctx->mdb, $2, $4);
free($3); free($2);
free($5); free($4);
} }
| NUMBER { $$ = $1; } | NUMBER { $$ = $1; }
| STRING { $$ = $1; } | STRING { $$ = $1; }
@@ -221,7 +221,7 @@ table:
; ;
column_list: column_list:
COUNT '(' '*' ')' { mdb_sql_sel_count(parser_ctx->mdb); } COUNT '*' CLOSING { mdb_sql_sel_count(parser_ctx->mdb); }
| '*' { mdb_sql_all_columns(parser_ctx->mdb); } | '*' { mdb_sql_all_columns(parser_ctx->mdb); }
| column | column
| column ',' column_list | column ',' column_list