Changeset: ce03012424c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce03012424c1
Modified Files:
        sql/backends/monet5/sql.c
        sql/test/scoping/Tests/scoping02.sql
        sql/test/scoping/Tests/scoping02.stable.err
Branch: scoping
Log Message:

Session default globals cannot be null


diffs (95 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
@@ -644,7 +644,7 @@ setVariable(Client cntxt, MalBlkPtr mb, 
        const char *sname = *getArgReference_str(stk, pci, 2);
        const char *varname = *getArgReference_str(stk, pci, 3);
        int mtype = getArgType(mb, pci, 4);
-       ValRecord *src;
+       ValRecord *src = &stk->stk[getArg(pci, 4)];
        sql_schema *s;
        sql_var *var;
 
@@ -659,10 +659,15 @@ setVariable(Client cntxt, MalBlkPtr mb, 
        *res = 0;
        if (mtype < 0 || mtype >= 255)
                throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable type 
error");
-       if (!strcmp("sys", s->base.name) && !strcmp("optimizer", varname)) {
-               const char *newopt = *getArgReference_str(stk, pci, 4);
-               if (newopt) {
+
+       if ((var = find_global_var(m, s, varname))) {
+               if (VALisnil(src)) /* this applies to the default global 
variables only, but for now we don't have session globals */
+                       throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable 
'%s.%s' cannot be NULL", sname, varname);
+
+               if (!strcmp("sys", s->base.name) && !strcmp("optimizer", 
varname)) {
+                       const char *newopt = src->val.sval;
                        char buf[BUFSIZ];
+
                        if (!isOptimizerPipe(newopt) && strchr(newopt, (int) 
';') == 0)
                                throw(SQL, "sql.setVariable", SQLSTATE(42100) 
"optimizer '%s' unknown", newopt);
                        (void) snprintf(buf, BUFSIZ, "user_%d", cntxt->idx);
@@ -673,24 +678,20 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                                        throw(SQL, "sql.setVariable", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        } else if (!sqlvar_set_string(find_global_var(m, s, 
varname), newopt))
                                throw(SQL, "sql.setVariable", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               } else {
+#ifdef HAVE_HGE
+                       hge sgn = val_get_number(src);
+#else
+                       lng sgn = val_get_number(src);
+#endif
+                       if ((msg = sql_update_var(m, s, varname, src->val.sval, 
sgn)))
+                               return msg;
+                       if (!sqlvar_set(var, src))
+                               throw(SQL, "sql.setVariable", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
                return MAL_SUCCEED;
        }
-       src = &stk->stk[getArg(pci, 4)];
-       if ((var = find_global_var(m, s, varname))) {
-#ifdef HAVE_HGE
-               hge sgn = val_get_number(src);
-#else
-               lng sgn = val_get_number(src);
-#endif
-               if ((msg = sql_update_var(m, s, varname, src->val.sval, sgn)))
-                       return msg;
-               if (!sqlvar_set(var, src))
-                       throw(SQL, "sql.setVariable", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-       } else {
-               throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable '%s.%s' 
unknown", sname, varname);
-       }
-       return MAL_SUCCEED;
+       throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable '%s.%s' 
unknown", sname, varname);
 }
 
 /* getVariable(int *ret, str *name) */
diff --git a/sql/test/scoping/Tests/scoping02.sql 
b/sql/test/scoping/Tests/scoping02.sql
--- a/sql/test/scoping/Tests/scoping02.sql
+++ b/sql/test/scoping/Tests/scoping02.sql
@@ -77,3 +77,6 @@ SELECT "sys"."current_schema" FROM "sys"
 DROP TABLE "sys";
 
 SELECT * from sys.var() where "name" not in ('debug', 'cache', 'last_id', 
'current_timezone');
+
+set "current_schema" = null; --error, cannot be null
+set "sys"."current_timezone" = null; --error, cannot be null
diff --git a/sql/test/scoping/Tests/scoping02.stable.err 
b/sql/test/scoping/Tests/scoping02.stable.err
--- a/sql/test/scoping/Tests/scoping02.stable.err
+++ b/sql/test/scoping/Tests/scoping02.stable.err
@@ -63,6 +63,14 @@ QUERY = CREATE OR REPLACE FUNCTION iambr
         END;
 ERROR = !SELECT: no such table 'mytable'
 CODE  = 42S02
+MAPI  = (monetdb) /var/tmp/mtest-461996/.s.monetdb.34756
+QUERY = set "current_schema" = null; --error, cannot be null
+ERROR = !Variable 'sys.current_schema' cannot be NULL
+CODE  = 42100
+MAPI  = (monetdb) /var/tmp/mtest-461996/.s.monetdb.34756
+QUERY = set "sys"."current_timezone" = null; --error, cannot be null
+ERROR = !Variable 'sys.current_timezone' cannot be NULL
+CODE  = 42100
 
 # 11:27:58 >  
 # 11:27:58 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to