Changeset: b7451b168aab for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b7451b168aab
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_result.c
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/22_clients.sql
        sql/server/sql_semantic.c
        sql/test/miscellaneous/Tests/deallocate.sql
        sql/test/miscellaneous/Tests/deallocate.stable.err
        sql/test/miscellaneous/Tests/deallocate.stable.out
Branch: default
Log Message:

Added sys.prepared_statements_args table returning function and view, returning 
details of the arguments from every prepared statements in the current session

create function sys.prepared_statements_args()
returns table(
        "statementid" int,
        "parameter" boolean,
        "type" string,
        "digits" int,
        "scale" int,
        "schema" string,
        "table" string,
        "column" string
)
external name sql.prepared_statements_args;


diffs (truncated from 419 to 300 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
@@ -5359,3 +5359,164 @@ bailout:
        }
        return msg;
 }
+
+str
+SQLsession_prepared_statements_args(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci)
+{
+       BAT *statementid, *parameter, *type, *digits, *scale, *schema, *table, 
*column;
+       bat *sid = getArgReference_bat(stk,pci,0);
+       bat *p = getArgReference_bat(stk,pci,1);
+       bat *t = getArgReference_bat(stk,pci,2);
+       bat *d = getArgReference_bat(stk,pci,3);
+       bat *s = getArgReference_bat(stk,pci,4);
+       bat *sch = getArgReference_bat(stk,pci,5);
+       bat *tbl = getArgReference_bat(stk,pci,6);
+       bat *col = getArgReference_bat(stk,pci,7);
+       str msg = MAL_SUCCEED;
+       mvc *sql = NULL;
+       cq *q = NULL;
+
+       (void) stk;
+       (void) pci;
+       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+
+       assert(sql->qc);
+
+       statementid = COLnew(0, TYPE_int, 256, TRANSIENT);
+       parameter = COLnew(0, TYPE_bit, 256, TRANSIENT);
+       type = COLnew(0, TYPE_str, 256, TRANSIENT);
+       digits = COLnew(0, TYPE_int, 256, TRANSIENT);
+       scale = COLnew(0, TYPE_int, 256, TRANSIENT);
+       schema = COLnew(0, TYPE_str, 256, TRANSIENT);
+       table = COLnew(0, TYPE_str, 256, TRANSIENT);
+       column = COLnew(0, TYPE_str, 256, TRANSIENT);
+       if (!statementid || !parameter || !type || !digits || !scale || !schema 
|| !table || !column) {
+               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+
+       for (q = sql->qc->q; q; q = q->next) {
+               if (q->prepared) {
+                       sql_rel *r = q->rel;
+                       bool isparameter = false;
+
+                       if (r && is_topn(r->op))
+                               r = r->l;
+
+                       if (r && is_project(r->op) && r->exps) {
+                               for (node *n = r->exps->h; n; n = n->next) {
+                                       sql_exp *e = n->data;
+                                       sql_subtype *t = exp_subtype(e);
+                                       const char *name = exp_name(e), *rname 
= exp_relname(e), *rschema = ATOMnilptr(TYPE_str);
+
+                                       if (!name && e->type == e_column && 
e->r)
+                                               name = e->r;
+                                       if (!name)
+                                               name = ATOMnilptr(TYPE_str);
+                                       if (!rname && e->type == e_column && 
e->l)
+                                               rname = e->l;
+                                       if (!rname)
+                                               rname = ATOMnilptr(TYPE_str);
+
+                                       if (BUNappend(statementid, &(q->id), 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(parameter, &isparameter, 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(type, t->type->sqlname, 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(digits, &t->digits, 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(scale, &t->scale, false) 
!= GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(schema, rschema, false) 
!= GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(table, rname, false) != 
GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(column, name, false) != 
GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                               }
+                       }
+
+                       if (q->params) {
+                               isparameter = true;
+                               for (int i = 0; i < q->paramlen; i++) {
+                                       sql_subtype t = q->params[i];
+
+                                       if (BUNappend(statementid, &(q->id), 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(parameter, &isparameter, 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(type, t.type->sqlname, 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(digits, &(t.digits), 
false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(scale, &(t.scale), false) 
!= GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(schema, 
ATOMnilptr(TYPE_str), false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(table, 
ATOMnilptr(TYPE_str), false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                                       if (BUNappend(column, 
ATOMnilptr(TYPE_str), false) != GDK_SUCCEED) {
+                                               msg = createException(SQL, 
"sql.session_prepared_statements_args", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                               goto bailout;
+                                       }
+                               }
+                       }
+               }
+       }
+
+bailout:
+       if (msg) {
+               BBPreclaim(statementid);
+               BBPreclaim(parameter);
+               BBPreclaim(type);
+               BBPreclaim(digits);
+               BBPreclaim(scale);
+               BBPreclaim(schema);
+               BBPreclaim(table);
+               BBPreclaim(column);
+       } else {
+               BBPkeepref(*sid = statementid->batCacheid);
+               BBPkeepref(*p = parameter->batCacheid);
+               BBPkeepref(*t = type->batCacheid);
+               BBPkeepref(*d = digits->batCacheid);
+               BBPkeepref(*s = scale->batCacheid);
+               BBPkeepref(*sch = schema->batCacheid);
+               BBPkeepref(*tbl = table->batCacheid);
+               BBPkeepref(*col = column->batCacheid);
+       }
+       return msg;
+}
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -260,7 +260,6 @@ sql5_export str str_2_blob(blob * *res, 
 sql5_export str batstr_2_blob(bat *res, const bat *val);
 sql5_export str SQLblob_2_str(str *res, const blob * val);
 
-
 sql5_export str SQLstr_cast(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLbatstr_cast(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
@@ -313,5 +312,6 @@ sql5_export str SQLresume_log_flushing(v
 sql5_export str SQLhot_snapshot(void *ret, const str *tarfile);
 
 sql5_export str SQLsession_prepared_statements(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr pci);
+sql5_export str SQLsession_prepared_statements_args(Client cntxt, MalBlkPtr 
mb, MalStkPtr stk, InstrPtr pci);
 
 #endif /* _SQL_H */
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
@@ -603,10 +603,15 @@ address SYSMONstop;
 pattern sysmon_stop(tag:lng)
 address SYSMONstop;
 
-pattern prepared_statements()(sessionid:bat[:int], user:bat[:str], 
statementid:bat[:int], statementt:bat[:str], createdd:bat[:timestamp])
+pattern prepared_statements()(sessionid:bat[:int], user:bat[:str], 
statementid:bat[:int], statement:bat[:str], created:bat[:timestamp])
 address SQLsession_prepared_statements
 comment "Available prepared statements in the current session";
 
+pattern prepared_statements_args()(statementid:bat[:int], parameter:bat[:bit], 
type:bat[:str], digits:bat[:int], scale:bat[:int], 
+schema:bat[:str], table:bat[:str], column:bat[:str])
+address SQLsession_prepared_statements_args
+comment "Available prepared statements' arguments in the current session";
+
 pattern copy_rejects() (rowid:bat[:lng], fldid:bat[:int], msg:bat[:str], 
inp:bat[:str])
 address COPYrejects;
 pattern copy_rejects_clear()
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1063,7 +1063,7 @@ mvc_export_prepare(mvc *c, stream *out, 
        if (!out)
                return 0;
 
-       if (is_topn(r->op))
+       if (r && is_topn(r->op))
                r = r->l;
        if (r && is_project(r->op) && r->exps) {
                unsigned int max2 = 10, max3 = 10;      /* to help calculate 
widths */
@@ -1174,7 +1174,6 @@ mvc_export_prepare(mvc *c, stream *out, 
        return 0;
 }
 
-
 /*
  * improved formatting of positive integers
  */
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -2448,14 +2448,26 @@ sql_update_default(Client c, mvc *sql, c
                        "\"statement\" string,\n"
                        "\"created\" timestamp)\n"
                        " external name sql.prepared_statements;\n"
-                       "create view sys.prepared_statements as select * from 
sys.prepared_statements();\n");
+                       "create view sys.prepared_statements as select * from 
sys.prepared_statements();\n"
+                       "create function sys.prepared_statements_args()\n"
+                       "returns table(\n"
+                       "\"statementid\" int,\n"
+                       "\"parameter\" boolean,\n"
+                       "\"type\" string,\n"
+                       "\"digits\" int,\n"
+                       "\"scale\" int,\n"
+                       "\"schema\" string,\n"
+                       "\"table\" string,\n"
+                       "\"column\" string)\n"
+                       " external name sql.prepared_statements_args;\n"
+                       "create view sys.prepared_statements_args as select * 
from sys.prepared_statements_args();\n");
 
        pos += snprintf(buf + pos, bufsize - pos,
                        "update sys.functions set system = true where schema_id 
= (select id from sys.schemas where name = 'sys')"
-                       " and name in ('sessions', 'prepared_statements') and 
type = %d;\n", (int) F_UNION);
+                       " and name in ('sessions', 'prepared_statements', 
'prepared_statements_args') and type = %d;\n", (int) F_UNION);
        pos += snprintf(buf + pos, bufsize - pos,
                        "update sys._tables set system = true where schema_id = 
(select id from sys.schemas where name = 'sys')"
-                       " and name in ('sessions', 'prepared_statements');\n");
+                       " and name in ('sessions', 'prepared_statements', 
'prepared_statements_args');\n");
        pos += snprintf(buf + pos, bufsize - pos,
                        "update sys.functions set system = true where schema_id 
= (select id from sys.schemas where name = 'sys')"
                        " and name in ('setoptimizer', 'setquerytimeout', 
'setsessiontimeout', 'setworkerlimit', 'setmemorylimit', 'setoptimizer', 
'stopsession') and type = %d;\n", (int) F_PROC);
diff --git a/sql/scripts/22_clients.sql b/sql/scripts/22_clients.sql
--- a/sql/scripts/22_clients.sql
+++ b/sql/scripts/22_clients.sql
@@ -96,3 +96,21 @@ grant execute on function sys.prepared_s
 
 create view sys.prepared_statements as select * from sys.prepared_statements();
 grant select on sys.prepared_statements to public;
+
+-- session's prepared statements arguments
+create function sys.prepared_statements_args()
+returns table(
+       "statementid" int,
+       "parameter" boolean,
+       "type" string,
+       "digits" int,
+       "scale" int,
+       "schema" string,
+       "table" string,
+       "column" string
+)
+external name sql.prepared_statements_args;
+grant execute on function sys.prepared_statements_args to public;
+
+create view sys.prepared_statements_args as select * from 
sys.prepared_statements_args();
+grant select on sys.prepared_statements_args to public;
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -145,7 +145,6 @@ sql_destroy_args(mvc *sql)
        sql->argc = 0;
 }
 
-
 sql_schema *
 cur_schema(mvc *sql)
 {
diff --git a/sql/test/miscellaneous/Tests/deallocate.sql 
b/sql/test/miscellaneous/Tests/deallocate.sql
--- a/sql/test/miscellaneous/Tests/deallocate.sql
+++ b/sql/test/miscellaneous/Tests/deallocate.sql
@@ -1,11 +1,18 @@
-deallocate all; --deallocate all the prepared statements from the current 
directory run
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to