Changeset: cec959cce839 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cec959cce839
Modified Files:
cmake/monetdb-findpackages.cmake
sql/server/sql_parser.y
sql/server/sql_scan.c
sql/test/BugTracker-2022/Tests/incomplete-sql-script.Bug-7298.SQL.py
Branch: default
Log Message:
added least/greatest with more than 2 arguments
enabled better error messages in bison
diffs (138 lines):
diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake
--- a/cmake/monetdb-findpackages.cmake
+++ b/cmake/monetdb-findpackages.cmake
@@ -9,7 +9,7 @@
#]]
# Detect required packages
-find_package(BISON REQUIRED)
+find_package(BISON REQUIRED 3.2)
find_package(Iconv)
find_package(Threads)
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
@@ -173,9 +173,8 @@ uescape_xform(char *restrict s, const ch
%parse-param { mvc *m }
%lex-param { void *m }
-/* only possible from bison 3.6 and up
+/* only possible from bison 3.6 and up */
%define parse.error verbose
-*/
/* reentrant parser */
%define api.pure
@@ -265,6 +264,7 @@ int yydebug=1;
merge_match_clause
merge_stmt
merge_update_or_delete
+ multi_arg_func
null
object_name
operation
@@ -437,6 +437,7 @@ int yydebug=1;
XML_PI_target
opt_optimizer
opt_default_role
+ multi_arg_func_name
%type <l>
argument_list
@@ -656,6 +657,7 @@ int yydebug=1;
%token <sval> COMMIT ROLLBACK SAVEPOINT RELEASE WORK CHAIN NO PRESERVE ROWS
%token START TRANSACTION READ WRITE ONLY ISOLATION LEVEL
%token UNCOMMITTED COMMITTED sqlREPEATABLE SERIALIZABLE DIAGNOSTICS sqlSIZE
STORAGE SNAPSHOT
+%token LEAST GREATEST
%token <sval> ASYMMETRIC SYMMETRIC ORDER ORDERED BY IMPRINTS
%token <operation> ESCAPE UESCAPE HAVING sqlGROUP ROLLUP CUBE sqlNULL
@@ -4291,6 +4293,7 @@ value_exp:
| string_funcs
| XML_value_function
| odbc_scalar_func_escape
+ | multi_arg_func
;
param:
@@ -6774,6 +6777,28 @@ odbc_tsi_qualifier:
{ $$ = iyear; }
;
+multi_arg_func_name:
+ LEAST { $$ = sa_strdup(SA, "least"); }
+ | GREATEST { $$ = sa_strdup(SA, "greatest"); }
+ ;
+
+multi_arg_func:
+ multi_arg_func_name '(' case_search_condition_commalist ')' /* create
nested calls of binary function */
+ { dlist *args = $3;
+ dnode *f = args->h;
+ symbol *cur = f->data.sym;
+ for (dnode *dn = f->next; dn; dn = dn->next) {
+ dlist *l = L();
+ append_list( l, append_string(L(), $1));
+ append_int(l, FALSE); /* ignore distinct */
+ append_symbol(l, cur);
+ append_symbol(l, dn->data.sym);
+ cur = _symbol_create_list( SQL_BINOP, l );
+ }
+ $$ = cur;
+ }
+ ;
+
%%
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -583,6 +583,8 @@ scanner_init_keywords(void)
failed += keywords_insert("SQL_TSI_QUARTER", SQL_TSI_QUARTER);
failed += keywords_insert("SQL_TSI_YEAR", SQL_TSI_YEAR);
+ failed += keywords_insert("LEAST", LEAST);
+ failed += keywords_insert("GREATEST", GREATEST);
return failed;
}
diff --git
a/sql/test/BugTracker-2022/Tests/incomplete-sql-script.Bug-7298.SQL.py
b/sql/test/BugTracker-2022/Tests/incomplete-sql-script.Bug-7298.SQL.py
--- a/sql/test/BugTracker-2022/Tests/incomplete-sql-script.Bug-7298.SQL.py
+++ b/sql/test/BugTracker-2022/Tests/incomplete-sql-script.Bug-7298.SQL.py
@@ -9,7 +9,7 @@ with SQLTestCase() as tc:
tf.flush()
tf.seek(0)
- tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected $end in: "select foo"', '!syntax error in: "select foo"'])
+ tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected end of file in: "select foo"', '!syntax error in: "select foo"'])
tf.seek(0)
tf.truncate(0)
@@ -27,7 +27,7 @@ with SQLTestCase() as tc:
tf.flush()
tf.seek(0)
- tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected $end, expecting SCOLON in: "select foo."', '!syntax error in:
"select foo."'])
+ tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected end of file, expecting SCOLON or \':\' in: "select foo."', '!syntax
error in: "select foo."'])
tf.seek(0)
tf.truncate(0)
@@ -36,7 +36,7 @@ with SQLTestCase() as tc:
tf.flush()
tf.seek(0)
- tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected $end, expecting SCOLON in: "select foo-"', '!syntax error in:
"select foo-"'])
+ tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected end of file, expecting SCOLON or \':\' in: "select foo-"', '!syntax
error in: "select foo-"'])
tf.seek(0)
tf.truncate(0)
@@ -45,7 +45,7 @@ with SQLTestCase() as tc:
tf.flush()
tf.seek(0)
- tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected $end in: "select f001234"', '!syntax error in: "select f001234"'])
+ tc.execute(None, '-fraw', client='mclient',
stdin=tf).assertFailed(err_code="42000", err_message=['!syntax error,
unexpected end of file in: "select f001234"', '!syntax error in: "select
f001234"'])
tf.seek(0)
tf.truncate(0)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]