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