Changeset: 332c52094870 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=332c52094870
Modified Files:
        sql/backends/monet5/sql.c
        sql/server/sql_env.c
        sql/server/sql_env.h
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.err
Branch: Jun2020
Log Message:

Small bugfix, disallow NULL values on default global variables and throw error 
instead of triggering an assertion on esoteric timezones


diffs (188 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -639,7 +639,7 @@ setVariable(Client cntxt, MalBlkPtr mb, 
        str msg;
        const char *varname = *getArgReference_str(stk, pci, 2);
        int mtype = getArgType(mb, pci, 3);
-       ValRecord *src;
+       ValPtr ptr;
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
                return msg;
@@ -653,35 +653,32 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                const char *newopt = *getArgReference_str(stk, pci, 3);
                if (newopt) {
                        char buf[BUFSIZ];
-                       if (!isOptimizerPipe(newopt) && strchr(newopt, (int) 
';') == 0) {
+
+                       if (strNil(newopt))
+                               throw(SQL, "sql.setVariable", SQLSTATE(42000) 
"optimizer cannot be NULL");
+                       if (!isOptimizerPipe(newopt) && strchr(newopt, (int) 
';') == 0)
                                throw(SQL, "sql.setVariable", SQLSTATE(42100) 
"optimizer '%s' unknown", newopt);
-                       }
                        snprintf(buf, BUFSIZ, "user_%d", cntxt->idx);
                        if (!isOptimizerPipe(newopt) || strcmp(buf, newopt) == 
0) {
                                msg = addPipeDefinition(cntxt, buf, newopt);
                                if (msg)
                                        return msg;
                                if (stack_find_var(m, varname)) {
-                                       if(!stack_set_string(m, varname, buf))
+                                       if (!stack_set_string(m, varname, buf))
                                                throw(SQL, "sql.setVariable", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                }
                        } else if (stack_find_var(m, varname)) {
-                               if(!stack_set_string(m, varname, newopt))
+                               if (!stack_set_string(m, varname, newopt))
                                        throw(SQL, "sql.setVariable", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        }
                }
                return MAL_SUCCEED;
        }
-       src = &stk->stk[getArg(pci, 3)];
+       ptr = &stk->stk[getArg(pci, 3)];
        if (stack_find_var(m, varname)) {
-#ifdef HAVE_HGE
-               hge sgn = val_get_number(src);
-#else
-               lng sgn = val_get_number(src);
-#endif
-               if ((msg = sql_update_var(m, varname, src->val.sval, sgn)) != 
NULL)
+               if ((msg = sql_update_var(m, varname, ptr)) != NULL)
                        return msg;
-               if(!stack_set_var(m, varname, src))
+               if (!stack_set_var(m, varname, ptr))
                        throw(SQL, "sql.setVariable", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        } else {
                throw(SQL, "sql.setVariable", SQLSTATE(42100) "variable '%s' 
unknown", varname);
diff --git a/sql/server/sql_env.c b/sql/server/sql_env.c
--- a/sql/server/sql_env.c
+++ b/sql/server/sql_env.c
@@ -40,46 +40,39 @@
 #include "sql_privileges.h"
 #include "mal_exception.h"
 
-#define SESSION_RW 0
-#define SESSION_RO 1
+#ifdef HAVE_HGE
+#define        VAR_UPCAST hge
+#else
+#define        VAR_UPCAST lng
+#endif
 
 str
-#ifdef HAVE_HGE
-sql_update_var(mvc *m, const char *name, char *sval, hge sgn)
-#else
-sql_update_var(mvc *m, const char *name, char *sval, lng sgn)
-#endif
+sql_update_var(mvc *m, const char *name, ValPtr ptr)
 {
-       if (strcmp(name, "debug") == 0) {
-#ifdef HAVE_HGE
-               assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max);
-#else
-               assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max);
-#endif
-               m->debug = (int) sgn;
-       } else if (strcmp(name, "current_schema") == 0) {
-               if (!mvc_set_schema(m, sval)) {
-                       throw(SQL,"sql.update_var", SQLSTATE(3F000) "Schema 
(%s) missing\n", sval);
-               }
-       } else if (strcmp(name, "current_role") == 0) {
-               if (!mvc_set_role(m, sval)) {
-                       throw(SQL,"sql.update_var", SQLSTATE(42000) "Role (%s) 
missing\n", sval);
-               }
-       } else if (strcmp(name, "current_timezone") == 0) {
-#ifdef HAVE_HGE
-               assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max);
-#else
-               assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max);
-#endif
-               m->timezone = (int) sgn;
-       } else if (strcmp(name, "cache") == 0) {
-#ifdef HAVE_HGE
-               assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max);
-#else
-               assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max);
-#endif
-               m->cache = (int) sgn;
-       } 
+       if (strcmp(name, "debug") == 0 || strcmp(name, "current_timezone") == 0 
|| strcmp(name, "cache") == 0) {
+               VAR_UPCAST sgn = val_get_number(ptr);
+
+               if (VALisnil(ptr))
+                       throw(SQL,"sql.update_var", SQLSTATE(42000) "%s cannot 
be NULL\n", name);
+               if (sgn <= (VAR_UPCAST) GDK_int_min)
+                       throw(SQL,"sql.update_var", SQLSTATE(42000) "Value too 
small for %s\n", name);
+               if (sgn > (VAR_UPCAST) GDK_int_max)
+                       throw(SQL,"sql.update_var", SQLSTATE(42000) "Value too 
large for %s\n", name);
+
+               if (strcmp(name, "debug") == 0)
+                       m->debug = (int) sgn;
+               else if (strcmp(name, "current_timezone") == 0)
+                       m->timezone = (int) sgn;
+               else if (strcmp(name, "cache") == 0)
+                       m->cache = (int) sgn;
+       } else if (strcmp(name, "current_schema") == 0 || strcmp(name, 
"current_role") == 0) {
+               if (VALisnil(ptr))
+                       throw(SQL,"sql.update_var", SQLSTATE(42000) "%s cannot 
be NULL\n", name);
+               if (strcmp(name, "current_schema") == 0 && !mvc_set_schema(m, 
ptr->val.sval))
+                       throw(SQL,"sql.update_var", SQLSTATE(3F000) "Schema 
(%s) missing\n", ptr->val.sval);
+               else if (strcmp(name, "current_role") == 0 && !mvc_set_role(m, 
ptr->val.sval))
+                       throw(SQL,"sql.update_var", SQLSTATE(42000) "Role (%s) 
missing\n", ptr->val.sval);
+       }
        return NULL;
 }
 
diff --git a/sql/server/sql_env.h b/sql/server/sql_env.h
--- a/sql/server/sql_env.h
+++ b/sql/server/sql_env.h
@@ -13,12 +13,8 @@
 #include "sql_symbol.h"
 #include "sql_mvc.h"
 
-#ifdef HAVE_HGE
-extern str sql_update_var(mvc *sql, const char *name, char *sval, hge sgn);
-#else
-extern str sql_update_var(mvc *sql, const char *name, char *sval, lng sgn);
-#endif
+extern str sql_update_var(mvc *m, const char *name, ValPtr ptr);
 
-extern int sql_create_env(mvc *sql, sql_schema *s);
+extern int sql_create_env(mvc *m, sql_schema *s);
 
 #endif /* _SQL_ENV_H_ */
diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql 
b/sql/test/miscellaneous/Tests/simple_selects.sql
--- a/sql/test/miscellaneous/Tests/simple_selects.sql
+++ b/sql/test/miscellaneous/Tests/simple_selects.sql
@@ -147,3 +147,7 @@ drop table myx;
 drop table myy;
 
 create view iambad as select * from _tables sample 10; --error, sample inside 
views not supported
+
+set current_timezone = null; --error, default global variables cannot be null
+set current_timezone = 111111111111111111111111; --error, value too big
+set current_schema = null; --error, default global variables cannot be null
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err 
b/sql/test/miscellaneous/Tests/simple_selects.stable.err
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.err
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err
@@ -177,6 +177,18 @@ MAPI  = (monetdb) /var/tmp/mtest-753717/
 QUERY = create view iambad as select * from _tables sample 10; --error, sample 
inside views not supported
 ERROR = !CREATE VIEW: SAMPLE not supported
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-440671/.s.monetdb.33654
+QUERY = set current_timezone = null; --error, default global variables cannot 
be null
+ERROR = !current_timezone cannot be NULL
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-440671/.s.monetdb.33654
+QUERY = set current_timezone = 111111111111111111111111; --error, value too big
+ERROR = !Value too large for current_timezone
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-440671/.s.monetdb.33654
+QUERY = set current_schema = null; --error, default global variables cannot be 
null
+ERROR = !current_schema cannot be NULL
+CODE  = 42000
 
 # 17:31:38 >  
 # 17:31:38 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to