Changeset: 1f33818e31e8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1f33818e31e8
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql.mal
sql/server/sql_env.c
sql/test/scoping/Tests/scoping01.sql
sql/test/scoping/Tests/scoping02.sql
sql/test/scoping/Tests/scoping02.stable.out
Branch: scoping
Log Message:
Return schema name, variable name, type and value from global variables at
sys.var function
diffs (185 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
@@ -728,33 +728,82 @@ str
sql_variables(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *m = NULL;
- BAT *vars;
- str msg;
- bat *res = getArgReference_bat(stk, pci, 0);
- sql_frame *f;
+ BAT *schemas, *names, *types, *values;
+ str msg = MAL_SUCCEED;
+ bat *s = getArgReference_bat(stk,pci,0);
+ bat *n = getArgReference_bat(stk,pci,1);
+ bat *t = getArgReference_bat(stk,pci,2);
+ bat *v = getArgReference_bat(stk,pci,3);
+ int nvars;
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
return msg;
if ((msg = checkSQLContext(cntxt)) != NULL)
return msg;
- f = m->frames[m->topframes - 1];
- vars = COLnew(0, TYPE_str, list_length(f->vars), TRANSIENT);
- if (vars == NULL)
- throw(SQL, "sql.variables", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-
- if (f->vars) {
- for (node *n = f->vars->h; n ; n = n->next) {
+ nvars = list_length(m->global_vars);
+ schemas = COLnew(0, TYPE_str, nvars, TRANSIENT);
+ names = COLnew(0, TYPE_str, nvars, TRANSIENT);
+ types = COLnew(0, TYPE_str, nvars, TRANSIENT);
+ values = COLnew(0, TYPE_str, nvars, TRANSIENT);
+ if (!schemas || !names || !types || !values) {
+ msg = createException(SQL, "sql.variables", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ if (m->global_vars) {
+ for (node *n = m->global_vars->h; n ; n = n->next) {
sql_var *var = (sql_var*) n->data;
- if (BUNappend(vars, var->name, false) != GDK_SUCCEED) {
- BBPreclaim(vars);
- throw(SQL, "sql.variables", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ atom value = var->var;
+ ValPtr myptr = &(value.data);
+ ValRecord val = (ValRecord) {.vtype = TYPE_void,};
+ gdk_return res;
+
+ if (value.tpe.type->localtype != TYPE_str) {
+ ptr ok = VALcopy(&val, myptr);
+ if (ok)
+ ok = VALconvert(TYPE_str, &val);
+ if (!ok) {
+ VALclear(&val);
+ msg = createException(SQL,
"sql.variables", SQLSTATE(HY013) "Failed to convert variable '%s.%s' into a
string", var->sname, var->name);
+ goto bailout;
+ }
+ myptr = &val;
+ }
+ res = BUNappend(values, VALget(myptr), false);
+ VALclear(&val);
+ if (res != GDK_SUCCEED) {
+ msg = createException(SQL, "sql.variables",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (BUNappend(schemas, var->sname, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL, "sql.variables",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (BUNappend(names, var->name, false) != GDK_SUCCEED) {
+ msg = createException(SQL, "sql.variables",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (BUNappend(types, value.tpe.type->sqlname, false) !=
GDK_SUCCEED) {
+ msg = createException(SQL, "sql.variables",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
}
}
}
- *res = vars->batCacheid;
- BBPkeepref(vars->batCacheid);
- return MAL_SUCCEED;
+
+bailout:
+ if (msg) {
+ BBPreclaim(schemas);
+ BBPreclaim(names);
+ BBPreclaim(types);
+ BBPreclaim(values);
+ } else {
+ BBPkeepref(*s = schemas->batCacheid);
+ BBPkeepref(*n = names->batCacheid);
+ BBPkeepref(*t = types->batCacheid);
+ BBPkeepref(*v = values->batCacheid);
+ }
+ return msg;
}
/* str mvc_logfile(int *d, str *filename); */
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -383,7 +383,7 @@ pattern argRecord(a:any...):str
address SQLargRecord
comment "Glue together the calling sequence";
-pattern sql_variables():bat[:str]
+pattern sql_variables() (sname:bat[:str], name:bat[:str], type:bat[:str],
value:bat[:str])
address sql_variables
comment "return the table with session variables";
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
@@ -86,18 +86,21 @@ sql_create_env(mvc *m, sql_schema *s)
list *res, *ops;
res = sa_list(m->sa);
- list_append(res, sql_create_arg(m->sa, "name", sql_bind_subtype(m->sa,
"varchar", 1024, 0), ARG_OUT));
- list_append(res, sql_create_arg(m->sa, "value", sql_bind_subtype(m->sa,
"varchar", 2048, 0), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "name", sql_bind_subtype(m->sa,
"varchar", 1024, 0), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "value", sql_bind_subtype(m->sa,
"varchar", 2048, 0), ARG_OUT));
/* add function */
ops = sa_list(m->sa);
- mvc_create_func(m, NULL, s, "env", ops, res, F_UNION, FUNC_LANG_SQL,
"sql", "sql_environment", "CREATE FUNCTION env () RETURNS TABLE( name
varchar(1024), value varchar(2048)) EXTERNAL NAME sql.sql_environment;", FALSE,
FALSE, TRUE);
+ mvc_create_func(m, NULL, s, "env", ops, res, F_UNION, FUNC_LANG_SQL,
"sql", "sql_environment", "CREATE FUNCTION \"sys\".\"env\"() RETURNS
TABLE(\"name\" varchar(1024), \"value\" varchar(2048)) EXTERNAL NAME
\"sql\".\"sql_environment\";", FALSE, FALSE, TRUE);
res = sa_list(m->sa);
- list_append(res, sql_create_arg(m->sa, "name", sql_bind_subtype(m->sa,
"varchar", 1024, 0), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "sname",
sql_bind_localtype("str"), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "name",
sql_bind_localtype("str"), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "type",
sql_bind_localtype("str"), ARG_OUT));
+ list_append(res, sql_create_arg(m->sa, "value",
sql_bind_localtype("str"), ARG_OUT));
/* add function */
ops = sa_list(m->sa);
- mvc_create_func(m, NULL, s, "var", ops, res, F_UNION, FUNC_LANG_SQL,
"sql", "sql_variables", "CREATE FUNCTION var() RETURNS TABLE( name
varchar(1024)) EXTERNAL NAME sql.sql_variables;", FALSE, FALSE, TRUE);
+ mvc_create_func(m, NULL, s, "var", ops, res, F_UNION, FUNC_LANG_SQL,
"sql", "sql_variables", "CREATE FUNCTION \"sys\".\"var\"() RETURNS
TABLE(\"sname\" string, \"name\" string, \"type\" string, \"value\" string)
EXTERNAL NAME \"sql\".\"sql_variables\";", FALSE, FALSE, TRUE);
return 0;
}
diff --git a/sql/test/scoping/Tests/scoping01.sql
b/sql/test/scoping/Tests/scoping01.sql
--- a/sql/test/scoping/Tests/scoping01.sql
+++ b/sql/test/scoping/Tests/scoping01.sql
@@ -1,6 +1,6 @@
-- hash lookup for variables
-- TODO transaction management
--- upgrade drop dt_schema
+-- upgrade drop dt_schema, re-create var F_UNION
create table tmp1("optimizer" integer, s string);
insert into tmp1 values(1,'hello'),(2,'world');
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
@@ -75,3 +75,5 @@ SELECT "sys"."current_schema" FROM "sys"
-- astring
DROP TABLE "sys";
+
+SELECT * from sys.var() where "name" not in ('debug', 'cache', 'last_id',
'current_timezone');
diff --git a/sql/test/scoping/Tests/scoping02.stable.out
b/sql/test/scoping/Tests/scoping02.stable.out
--- a/sql/test/scoping/Tests/scoping02.stable.out
+++ b/sql/test/scoping/Tests/scoping02.stable.out
@@ -80,6 +80,16 @@ stdout of test 'scoping02` in directory
% 7 # length
[ "astring" ]
#DROP TABLE "sys";
+#SELECT * from sys.var() where "name" not in ('debug', 'cache', 'last_id',
'current_timezone');
+% .%1, .%1, .%1, .%1 # table_name
+% sname, name, type, value # name
+% char, char, char, char # type
+% 3, 14, 7, 12 # length
+[ "sys", "current_schema", "varchar", "sys" ]
+[ "sys", "current_user", "varchar", "monetdb" ]
+[ "sys", "current_role", "varchar", "monetdb" ]
+[ "sys", "optimizer", "varchar", "default_pipe" ]
+[ "sys", "rowcnt", "bigint", "1" ]
# 11:27:58 >
# 11:27:58 > "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list