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

Reply via email to