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]

Reply via email to