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