Support "SELECT TOP n [PERCENT]... " queries.

Updated the SQL parser to support "SELECT TOP n [PERCENT]... " queries,
matching the Mocrosoft Access SQL language.

Export these queries from databases with mdb-queries.
This commit is contained in:
James Woodcock
2020-09-26 11:28:34 +01:00
parent 8219e4ef7a
commit eb5dd4d0b7
5 changed files with 64 additions and 7 deletions

View File

@@ -62,7 +62,7 @@ typedef struct sql_context
%token <name> IDENT NAME PATH STRING NUMBER
%token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES AND OR NOT LIMIT COUNT STRPTIME
%token DESCRIBE TABLE
%token DESCRIBE TABLE TOP PERCENT
%token LTEQ GTEQ LIKE IS NUL
%type <name> database
@@ -91,7 +91,7 @@ stmt:
;
query:
SELECT column_list FROM table where_clause limit_clause {
SELECT top_clause column_list FROM table where_clause limit_clause {
mdb_sql_select(parser_ctx->mdb);
}
| CONNECT TO database {
@@ -108,6 +108,17 @@ query:
}
;
top_clause:
/* empty */
| TOP NUMBER { mdb_sql_add_limit(parser_ctx->mdb, $2, 0); free($2); }
| TOP NUMBER PERCENT {
if (mdb_sql_add_limit(parser_ctx->mdb, $2, 1)) {
yyerror(NULL, parser_ctx, "Percent values must be between 0 and 100");
}
free($2);
}
;
where_clause:
/* empty */
| WHERE sarg_list
@@ -115,7 +126,14 @@ where_clause:
limit_clause:
/* empty */
| LIMIT NUMBER { mdb_sql_add_limit(parser_ctx->mdb, $2); free($2); }
| LIMIT NUMBER {
if (mdb_sql_get_limit(parser_ctx->mdb) != -1) {
yyerror(NULL, parser_ctx, "Can not have TOP and LIMIT clauses");
} else {
mdb_sql_add_limit(parser_ctx->mdb, $2, 0);
}
free($2);
}
;
sarg_list: