LCOV - code coverage report
Current view: top level - sql/backends/monet5 - sql_upgrades.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 530 1459 36.3 %
Date: 2024-04-25 23:25:41 Functions: 21 29 72.4 %

          Line data    Source code
       1             : /*
       2             :  * SPDX-License-Identifier: MPL-2.0
       3             :  *
       4             :  * This Source Code Form is subject to the terms of the Mozilla Public
       5             :  * License, v. 2.0.  If a copy of the MPL was not distributed with this
       6             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       7             :  *
       8             :  * Copyright 2024 MonetDB Foundation;
       9             :  * Copyright August 2008 - 2023 MonetDB B.V.;
      10             :  * Copyright 1997 - July 2008 CWI.
      11             :  */
      12             : 
      13             : /*
      14             :  * SQL upgrade code
      15             :  * N. Nes, M.L. Kersten, S. Mullender
      16             :  */
      17             : #include "monetdb_config.h"
      18             : #include "mal_backend.h"
      19             : #include "sql_execute.h"
      20             : #include "sql_mvc.h"
      21             : #include "gdk_time.h"
      22             : #include <unistd.h>
      23             : #include "sql_upgrades.h"
      24             : #include "rel_rel.h"
      25             : #include "rel_semantic.h"
      26             : 
      27             : #include "mal_authorize.h"
      28             : 
      29             : /* this function can be used to recreate the system tables (types,
      30             :  * functions, args) when internal types and/or functions have changed
      31             :  * (i.e. the ones in sql_types.c) */
      32             : static str
      33          16 : sql_fix_system_tables(Client c, mvc *sql)
      34             : {
      35          16 :         size_t bufsize = 1000000, pos = 0;
      36          16 :         char *buf = GDKmalloc(bufsize), *err = NULL;
      37          16 :         node *n;
      38          16 :         sql_schema *s;
      39          16 :         static const char *boolnames[2] = {"false", "true"};
      40             : 
      41          16 :         if (buf == NULL)
      42           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
      43          16 :         s = mvc_bind_schema(sql, "sys");
      44             : 
      45          16 :         pos += snprintf(buf + pos, bufsize - pos,
      46             :                         "delete from sys.dependencies where id < 2000;\n");
      47             : 
      48             :         /* recreate internal types */
      49          16 :         pos += snprintf(buf + pos, bufsize - pos,
      50             :                         "delete from sys.types where id < 2000;\n");
      51         512 :         for (n = types->h; n; n = n->next) {
      52         496 :                 sql_type *t = n->data;
      53             : 
      54         496 :                 if (t->base.id >= FUNC_OIDS)
      55           0 :                         continue;
      56             : 
      57         496 :                 pos += snprintf(buf + pos, bufsize - pos,
      58             :                                 "insert into sys.types values"
      59             :                                 " (%d, '%s', '%s', %u, %u, %d, %d, %d);\n",
      60             :                                 t->base.id, t->impl, t->base.name, t->digits,
      61         496 :                                 t->scale, t->radix, (int) t->eclass,
      62         496 :                                 t->s ? t->s->base.id : s->base.id);
      63             :         }
      64             : 
      65             :         /* recreate internal functions */
      66          16 :         pos += snprintf(buf + pos, bufsize - pos,
      67             :                         "delete from sys.functions where id < 2000;\n"
      68             :                         "delete from sys.args where func_id not in"
      69             :                         " (select id from sys.functions);\n");
      70          16 :         sqlstore *store = sql->session->tr->store;
      71       15088 :         for (n = funcs->h; n; n = n->next) {
      72       15072 :                 sql_func *func = n->data;
      73       15072 :                 int number = 0;
      74       15072 :                 sql_arg *arg;
      75       15072 :                 node *m;
      76             : 
      77       15072 :                 if (func->private || func->base.id >= FUNC_OIDS)
      78        3664 :                         continue;
      79             : 
      80       22816 :                 pos += snprintf(buf + pos, bufsize - pos,
      81             :                                 "insert into sys.functions values"
      82             :                                 " (%d, '%s', '%s', '%s',"
      83             :                                 " %d, %d, %s, %s, %s, %d, %s, %s);\n",
      84             :                                 func->base.id, func->base.name,
      85             :                                 sql_func_imp(func), sql_func_mod(func), (int) FUNC_LANG_INT,
      86       11408 :                                 (int) func->type,
      87       11408 :                                 boolnames[func->side_effect],
      88       11408 :                                 boolnames[func->varres],
      89       11408 :                                 boolnames[func->vararg],
      90       11408 :                                 func->s ? func->s->base.id : s->base.id,
      91       11408 :                                 boolnames[func->system],
      92       11408 :                                 boolnames[func->semantics]);
      93       11408 :                 if (func->res) {
      94       22752 :                         for (m = func->res->h; m; m = m->next, number++) {
      95       11376 :                                 arg = m->data;
      96       11376 :                                 pos += snprintf(buf + pos, bufsize - pos,
      97             :                                                 "insert into sys.args"
      98             :                                                 " values"
      99             :                                                 " (%d, %d, 'res_%d',"
     100             :                                                 " '%s', %u, %u, %d,"
     101             :                                                 " %d);\n",
     102             :                                                 store_next_oid(store),
     103             :                                                 func->base.id,
     104             :                                                 number,
     105       11376 :                                                 arg->type.type->base.name,
     106             :                                                 arg->type.digits,
     107             :                                                 arg->type.scale,
     108       11376 :                                                 arg->inout, number);
     109             :                         }
     110             :                 }
     111       30400 :                 for (m = func->ops->h; m; m = m->next, number++) {
     112       18992 :                         arg = m->data;
     113       18992 :                         if (arg->name)
     114           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
     115             :                                                 "insert into sys.args"
     116             :                                                 " values"
     117             :                                                 " (%d, %d, '%s', '%s',"
     118             :                                                 " %u, %u, %d, %d);\n",
     119             :                                                 store_next_oid(store),
     120             :                                                 func->base.id,
     121             :                                                 arg->name,
     122           0 :                                                 arg->type.type->base.name,
     123             :                                                 arg->type.digits,
     124             :                                                 arg->type.scale,
     125           0 :                                                 arg->inout, number);
     126             :                         else
     127       18992 :                                 pos += snprintf(buf + pos, bufsize - pos,
     128             :                                                 "insert into sys.args"
     129             :                                                 " values"
     130             :                                                 " (%d, %d, 'arg_%d',"
     131             :                                                 " '%s', %u, %u, %d,"
     132             :                                                 " %d);\n",
     133             :                                                 store_next_oid(store),
     134             :                                                 func->base.id,
     135             :                                                 number,
     136       18992 :                                                 arg->type.type->base.name,
     137             :                                                 arg->type.digits,
     138             :                                                 arg->type.scale,
     139       18992 :                                                 arg->inout, number);
     140             :                 }
     141             :         }
     142             : 
     143          16 :         assert(pos < bufsize);
     144          16 :         printf("Running database upgrade commands to update system tables.\n\n");
     145          16 :         fflush(stdout);
     146          16 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
     147          16 :         GDKfree(buf);
     148          16 :         return err;             /* usually MAL_SUCCEED */
     149             : }
     150             : 
     151             : static str
     152         104 : check_sys_tables(Client c, mvc *m, sql_schema *s)
     153             : {
     154         104 :         struct {
     155             :                 const char *name;
     156             :                 const char *func;
     157             :                 const char *type;
     158             :                 sql_ftype ftype;
     159         104 :         } tests[] = {
     160             :                 /* tests a few internal functions: the last one created, the
     161             :                  * first one created, and one of the first ones created after
     162             :                  * the geom module */
     163             :                 { "quarter",           "quarter",       "date", F_FUNC, },
     164             :                 { "sys_update_tables", "update_tables", NULL,   F_PROC, },
     165             :                 { "length",            "nitems",        "blob", F_FUNC, },
     166             :                 { "isnull",            "isnil",         "void", F_FUNC, },
     167             :                 {0},
     168             :         };
     169         104 :         char *err;
     170             : 
     171             :         /* if any of the tested function's internal ID does not match the ID
     172             :          * in the sys.functions table, we recreate the internal part of the
     173             :          * system tables */
     174         456 :         for (int i = 0; tests[i].name; i++) {
     175         368 :                 bool needsystabfix = true;
     176         368 :                 sql_subtype tp, *tpp;
     177         368 :                 if (tests[i].type) {
     178         280 :                         sql_find_subtype(&tp, tests[i].type, 0, 0);
     179         280 :                         tpp = &tp;
     180             :                 } else {
     181             :                         tpp = NULL;
     182             :                 }
     183         368 :                 sql_subfunc *f = sql_bind_func(m, s->base.name, tests[i].name, tpp, NULL, tests[i].ftype, true, true);
     184         368 :                 if (f == NULL)
     185          16 :                         throw(SQL, __func__, "cannot find procedure sys.%s(%s)", tests[i].name, tests[i].type ? tests[i].type : "");
     186         368 :                 sqlid id = f->func->base.id;
     187         368 :                 char buf[256];
     188         368 :                 snprintf(buf, sizeof(buf),
     189             :                                  "select id from sys.functions where name = '%s' and func = '%s' and schema_id = 2000;\n",
     190             :                                  tests[i].name, tests[i].func);
     191         368 :                 res_table *output = NULL;
     192         368 :                 err = SQLstatementIntern(c, buf, "update", true, false, &output);
     193         368 :                 if (err)
     194           0 :                         return err;
     195         368 :                 BAT *b;
     196         368 :                 b = BATdescriptor(output->cols[0].b);
     197         368 :                 res_table_destroy(output);
     198         368 :                 if (b == NULL)
     199           0 :                         throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     200         368 :                 if (BATcount(b) > 0) {
     201         368 :                         BATiter bi = bat_iterator(b);
     202         368 :                         needsystabfix = * (int *) BUNtloc(bi, 0) != id;
     203         368 :                         bat_iterator_end(&bi);
     204             :                 }
     205         368 :                 BBPunfix(b->batCacheid);
     206         368 :                 if (i == 0 && !needsystabfix) {
     207          88 :                         snprintf(buf, sizeof(buf),
     208             :                                          "select a.type from sys.functions f join sys.args a on f.id = a.func_id where f.name = 'quarter' and f.schema_id = 2000 and a.inout = 0 and a.type = 'int';\n");
     209          88 :                         err = SQLstatementIntern(c, buf, "update", true, false, &output);
     210          88 :                         if (err)
     211           0 :                                 return err;
     212          88 :                         b = BATdescriptor(output->cols[0].b);
     213          88 :                         res_table_destroy(output);
     214          88 :                         if (b == NULL)
     215           0 :                                 throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     216          88 :                         needsystabfix = BATcount(b) > 0;
     217          88 :                         BBPunfix(b->batCacheid);
     218             :                 }
     219         368 :                 if (needsystabfix)
     220          16 :                         return sql_fix_system_tables(c, m);
     221             :         }
     222             :         return NULL;
     223             : }
     224             : 
     225             : #ifdef HAVE_HGE
     226             : static str
     227           8 : sql_update_hugeint(Client c, mvc *sql)
     228             : {
     229           8 :         size_t bufsize = 8192, pos = 0;
     230           8 :         char *buf, *err;
     231             : 
     232           8 :         (void) sql;
     233           8 :         if ((buf = GDKmalloc(bufsize)) == NULL)
     234           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     235             : 
     236             :         /* 90_generator_hge.sql */
     237           8 :         pos += snprintf(buf + pos, bufsize - pos,
     238             :                         "create function sys.generate_series(first hugeint, \"limit\" hugeint)\n"
     239             :                         "returns table (value hugeint)\n"
     240             :                         "external name generator.series;\n"
     241             :                         "create function sys.generate_series(first hugeint, \"limit\" hugeint, stepsize hugeint)\n"
     242             :                         "returns table (value hugeint)\n"
     243             :                         "external name generator.series;\n");
     244             : 
     245             :         /* 39_analytics_hge.sql */
     246           8 :         pos += snprintf(buf + pos, bufsize - pos,
     247             :                         "create aggregate stddev_samp(val HUGEINT) returns DOUBLE\n"
     248             :                         " external name \"aggr\".\"stdev\";\n"
     249             :                         "GRANT EXECUTE ON AGGREGATE stddev_samp(HUGEINT) TO PUBLIC;\n"
     250             :                         "create window stddev_samp(val HUGEINT) returns DOUBLE\n"
     251             :                         " external name \"sql\".\"stdev\";\n"
     252             :                         "GRANT EXECUTE ON WINDOW stddev_samp(HUGEINT) TO PUBLIC;\n"
     253             :                         "create aggregate stddev_pop(val HUGEINT) returns DOUBLE\n"
     254             :                         " external name \"aggr\".\"stdevp\";\n"
     255             :                         "GRANT EXECUTE ON AGGREGATE stddev_pop(HUGEINT) TO PUBLIC;\n"
     256             :                         "create window stddev_pop(val HUGEINT) returns DOUBLE\n"
     257             :                         " external name \"sql\".\"stdevp\";\n"
     258             :                         "GRANT EXECUTE ON WINDOW stddev_pop(HUGEINT) TO PUBLIC;\n"
     259             :                         "create aggregate var_samp(val HUGEINT) returns DOUBLE\n"
     260             :                         " external name \"aggr\".\"variance\";\n"
     261             :                         "GRANT EXECUTE ON AGGREGATE var_samp(HUGEINT) TO PUBLIC;\n"
     262             :                         "create window var_samp(val HUGEINT) returns DOUBLE\n"
     263             :                         " external name \"sql\".\"variance\";\n"
     264             :                         "GRANT EXECUTE ON WINDOW var_samp(HUGEINT) TO PUBLIC;\n"
     265             :                         "create aggregate covar_samp(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     266             :                         " external name \"aggr\".\"covariance\";\n"
     267             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(HUGEINT, HUGEINT) TO PUBLIC;\n"
     268             :                         "create window covar_samp(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     269             :                         " external name \"sql\".\"covariance\";\n"
     270             :                         "GRANT EXECUTE ON WINDOW covar_samp(HUGEINT, HUGEINT) TO PUBLIC;\n"
     271             :                         "create aggregate var_pop(val HUGEINT) returns DOUBLE\n"
     272             :                         " external name \"aggr\".\"variancep\";\n"
     273             :                         "GRANT EXECUTE ON AGGREGATE var_pop(HUGEINT) TO PUBLIC;\n"
     274             :                         "create window var_pop(val HUGEINT) returns DOUBLE\n"
     275             :                         " external name \"sql\".\"variancep\";\n"
     276             :                         "GRANT EXECUTE ON WINDOW var_pop(HUGEINT) TO PUBLIC;\n"
     277             :                         "create aggregate covar_pop(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     278             :                         " external name \"aggr\".\"covariancep\";\n"
     279             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(HUGEINT, HUGEINT) TO PUBLIC;\n"
     280             :                         "create window covar_pop(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     281             :                         " external name \"sql\".\"covariancep\";\n"
     282             :                         "GRANT EXECUTE ON WINDOW covar_pop(HUGEINT, HUGEINT) TO PUBLIC;\n"
     283             :                         "create aggregate median(val HUGEINT) returns HUGEINT\n"
     284             :                         " external name \"aggr\".\"median\";\n"
     285             :                         "GRANT EXECUTE ON AGGREGATE median(HUGEINT) TO PUBLIC;\n"
     286             :                         "create aggregate quantile(val HUGEINT, q DOUBLE) returns HUGEINT\n"
     287             :                         " external name \"aggr\".\"quantile\";\n"
     288             :                         "GRANT EXECUTE ON AGGREGATE quantile(HUGEINT, DOUBLE) TO PUBLIC;\n"
     289             :                         "create aggregate median_avg(val HUGEINT) returns DOUBLE\n"
     290             :                         " external name \"aggr\".\"median_avg\";\n"
     291             :                         "GRANT EXECUTE ON AGGREGATE median_avg(HUGEINT) TO PUBLIC;\n"
     292             :                         "create aggregate quantile_avg(val HUGEINT, q DOUBLE) returns DOUBLE\n"
     293             :                         " external name \"aggr\".\"quantile_avg\";\n"
     294             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(HUGEINT, DOUBLE) TO PUBLIC;\n"
     295             :                         "create aggregate corr(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     296             :                         " external name \"aggr\".\"corr\";\n"
     297             :                         "GRANT EXECUTE ON AGGREGATE corr(HUGEINT, HUGEINT) TO PUBLIC;\n"
     298             :                         "create window corr(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
     299             :                         " external name \"sql\".\"corr\";\n"
     300             :                         "GRANT EXECUTE ON WINDOW corr(HUGEINT, HUGEINT) TO PUBLIC;\n");
     301             : 
     302             :         /* 40_json_hge.sql */
     303           8 :         pos += snprintf(buf + pos, bufsize - pos,
     304             :                         "create function json.filter(js json, name hugeint)\n"
     305             :                         "returns json external name json.filter;\n"
     306             :                         "GRANT EXECUTE ON FUNCTION json.filter(json, hugeint) TO PUBLIC;\n");
     307             : 
     308           8 :         pos += snprintf(buf + pos, bufsize - pos,
     309             :                         "update sys.functions set system = true where system <> true and name in ('generate_series') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n"
     310             :                         "update sys.functions set system = true where system <> true and name in ('stddev_samp', 'stddev_pop', 'var_samp', 'covar_samp', 'var_pop', 'covar_pop', 'median', 'median_avg', 'quantile', 'quantile_avg', 'corr') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n"
     311             :                         "update sys.functions set system = true where system <> true and name in ('stddev_samp', 'stddev_pop', 'var_samp', 'covar_samp', 'var_pop', 'covar_pop', 'corr') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n"
     312             :                         "update sys.functions set system = true where system <> true and name = 'filter' and schema_id = (select id from sys.schemas where name = 'json') and type = %d;\n",
     313             :                         (int) F_UNION, (int) F_AGGR, (int) F_ANALYTIC, (int) F_FUNC);
     314             : 
     315           8 :         assert(pos < bufsize);
     316             : 
     317           8 :         printf("Running database upgrade commands:\n%s\n", buf);
     318           8 :         fflush(stdout);
     319           8 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
     320           8 :         GDKfree(buf);
     321           8 :         return err;             /* usually MAL_SUCCEED */
     322             : }
     323             : #endif
     324             : 
     325             : #ifdef HAVE_SHP
     326             : static str
     327           8 : sql_create_shp(Client c)
     328             : {
     329             :         //Create the new SHPload procedures
     330           8 :         const char *query = "create procedure SHPLoad(fname string, schemaname string, tablename string) external name shp.load;\n"
     331             :                 "create procedure SHPLoad(fname string, tablename string) external name shp.load;\n"
     332             :                 "update sys.functions set system = true where schema_id = 2000 and name in ('shpload');";
     333           8 :         printf("Running database upgrade commands:\n%s\n", query);
     334           8 :         fflush(stdout);
     335           8 :         return SQLstatementIntern(c, query, "update", true, false, NULL);
     336             : }
     337             : #endif
     338             : 
     339             : static str
     340           8 : sql_drop_shp(Client c)
     341             : {
     342             :         //Drop the old SHP procedures (upgrade from version before shpload upgrade)
     343           8 :         const char *query = "drop procedure if exists SHPattach(string) cascade;\n"
     344             :                 "drop procedure if exists SHPload(integer) cascade;\n"
     345             :                 "drop procedure if exists SHPload(integer, geometry) cascade;\n";
     346           8 :         printf("Running database upgrade commands:\n%s\n", query);
     347           8 :         fflush(stdout);
     348           8 :         return SQLstatementIntern(c, query, "update", true, false, NULL);
     349             : }
     350             : 
     351             : static str
     352         104 : sql_update_generator(Client c)
     353             : {
     354         104 :         const char *query = "update sys.args set name = 'limit' where name = 'last' and func_id in (select id from sys.functions where schema_id = 2000 and name = 'generate_series' and func like '% last %');\n"
     355             :                 "update sys.functions set func = replace(func, ' last ', ' \"limit\" ') where schema_id = 2000 and name = 'generate_series' and func like '% last %';\n";
     356         104 :         return SQLstatementIntern(c, query, "update", true, false, NULL);
     357             : }
     358             : 
     359             : static str
     360           0 : sql_drop_functions_dependencies_Xs_on_Ys(Client c)
     361             : {
     362           0 :         size_t bufsize = 1600, pos = 0;
     363           0 :         char *err = NULL, *buf = GDKmalloc(bufsize);
     364             : 
     365           0 :         if (buf == NULL)
     366           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     367             : 
     368             :         /* remove functions which were created in sql/scripts/21_dependency_functions.sql */
     369           0 :         pos += snprintf(buf + pos, bufsize - pos,
     370             :                         "DROP FUNCTION dependencies_schemas_on_users() CASCADE;\n"
     371             :                         "DROP FUNCTION dependencies_owners_on_schemas() CASCADE;\n"
     372             :                         "DROP FUNCTION dependencies_tables_on_views() CASCADE;\n"
     373             :                         "DROP FUNCTION dependencies_tables_on_indexes() CASCADE;\n"
     374             :                         "DROP FUNCTION dependencies_tables_on_triggers() CASCADE;\n"
     375             :                         "DROP FUNCTION dependencies_tables_on_foreignKeys() CASCADE;\n"
     376             :                         "DROP FUNCTION dependencies_tables_on_functions() CASCADE;\n"
     377             :                         "DROP FUNCTION dependencies_columns_on_views() CASCADE;\n"
     378             :                         "DROP FUNCTION dependencies_columns_on_keys() CASCADE;\n"
     379             :                         "DROP FUNCTION dependencies_columns_on_indexes() CASCADE;\n"
     380             :                         "DROP FUNCTION dependencies_columns_on_functions() CASCADE;\n"
     381             :                         "DROP FUNCTION dependencies_columns_on_triggers() CASCADE;\n"
     382             :                         "DROP FUNCTION dependencies_views_on_functions() CASCADE;\n"
     383             :                         "DROP FUNCTION dependencies_views_on_triggers() CASCADE;\n"
     384             :                         "DROP FUNCTION dependencies_functions_on_functions() CASCADE;\n"
     385             :                         "DROP FUNCTION dependencies_functions_on_triggers() CASCADE;\n"
     386             :                         "DROP FUNCTION dependencies_keys_on_foreignKeys() CASCADE;\n");
     387             : 
     388           0 :         assert(pos < bufsize);
     389             : 
     390           0 :         printf("Running database upgrade commands:\n%s\n", buf);
     391           0 :         fflush(stdout);
     392           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
     393           0 :         GDKfree(buf);
     394           0 :         return err;             /* usually MAL_SUCCEED */
     395             : }
     396             : 
     397             : static str
     398           0 : sql_update_storagemodel(Client c, mvc *sql, bool oct2020_upgrade)
     399             : {
     400           0 :         size_t bufsize = 20000, pos = 0;
     401           0 :         char *buf, *err;
     402           0 :         sql_schema *s = mvc_bind_schema(sql, "sys");
     403           0 :         sql_table *t;
     404           0 :         char *day_interval_str = oct2020_upgrade ? " 'day_interval'," : "";
     405             : 
     406           0 :         if ((buf = GDKmalloc(bufsize)) == NULL)
     407           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     408             : 
     409             :         /* set views and tables internally to non-system to allow drop commands to succeed without error */
     410           0 :         if ((t = mvc_bind_table(sql, s, "storage")) != NULL)
     411           0 :                 t->system = 0;
     412           0 :         if ((t = mvc_bind_table(sql, s, "storagemodel")) != NULL)
     413           0 :                 t->system = 0;
     414           0 :         if ((t = mvc_bind_table(sql, s, "storagemodelinput")) != NULL)
     415           0 :                 t->system = 0;
     416           0 :         if ((t = mvc_bind_table(sql, s, "tablestoragemodel")) != NULL)
     417           0 :                 t->system = 0;
     418             : 
     419             :         /* new 75_storagemodel.sql */
     420           0 :         pos += snprintf(buf + pos, bufsize - pos,
     421             :                 /* drop objects in reverse order of original creation of old 75_storagemodel.sql */
     422             :                 "drop view if exists sys.tablestoragemodel cascade;\n"
     423             :                 "drop view if exists sys.storagemodel cascade;\n"
     424             :                 "drop function if exists sys.storagemodel() cascade;\n");
     425             : 
     426           0 :         if (oct2020_upgrade) {
     427           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     428             :                         "drop function if exists sys.imprintsize(varchar(1024), bigint) cascade;\n");
     429             :         } else {
     430           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     431             :                         "drop function if exists sys.imprintsize(bigint, clob) cascade;\n");
     432             :         }
     433             : 
     434           0 :         pos += snprintf(buf + pos, bufsize - pos,
     435             :                 "drop function if exists sys.hashsize(boolean, bigint) cascade;\n");
     436             : 
     437           0 :         if (oct2020_upgrade) {
     438           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     439             :                         "drop function if exists sys.columnsize(varchar(1024), bigint) cascade;\n"
     440             :                         "drop function if exists sys.heapsize(varchar(1024), bigint, bigint, int) cascade;\n");
     441             :         } else {
     442           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     443             :                         "drop function if exists sys.columnsize(clob, bigint, bigint) cascade;\n"
     444             :                         "drop function if exists sys.heapsize(clob, bigint, int) cascade;\n");
     445             :         }
     446             : 
     447           0 :         pos += snprintf(buf + pos, bufsize - pos,
     448             :                 "drop procedure if exists sys.storagemodelinit() cascade;\n"
     449             :                 "drop table if exists sys.storagemodelinput cascade;\n"
     450             :                 "drop view if exists sys.\"storage\" cascade;\n");
     451             : 
     452           0 :         if (oct2020_upgrade) {
     453           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     454             :                         "drop function if exists sys.\"storage\"(varchar(1024), varchar(1024), varchar(1024)) cascade;\n"
     455             :                         "drop function if exists sys.\"storage\"(varchar(1024), varchar(1024)) cascade;\n"
     456             :                         "drop function if exists sys.\"storage\"(varchar(1024)) cascade;\n");
     457             :         } else {
     458           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     459             :                         "drop function if exists sys.\"storage\"(clob, clob, clob) cascade;\n"
     460             :                         "drop function if exists sys.\"storage\"(clob, clob) cascade;\n"
     461             :                         "drop function if exists sys.\"storage\"(clob) cascade;\n");
     462             :         }
     463             : 
     464             :         /* new 75_storagemodel.sql */
     465           0 :         pos += snprintf(buf + pos, bufsize - pos,
     466             :                 "drop function if exists sys.\"storage\"() cascade;\n"
     467             :                 "create function sys.\"storage\"()\n"
     468             :                 "returns table (\n"
     469             :                 "  \"schema\" varchar(1024),\n"
     470             :                 "  \"table\" varchar(1024),\n"
     471             :                 "  \"column\" varchar(1024),\n"
     472             :                 "  \"type\" varchar(1024),\n"
     473             :                 "  \"mode\" varchar(15),\n"
     474             :                 "  location varchar(1024),\n"
     475             :                 "  \"count\" bigint,\n"
     476             :                 "  typewidth int,\n"
     477             :                 "  columnsize bigint,\n"
     478             :                 "  heapsize bigint,\n"
     479             :                 "  hashes bigint,\n"
     480             :                 "  phash boolean,\n"
     481             :                 "  \"imprints\" bigint,\n"
     482             :                 "  sorted boolean,\n"
     483             :                 "  revsorted boolean,\n"
     484             :                 "  \"unique\" boolean,\n"
     485             :                 "  orderidx bigint\n"
     486             :                 ")\n"
     487             :                 "external name sql.\"storage\";\n"
     488             :                 "create view sys.\"storage\" as\n"
     489             :                 "select * from sys.\"storage\"()\n"
     490             :                 " where (\"schema\", \"table\") in (\n"
     491             :                 "  SELECT sch.\"name\", tbl.\"name\"\n"
     492             :                 "    FROM sys.\"tables\" AS tbl JOIN sys.\"schemas\" AS sch ON tbl.schema_id = sch.id\n"
     493             :                 "   WHERE tbl.\"system\" = FALSE)\n"
     494             :                 "order by \"schema\", \"table\", \"column\";\n"
     495             :                 "create view sys.\"tablestorage\" as\n"
     496             :                 "select \"schema\", \"table\",\n"
     497             :                 "  max(\"count\") as \"rowcount\",\n"
     498             :                 "  count(*) as \"storages\",\n"
     499             :                 "  sum(columnsize) as columnsize,\n"
     500             :                 "  sum(heapsize) as heapsize,\n"
     501             :                 "  sum(hashes) as hashsize,\n"
     502             :                 "  sum(\"imprints\") as imprintsize,\n"
     503             :                 "  sum(orderidx) as orderidxsize\n"
     504             :                 " from sys.\"storage\"\n"
     505             :                 "group by \"schema\", \"table\"\n"
     506             :                 "order by \"schema\", \"table\";\n"
     507             :                 "create view sys.\"schemastorage\" as\n"
     508             :                 "select \"schema\",\n"
     509             :                 "  count(*) as \"storages\",\n"
     510             :                 "  sum(columnsize) as columnsize,\n"
     511             :                 "  sum(heapsize) as heapsize,\n"
     512             :                 "  sum(hashes) as hashsize,\n"
     513             :                 "  sum(\"imprints\") as imprintsize,\n"
     514             :                 "  sum(orderidx) as orderidxsize\n"
     515             :                 " from sys.\"storage\"\n"
     516             :                 "group by \"schema\"\n"
     517             :                 "order by \"schema\";\n"
     518             :                 "create function sys.\"storage\"(sname varchar(1024))\n"
     519             :                 "returns table (\n"
     520             :                 "  \"schema\" varchar(1024),\n"
     521             :                 "  \"table\" varchar(1024),\n"
     522             :                 "  \"column\" varchar(1024),\n"
     523             :                 "  \"type\" varchar(1024),\n"
     524             :                 "  \"mode\" varchar(15),\n"
     525             :                 "  location varchar(1024),\n"
     526             :                 "  \"count\" bigint,\n"
     527             :                 "  typewidth int,\n"
     528             :                 "  columnsize bigint,\n"
     529             :                 "  heapsize bigint,\n"
     530             :                 "  hashes bigint,\n"
     531             :                 "  phash boolean,\n"
     532             :                 "  \"imprints\" bigint,\n"
     533             :                 "  sorted boolean,\n"
     534             :                 "  revsorted boolean,\n"
     535             :                 "  \"unique\" boolean,\n"
     536             :                 "  orderidx bigint\n"
     537             :                 ")\n"
     538             :                 "external name sql.\"storage\";\n"
     539             :                 "create function sys.\"storage\"(sname varchar(1024), tname varchar(1024))\n"
     540             :                 "returns table (\n"
     541             :                 "  \"schema\" varchar(1024),\n"
     542             :                 "  \"table\" varchar(1024),\n"
     543             :                 "  \"column\" varchar(1024),\n"
     544             :                 "  \"type\" varchar(1024),\n"
     545             :                 "  \"mode\" varchar(15),\n"
     546             :                 "  location varchar(1024),\n"
     547             :                 "  \"count\" bigint,\n"
     548             :                 "  typewidth int,\n"
     549             :                 "  columnsize bigint,\n"
     550             :                 "  heapsize bigint,\n"
     551             :                 "  hashes bigint,\n"
     552             :                 "  phash boolean,\n"
     553             :                 "  \"imprints\" bigint,\n"
     554             :                 "  sorted boolean,\n"
     555             :                 "  revsorted boolean,\n"
     556             :                 "  \"unique\" boolean,\n"
     557             :                 "  orderidx bigint\n"
     558             :                 ")\n"
     559             :                 "external name sql.\"storage\";\n"
     560             :                 "create function sys.\"storage\"(sname varchar(1024), tname varchar(1024), cname varchar(1024))\n"
     561             :                 "returns table (\n"
     562             :                 "  \"schema\" varchar(1024),\n"
     563             :                 "  \"table\" varchar(1024),\n"
     564             :                 "  \"column\" varchar(1024),\n"
     565             :                 "  \"type\" varchar(1024),\n"
     566             :                 "  \"mode\" varchar(15),\n"
     567             :                 "  location varchar(1024),\n"
     568             :                 "  \"count\" bigint,\n"
     569             :                 "  typewidth int,\n"
     570             :                 "  columnsize bigint,\n"
     571             :                 "  heapsize bigint,\n"
     572             :                 "  hashes bigint,\n"
     573             :                 "  phash boolean,\n"
     574             :                 "  \"imprints\" bigint,\n"
     575             :                 "  sorted boolean,\n"
     576             :                 "  revsorted boolean,\n"
     577             :                 "  \"unique\" boolean,\n"
     578             :                 "  orderidx bigint\n"
     579             :                 ")\n"
     580             :                 "external name sql.\"storage\";\n"
     581             :                 "create table sys.storagemodelinput(\n"
     582             :                 "  \"schema\" varchar(1024) NOT NULL,\n"
     583             :                 "  \"table\" varchar(1024) NOT NULL,\n"
     584             :                 "  \"column\" varchar(1024) NOT NULL,\n"
     585             :                 "  \"type\" varchar(1024) NOT NULL,\n"
     586             :                 "  typewidth int NOT NULL,\n"
     587             :                 "  \"count\" bigint NOT NULL,\n"
     588             :                 "  \"distinct\" bigint NOT NULL,\n"
     589             :                 "  atomwidth int NOT NULL,\n"
     590             :                 "  reference boolean NOT NULL DEFAULT FALSE,\n"
     591             :                 "  sorted boolean,\n"
     592             :                 "  \"unique\" boolean,\n"
     593             :                 "  isacolumn boolean NOT NULL DEFAULT TRUE\n"
     594             :                 ");\n"
     595             :                 "create procedure sys.storagemodelinit()\n"
     596             :                 "begin\n"
     597             :                 "  delete from sys.storagemodelinput;\n"
     598             :                 "  insert into sys.storagemodelinput\n"
     599             :                 "  select \"schema\", \"table\", \"column\", \"type\", typewidth, \"count\",\n"
     600             :                 "          case when (\"unique\" or \"type\" IN ('varchar', 'char', 'clob', 'json', 'url', 'blob', 'geometry', 'geometrya'))\n"
     601             :                 "                  then \"count\" else 0 end,\n"
     602             :                 "          case when \"count\" > 0 and heapsize >= 8192 and \"type\" in ('varchar', 'char', 'clob', 'json', 'url')\n"
     603             :                 "                  then cast((heapsize - 8192) / \"count\" as bigint)\n"
     604             :                 "          when \"count\" > 0 and heapsize >= 32 and \"type\" in ('blob', 'geometry', 'geometrya')\n"
     605             :                 "                  then cast((heapsize - 32) / \"count\" as bigint)\n"
     606             :                 "          else typewidth end,\n"
     607             :                 "          FALSE, case sorted when true then true else false end, \"unique\", TRUE\n"
     608             :                 "    from sys.\"storage\";\n"
     609             :                 "  update sys.storagemodelinput\n"
     610             :                 "     set reference = TRUE\n"
     611             :                 "   where (\"schema\", \"table\", \"column\") in (\n"
     612             :                 "          SELECT fkschema.\"name\", fktable.\"name\", fkkeycol.\"name\"\n"
     613             :                 "            FROM  sys.\"keys\" AS fkkey,\n"
     614             :                 "                  sys.\"objects\" AS fkkeycol,\n"
     615             :                 "                  sys.\"tables\" AS fktable,\n"
     616             :                 "                  sys.\"schemas\" AS fkschema\n"
     617             :                 "          WHERE fktable.\"id\" = fkkey.\"table_id\"\n"
     618             :                 "            AND fkkey.\"id\" = fkkeycol.\"id\"\n"
     619             :                 "            AND fkschema.\"id\" = fktable.\"schema_id\"\n"
     620             :                 "            AND fkkey.\"rkey\" > -1 );\n"
     621             :                 "  update sys.storagemodelinput\n"
     622             :                 "     set isacolumn = FALSE\n"
     623             :                 "   where (\"schema\", \"table\", \"column\") NOT in (\n"
     624             :                 "          SELECT sch.\"name\", tbl.\"name\", col.\"name\"\n"
     625             :                 "            FROM sys.\"schemas\" AS sch,\n"
     626             :                 "                  sys.\"tables\" AS tbl,\n"
     627             :                 "                  sys.\"columns\" AS col\n"
     628             :                 "          WHERE sch.\"id\" = tbl.\"schema_id\"\n"
     629             :                 "            AND tbl.\"id\" = col.\"table_id\");\n"
     630             :                 "end;\n"
     631             :                 "create function sys.columnsize(tpe varchar(1024), count bigint)\n"
     632             :                 "returns bigint\n"
     633             :                 "begin\n"
     634             :                 "  if tpe in ('tinyint', 'boolean')\n"
     635             :                 "          then return count;\n"
     636             :                 "  end if;\n"
     637             :                 "  if tpe = 'smallint'\n"
     638             :                 "          then return 2 * count;\n"
     639             :                 "  end if;\n"
     640             :                 "  if tpe in ('int', 'real', 'date', 'time', 'timetz', 'sec_interval',%s 'month_interval')\n"
     641             :                 "          then return 4 * count;\n"
     642             :                 "  end if;\n"
     643             :                 "  if tpe in ('bigint', 'double', 'timestamp', 'timestamptz', 'inet', 'oid')\n"
     644             :                 "          then return 8 * count;\n"
     645             :                 "  end if;\n"
     646             :                 "  if tpe in ('hugeint', 'decimal', 'uuid', 'mbr')\n"
     647             :                 "          then return 16 * count;\n"
     648             :                 "  end if;\n"
     649             :                 "  if tpe in ('varchar', 'char', 'clob', 'json', 'url')\n"
     650             :                 "          then return 4 * count;\n"
     651             :                 "  end if;\n"
     652             :                 "  if tpe in ('blob', 'geometry', 'geometrya')\n"
     653             :                 "          then return 8 * count;\n"
     654             :                 "  end if;\n"
     655             :                 "  return 8 * count;\n"
     656             :                 "end;\n"
     657             :                 "create function sys.heapsize(tpe varchar(1024), count bigint, distincts bigint, avgwidth int)\n"
     658             :                 "returns bigint\n"
     659             :                 "begin\n"
     660             :                 "  if tpe in ('varchar', 'char', 'clob', 'json', 'url')\n"
     661             :                 "          then return 8192 + ((avgwidth + 8) * distincts);\n"
     662             :                 "  end if;\n"
     663             :                 "  if tpe in ('blob', 'geometry', 'geometrya')\n"
     664             :                 "          then return 32 + (avgwidth * count);\n"
     665             :                 "  end if;\n"
     666             :                 "  return 0;\n"
     667             :                 "end;\n"
     668             :                 "create function sys.hashsize(b boolean, count bigint)\n"
     669             :                 "returns bigint\n"
     670             :                 "begin\n"
     671             :                 "  if b = true\n"
     672             :                 "          then return 8 * count;\n"
     673             :                 "  end if;\n"
     674             :                 "  return 0;\n"
     675             :                 "end;\n"
     676             :                 "create function sys.imprintsize(tpe varchar(1024), count bigint)\n"
     677             :                 "returns bigint\n"
     678             :                 "begin\n"
     679             :                 "  if tpe in ('tinyint', 'boolean')\n"
     680             :                 "          then return cast(0.2 * count as bigint);\n"
     681             :                 "  end if;\n"
     682             :                 "  if tpe = 'smallint'\n"
     683             :                 "          then return cast(0.4 * count as bigint);\n"
     684             :                 "  end if;\n"
     685             :                 "  if tpe in ('int', 'real', 'date', 'time', 'timetz', 'sec_interval',%s 'month_interval')\n"
     686             :                 "          then return cast(0.8 * count as bigint);\n"
     687             :                 "  end if;\n"
     688             :                 "  if tpe in ('bigint', 'double', 'timestamp', 'timestamptz', 'inet', 'oid')\n"
     689             :                 "          then return cast(1.6 * count as bigint);\n"
     690             :                 "  end if;\n"
     691             :                 "  if tpe in ('hugeint', 'decimal', 'uuid', 'mbr')\n"
     692             :                 "          then return cast(3.2 * count as bigint);\n"
     693             :                 "  end if;\n"
     694             :                 "  return 0;\n"
     695             :                 "end;\n"
     696             :                 "create view sys.storagemodel as\n"
     697             :                 "select \"schema\", \"table\", \"column\", \"type\", \"count\",\n"
     698             :                 "  sys.columnsize(\"type\", \"count\") as columnsize,\n"
     699             :                 "  sys.heapsize(\"type\", \"count\", \"distinct\", \"atomwidth\") as heapsize,\n"
     700             :                 "  sys.hashsize(\"reference\", \"count\") as hashsize,\n"
     701             :                 "  case when isacolumn then sys.imprintsize(\"type\", \"count\") else 0 end as imprintsize,\n"
     702             :                 "  case when (isacolumn and not sorted) then cast(8 * \"count\" as bigint) else 0 end as orderidxsize,\n"
     703             :                 "  sorted, \"unique\", isacolumn\n"
     704             :                 " from sys.storagemodelinput\n"
     705             :                 "order by \"schema\", \"table\", \"column\";\n"
     706             :                 "create view sys.tablestoragemodel as\n"
     707             :                 "select \"schema\", \"table\",\n"
     708             :                 "  max(\"count\") as \"rowcount\",\n"
     709             :                 "  count(*) as \"storages\",\n"
     710             :                 "  sum(sys.columnsize(\"type\", \"count\")) as columnsize,\n"
     711             :                 "  sum(sys.heapsize(\"type\", \"count\", \"distinct\", \"atomwidth\")) as heapsize,\n"
     712             :                 "  sum(sys.hashsize(\"reference\", \"count\")) as hashsize,\n"
     713             :                 "  sum(case when isacolumn then sys.imprintsize(\"type\", \"count\") else 0 end) as imprintsize,\n"
     714             :                 "  sum(case when (isacolumn and not sorted) then cast(8 * \"count\" as bigint) else 0 end) as orderidxsize\n"
     715             :                 " from sys.storagemodelinput\n"
     716             :                 "group by \"schema\", \"table\"\n"
     717             :                 "order by \"schema\", \"table\";\n", day_interval_str, day_interval_str);
     718           0 :         assert(pos < bufsize);
     719             : 
     720           0 :         pos += snprintf(buf + pos, bufsize - pos,
     721             :                 "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
     722             :                 " and name in ('storage', 'tablestorage', 'schemastorage', 'storagemodelinput', 'storagemodel', 'tablestoragemodel');\n");
     723           0 :         pos += snprintf(buf + pos, bufsize - pos,
     724             :                 "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
     725             :                 " and name in ('storage') and type = %d;\n", (int) F_UNION);
     726           0 :         pos += snprintf(buf + pos, bufsize - pos,
     727             :                 "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
     728             :                 " and name in ('storagemodelinit') and type = %d;\n", (int) F_PROC);
     729           0 :         pos += snprintf(buf + pos, bufsize - pos,
     730             :                 "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
     731             :                 " and name in ('columnsize', 'heapsize', 'hashsize', 'imprintsize') and type = %d;\n", (int) F_FUNC);
     732             : 
     733           0 :         assert(pos < bufsize);
     734             : 
     735           0 :         printf("Running database upgrade commands:\n%s\n", buf);
     736           0 :         fflush(stdout);
     737           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
     738           0 :         GDKfree(buf);
     739           0 :         return err;             /* usually MAL_SUCCEED */
     740             : }
     741             : 
     742             : #define FLUSH_INSERTS_IF_BUFFERFILLED                                                                   \
     743             :         do {                                                                                                                            \
     744             :                 /* Each new value should add about 20 bytes to the buffer, */   \
     745             :                 /* "flush" when is 200 bytes from being full */                                       \
     746             :                 if (pos > 7900) {                                                                                            \
     747             :                         pos += snprintf(buf + pos, bufsize - pos,                                       \
     748             :                                                         ") as t1(c1,c2,c3) where t1.c1 not in (select \"id\" from sys.dependencies where depend_id = t1.c2);\n"); \
     749             :                         assert(pos < bufsize);                                                                               \
     750             :                         printf("Running database upgrade commands:\n%s\n", buf);      \
     751             :                         fflush(stdout);                                                                                         \
     752             :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL); \
     753             :                         if (err)                                                                                                        \
     754             :                                 goto bailout;                                                                                   \
     755             :                         pos = 0;                                                                                                        \
     756             :                         pos += snprintf(buf + pos, bufsize - pos, "insert into sys.dependencies select c1, c2, c3 from (values"); \
     757             :                         ppos = pos;                                                                                                     \
     758             :                         first = true;                                                                                           \
     759             :                 }                                                                                                                               \
     760             :         } while (0)
     761             : 
     762             : static str
     763           0 : sql_update_nov2019_missing_dependencies(Client c, mvc *sql)
     764             : {
     765           0 :         size_t bufsize = 8192, pos = 0, ppos;
     766           0 :         char *err = NULL, *buf = GDKmalloc(bufsize);
     767           0 :         allocator *old_sa = sql->sa;
     768           0 :         bool first = true;
     769           0 :         sql_trans *tr = sql->session->tr;
     770           0 :         struct os_iter si;
     771             : 
     772           0 :         if (buf == NULL)
     773           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     774             : 
     775           0 :         if (!(sql->sa = sa_create(sql->pa))) {
     776           0 :                 err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     777           0 :                 goto bailout;
     778             :         }
     779             : 
     780           0 :         pos += snprintf(buf + pos, bufsize - pos, "insert into sys.dependencies select c1, c2, c3 from (values");
     781           0 :         ppos = pos; /* later check if found updatable database objects */
     782             : 
     783           0 :         os_iterator(&si, sql->session->tr->cat->schemas, sql->session->tr, NULL);
     784           0 :         for (sql_base *b = oi_next(&si); b; b = oi_next(&si)) {
     785           0 :                 sql_schema *s = (sql_schema*)b;
     786             : 
     787           0 :                 struct os_iter oi;
     788           0 :                 os_iterator(&oi, s->funcs, sql->session->tr, NULL);
     789           0 :                 for (sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
     790           0 :                         sql_func *f = (sql_func*)b;
     791             : 
     792           0 :                         if (f->query && f->lang == FUNC_LANG_SQL) {
     793           0 :                                 char *relt;
     794           0 :                                 sql_rel *r = NULL;
     795             : 
     796           0 :                                 if (!(relt = sa_strdup(sql->sa, f->query))) {
     797           0 :                                         err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     798           0 :                                         goto bailout;
     799             :                                 }
     800             : 
     801           0 :                                 r = rel_parse(sql, s, relt, m_deps);
     802           0 :                                 if (r)
     803           0 :                                         r = sql_processrelation(sql, r, 0, 0, 0, 0);
     804           0 :                                 if (r) {
     805           0 :                                         list *id_l = rel_dependencies(sql, r);
     806             : 
     807           0 :                                         for (node *o = id_l->h ; o ; o = o->next) {
     808           0 :                                                 sqlid next = ((sql_base*) o->data)->id;
     809           0 :                                                 if (next != f->base.id) {
     810           0 :                                                         pos += snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
     811           0 :                                                                                         f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY));
     812           0 :                                                         first = false;
     813           0 :                                                         FLUSH_INSERTS_IF_BUFFERFILLED;
     814             :                                                 }
     815             :                                         }
     816           0 :                                 } else if (sql->session->status == -1) {
     817           0 :                                         sql->session->status = 0;
     818           0 :                                         sql->errstr[0] = 0;
     819             :                                 }
     820             :                         }
     821             :                 }
     822           0 :                 if (s->tables) {
     823           0 :                         struct os_iter oi;
     824           0 :                         os_iterator(&oi, s->tables, tr, NULL);
     825           0 :                         for (sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
     826           0 :                                 sql_table *t = (sql_table*) b;
     827             : 
     828           0 :                                 if (t->query && isView(t)) {
     829           0 :                                         char *relt;
     830           0 :                                         sql_rel *r = NULL;
     831             : 
     832           0 :                                         if (!(relt = sa_strdup(sql->sa, t->query))) {
     833           0 :                                                 err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     834           0 :                                                 goto bailout;
     835             :                                         }
     836             : 
     837           0 :                                         r = rel_parse(sql, s, relt, m_deps);
     838           0 :                                         if (r)
     839           0 :                                                 r = sql_processrelation(sql, r, 0, 0, 0, 0);
     840           0 :                                         if (r) {
     841           0 :                                                 list *id_l = rel_dependencies(sql, r);
     842             : 
     843           0 :                                                 for (node *o = id_l->h ; o ; o = o->next) {
     844           0 :                                                         sqlid next = ((sql_base*) o->data)->id;
     845           0 :                                                         if (next != t->base.id) {
     846           0 :                                                                 pos += snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
     847             :                                                                                                 next, t->base.id, (int) VIEW_DEPENDENCY);
     848           0 :                                                                 first = false;
     849           0 :                                                                 FLUSH_INSERTS_IF_BUFFERFILLED;
     850             :                                                         }
     851             :                                                 }
     852             :                                         }
     853             :                                 }
     854           0 :                                 if (t->triggers)
     855           0 :                                         for (node *mm = ol_first_node(t->triggers); mm; mm = mm->next) {
     856           0 :                                                 sql_trigger *tr = (sql_trigger*) mm->data;
     857           0 :                                                 char *relt;
     858           0 :                                                 sql_rel *r = NULL;
     859             : 
     860           0 :                                                 if (!(relt = sa_strdup(sql->sa, tr->statement))) {
     861           0 :                                                         err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
     862           0 :                                                         goto bailout;
     863             :                                                 }
     864             : 
     865           0 :                                                 r = rel_parse(sql, s, relt, m_deps);
     866           0 :                                                 if (r)
     867           0 :                                                         r = sql_processrelation(sql, r, 0, 0, 0, 0);
     868           0 :                                                 if (r) {
     869           0 :                                                         list *id_l = rel_dependencies(sql, r);
     870             : 
     871           0 :                                                         for (node *o = id_l->h ; o ; o = o->next) {
     872           0 :                                                                 sqlid next = ((sql_base*) o->data)->id;
     873           0 :                                                                 if (next != tr->base.id) {
     874           0 :                                                                         pos += snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
     875             :                                                                                                         next, tr->base.id, (int) TRIGGER_DEPENDENCY);
     876           0 :                                                                         first = false;
     877           0 :                                                                         FLUSH_INSERTS_IF_BUFFERFILLED;
     878             :                                                                 }
     879             :                                                         }
     880             :                                                 }
     881             :                                         }
     882             :                         }
     883             :                 }
     884             :         }
     885             : 
     886           0 :         if (ppos != pos) { /* found updatable functions */
     887           0 :                 pos += snprintf(buf + pos, bufsize - pos,
     888             :                                                 ") as t1(c1,c2,c3) where t1.c1 not in (select \"id\" from sys.dependencies where depend_id = t1.c2);\n");
     889             : 
     890           0 :                 assert(pos < bufsize);
     891           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
     892           0 :                 fflush(stdout);
     893           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
     894             :         }
     895             : 
     896           0 : bailout:
     897           0 :         if (sql->sa)
     898           0 :                 sa_destroy(sql->sa);
     899           0 :         sql->sa = old_sa;
     900           0 :         GDKfree(buf);
     901           0 :         return err;
     902             : }
     903             : 
     904             : static str
     905           0 : sql_update_nov2019(Client c, mvc *sql)
     906             : {
     907           0 :         size_t bufsize = 16384, pos = 0;
     908           0 :         char *err = NULL, *buf = GDKmalloc(bufsize);
     909             : 
     910           0 :         (void) sql;
     911           0 :         if (buf == NULL)
     912           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     913             : 
     914           0 :         pos += snprintf(buf + pos, bufsize - pos,
     915             :                         "create function sys.deltas (\"schema\" string)"
     916             :                         " returns table (\"id\" int, \"cleared\" boolean, \"immutable\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)"
     917             :                         " external name \"sql\".\"deltas\";\n"
     918             :                         "create function sys.deltas (\"schema\" string, \"table\" string)"
     919             :                         " returns table (\"id\" int, \"cleared\" boolean, \"immutable\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)"
     920             :                         " external name \"sql\".\"deltas\";\n"
     921             :                         "create function sys.deltas (\"schema\" string, \"table\" string, \"column\" string)"
     922             :                         " returns table (\"id\" int, \"cleared\" boolean, \"immutable\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)"
     923             :                         " external name \"sql\".\"deltas\";\n"
     924             :                         "create aggregate median_avg(val TINYINT) returns DOUBLE\n"
     925             :                         " external name \"aggr\".\"median_avg\";\n"
     926             :                         "GRANT EXECUTE ON AGGREGATE median_avg(TINYINT) TO PUBLIC;\n"
     927             :                         "create aggregate median_avg(val SMALLINT) returns DOUBLE\n"
     928             :                         " external name \"aggr\".\"median_avg\";\n"
     929             :                         "GRANT EXECUTE ON AGGREGATE median_avg(SMALLINT) TO PUBLIC;\n"
     930             :                         "create aggregate median_avg(val INTEGER) returns DOUBLE\n"
     931             :                         " external name \"aggr\".\"median_avg\";\n"
     932             :                         "GRANT EXECUTE ON AGGREGATE median_avg(INTEGER) TO PUBLIC;\n"
     933             :                         "create aggregate median_avg(val BIGINT) returns DOUBLE\n"
     934             :                         " external name \"aggr\".\"median_avg\";\n"
     935             :                         "GRANT EXECUTE ON AGGREGATE median_avg(BIGINT) TO PUBLIC;\n"
     936             :                         "create aggregate median_avg(val DECIMAL) returns DOUBLE\n"
     937             :                         " external name \"aggr\".\"median_avg\";\n"
     938             :                         "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL) TO PUBLIC;\n"
     939             :                         "create aggregate median_avg(val REAL) returns DOUBLE\n"
     940             :                         " external name \"aggr\".\"median_avg\";\n"
     941             :                         "GRANT EXECUTE ON AGGREGATE median_avg(REAL) TO PUBLIC;\n"
     942             :                         "create aggregate median_avg(val DOUBLE) returns DOUBLE\n"
     943             :                         " external name \"aggr\".\"median_avg\";\n"
     944             :                         "GRANT EXECUTE ON AGGREGATE median_avg(DOUBLE) TO PUBLIC;\n"
     945             :                         "create aggregate quantile_avg(val TINYINT, q DOUBLE) returns DOUBLE\n"
     946             :                         " external name \"aggr\".\"quantile_avg\";\n"
     947             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(TINYINT, DOUBLE) TO PUBLIC;\n"
     948             :                         "create aggregate quantile_avg(val SMALLINT, q DOUBLE) returns DOUBLE\n"
     949             :                         " external name \"aggr\".\"quantile_avg\";\n"
     950             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(SMALLINT, DOUBLE) TO PUBLIC;\n"
     951             :                         "create aggregate quantile_avg(val INTEGER, q DOUBLE) returns DOUBLE\n"
     952             :                         " external name \"aggr\".\"quantile_avg\";\n"
     953             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(INTEGER, DOUBLE) TO PUBLIC;\n"
     954             :                         "create aggregate quantile_avg(val BIGINT, q DOUBLE) returns DOUBLE\n"
     955             :                         " external name \"aggr\".\"quantile_avg\";\n"
     956             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(BIGINT, DOUBLE) TO PUBLIC;\n"
     957             :                         "create aggregate quantile_avg(val DECIMAL, q DOUBLE) returns DOUBLE\n"
     958             :                         " external name \"aggr\".\"quantile_avg\";\n"
     959             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL, DOUBLE) TO PUBLIC;\n"
     960             :                         "create aggregate quantile_avg(val REAL, q DOUBLE) returns DOUBLE\n"
     961             :                         " external name \"aggr\".\"quantile_avg\";\n"
     962             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(REAL, DOUBLE) TO PUBLIC;\n"
     963             :                         "create aggregate quantile_avg(val DOUBLE, q DOUBLE) returns DOUBLE\n"
     964             :                         " external name \"aggr\".\"quantile_avg\";\n"
     965             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(DOUBLE, DOUBLE) TO PUBLIC;\n");
     966             : #ifdef HAVE_HGE
     967           0 :         pos += snprintf(buf + pos, bufsize - pos,
     968             :                                 "create aggregate median_avg(val HUGEINT) returns DOUBLE\n"
     969             :                                 " external name \"aggr\".\"median_avg\";\n"
     970             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(HUGEINT) TO PUBLIC;\n"
     971             :                                 "create aggregate quantile_avg(val HUGEINT, q DOUBLE) returns DOUBLE\n"
     972             :                                 " external name \"aggr\".\"quantile_avg\";\n"
     973             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(HUGEINT, DOUBLE) TO PUBLIC;\n");
     974             : #endif
     975             :         /* 60/61_wlcr signatures migrations */
     976           0 :         pos += snprintf(buf + pos, bufsize - pos,
     977             :                         "drop procedure master() cascade;\n"
     978             :                         "drop procedure master(string) cascade;\n"
     979             :                         "drop procedure stopmaster() cascade;\n"
     980             :                         "drop procedure masterbeat(int) cascade;\n"
     981             :                         "drop function masterClock() cascade;\n"
     982             :                         "drop function masterTick() cascade;\n"
     983             :                         "drop procedure replicate() cascade;\n"
     984             :                         "drop procedure replicate(timestamp) cascade;\n"
     985             :                         "drop procedure replicate(string) cascade;\n"
     986             :                         "drop procedure replicate(string, timestamp) cascade;\n"
     987             :                         "drop procedure replicate(string, tinyint) cascade;\n"
     988             :                         "drop procedure replicate(string, smallint) cascade;\n"
     989             :                         "drop procedure replicate(string, integer) cascade;\n"
     990             :                         "drop procedure replicate(string, bigint) cascade;\n"
     991             :                         "drop procedure replicabeat(integer) cascade;\n"
     992             :                         "drop function replicaClock() cascade;\n"
     993             :                         "drop function replicaTick() cascade;\n"
     994             :                 );
     995             : 
     996           0 :         pos += snprintf(buf + pos, bufsize - pos,
     997             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
     998             :                         " and name in ('deltas') and type = %d;\n", (int) F_UNION);
     999           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1000             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1001             :                         " and name in ('median_avg', 'quantile_avg') and type = %d;\n", (int) F_AGGR);
    1002             : 
    1003             :         /* 39_analytics.sql */
    1004           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1005             :                         "create aggregate stddev_samp(val INTERVAL SECOND) returns DOUBLE\n"
    1006             :                         "external name \"aggr\".\"stdev\";\n"
    1007             :                         "GRANT EXECUTE ON AGGREGATE stddev_samp(INTERVAL SECOND) TO PUBLIC;\n"
    1008             :                         "create aggregate stddev_samp(val INTERVAL MONTH) returns DOUBLE\n"
    1009             :                         "external name \"aggr\".\"stdev\";\n"
    1010             :                         "GRANT EXECUTE ON AGGREGATE stddev_samp(INTERVAL MONTH) TO PUBLIC;\n"
    1011             : 
    1012             :                         "create aggregate stddev_pop(val INTERVAL SECOND) returns DOUBLE\n"
    1013             :                         "external name \"aggr\".\"stdevp\";\n"
    1014             :                         "GRANT EXECUTE ON AGGREGATE stddev_pop(INTERVAL SECOND) TO PUBLIC;\n"
    1015             :                         "create aggregate stddev_pop(val INTERVAL MONTH) returns DOUBLE\n"
    1016             :                         "external name \"aggr\".\"stdevp\";\n"
    1017             :                         "GRANT EXECUTE ON AGGREGATE stddev_pop(INTERVAL MONTH) TO PUBLIC;\n"
    1018             : 
    1019             :                         "create aggregate var_samp(val INTERVAL SECOND) returns DOUBLE\n"
    1020             :                         "external name \"aggr\".\"variance\";\n"
    1021             :                         "GRANT EXECUTE ON AGGREGATE var_samp(INTERVAL SECOND) TO PUBLIC;\n"
    1022             :                         "create aggregate var_samp(val INTERVAL MONTH) returns DOUBLE\n"
    1023             :                         "external name \"aggr\".\"variance\";\n"
    1024             :                         "GRANT EXECUTE ON AGGREGATE var_samp(INTERVAL MONTH) TO PUBLIC;\n"
    1025             : 
    1026             :                         "create aggregate var_pop(val INTERVAL SECOND) returns DOUBLE\n"
    1027             :                         "external name \"aggr\".\"variancep\";\n"
    1028             :                         "GRANT EXECUTE ON AGGREGATE var_pop(INTERVAL SECOND) TO PUBLIC;\n"
    1029             :                         "create aggregate var_pop(val INTERVAL MONTH) returns DOUBLE\n"
    1030             :                         "external name \"aggr\".\"variancep\";\n"
    1031             :                         "GRANT EXECUTE ON AGGREGATE var_pop(INTERVAL MONTH) TO PUBLIC;\n"
    1032             : 
    1033             :                         "create aggregate median(val INTERVAL SECOND) returns INTERVAL SECOND\n"
    1034             :                         "external name \"aggr\".\"median\";\n"
    1035             :                         "GRANT EXECUTE ON AGGREGATE median(INTERVAL SECOND) TO PUBLIC;\n"
    1036             :                         "create aggregate median(val INTERVAL MONTH) returns INTERVAL MONTH\n"
    1037             :                         "external name \"aggr\".\"median\";\n"
    1038             :                         "GRANT EXECUTE ON AGGREGATE median(INTERVAL MONTH) TO PUBLIC;\n"
    1039             : 
    1040             :                         "create aggregate quantile(val INTERVAL SECOND, q DOUBLE) returns INTERVAL SECOND\n"
    1041             :                         "external name \"aggr\".\"quantile\";\n"
    1042             :                         "GRANT EXECUTE ON AGGREGATE quantile(INTERVAL SECOND, DOUBLE) TO PUBLIC;\n"
    1043             :                         "create aggregate quantile(val INTERVAL MONTH, q DOUBLE) returns INTERVAL MONTH\n"
    1044             :                         "external name \"aggr\".\"quantile\";\n"
    1045             :                         "GRANT EXECUTE ON AGGREGATE quantile(INTERVAL MONTH, DOUBLE) TO PUBLIC;\n"
    1046             :                 );
    1047             : 
    1048           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1049             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1050             :                         " and name in ('stddev_samp', 'stddev_pop', 'var_samp', 'var_pop', 'median', 'quantile') and type = %d;\n", (int) F_AGGR);
    1051             : 
    1052             :         /* The MAL implementation of functions json.text(string) and json.text(int) do not exist */
    1053           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1054             :                         "drop function json.text(string) cascade;\n"
    1055             :                         "drop function json.text(int) cascade;\n");
    1056             : 
    1057             :         /* The first argument to copyfrom is a PTR type */
    1058           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1059             :                         "update sys.args set type = 'ptr' where"
    1060             :                         " func_id = (select id from sys.functions where name = 'copyfrom' and func = 'copy_from' and mod = 'sql' and type = %d) and name = 'arg_1';\n", (int) F_UNION);
    1061             : 
    1062           0 :         assert(pos < bufsize);
    1063             : 
    1064           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    1065           0 :         fflush(stdout);
    1066           0 :         err = SQLstatementIntern(c, buf, "update", 1, 0, NULL);
    1067           0 :         GDKfree(buf);
    1068           0 :         return err;             /* usually MAL_SUCCEED */
    1069             : }
    1070             : 
    1071             : #ifdef HAVE_HGE
    1072             : static str
    1073           0 : sql_update_nov2019_sp1_hugeint(Client c, mvc *sql)
    1074             : {
    1075           0 :         size_t bufsize = 1024, pos = 0;
    1076           0 :         char *buf, *err;
    1077             : 
    1078           0 :         (void) sql;
    1079           0 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    1080           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1081             : 
    1082             :         /* 39_analytics_hge.sql */
    1083           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1084             :                         "create aggregate median_avg(val HUGEINT) returns DOUBLE\n"
    1085             :                         " external name \"aggr\".\"median_avg\";\n"
    1086             :                         "GRANT EXECUTE ON AGGREGATE median_avg(HUGEINT) TO PUBLIC;\n"
    1087             :                         "create aggregate quantile_avg(val HUGEINT, q DOUBLE) returns DOUBLE\n"
    1088             :                         " external name \"aggr\".\"quantile_avg\";\n"
    1089             :                         "GRANT EXECUTE ON AGGREGATE quantile_avg(HUGEINT, DOUBLE) TO PUBLIC;\n");
    1090             : 
    1091           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1092             :                         "update sys.functions set system = true where system <> true and name in ('median_avg', 'quantile_avg') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_AGGR);
    1093             : 
    1094           0 :         assert(pos < bufsize);
    1095             : 
    1096           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    1097           0 :         fflush(stdout);
    1098           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1099           0 :         GDKfree(buf);
    1100           0 :         return err;             /* usually MAL_SUCCEED */
    1101             : }
    1102             : #endif
    1103             : 
    1104             : static str
    1105           0 : sql_update_jun2020(Client c, mvc *sql)
    1106             : {
    1107           0 :         sql_table *t;
    1108           0 :         size_t bufsize = 32768, pos = 0;
    1109           0 :         char *err = NULL, *buf = NULL;
    1110           0 :         sql_schema *sys = mvc_bind_schema(sql, "sys");
    1111             : 
    1112           0 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    1113           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1114             : 
    1115             :         /* convert old PYTHON2 and PYTHON2_MAP to PYTHON and PYTHON_MAP
    1116             :          * see also function load_func() in store.c */
    1117           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1118             :                         "update sys.functions set language = language - 2 where language in (8, 9);\n");
    1119             : 
    1120           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1121             :                         "update sys.args set name = name || '_' || cast(number as string) where name in ('arg', 'res') and func_id in (select id from sys.functions f where f.system);\n");
    1122           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1123             :                         "insert into sys.dependencies values ((select id from sys.functions where name = 'ms_trunc' and schema_id = (select id from sys.schemas where name = 'sys')), (select id from sys.functions where name = 'ms_round' and schema_id = (select id from sys.schemas where name = 'sys')), (select dependency_type_id from sys.dependency_types where dependency_type_name = 'FUNCTION'));\n");
    1124             : 
    1125             :         /* 12_url */
    1126           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1127             :                         "drop function isaURL(url) cascade;\n"
    1128             :                         "CREATE function isaURL(theUrl string) RETURNS BOOL\n"
    1129             :                         " EXTERNAL NAME url.\"isaURL\";\n"
    1130             :                         "GRANT EXECUTE ON FUNCTION isaURL(string) TO PUBLIC;\n"
    1131             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1132             :                         " and name = 'isaurl' and type = %d;\n", (int) F_FUNC);
    1133             : 
    1134             :         /* 13_date.sql */
    1135           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1136             :                         "drop function str_to_time(string, string) cascade;\n"
    1137             :                         "drop function time_to_str(time, string) cascade;\n"
    1138             :                         "drop function str_to_timestamp(string, string) cascade;\n"
    1139             :                         "drop function timestamp_to_str(timestamp, string) cascade;\n"
    1140             :                         "create function str_to_time(s string, format string) returns time with time zone\n"
    1141             :                         " external name mtime.\"str_to_time\";\n"
    1142             :                         "create function time_to_str(d time with time zone, format string) returns string\n"
    1143             :                         " external name mtime.\"time_to_str\";\n"
    1144             :                         "create function str_to_timestamp(s string, format string) returns timestamp with time zone\n"
    1145             :                         " external name mtime.\"str_to_timestamp\";\n"
    1146             :                         "create function timestamp_to_str(d timestamp with time zone, format string) returns string\n"
    1147             :                         " external name mtime.\"timestamp_to_str\";\n"
    1148             :                         "grant execute on function str_to_time to public;\n"
    1149             :                         "grant execute on function time_to_str to public;\n"
    1150             :                         "grant execute on function str_to_timestamp to public;\n"
    1151             :                         "grant execute on function timestamp_to_str to public;\n"
    1152             :                         "update sys.functions set system = true where system <> true and name in"
    1153             :                         " ('str_to_time', 'str_to_timestamp', 'time_to_str', 'timestamp_to_str')"
    1154             :                         " and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_FUNC);
    1155             : 
    1156             :         /* 16_tracelog */
    1157           0 :         t = mvc_bind_table(sql, sys, "tracelog");
    1158           0 :         t->system = 0; /* make it non-system else the drop view will fail */
    1159           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1160             :                         "drop view sys.tracelog cascade;\n"
    1161             :                         "drop function sys.tracelog() cascade;\n"
    1162             :                         "create function sys.tracelog()\n"
    1163             :                         " returns table (\n"
    1164             :                         "  ticks bigint, -- time in microseconds\n"
    1165             :                         "  stmt string  -- actual statement executed\n"
    1166             :                         " )\n"
    1167             :                         " external name sql.dump_trace;\n"
    1168             :                         "create view sys.tracelog as select * from sys.tracelog();\n"
    1169             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1170             :                         " and name = 'tracelog' and type = %d;\n", (int) F_UNION);
    1171           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1172             :                         "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1173             :                         " and name = 'tracelog';\n");
    1174             : 
    1175             :         /* 17_temporal.sql */
    1176           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1177             :                         "drop function sys.epoch(bigint) cascade;\n"
    1178             :                         "drop function sys.epoch(int) cascade;\n"
    1179             :                         "drop function sys.epoch(timestamp) cascade;\n"
    1180             :                         "drop function sys.epoch(timestamp with time zone) cascade;\n"
    1181             :                         "create function sys.epoch(sec BIGINT) returns TIMESTAMP WITH TIME ZONE\n"
    1182             :                         " external name mtime.epoch;\n"
    1183             :                         "create function sys.epoch(sec INT) returns TIMESTAMP WITH TIME ZONE\n"
    1184             :                         " external name mtime.epoch;\n"
    1185             :                         "create function sys.epoch(ts TIMESTAMP WITH TIME ZONE) returns INT\n"
    1186             :                         " external name mtime.epoch;\n"
    1187             :                         "create function sys.date_trunc(txt string, t timestamp with time zone)\n"
    1188             :                         "returns timestamp with time zone\n"
    1189             :                         "external name sql.date_trunc;\n"
    1190             :                         "grant execute on function sys.date_trunc(string, timestamp with time zone) to public;\n"
    1191             :                         "grant execute on function sys.epoch (BIGINT) to public;\n"
    1192             :                         "grant execute on function sys.epoch (INT) to public;\n"
    1193             :                         "grant execute on function sys.epoch (TIMESTAMP WITH TIME ZONE) to public;\n"
    1194             :                         "update sys.functions set system = true where system <> true and name in"
    1195             :                         " ('epoch', 'date_trunc')"
    1196             :                         " and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_FUNC);
    1197             : 
    1198             :         /* 22_clients */
    1199           0 :         t = mvc_bind_table(sql, sys, "sessions");
    1200           0 :         t->system = 0; /* make it non-system else the drop view will fail */
    1201             : 
    1202           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1203             :                         "drop view sys.sessions cascade;\n"
    1204             :                         "drop function sys.sessions cascade;\n"
    1205             :                         "create function sys.sessions()\n"
    1206             :                         "returns table(\n"
    1207             :                                 "\"sessionid\" int,\n"
    1208             :                                 "\"username\" string,\n"
    1209             :                                 "\"login\" timestamp,\n"
    1210             :                                 "\"idle\" timestamp,\n"
    1211             :                                 "\"optimizer\" string,\n"
    1212             :                                 "\"sessiontimeout\" int,\n"
    1213             :                                 "\"querytimeout\" int,\n"
    1214             :                                 "\"workerlimit\" int,\n"
    1215             :                                 "\"memorylimit\" int)\n"
    1216             :                         " external name sql.sessions;\n"
    1217             :                         "create view sys.sessions as select * from sys.sessions();\n");
    1218             : 
    1219           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1220             :                         "grant execute on procedure sys.settimeout(bigint) to public;\n"
    1221             :                         "grant execute on procedure sys.settimeout(bigint,bigint) to public;\n"
    1222             :                         "grant execute on procedure sys.setsession(bigint) to public;\n");
    1223             : 
    1224           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1225             :                         "create procedure sys.setoptimizer(\"optimizer\" string)\n"
    1226             :                         " external name clients.setoptimizer;\n"
    1227             :                         "grant execute on procedure sys.setoptimizer(string) to public;\n"
    1228             :                         "create procedure sys.setquerytimeout(\"query\" int)\n"
    1229             :                         " external name clients.setquerytimeout;\n"
    1230             :                         "grant execute on procedure sys.setquerytimeout(int) to public;\n"
    1231             :                         "create procedure sys.setsessiontimeout(\"timeout\" int)\n"
    1232             :                         " external name clients.setsessiontimeout;\n"
    1233             :                         "grant execute on procedure sys.setsessiontimeout(int) to public;\n"
    1234             :                         "create procedure sys.setworkerlimit(\"limit\" int)\n"
    1235             :                         " external name clients.setworkerlimit;\n"
    1236             :                         "grant execute on procedure sys.setworkerlimit(int) to public;\n"
    1237             :                         "create procedure sys.setmemorylimit(\"limit\" int)\n"
    1238             :                         " external name clients.setmemorylimit;\n"
    1239             :                         "grant execute on procedure sys.setmemorylimit(int) to public;\n"
    1240             :                         "create procedure sys.setoptimizer(\"sessionid\" int, \"optimizer\" string)\n"
    1241             :                         " external name clients.setoptimizer;\n"
    1242             :                         "create procedure sys.setquerytimeout(\"sessionid\" int, \"query\" int)\n"
    1243             :                         " external name clients.setquerytimeout;\n"
    1244             :                         "create procedure sys.setsessiontimeout(\"sessionid\" int, \"query\" int)\n"
    1245             :                         " external name clients.setsessiontimeout;\n"
    1246             :                         "create procedure sys.setworkerlimit(\"sessionid\" int, \"limit\" int)\n"
    1247             :                         " external name clients.setworkerlimit;\n"
    1248             :                         "create procedure sys.setmemorylimit(\"sessionid\" int, \"limit\" int)\n"
    1249             :                         " external name clients.setmemorylimit;\n"
    1250             :                         "create procedure sys.stopsession(\"sessionid\" int)\n"
    1251             :                         " external name clients.stopsession;\n");
    1252             : 
    1253           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1254             :                         "create function sys.prepared_statements()\n"
    1255             :                         "returns table(\n"
    1256             :                         "\"sessionid\" int,\n"
    1257             :                         "\"username\" string,\n"
    1258             :                         "\"statementid\" int,\n"
    1259             :                         "\"statement\" string,\n"
    1260             :                         "\"created\" timestamp)\n"
    1261             :                         " external name sql.prepared_statements;\n"
    1262             :                         "grant execute on function sys.prepared_statements to public;\n"
    1263             :                         "create view sys.prepared_statements as select * from sys.prepared_statements();\n"
    1264             :                         "grant select on sys.prepared_statements to public;\n"
    1265             :                         "create function sys.prepared_statements_args()\n"
    1266             :                         "returns table(\n"
    1267             :                         "\"statementid\" int,\n"
    1268             :                         "\"type\" string,\n"
    1269             :                         "\"type_digits\" int,\n"
    1270             :                         "\"type_scale\" int,\n"
    1271             :                         "\"inout\" tinyint,\n"
    1272             :                         "\"number\" int,\n"
    1273             :                         "\"schema\" string,\n"
    1274             :                         "\"table\" string,\n"
    1275             :                         "\"column\" string)\n"
    1276             :                         " external name sql.prepared_statements_args;\n"
    1277             :                         "grant execute on function sys.prepared_statements_args to public;\n"
    1278             :                         "create view sys.prepared_statements_args as select * from sys.prepared_statements_args();\n"
    1279             :                         "grant select on sys.prepared_statements_args to public;\n");
    1280             : 
    1281           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1282             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1283             :                         " and name in ('sessions', 'prepared_statements', 'prepared_statements_args') and type = %d;\n", (int) F_UNION);
    1284           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1285             :                         "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1286             :                         " and name in ('sessions', 'prepared_statements', 'prepared_statements_args');\n");
    1287           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1288             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1289             :                         " and name in ('setoptimizer', 'setquerytimeout', 'setsessiontimeout', 'setworkerlimit', 'setmemorylimit', 'setoptimizer', 'stopsession') and type = %d;\n", (int) F_PROC);
    1290             : 
    1291             :         /* 25_debug */
    1292           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1293             :                         "create procedure sys.suspend_log_flushing()\n"
    1294             :                         " external name sql.suspend_log_flushing;\n"
    1295             :                         "create procedure sys.resume_log_flushing()\n"
    1296             :                         " external name sql.resume_log_flushing;\n"
    1297             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1298             :                         " and name in ('suspend_log_flushing', 'resume_log_flushing') and type = %d;\n", (int) F_PROC);
    1299             : 
    1300           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1301             :                         "create function sys.debug(flag string) returns integer\n"
    1302             :                         " external name mdb.\"setDebug\";\n"
    1303             :                         "create function sys.debugflags()\n"
    1304             :                         " returns table(flag string, val bool)\n"
    1305             :                         " external name mdb.\"getDebugFlags\";\n");
    1306           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1307             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1308             :                         " and name in ('debug') and type = %d;\n"
    1309             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1310             :                         " and name in ('debugflags') and type = %d;\n",
    1311             :                         (int) F_FUNC, (int) F_UNION);
    1312             : 
    1313             :         /* 26_sysmon */
    1314           0 :         t = mvc_bind_table(sql, sys, "queue");
    1315           0 :         t->system = 0; /* make it non-system else the drop view will fail */
    1316             : 
    1317           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1318             :                         "drop view sys.queue cascade;\n"
    1319             :                         "drop function sys.queue cascade;\n"
    1320             :                         "create function sys.queue()\n"
    1321             :                         "returns table(\n"
    1322             :                         "\"tag\" bigint,\n"
    1323             :                         "\"sessionid\" int,\n"
    1324             :                         "\"username\" string,\n"
    1325             :                         "\"started\" timestamp,\n"
    1326             :                         "\"status\" string,\n"
    1327             :                         "\"query\" string,\n"
    1328             :                         "\"progress\" int,\n"
    1329             :                         "\"maxworkers\" int,\n"
    1330             :                         "\"footprint\" int)\n"
    1331             :                         " external name sysmon.queue;\n"
    1332             :                         "grant execute on function sys.queue to public;\n"
    1333             :                         "create view sys.queue as select * from sys.queue();\n"
    1334             :                         "grant select on sys.queue to public;\n"
    1335             : 
    1336             :                         "drop procedure sys.pause(int) cascade;\n"
    1337             :                         "drop procedure sys.resume(int) cascade;\n"
    1338             :                         "drop procedure sys.stop(int) cascade;\n"
    1339             : 
    1340             :                         "grant execute on procedure sys.pause(bigint) to public;\n"
    1341             :                         "grant execute on procedure sys.resume(bigint) to public;\n"
    1342             :                         "grant execute on procedure sys.stop(bigint) to public;\n");
    1343             : 
    1344           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1345             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1346             :                         " and name = 'queue' and type = %d;\n", (int) F_UNION);
    1347           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1348             :                         "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1349             :                         " and name = 'queue';\n");
    1350             : 
    1351             :         /* 39_analytics.sql */
    1352           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1353             :                         "create window stddev_samp(val TINYINT) returns DOUBLE\n"
    1354             :                         " external name \"sql\".\"stdev\";\n"
    1355             :                         "GRANT EXECUTE ON WINDOW stddev_samp(TINYINT) TO PUBLIC;\n"
    1356             :                         "create window stddev_samp(val SMALLINT) returns DOUBLE"
    1357             :                         " external name \"sql\".\"stdev\";\n"
    1358             :                         "GRANT EXECUTE ON WINDOW stddev_samp(SMALLINT) TO PUBLIC;\n"
    1359             :                         "create window stddev_samp(val INTEGER) returns DOUBLE\n"
    1360             :                         " external name \"sql\".\"stdev\";\n"
    1361             :                         "GRANT EXECUTE ON WINDOW stddev_samp(INTEGER) TO PUBLIC;\n"
    1362             :                         "create window stddev_samp(val BIGINT) returns DOUBLE\n"
    1363             :                         " external name \"sql\".\"stdev\";\n"
    1364             :                         "GRANT EXECUTE ON WINDOW stddev_samp(BIGINT) TO PUBLIC;\n"
    1365             :                         "create window stddev_samp(val REAL) returns DOUBLE\n"
    1366             :                         " external name \"sql\".\"stdev\";\n"
    1367             :                         "GRANT EXECUTE ON WINDOW stddev_samp(REAL) TO PUBLIC;\n"
    1368             :                         "create window stddev_samp(val DOUBLE) returns DOUBLE\n"
    1369             :                         " external name \"sql\".\"stdev\";\n"
    1370             :                         "GRANT EXECUTE ON WINDOW stddev_samp(DOUBLE) TO PUBLIC;\n"
    1371             :                         "create window stddev_samp(val INTERVAL SECOND) returns DOUBLE\n"
    1372             :                         " external name \"sql\".\"stdev\";\n"
    1373             :                         "GRANT EXECUTE ON WINDOW stddev_samp(INTERVAL SECOND) TO PUBLIC;\n"
    1374             :                         "create window stddev_samp(val INTERVAL MONTH) returns DOUBLE\n"
    1375             :                         " external name \"sql\".\"stdev\";\n"
    1376             :                         "GRANT EXECUTE ON WINDOW stddev_samp(INTERVAL MONTH) TO PUBLIC;\n"
    1377             :                         "create window stddev_pop(val TINYINT) returns DOUBLE\n"
    1378             :                         " external name \"sql\".\"stdevp\";\n"
    1379             :                         "GRANT EXECUTE ON WINDOW stddev_pop(TINYINT) TO PUBLIC;\n"
    1380             :                         "create window stddev_pop(val SMALLINT) returns DOUBLE\n"
    1381             :                         " external name \"sql\".\"stdevp\";\n"
    1382             :                         "GRANT EXECUTE ON WINDOW stddev_pop(SMALLINT) TO PUBLIC;\n"
    1383             :                         "create window stddev_pop(val INTEGER) returns DOUBLE\n"
    1384             :                         " external name \"sql\".\"stdevp\";\n"
    1385             :                         "GRANT EXECUTE ON WINDOW stddev_pop(INTEGER) TO PUBLIC;\n"
    1386             :                         "create window stddev_pop(val BIGINT) returns DOUBLE\n"
    1387             :                         " external name \"sql\".\"stdevp\";\n"
    1388             :                         "GRANT EXECUTE ON WINDOW stddev_pop(BIGINT) TO PUBLIC;\n"
    1389             :                         "create window stddev_pop(val REAL) returns DOUBLE\n"
    1390             :                         " external name \"sql\".\"stdevp\";\n"
    1391             :                         "GRANT EXECUTE ON WINDOW stddev_pop(REAL) TO PUBLIC;\n"
    1392             :                         "create window stddev_pop(val DOUBLE) returns DOUBLE\n"
    1393             :                         " external name \"sql\".\"stdevp\";\n"
    1394             :                         "GRANT EXECUTE ON WINDOW stddev_pop(DOUBLE) TO PUBLIC;\n"
    1395             :                         "create window stddev_pop(val INTERVAL SECOND) returns DOUBLE\n"
    1396             :                         " external name \"sql\".\"stdevp\";\n"
    1397             :                         "GRANT EXECUTE ON WINDOW stddev_pop(INTERVAL SECOND) TO PUBLIC;\n"
    1398             :                         "create window stddev_pop(val INTERVAL MONTH) returns DOUBLE\n"
    1399             :                         " external name \"sql\".\"stdevp\";\n"
    1400             :                         "GRANT EXECUTE ON WINDOW stddev_pop(INTERVAL MONTH) TO PUBLIC;\n"
    1401             :                         "create window var_samp(val TINYINT) returns DOUBLE\n"
    1402             :                         " external name \"sql\".\"variance\";\n"
    1403             :                         "GRANT EXECUTE ON WINDOW var_samp(TINYINT) TO PUBLIC;\n"
    1404             :                         "create window var_samp(val SMALLINT) returns DOUBLE\n"
    1405             :                         " external name \"sql\".\"variance\";\n"
    1406             :                         "GRANT EXECUTE ON WINDOW var_samp(SMALLINT) TO PUBLIC;\n"
    1407             :                         "create window var_samp(val INTEGER) returns DOUBLE\n"
    1408             :                         " external name \"sql\".\"variance\";\n"
    1409             :                         "GRANT EXECUTE ON WINDOW var_samp(INTEGER) TO PUBLIC;\n"
    1410             :                         "create window var_samp(val BIGINT) returns DOUBLE\n"
    1411             :                         " external name \"sql\".\"variance\";\n"
    1412             :                         "GRANT EXECUTE ON WINDOW var_samp(BIGINT) TO PUBLIC;\n"
    1413             :                         "create window var_samp(val REAL) returns DOUBLE\n"
    1414             :                         " external name \"sql\".\"variance\";\n"
    1415             :                         "GRANT EXECUTE ON WINDOW var_samp(REAL) TO PUBLIC;\n"
    1416             :                         "create window var_samp(val DOUBLE) returns DOUBLE\n"
    1417             :                         " external name \"sql\".\"variance\";\n"
    1418             :                         "GRANT EXECUTE ON WINDOW var_samp(DOUBLE) TO PUBLIC;\n"
    1419             :                         "create window var_samp(val INTERVAL SECOND) returns DOUBLE\n"
    1420             :                         " external name \"sql\".\"variance\";\n"
    1421             :                         "GRANT EXECUTE ON WINDOW var_samp(INTERVAL SECOND) TO PUBLIC;\n"
    1422             :                         "create window var_samp(val INTERVAL MONTH) returns DOUBLE\n"
    1423             :                         " external name \"sql\".\"variance\";\n"
    1424             :                         "GRANT EXECUTE ON WINDOW var_samp(INTERVAL MONTH) TO PUBLIC;\n"
    1425             :                         "create window var_pop(val TINYINT) returns DOUBLE\n"
    1426             :                         " external name \"sql\".\"variancep\";\n"
    1427             :                         "GRANT EXECUTE ON WINDOW var_pop(TINYINT) TO PUBLIC;\n"
    1428             :                         "create window var_pop(val SMALLINT) returns DOUBLE\n"
    1429             :                         " external name \"sql\".\"variancep\";\n"
    1430             :                         "GRANT EXECUTE ON WINDOW var_pop(SMALLINT) TO PUBLIC;\n"
    1431             :                         "create window var_pop(val INTEGER) returns DOUBLE\n"
    1432             :                         " external name \"sql\".\"variancep\";\n"
    1433             :                         "GRANT EXECUTE ON WINDOW var_pop(INTEGER) TO PUBLIC;\n"
    1434             :                         "create window var_pop(val BIGINT) returns DOUBLE\n"
    1435             :                         " external name \"sql\".\"variancep\";\n"
    1436             :                         "GRANT EXECUTE ON WINDOW var_pop(BIGINT) TO PUBLIC;\n"
    1437             :                         "create window var_pop(val REAL) returns DOUBLE\n"
    1438             :                         " external name \"sql\".\"variancep\";\n"
    1439             :                         "GRANT EXECUTE ON WINDOW var_pop(REAL) TO PUBLIC;\n"
    1440             :                         "create window var_pop(val DOUBLE) returns DOUBLE\n"
    1441             :                         " external name \"sql\".\"variancep\";\n"
    1442             :                         "GRANT EXECUTE ON WINDOW var_pop(DOUBLE) TO PUBLIC;\n"
    1443             :                         "create window var_pop(val INTERVAL SECOND) returns DOUBLE\n"
    1444             :                         " external name \"sql\".\"variancep\";\n"
    1445             :                         "GRANT EXECUTE ON WINDOW var_pop(INTERVAL SECOND) TO PUBLIC;\n"
    1446             :                         "create window var_pop(val INTERVAL MONTH) returns DOUBLE\n"
    1447             :                         " external name \"sql\".\"variancep\";\n"
    1448             :                         "GRANT EXECUTE ON WINDOW var_pop(INTERVAL MONTH) TO PUBLIC;\n"
    1449             :                         "create aggregate covar_samp(e1 TINYINT, e2 TINYINT) returns DOUBLE\n"
    1450             :                         " external name \"aggr\".\"covariance\";\n"
    1451             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(TINYINT, TINYINT) TO PUBLIC;\n"
    1452             :                         "create aggregate covar_samp(e1 SMALLINT, e2 SMALLINT) returns DOUBLE\n"
    1453             :                         " external name \"aggr\".\"covariance\";\n"
    1454             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(SMALLINT, SMALLINT) TO PUBLIC;\n"
    1455             :                         "create aggregate covar_samp(e1 INTEGER, e2 INTEGER) returns DOUBLE\n"
    1456             :                         " external name \"aggr\".\"covariance\";\n"
    1457             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(INTEGER, INTEGER) TO PUBLIC;\n"
    1458             :                         "create aggregate covar_samp(e1 BIGINT, e2 BIGINT) returns DOUBLE\n"
    1459             :                         " external name \"aggr\".\"covariance\";\n"
    1460             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(BIGINT, BIGINT) TO PUBLIC;\n"
    1461             :                         "create aggregate covar_samp(e1 REAL, e2 REAL) returns DOUBLE\n"
    1462             :                         " external name \"aggr\".\"covariance\";\n"
    1463             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(REAL, REAL) TO PUBLIC;\n"
    1464             :                         "create aggregate covar_samp(e1 DOUBLE, e2 DOUBLE) returns DOUBLE\n"
    1465             :                         " external name \"aggr\".\"covariance\";\n"
    1466             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(DOUBLE, DOUBLE) TO PUBLIC;\n"
    1467             :                         "create aggregate covar_samp(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1468             :                         " external name \"aggr\".\"covariance\";\n"
    1469             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1470             :                         "create aggregate covar_samp(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1471             :                         " external name \"aggr\".\"covariance\";\n"
    1472             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n"
    1473             :                         "create window covar_samp(e1 TINYINT, e2 TINYINT) returns DOUBLE\n"
    1474             :                         " external name \"sql\".\"covariance\";\n"
    1475             :                         "GRANT EXECUTE ON WINDOW covar_samp(TINYINT, TINYINT) TO PUBLIC;\n"
    1476             :                         "create window covar_samp(e1 SMALLINT, e2 SMALLINT) returns DOUBLE\n"
    1477             :                         " external name \"sql\".\"covariance\";\n"
    1478             :                         "GRANT EXECUTE ON WINDOW covar_samp(SMALLINT, SMALLINT) TO PUBLIC;\n"
    1479             :                         "create window covar_samp(e1 INTEGER, e2 INTEGER) returns DOUBLE\n"
    1480             :                         " external name \"sql\".\"covariance\";\n"
    1481             :                         "GRANT EXECUTE ON WINDOW covar_samp(INTEGER, INTEGER) TO PUBLIC;\n"
    1482             :                         "create window covar_samp(e1 BIGINT, e2 BIGINT) returns DOUBLE\n"
    1483             :                         " external name \"sql\".\"covariance\";\n"
    1484             :                         "GRANT EXECUTE ON WINDOW covar_samp(BIGINT, BIGINT) TO PUBLIC;\n"
    1485             :                         "create window covar_samp(e1 REAL, e2 REAL) returns DOUBLE\n"
    1486             :                         " external name \"sql\".\"covariance\";\n"
    1487             :                         "GRANT EXECUTE ON WINDOW covar_samp(REAL, REAL) TO PUBLIC;\n"
    1488             :                         "create window covar_samp(e1 DOUBLE, e2 DOUBLE) returns DOUBLE\n"
    1489             :                         " external name \"sql\".\"covariance\";\n"
    1490             :                         "GRANT EXECUTE ON WINDOW covar_samp(DOUBLE, DOUBLE) TO PUBLIC;\n"
    1491             :                         "create window covar_samp(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1492             :                         " external name \"sql\".\"covariance\";\n"
    1493             :                         "GRANT EXECUTE ON WINDOW covar_samp(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1494             :                         "create window covar_samp(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1495             :                         " external name \"sql\".\"covariance\";\n"
    1496             :                         "GRANT EXECUTE ON WINDOW covar_samp(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n"
    1497             :                         "create aggregate covar_pop(e1 TINYINT, e2 TINYINT) returns DOUBLE\n"
    1498             :                         " external name \"aggr\".\"covariancep\";\n"
    1499             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(TINYINT, TINYINT) TO PUBLIC;\n"
    1500             :                         "create aggregate covar_pop(e1 SMALLINT, e2 SMALLINT) returns DOUBLE\n"
    1501             :                         " external name \"aggr\".\"covariancep\";\n"
    1502             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(SMALLINT, SMALLINT) TO PUBLIC;\n"
    1503             :                         "create aggregate covar_pop(e1 INTEGER, e2 INTEGER) returns DOUBLE\n"
    1504             :                         " external name \"aggr\".\"covariancep\";\n"
    1505             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(INTEGER, INTEGER) TO PUBLIC;\n"
    1506             :                         "create aggregate covar_pop(e1 BIGINT, e2 BIGINT) returns DOUBLE\n"
    1507             :                         " external name \"aggr\".\"covariancep\";\n"
    1508             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(BIGINT, BIGINT) TO PUBLIC;\n"
    1509             :                         "create aggregate covar_pop(e1 REAL, e2 REAL) returns DOUBLE\n"
    1510             :                         " external name \"aggr\".\"covariancep\";\n"
    1511             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(REAL, REAL) TO PUBLIC;\n"
    1512             :                         "create aggregate covar_pop(e1 DOUBLE, e2 DOUBLE) returns DOUBLE\n"
    1513             :                         " external name \"aggr\".\"covariancep\";\n"
    1514             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(DOUBLE, DOUBLE) TO PUBLIC;\n"
    1515             :                         "create aggregate covar_pop(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1516             :                         " external name \"aggr\".\"covariancep\";\n"
    1517             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1518             :                         "create aggregate covar_pop(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1519             :                         " external name \"aggr\".\"covariancep\";\n"
    1520             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n"
    1521             :                         "create window covar_pop(e1 TINYINT, e2 TINYINT) returns DOUBLE\n"
    1522             :                         " external name \"sql\".\"covariancep\";\n"
    1523             :                         "GRANT EXECUTE ON WINDOW covar_pop(TINYINT, TINYINT) TO PUBLIC;\n"
    1524             :                         "create window covar_pop(e1 SMALLINT, e2 SMALLINT) returns DOUBLE\n"
    1525             :                         " external name \"sql\".\"covariancep\";\n"
    1526             :                         "GRANT EXECUTE ON WINDOW covar_pop(SMALLINT, SMALLINT) TO PUBLIC;\n"
    1527             :                         "create window covar_pop(e1 INTEGER, e2 INTEGER) returns DOUBLE\n"
    1528             :                         " external name \"sql\".\"covariancep\";\n"
    1529             :                         "GRANT EXECUTE ON WINDOW covar_pop(INTEGER, INTEGER) TO PUBLIC;\n"
    1530             :                         "create window covar_pop(e1 BIGINT, e2 BIGINT) returns DOUBLE\n"
    1531             :                         " external name \"sql\".\"covariancep\";\n"
    1532             :                         "GRANT EXECUTE ON WINDOW covar_pop(BIGINT, BIGINT) TO PUBLIC;\n"
    1533             :                         "create window covar_pop(e1 REAL, e2 REAL) returns DOUBLE\n"
    1534             :                         " external name \"sql\".\"covariancep\";\n"
    1535             :                         "GRANT EXECUTE ON WINDOW covar_pop(REAL, REAL) TO PUBLIC;\n"
    1536             :                         "create window covar_pop(e1 DOUBLE, e2 DOUBLE) returns DOUBLE\n"
    1537             :                         " external name \"sql\".\"covariancep\";\n"
    1538             :                         "GRANT EXECUTE ON WINDOW covar_pop(DOUBLE, DOUBLE) TO PUBLIC;\n"
    1539             :                         "create window covar_pop(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1540             :                         " external name \"sql\".\"covariancep\";\n"
    1541             :                         "GRANT EXECUTE ON WINDOW covar_pop(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1542             :                         "create window covar_pop(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1543             :                         " external name \"sql\".\"covariancep\";\n"
    1544             :                         "GRANT EXECUTE ON WINDOW covar_pop(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n"
    1545             :                         "create aggregate corr(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1546             :                         " external name \"aggr\".\"corr\";\n"
    1547             :                         "GRANT EXECUTE ON AGGREGATE corr(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1548             :                         "create aggregate corr(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1549             :                         " external name \"aggr\".\"corr\";\n"
    1550             :                         "GRANT EXECUTE ON AGGREGATE corr(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n"
    1551             :                         "create window corr(e1 TINYINT, e2 TINYINT) returns DOUBLE\n"
    1552             :                         " external name \"sql\".\"corr\";\n"
    1553             :                         "GRANT EXECUTE ON WINDOW corr(TINYINT, TINYINT) TO PUBLIC;\n"
    1554             :                         "create window corr(e1 SMALLINT, e2 SMALLINT) returns DOUBLE\n"
    1555             :                         " external name \"sql\".\"corr\";\n"
    1556             :                         "GRANT EXECUTE ON WINDOW corr(SMALLINT, SMALLINT) TO PUBLIC;\n"
    1557             :                         "create window corr(e1 INTEGER, e2 INTEGER) returns DOUBLE\n"
    1558             :                         " external name \"sql\".\"corr\";\n"
    1559             :                         "GRANT EXECUTE ON WINDOW corr(INTEGER, INTEGER) TO PUBLIC;\n"
    1560             :                         "create window corr(e1 BIGINT, e2 BIGINT) returns DOUBLE\n"
    1561             :                         " external name \"sql\".\"corr\";\n"
    1562             :                         "GRANT EXECUTE ON WINDOW corr(BIGINT, BIGINT) TO PUBLIC;\n"
    1563             :                         "create window corr(e1 REAL, e2 REAL) returns DOUBLE\n"
    1564             :                         " external name \"sql\".\"corr\";\n"
    1565             :                         "GRANT EXECUTE ON WINDOW corr(REAL, REAL) TO PUBLIC;\n"
    1566             :                         "create window corr(e1 DOUBLE, e2 DOUBLE) returns DOUBLE\n"
    1567             :                         " external name \"sql\".\"corr\";\n"
    1568             :                         "GRANT EXECUTE ON WINDOW corr(DOUBLE, DOUBLE) TO PUBLIC;\n"
    1569             :                         "create window corr(e1 INTERVAL SECOND, e2 INTERVAL SECOND) returns DOUBLE\n"
    1570             :                         " external name \"sql\".\"corr\";\n"
    1571             :                         "GRANT EXECUTE ON WINDOW corr(INTERVAL SECOND, INTERVAL SECOND) TO PUBLIC;\n"
    1572             :                         "create window corr(e1 INTERVAL MONTH, e2 INTERVAL MONTH) returns DOUBLE\n"
    1573             :                         " external name \"sql\".\"corr\";\n"
    1574             :                         "GRANT EXECUTE ON WINDOW corr(INTERVAL MONTH, INTERVAL MONTH) TO PUBLIC;\n");
    1575             : 
    1576           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1577             :                 "create window sys.group_concat(str STRING) returns STRING\n"
    1578             :                 " external name \"sql\".\"str_group_concat\";\n"
    1579             :                 "GRANT EXECUTE ON WINDOW sys.group_concat(STRING) TO PUBLIC;\n"
    1580             :                 "create window sys.group_concat(str STRING, sep STRING) returns STRING\n"
    1581             :                 " external name \"sql\".\"str_group_concat\";\n"
    1582             :                 "GRANT EXECUTE ON WINDOW sys.group_concat(STRING, STRING) TO PUBLIC;\n");
    1583             : 
    1584           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1585             :                         "update sys.functions set system = true where system <> true and name in"
    1586             :                         " ('stddev_samp', 'stddev_pop', 'var_samp', 'var_pop', 'covar_samp', 'covar_pop', 'corr', 'group_concat')"
    1587             :                         " and schema_id = (select id from sys.schemas where name = 'sys') and type in (%d, %d);\n", (int) F_ANALYTIC, (int) F_AGGR);
    1588             : 
    1589           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1590             :                         "DROP AGGREGATE stddev_samp(date) CASCADE;\n"
    1591             :                         "DROP AGGREGATE stddev_samp(time) CASCADE;\n"
    1592             :                         "DROP AGGREGATE stddev_samp(timestamp) CASCADE;\n"
    1593             :                         "DROP AGGREGATE stddev_pop(date) CASCADE;\n"
    1594             :                         "DROP AGGREGATE stddev_pop(time) CASCADE;\n"
    1595             :                         "DROP AGGREGATE stddev_pop(timestamp) CASCADE;\n"
    1596             :                         "DROP AGGREGATE var_samp(date) CASCADE;\n"
    1597             :                         "DROP AGGREGATE var_samp(time) CASCADE;\n"
    1598             :                         "DROP AGGREGATE var_samp(timestamp) CASCADE;\n"
    1599             :                         "DROP AGGREGATE var_pop(date) CASCADE;\n"
    1600             :                         "DROP AGGREGATE var_pop(time) CASCADE;\n"
    1601             :                         "DROP AGGREGATE var_pop(timestamp) CASCADE;\n");
    1602             : 
    1603             :         /* 51_sys_schema_extensions */
    1604           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1605             :                         "ALTER TABLE sys.keywords SET READ WRITE;\n"
    1606             :                         "DELETE FROM sys.keywords where keyword IN ('NOCYCLE','NOMAXVALUE','NOMINVALUE');\n"
    1607             :                         "insert into sys.keywords values ('ANALYZE'),('AT'),('AUTHORIZATION'),('CACHE'),('CENTURY'),('COLUMN'),('CLIENT'),"
    1608             :                         "('CUBE'),('CYCLE'),('DATA'),('DATE'),('DEBUG'),('DECADE'),('DEALLOCATE'),('DIAGNOSTICS'),('DISTINCT'),"
    1609             :                         "('DOW'),('DOY'),('EXEC'),('EXECUTE'),('EXPLAIN'),('FIRST'),('FWF'),('GROUPING'),('GROUPS'),('INCREMENT'),"
    1610             :                         "('INTERVAL'),('KEY'),('LANGUAGE'),('LARGE'),('LAST'),('LATERAL'),('LEVEL'),('LOADER'),('MATCH'),('MATCHED'),('MAXVALUE'),"
    1611             :                         "('MINVALUE'),('NAME'),('NO'),('NULLS'),('OBJECT'),('OPTIONS'),('PASSWORD'),('PLAN'),('PRECISION'),('PREP'),('PREPARE'),"
    1612             :                         "('QUARTER'),('RELEASE'),('REPLACE'),('ROLLUP'),('SCHEMA'),('SEED'),('SERVER'),('SESSION'),('SETS'),('SIZE'),"
    1613             :                         "('STATEMENT'),('TABLE'),('TEMP'),('TEMPORARY'),('TEXT'),('TIME'),('TIMESTAMP'),('TRACE'),('TYPE'),"
    1614             :                         "('WEEK'),('YEAR'),('ZONE');\n");
    1615           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1616             :                         "ALTER TABLE sys.function_languages SET READ WRITE;\n"
    1617             :                         "DELETE FROM sys.function_languages where language_keyword IN ('PYTHON2','PYTHON2_MAP');\n");
    1618             : 
    1619             :         /* 58_hot_snapshot */
    1620           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1621             :                         "create procedure sys.hot_snapshot(tarfile string)\n"
    1622             :                         " external name sql.hot_snapshot;\n"
    1623             :                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1624             :                         " and name in ('hot_snapshot') and type = %d;\n", (int) F_PROC);
    1625             : 
    1626             :         /* 81_tracer.sql */
    1627           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1628             :                         "CREATE SCHEMA logging;\n"
    1629             :                         "CREATE PROCEDURE logging.flush()\n"
    1630             :                         " EXTERNAL NAME logging.flush;\n"
    1631             :                         "CREATE PROCEDURE logging.setcomplevel(comp_id STRING, lvl_id STRING)\n"
    1632             :                         " EXTERNAL NAME logging.setcomplevel;\n"
    1633             :                         "CREATE PROCEDURE logging.resetcomplevel(comp_id STRING)\n"
    1634             :                         " EXTERNAL NAME logging.resetcomplevel;\n"
    1635             :                         "CREATE PROCEDURE logging.setlayerlevel(layer_id STRING, lvl_id STRING)\n"
    1636             :                         " EXTERNAL NAME logging.setlayerlevel;\n"
    1637             :                         "CREATE PROCEDURE logging.resetlayerlevel(layer_id STRING)\n"
    1638             :                         " EXTERNAL NAME logging.resetlayerlevel;\n"
    1639             :                         "CREATE PROCEDURE logging.setflushlevel(lvl_id STRING)\n"
    1640             :                         " EXTERNAL NAME logging.setflushlevel;\n"
    1641             :                         "CREATE PROCEDURE logging.resetflushlevel()\n"
    1642             :                         " EXTERNAL NAME logging.resetflushlevel;\n"
    1643             :                         "CREATE PROCEDURE logging.setadapter(adapter_id STRING)\n"
    1644             :                         " EXTERNAL NAME logging.setadapter;\n"
    1645             :                         "CREATE PROCEDURE logging.resetadapter()\n"
    1646             :                         " EXTERNAL NAME logging.resetadapter;\n"
    1647             :                         "CREATE FUNCTION logging.compinfo()\n"
    1648             :                         "RETURNS TABLE(\n"
    1649             :                         " \"id\" int,\n"
    1650             :                         " \"component\" string,\n"
    1651             :                         " \"log_level\" string\n"
    1652             :                         ")\n"
    1653             :                         "EXTERNAL NAME logging.compinfo;\n"
    1654             :                         "GRANT EXECUTE ON FUNCTION logging.compinfo TO public;\n"
    1655             :                         "CREATE view logging.compinfo AS SELECT * FROM logging.compinfo();\n"
    1656             :                         "GRANT SELECT ON logging.compinfo TO public;\n");
    1657           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1658             :                         "update sys.schemas set system = true where name = 'logging';\n"
    1659             :                         "update sys.functions set system = true where system <> true and name in"
    1660             :                         " ('flush', 'setcomplevel', 'resetcomplevel', 'setlayerlevel', 'resetlayerlevel', 'setflushlevel', 'resetflushlevel', 'setadapter', 'resetadapter')"
    1661             :                         " and schema_id = (select id from sys.schemas where name = 'logging') and type = %d;\n"
    1662             :                         "update sys.functions set system = true where system <> true and name in"
    1663             :                         " ('compinfo')"
    1664             :                         " and schema_id = (select id from sys.schemas where name = 'logging') and type = %d;\n"
    1665             :                         "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'logging')"
    1666             :                         " and name = 'compinfo';\n",
    1667             :                         (int) F_PROC, (int) F_UNION);
    1668             : 
    1669           0 :         pos += snprintf(buf + pos, bufsize - pos, "commit;\n");
    1670           0 :         assert(pos < bufsize);
    1671             : 
    1672           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    1673           0 :         fflush(stdout);
    1674           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1675           0 :         if (err == MAL_SUCCEED) {
    1676           0 :                 pos = snprintf(buf, bufsize,
    1677             :                                "ALTER TABLE sys.keywords SET READ ONLY;\n"
    1678             :                                "ALTER TABLE sys.function_languages SET READ ONLY;\n");
    1679           0 :                 assert(pos < bufsize);
    1680           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    1681           0 :                 fflush(stdout);
    1682           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1683             :         }
    1684           0 :         GDKfree(buf);
    1685           0 :         return err;             /* usually MAL_SUCCEED */
    1686             : }
    1687             : 
    1688             : static str
    1689         101 : sql_update_jun2020_bam(Client c, mvc *m)
    1690             : {
    1691         101 :         size_t bufsize = 10240, pos = 0;
    1692         101 :         char *err = NULL, *buf;
    1693         101 :         res_table *output;
    1694         101 :         BAT *b;
    1695         101 :         sql_schema *s = mvc_bind_schema(m, "bam");
    1696         101 :         sql_table *t;
    1697             : 
    1698         101 :         if (s == NULL || !s->system)
    1699             :                 return NULL;    /* no system schema "bam": nothing to do */
    1700             : 
    1701           0 :         buf = GDKmalloc(bufsize);
    1702           0 :         if (buf == NULL)
    1703           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1704             : 
    1705           0 :         s->system = 0;
    1706           0 :         if ((t = mvc_bind_table(m, s, "files")) != NULL)
    1707           0 :                 t->system = 0;
    1708           0 :         if ((t = mvc_bind_table(m, s, "sq")) != NULL)
    1709           0 :                 t->system = 0;
    1710           0 :         if ((t = mvc_bind_table(m, s, "rg")) != NULL)
    1711           0 :                 t->system = 0;
    1712           0 :         if ((t = mvc_bind_table(m, s, "pg")) != NULL)
    1713           0 :                 t->system = 0;
    1714           0 :         if ((t = mvc_bind_table(m, s, "export")) != NULL)
    1715           0 :                 t->system = 0;
    1716             : 
    1717             :         /* check if any of the tables in the bam schema have any content */
    1718           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1719             :                         "select sum(count) from sys.storage('bam');\n");
    1720           0 :         err = SQLstatementIntern(c, buf, "update", 1, 0, &output);
    1721           0 :         if (err) {
    1722           0 :                 GDKfree(buf);
    1723           0 :                 return err;
    1724             :         }
    1725           0 :         b = BATdescriptor(output->cols[0].b);
    1726           0 :         res_table_destroy(output);
    1727           0 :         if (b == NULL) {
    1728           0 :                 GDKfree(buf);
    1729           0 :                 throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1730             :         }
    1731           0 :         pos = 0;
    1732           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1733             :                         "update sys.schemas set system = false where name = 'bam';\n"
    1734             :                         "update sys._tables set system = false where schema_id in (select id from sys.schemas where name = 'bam');\n"
    1735             :                         "drop procedure bam.bam_loader_repos cascade;\n"
    1736             :                         "drop procedure bam.bam_loader_files cascade;\n"
    1737             :                         "drop procedure bam.bam_loader_file cascade;\n"
    1738             :                         "drop procedure bam.bam_drop_file cascade;\n"
    1739             :                         "drop function bam.bam_flag cascade;\n"
    1740             :                         "drop function bam.reverse_seq cascade;\n"
    1741             :                         "drop function bam.reverse_qual cascade;\n"
    1742             :                         "drop function bam.seq_length cascade;\n"
    1743             :                         "drop function bam.seq_char cascade;\n"
    1744             :                         "drop procedure bam.sam_export cascade;\n"
    1745             :                         "drop procedure bam.bam_export cascade;\n");
    1746           0 :         if (BATcount(b) > 0 && *(lng *) Tloc(b, 0) == 0) {
    1747             :                 /* tables in bam schema are empty: drop them */
    1748           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    1749             :                                                 "drop table bam.sq cascade;\n"
    1750             :                                                 "drop table bam.rg cascade;\n"
    1751             :                                                 "drop table bam.pg cascade;\n"
    1752             :                                                 "drop table bam.export cascade;\n"
    1753             :                                                 "drop table bam.files cascade;\n"
    1754             :                                                 "drop schema bam cascade;\n");
    1755             :         }
    1756           0 :         BBPunfix(b->batCacheid);
    1757             : 
    1758           0 :         assert(pos < bufsize);
    1759             : 
    1760           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    1761           0 :         fflush(stdout);
    1762           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1763             : 
    1764           0 :         GDKfree(buf);
    1765           0 :         return err;
    1766             : }
    1767             : 
    1768             : #ifdef HAVE_HGE
    1769             : static str
    1770           0 : sql_update_jun2020_sp1_hugeint(Client c)
    1771             : {
    1772           0 :         size_t bufsize = 8192, pos = 0;
    1773           0 :         char *buf, *err;
    1774             : 
    1775           0 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    1776           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1777             : 
    1778             :         /* 39_analytics_hge.sql */
    1779           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1780             :                         "create window stddev_samp(val HUGEINT) returns DOUBLE\n"
    1781             :                         " external name \"sql\".\"stdev\";\n"
    1782             :                         "GRANT EXECUTE ON WINDOW stddev_samp(HUGEINT) TO PUBLIC;\n"
    1783             :                         "create window stddev_pop(val HUGEINT) returns DOUBLE\n"
    1784             :                         " external name \"sql\".\"stdevp\";\n"
    1785             :                         "GRANT EXECUTE ON WINDOW stddev_pop(HUGEINT) TO PUBLIC;\n"
    1786             :                         "create window var_samp(val HUGEINT) returns DOUBLE\n"
    1787             :                         " external name \"sql\".\"variance\";\n"
    1788             :                         "GRANT EXECUTE ON WINDOW var_samp(HUGEINT) TO PUBLIC;\n"
    1789             :                         "create aggregate covar_samp(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
    1790             :                         " external name \"aggr\".\"covariance\";\n"
    1791             :                         "GRANT EXECUTE ON AGGREGATE covar_samp(HUGEINT, HUGEINT) TO PUBLIC;\n"
    1792             :                         "create window covar_samp(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
    1793             :                         " external name \"sql\".\"covariance\";\n"
    1794             :                         "GRANT EXECUTE ON WINDOW covar_samp(HUGEINT, HUGEINT) TO PUBLIC;\n"
    1795             :                         "create window var_pop(val HUGEINT) returns DOUBLE\n"
    1796             :                         " external name \"sql\".\"variancep\";\n"
    1797             :                         "GRANT EXECUTE ON WINDOW var_pop(HUGEINT) TO PUBLIC;\n"
    1798             :                         "create aggregate covar_pop(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
    1799             :                         " external name \"aggr\".\"covariancep\";\n"
    1800             :                         "GRANT EXECUTE ON AGGREGATE covar_pop(HUGEINT, HUGEINT) TO PUBLIC;\n"
    1801             :                         "create window covar_pop(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
    1802             :                         " external name \"sql\".\"covariancep\";\n"
    1803             :                         "GRANT EXECUTE ON WINDOW covar_pop(HUGEINT, HUGEINT) TO PUBLIC;\n"
    1804             :                         "create window corr(e1 HUGEINT, e2 HUGEINT) returns DOUBLE\n"
    1805             :                         " external name \"sql\".\"corr\";\n"
    1806             :                         "GRANT EXECUTE ON WINDOW corr(HUGEINT, HUGEINT) TO PUBLIC;\n");
    1807             : 
    1808           0 :         pos += snprintf(buf + pos, bufsize - pos,
    1809             :                         "update sys.functions set system = true where system <> true and name in ('covar_samp', 'covar_pop') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n"
    1810             :                         "update sys.functions set system = true where system <> true and name in ('stddev_samp', 'stddev_pop', 'var_samp', 'covar_samp', 'var_pop', 'covar_pop', 'corr') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n",
    1811             :                         (int) F_AGGR, (int) F_ANALYTIC);
    1812             : 
    1813           0 :         assert(pos < bufsize);
    1814             : 
    1815           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    1816           0 :         fflush(stdout);
    1817           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1818           0 :         GDKfree(buf);
    1819           0 :         return err;             /* usually MAL_SUCCEED */
    1820             : }
    1821             : #endif
    1822             : 
    1823             : static str
    1824           0 : sql_update_oscar_lidar(Client c)
    1825             : {
    1826           0 :         char *query =
    1827             :                 "drop procedure sys.lidarattach(string) cascade;\n"
    1828             :                 "drop procedure sys.lidarload(string) cascade;\n"
    1829             :                 "drop procedure sys.lidarexport(string, string, string) cascade;\n";
    1830           0 :         printf("Running database upgrade commands:\n%s\n", query);
    1831           0 :         fflush(stdout);
    1832           0 :         return SQLstatementIntern(c, query, "update", true, false, NULL);
    1833             : }
    1834             : 
    1835             : static str
    1836         101 : sql_update_oscar(Client c, mvc *sql)
    1837             : {
    1838         101 :         size_t bufsize = 8192, pos = 0;
    1839         101 :         char *err = NULL, *buf = GDKmalloc(bufsize);
    1840         101 :         sql_schema *sys = mvc_bind_schema(sql, "sys");
    1841         101 :         res_table *output;
    1842         101 :         BAT *b;
    1843             : 
    1844         101 :         if (buf == NULL)
    1845           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1846             : 
    1847             :         /* if column 6 of sys.queue is named "progress" we need to update */
    1848         101 :         pos += snprintf(buf + pos, bufsize - pos,
    1849             :                         "select name from sys._columns where table_id = (select id from sys._tables where name = 'queue' and schema_id = (select id from sys.schemas where name = 'sys')) and number = 6;\n");
    1850         101 :         err = SQLstatementIntern(c, buf, "update", true, false, &output);
    1851         101 :         if (err) {
    1852           0 :                 GDKfree(buf);
    1853           0 :                 return err;
    1854             :         }
    1855         101 :         b = BATdescriptor(output->cols[0].b);
    1856         101 :         if (b) {
    1857         101 :                 BATiter bi = bat_iterator_nolock(b);
    1858         101 :                 if (BATcount(b) > 0 && strcmp(BUNtail(bi, 0), "progress") == 0) {
    1859           0 :                         pos = 0;
    1860             : 
    1861             :                         /* the real update of sys.env() has happened
    1862             :                          * in load_func, here we merely update the
    1863             :                          * sys.functions table */
    1864           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1865             :                                         "update sys.functions set"
    1866             :                                         " mod = 'inspect',"
    1867             :                                         " func = 'CREATE FUNCTION env() RETURNS TABLE( name varchar(1024), value varchar(2048)) EXTERNAL NAME inspect.\"getEnvironment\";'"
    1868             :                                         " where schema_id = (select id from sys.schemas where name = 'sys')"
    1869             :                                         " and name = 'env' and type = %d;\n",
    1870             :                                         (int) F_UNION);
    1871             : 
    1872             :                         /* 26_sysmon */
    1873           0 :                         sql_table *t;
    1874           0 :                         t = mvc_bind_table(sql, sys, "queue");
    1875           0 :                         t->system = 0; /* make it non-system else the drop view will fail */
    1876             : 
    1877           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1878             :                                         "drop view sys.queue cascade;\n"
    1879             :                                         "drop function sys.queue cascade;\n"
    1880             :                                         "create function sys.queue()\n"
    1881             :                                         "returns table(\n"
    1882             :                                         "\"tag\" bigint,\n"
    1883             :                                         "\"sessionid\" int,\n"
    1884             :                                         "\"username\" string,\n"
    1885             :                                         "\"started\" timestamp,\n"
    1886             :                                         "\"status\" string,\n"
    1887             :                                         "\"query\" string,\n"
    1888             :                                         "\"finished\" timestamp,\n"
    1889             :                                         "\"workers\" int,\n"
    1890             :                                         "\"memory\" int)\n"
    1891             :                                         " external name sysmon.queue;\n"
    1892             :                                         "grant execute on function sys.queue to public;\n"
    1893             :                                         "create view sys.queue as select * from sys.queue();\n"
    1894             :                                         "grant select on sys.queue to public;\n"
    1895             :                                         "drop procedure sys.pause(bigint) cascade;\n"
    1896             :                                         "drop procedure sys.resume(bigint) cascade;\n"
    1897             :                                         "drop procedure sys.stop(bigint) cascade;\n"
    1898             :                                         "create procedure sys.pause(tag bigint)\n"
    1899             :                                         "external name sysmon.pause;\n"
    1900             :                                         "grant execute on procedure sys.pause(bigint) to public;\n"
    1901             :                                         "create procedure sys.resume(tag bigint)\n"
    1902             :                                         "external name sysmon.resume;\n"
    1903             :                                         "grant execute on procedure sys.resume(bigint) to public;\n"
    1904             :                                         "create procedure sys.stop(tag bigint)\n"
    1905             :                                         "external name sysmon.stop;\n"
    1906             :                                         "grant execute on procedure sys.stop(bigint) to public;\n");
    1907             : 
    1908           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1909             :                                         "update sys.functions set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1910             :                                         " and name = 'queue' and type = %d;\n"
    1911             :                                         "update sys.functions set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1912             :                                         " and name in ('pause', 'resume', 'stop') and type = %d;\n",
    1913             :                                         (int) F_UNION, (int) F_PROC);
    1914           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1915             :                                         "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')"
    1916             :                                         " and name = 'queue';\n");
    1917             : 
    1918             :                         /* scoping branch changes */
    1919           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1920             :                                         "drop function \"sys\".\"var\"() cascade;\n"
    1921             :                                         "create function \"sys\".\"var\"() "
    1922             :                                         "returns table("
    1923             :                                         "\"schema\" string, "
    1924             :                                         "\"name\" string, "
    1925             :                                         "\"type\" string, "
    1926             :                                         "\"value\" string) "
    1927             :                                         "external name \"sql\".\"sql_variables\";\n"
    1928             :                                         "grant execute on function \"sys\".\"var\" to public;\n");
    1929             : 
    1930           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1931             :                                         "update sys.functions set system = true"
    1932             :                                         " where name = 'var' and schema_id = (select id from sys.schemas where name = 'sys');\n"
    1933             :                                         "update sys.privileges set grantor = 0 where obj_id = (select id from sys.functions where name = 'var' and schema_id = (select id from sys.schemas where name = 'sys') and type = %d);\n",
    1934             :                                         (int) F_UNION);
    1935             : 
    1936           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1937             :                                         "create procedure sys.hot_snapshot(tarfile string, onserver bool)\n"
    1938             :                                         "external name sql.hot_snapshot;\n"
    1939             :                                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'sys')"
    1940             :                                         " and name in ('hot_snapshot') and type = %d;\n",
    1941             :                                         (int) F_PROC);
    1942             :                         /* .snapshot user */
    1943           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1944             :                                 "create user \".snapshot\"\n"
    1945             :                                 " with encrypted password '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'\n"
    1946             :                                 " name 'Snapshot User'\n"
    1947             :                                 " schema sys;\n"
    1948             :                                 "grant execute on procedure sys.hot_snapshot(string) to \".snapshot\";\n"
    1949             :                                 "grant execute on procedure sys.hot_snapshot(string, bool) to \".snapshot\";\n"
    1950             :                         );
    1951             : 
    1952             :                         /* SQL functions without backend implementations */
    1953           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1954             :                                         "DROP FUNCTION \"sys\".\"getcontent\"(url) CASCADE;\n"
    1955             :                                         "DROP AGGREGATE \"json\".\"output\"(json) CASCADE;\n");
    1956             : 
    1957             :                         /* Move sys.degrees,sys.radians,sys.like and sys.ilike to sql_types.c definitions (I did this at the bat_logger) Remove the obsolete entries at privileges table */
    1958           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    1959             :                                         "delete from privileges where obj_id in (select obj_id from privileges left join functions on privileges.obj_id = functions.id where functions.id is null and privileges.obj_id not in ((SELECT tables.id from tables), 0));\n");
    1960             : 
    1961           0 :                         assert(pos < bufsize);
    1962             : 
    1963           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    1964           0 :                         fflush(stdout);
    1965           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    1966             :                 }
    1967         101 :                 BBPunfix(b->batCacheid);
    1968             :         } else {
    1969           0 :                 err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1970             :         }
    1971         101 :         res_table_destroy(output);
    1972         101 :         GDKfree(buf);
    1973         101 :         return err;             /* usually MAL_SUCCEED */
    1974             : }
    1975             : 
    1976             : static str
    1977         101 : sql_update_oct2020(Client c, mvc *sql)
    1978             : {
    1979         101 :         size_t bufsize = 4096, pos = 0;
    1980         101 :         char *buf = NULL, *err = NULL;
    1981         101 :         sql_schema *s = mvc_bind_schema(sql, "sys");
    1982         101 :         sql_table *t;
    1983         101 :         res_table *output = NULL;
    1984         101 :         BAT *b = NULL;
    1985             : 
    1986         101 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    1987           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    1988             : 
    1989             :         /* if view sys.var_values mentions the query cache ('cache') we need
    1990             :            to update */
    1991         101 :         pos += snprintf(buf + pos, bufsize - pos,
    1992             :                                         "select id from sys._tables where name = 'var_values' and query like '%%''cache''%%' and schema_id = (select id from sys.schemas where name = 'sys');\n");
    1993         101 :         err = SQLstatementIntern(c, buf, "update", true, false, &output);
    1994         101 :         if (err) {
    1995           0 :                 GDKfree(buf);
    1996           0 :                 return err;
    1997             :         }
    1998         101 :         b = BATdescriptor(output->cols[0].b);
    1999         101 :         if (b) {
    2000         101 :                 if (BATcount(b) > 0) {
    2001           0 :                         pos = 0;
    2002             : 
    2003             :                         /* 51_sys_schema_extensions.sql */
    2004           0 :                         t = mvc_bind_table(sql, s, "var_values");
    2005           0 :                         t->system = 0;       /* make it non-system else the drop view will fail */
    2006           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2007             :                                                         "DROP VIEW sys.var_values CASCADE;\n"
    2008             :                                                         "CREATE VIEW sys.var_values (var_name, value) AS\n"
    2009             :                                                         "SELECT 'current_role', current_role UNION ALL\n"
    2010             :                                                         "SELECT 'current_schema', current_schema UNION ALL\n"
    2011             :                                                         "SELECT 'current_timezone', current_timezone UNION ALL\n"
    2012             :                                                         "SELECT 'current_user', current_user UNION ALL\n"
    2013             :                                                         "SELECT 'debug', debug UNION ALL\n"
    2014             :                                                         "SELECT 'last_id', last_id UNION ALL\n"
    2015             :                                                         "SELECT 'optimizer', optimizer UNION ALL\n"
    2016             :                                                         "SELECT 'pi', pi() UNION ALL\n"
    2017             :                                                         "SELECT 'rowcnt', rowcnt;\n"
    2018             :                                                         "UPDATE sys._tables SET system = true WHERE name = 'var_values' AND schema_id = (SELECT id FROM sys.schemas WHERE name = 'sys');\n"
    2019             :                                                         "GRANT SELECT ON sys.var_values TO PUBLIC;\n");
    2020             :                         /* 26_sysmon.sql */
    2021           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2022             :                                         "create function sys.user_statistics()\n"
    2023             :                                         "returns table(\n"
    2024             :                                                 " username string,\n"
    2025             :                                                 " querycount bigint,\n"
    2026             :                                                 " totalticks bigint,\n"
    2027             :                                                 " started timestamp,\n"
    2028             :                                                 " finished timestamp,\n"
    2029             :                                                 " maxticks bigint,\n"
    2030             :                                                 " maxquery string\n"
    2031             :                                         ")\n"
    2032             :                                         "external name sysmon.user_statistics;\n"
    2033             :                                         "update sys.functions set system = true where system <> true and name = 'user_statistics' and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_UNION);
    2034             : 
    2035             :                         /* Remove entries on sys.args table without correspondents on sys.functions table */
    2036           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2037             :                                         "delete from sys.args where id in (select args.id from sys.args left join sys.functions on args.func_id = functions.id where functions.id is null);\n");
    2038             : 
    2039             :                         /* 39_analytics.sql */
    2040           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2041             :                                         "DROP AGGREGATE stddev_samp(INTERVAL SECOND) CASCADE;\n"
    2042             :                                         "DROP AGGREGATE stddev_samp(INTERVAL MONTH) CASCADE;\n"
    2043             :                                         "DROP WINDOW stddev_samp(INTERVAL SECOND) CASCADE;\n"
    2044             :                                         "DROP WINDOW stddev_samp(INTERVAL MONTH) CASCADE;\n"
    2045             :                                         "DROP AGGREGATE stddev_pop(INTERVAL SECOND) CASCADE;\n"
    2046             :                                         "DROP AGGREGATE stddev_pop(INTERVAL MONTH) CASCADE;\n"
    2047             :                                         "DROP WINDOW stddev_pop(INTERVAL SECOND) CASCADE;\n"
    2048             :                                         "DROP WINDOW stddev_pop(INTERVAL MONTH) CASCADE;\n"
    2049             :                                         "DROP AGGREGATE var_samp(INTERVAL SECOND) CASCADE;\n"
    2050             :                                         "DROP AGGREGATE var_samp(INTERVAL MONTH) CASCADE;\n"
    2051             :                                         "DROP WINDOW var_samp(INTERVAL SECOND) CASCADE;\n"
    2052             :                                         "DROP WINDOW var_samp(INTERVAL MONTH) CASCADE;\n"
    2053             :                                         "DROP AGGREGATE var_pop(INTERVAL SECOND) CASCADE;\n"
    2054             :                                         "DROP AGGREGATE var_pop(INTERVAL MONTH) CASCADE;\n"
    2055             :                                         "DROP WINDOW var_pop(INTERVAL SECOND) CASCADE;\n"
    2056             :                                         "DROP WINDOW var_pop(INTERVAL MONTH) CASCADE;\n"
    2057             :                                         "DROP AGGREGATE covar_samp(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2058             :                                         "DROP AGGREGATE covar_samp(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2059             :                                         "DROP WINDOW covar_samp(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2060             :                                         "DROP WINDOW covar_samp(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2061             :                                         "DROP AGGREGATE covar_pop(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2062             :                                         "DROP AGGREGATE covar_pop(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2063             :                                         "DROP WINDOW covar_pop(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2064             :                                         "DROP WINDOW covar_pop(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2065             :                                         "DROP AGGREGATE corr(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2066             :                                         "DROP AGGREGATE corr(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2067             :                                         "DROP WINDOW corr(INTERVAL SECOND,INTERVAL SECOND) CASCADE;\n"
    2068             :                                         "DROP WINDOW corr(INTERVAL MONTH,INTERVAL MONTH) CASCADE;\n"
    2069             :                                         "create aggregate median(val INTERVAL DAY) returns INTERVAL DAY\n"
    2070             :                                         " external name \"aggr\".\"median\";\n"
    2071             :                                         "GRANT EXECUTE ON AGGREGATE median(INTERVAL DAY) TO PUBLIC;\n"
    2072             :                                         "create aggregate quantile(val INTERVAL DAY, q DOUBLE) returns INTERVAL DAY\n"
    2073             :                                         " external name \"aggr\".\"quantile\";\n"
    2074             :                                         "GRANT EXECUTE ON AGGREGATE quantile(INTERVAL DAY, DOUBLE) TO PUBLIC;\n"
    2075             :                                         "update sys.functions set system = true where system <> true and name in ('median', 'quantile') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_AGGR);
    2076             : 
    2077             :                         /* 90_generator.sql */
    2078           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2079             :                                         "create function sys.generate_series(first timestamp, \"limit\" timestamp, stepsize interval day) returns table (value timestamp)\n"
    2080             :                                         " external name generator.series;\n"
    2081             :                                         "update sys.functions set system = true where system <> true and name in ('generate_series') and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_UNION);
    2082             : 
    2083             :                         /* 51_sys_schema_extensions.sql */
    2084           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2085             :                                         "ALTER TABLE sys.keywords SET READ WRITE;\n"
    2086             :                                         "insert into sys.keywords values ('EPOCH');\n");
    2087             : 
    2088           0 :                         pos += snprintf(buf + pos, bufsize - pos, "commit;\n");
    2089             : 
    2090           0 :                         assert(pos < bufsize);
    2091           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    2092           0 :                         fflush(stdout);
    2093           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    2094           0 :                         if (err != MAL_SUCCEED)
    2095           0 :                                 goto bailout;
    2096             : 
    2097           0 :                         pos = snprintf(buf, bufsize,
    2098             :                                         "ALTER TABLE sys.keywords SET READ ONLY;\n");
    2099           0 :                         assert(pos < bufsize);
    2100           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    2101           0 :                         fflush(stdout);
    2102           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    2103           0 :                         if (err != MAL_SUCCEED)
    2104           0 :                                 goto bailout;
    2105           0 :                         err = sql_update_storagemodel(c, sql, true); /* because of day interval addition, we have to recreate the storagmodel views */
    2106             :                 }
    2107             :         } else {
    2108           0 :                 err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
    2109             :         }
    2110             : 
    2111           0 : bailout:
    2112         101 :         BBPreclaim(b);
    2113         101 :         if (output)
    2114         101 :                 res_table_destroy(output);
    2115         101 :         GDKfree(buf);
    2116         101 :         return err;             /* usually MAL_SUCCEED */
    2117             : }
    2118             : 
    2119             : static str
    2120         101 : sql_update_oct2020_sp1(Client c, mvc *sql)
    2121             : {
    2122         101 :         size_t bufsize = 1024, pos = 0;
    2123         101 :         char *buf = NULL, *err = NULL;
    2124             : 
    2125         101 :         if (!sql_bind_func(sql, "sys", "uuid", sql_bind_localtype("int"), NULL, F_FUNC, true, true)) {
    2126           0 :                 sql->session->status = 0; /* if the function was not found clean the error */
    2127           0 :                 sql->errstr[0] = '\0';
    2128             : 
    2129           0 :                 if ((buf = GDKmalloc(bufsize)) == NULL)
    2130           0 :                         throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    2131             : 
    2132             :                 /* 45_uuid.sql */
    2133           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    2134             :                         "create function sys.uuid(d int) returns uuid\n"
    2135             :                         " external name uuid.\"new\";\n"
    2136             :                         "GRANT EXECUTE ON FUNCTION sys.uuid(int) TO PUBLIC;\n"
    2137             :                         "update sys.functions set system = true where system <> true and name = 'uuid' and schema_id = (select id from sys.schemas where name = 'sys') and type = %d;\n", (int) F_FUNC);
    2138             : 
    2139           0 :                 assert(pos < bufsize);
    2140           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    2141           0 :                 fflush(stdout);
    2142           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    2143             :         }
    2144           0 :         GDKfree(buf);
    2145         101 :         return err;             /* usually MAL_SUCCEED */
    2146             : }
    2147             : 
    2148             : static str
    2149         101 : sql_update_jul2021(Client c, mvc *sql)
    2150             : {
    2151         101 :         size_t bufsize = 65536, pos = 0;
    2152         101 :         char *buf = NULL, *err = NULL;
    2153         101 :         res_table *output = NULL;
    2154         101 :         BAT *b = NULL;
    2155         101 :         sql_schema *s = mvc_bind_schema(sql, "sys");
    2156         101 :         sql_table *t;
    2157             : 
    2158         101 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    2159           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    2160             : 
    2161             :         /* if the keyword STREAM is in the list of keywords, upgrade */
    2162         101 :         pos += snprintf(buf + pos, bufsize - pos,
    2163             :                                         "select keyword from sys.keywords where keyword = 'STREAM';\n");
    2164         101 :         assert(pos < bufsize);
    2165         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)))
    2166           0 :                 goto bailout;
    2167         101 :         if ((b = BATdescriptor(output->cols[0].b))) {
    2168         101 :                 if (BATcount(b) == 1) {
    2169             :                         /* 20_vacuum.sql */
    2170           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2171             :                                                         "drop procedure sys.shrink(string, string) cascade;\n"
    2172             :                                                         "drop procedure sys.reuse(string, string) cascade;\n"
    2173             :                                                         "drop procedure sys.vacuum(string, string) cascade;\n");
    2174             : 
    2175             :                         /* 22_clients.sql */
    2176           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2177             :                                                         "create function sys.current_sessionid() returns int\n"
    2178             :                                                         "external name clients.current_sessionid;\n"
    2179             :                                                         "grant execute on function sys.current_sessionid to public;\n"
    2180             :                                                         "update sys.functions set system = true where system <> true and schema_id = 2000 and name = 'current_sessionid' and type = %d;\n", (int) F_FUNC);
    2181             : 
    2182             :                         /* 25_debug.sql */
    2183           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2184             :                                                         "drop procedure sys.flush_log() cascade;\n");
    2185             : 
    2186           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2187             :                                                         "drop function sys.deltas(string) cascade;\n"
    2188             :                                                         "drop function sys.deltas(string, string) cascade;\n"
    2189             :                                                         "drop function sys.deltas(string, string, string) cascade;\n");
    2190           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2191             :                                                         "create function sys.deltas (\"schema\" string)\n"
    2192             :                                                         "returns table (\"id\" int, \"segments\" bigint, \"all\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)\n"
    2193             :                                                         "external name \"sql\".\"deltas\";\n"
    2194             :                                                         "create function sys.deltas (\"schema\" string, \"table\" string)\n"
    2195             :                                                         "returns table (\"id\" int, \"segments\" bigint, \"all\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)\n"
    2196             :                                                         "external name \"sql\".\"deltas\";\n"
    2197             :                                                         "create function sys.deltas (\"schema\" string, \"table\" string, \"column\" string)\n"
    2198             :                                                         "returns table (\"id\" int, \"segments\" bigint, \"all\" bigint, \"inserted\" bigint, \"updates\" bigint, \"deletes\" bigint, \"level\" int)\n"
    2199             :                                                         "external name \"sql\".\"deltas\";\n"
    2200             :                                                         "update sys.functions set system = true"
    2201             :                                                         " where schema_id = 2000 and name = 'deltas';\n");
    2202             : 
    2203             :                         /* 26_sysmon */
    2204           0 :                         t = mvc_bind_table(sql, s, "queue");
    2205           0 :                         t->system = 0; /* make it non-system else the drop view will fail */
    2206             : 
    2207           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2208             :                                                         "drop view sys.queue cascade;\n"
    2209             :                                                         "drop function sys.queue cascade;\n"
    2210             :                                                         "create function sys.queue()\n"
    2211             :                                                         "returns table(\n"
    2212             :                                                         "\"tag\" bigint,\n"
    2213             :                                                         "\"sessionid\" int,\n"
    2214             :                                                         "\"username\" string,\n"
    2215             :                                                         "\"started\" timestamp,\n"
    2216             :                                                         "\"status\" string,\n"
    2217             :                                                         "\"query\" string,\n"
    2218             :                                                         "\"finished\" timestamp,\n"
    2219             :                                                         "\"maxworkers\" int,\n"
    2220             :                                                         "\"footprint\" int\n"
    2221             :                                                         ")\n"
    2222             :                                                         "external name sysmon.queue;\n"
    2223             :                                                         "grant execute on function sys.queue to public;\n"
    2224             :                                                         "create view sys.queue as select * from sys.queue();\n"
    2225             :                                                         "grant select on sys.queue to public;\n");
    2226           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2227             :                                                         "update sys.functions set system = true where system <> true and schema_id = 2000"
    2228             :                                                         " and name = 'queue' and type = %d;\n", (int) F_UNION);
    2229           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2230             :                                                         "update sys._tables set system = true where schema_id = 2000"
    2231             :                                                         " and name = 'queue';\n");
    2232             : 
    2233             :                         /* fix up dependencies for function getproj4 (if it exists) */
    2234           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2235             :                                                         "delete from sys.dependencies d where d.depend_id = (select id from sys.functions where name = 'getproj4' and schema_id = 2000) and id in (select id from sys._columns where name not in ('proj4text', 'srid'));\n");
    2236             : 
    2237             :                         /* 41_json.sql */
    2238           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2239             :                                                         "drop function json.isobject(string) cascade;\n"
    2240             :                                                         "drop function json.isarray(string) cascade;\n"
    2241             :                                                         "drop function json.isvalid(json) cascade;\n"
    2242             :                                                         "create function json.isvalid(js json)\n"
    2243             :                                                         "returns bool begin return true; end;\n"
    2244             :                                                         "grant execute on function json.isvalid(json) to public;\n"
    2245             :                                                         "update sys.functions set system = true"
    2246             :                                                         " where schema_id = (select id from sys.schemas where name = 'json')"
    2247             :                                                         " and name = 'isvalid';\n");
    2248             : 
    2249             :                         /* 51_sys_schema_extensions, remove stream table entries and update window function description */
    2250           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2251             :                                         "ALTER TABLE sys.keywords SET READ WRITE;\n"
    2252             :                                         "DELETE FROM sys.keywords where keyword = 'STREAM';\n"
    2253             :                                         "INSERT INTO sys.keywords VALUES ('BIG'), ('LITTLE'), ('NATIVE'), ('ENDIAN'), ('CURRENT_SCHEMA'), ('CURRENT_TIMEZONE'), ('IMPRINTS'), ('ORDERED'), ('PATH'), ('ROLE'), ('ROW'), ('VALUE');\n"
    2254             :                                         "ALTER TABLE sys.table_types SET READ WRITE;\n"
    2255             :                                         "DELETE FROM sys.table_types where table_type_id = 4;\n"
    2256             :                                         "ALTER TABLE sys.function_types SET READ WRITE;\n"
    2257             :                                         "UPDATE sys.function_types SET function_type_keyword = 'WINDOW' WHERE function_type_id = 6;\n");
    2258             : 
    2259             :                         /* 52_describe.sql */
    2260           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2261             :                                         "CREATE FUNCTION sys.describe_type(ctype string, digits integer, tscale integer)\n"
    2262             :                                         "  RETURNS string\n"
    2263             :                                         "BEGIN\n"
    2264             :                                         "  RETURN\n"
    2265             :                                         "    CASE ctype\n"
    2266             :                                         "      WHEN 'bigint' THEN 'BIGINT'\n"
    2267             :                                         "      WHEN 'blob' THEN\n"
    2268             :                                         "        CASE digits\n"
    2269             :                                         "          WHEN 0 THEN 'BINARY LARGE OBJECT'\n"
    2270             :                                         "          ELSE 'BINARY LARGE OBJECT(' || digits || ')'\n"
    2271             :                                         "        END\n"
    2272             :                                         "      WHEN 'boolean' THEN 'BOOLEAN'\n"
    2273             :                                         "      WHEN 'char' THEN\n"
    2274             :                                         "        CASE digits\n"
    2275             :                                         "          WHEN 1 THEN 'CHARACTER'\n"
    2276             :                                         "          ELSE 'CHARACTER(' || digits || ')'\n"
    2277             :                                         "        END\n"
    2278             :                                         "      WHEN 'clob' THEN\n"
    2279             :                                         "    CASE digits\n"
    2280             :                                         "      WHEN 0 THEN 'CHARACTER LARGE OBJECT'\n"
    2281             :                                         "      ELSE 'CHARACTER LARGE OBJECT(' || digits || ')'\n"
    2282             :                                         "    END\n"
    2283             :                                         "      WHEN 'date' THEN 'DATE'\n"
    2284             :                                         "      WHEN 'day_interval' THEN 'INTERVAL DAY'\n"
    2285             :                                         "      WHEN ctype = 'decimal' THEN\n"
    2286             :                                         "      CASE\n"
    2287             :                                         "      WHEN (digits = 1 AND tscale = 0) OR digits = 0 THEN 'DECIMAL'\n"
    2288             :                                         "      WHEN tscale = 0 THEN 'DECIMAL(' || digits || ')'\n"
    2289             :                                         "      WHEN digits = 39 THEN 'DECIMAL(' || 38 || ',' || tscale || ')'\n"
    2290             :                                         "      WHEN digits = 19 AND (SELECT COUNT(*) = 0 FROM sys.types WHERE sqlname = 'hugeint' ) THEN 'DECIMAL(' || 18 || ',' || tscale || ')'\n"
    2291             :                                         "      ELSE 'DECIMAL(' || digits || ',' || tscale || ')'\n"
    2292             :                                         "    END\n"
    2293             :                                         "      WHEN 'double' THEN\n"
    2294             :                                         "    CASE\n"
    2295             :                                         "      WHEN digits = 53 and tscale = 0 THEN 'DOUBLE'\n"
    2296             :                                         "      WHEN tscale = 0 THEN 'FLOAT(' || digits || ')'\n"
    2297             :                                         "      ELSE 'FLOAT(' || digits || ',' || tscale || ')'\n"
    2298             :                                         "    END\n"
    2299             :                                         "      WHEN 'geometry' THEN\n"
    2300             :                                         "    CASE digits\n"
    2301             :                                         "      WHEN 4 THEN 'GEOMETRY(POINT' ||\n"
    2302             :                                         "            CASE tscale\n"
    2303             :                                         "              WHEN 0 THEN ''\n"
    2304             :                                         "              ELSE ',' || tscale\n"
    2305             :                                         "            END || ')'\n"
    2306             :                                         "      WHEN 8 THEN 'GEOMETRY(LINESTRING' ||\n"
    2307             :                                         "            CASE tscale\n"
    2308             :                                         "              WHEN 0 THEN ''\n"
    2309             :                                         "              ELSE ',' || tscale\n"
    2310             :                                         "            END || ')'\n"
    2311             :                                         "      WHEN 16 THEN 'GEOMETRY(POLYGON' ||\n"
    2312             :                                         "            CASE tscale\n"
    2313             :                                         "              WHEN 0 THEN ''\n"
    2314             :                                         "              ELSE ',' || tscale\n"
    2315             :                                         "            END || ')'\n"
    2316             :                                         "      WHEN 20 THEN 'GEOMETRY(MULTIPOINT' ||\n"
    2317             :                                         "            CASE tscale\n"
    2318             :                                         "              WHEN 0 THEN ''\n"
    2319             :                                         "              ELSE ',' || tscale\n"
    2320             :                                         "            END || ')'\n"
    2321             :                                         "      WHEN 24 THEN 'GEOMETRY(MULTILINESTRING' ||\n"
    2322             :                                         "            CASE tscale\n"
    2323             :                                         "              WHEN 0 THEN ''\n"
    2324             :                                         "              ELSE ',' || tscale\n"
    2325             :                                         "            END || ')'\n"
    2326             :                                         "      WHEN 28 THEN 'GEOMETRY(MULTIPOLYGON' ||\n"
    2327             :                                         "            CASE tscale\n"
    2328             :                                         "              WHEN 0 THEN ''\n"
    2329             :                                         "              ELSE ',' || tscale\n"
    2330             :                                         "            END || ')'\n"
    2331             :                                         "      WHEN 32 THEN 'GEOMETRY(GEOMETRYCOLLECTION' ||\n"
    2332             :                                         "            CASE tscale\n"
    2333             :                                         "              WHEN 0 THEN ''\n"
    2334             :                                         "              ELSE ',' || tscale\n"
    2335             :                                         "            END || ')'\n"
    2336             :                                         "      ELSE 'GEOMETRY'\n"
    2337             :                                         "        END\n"
    2338             :                                         "      WHEN 'hugeint' THEN 'HUGEINT'\n"
    2339             :                                         "      WHEN 'int' THEN 'INTEGER'\n"
    2340             :                                         "      WHEN 'month_interval' THEN\n"
    2341             :                                         "    CASE digits\n"
    2342             :                                         "      WHEN 1 THEN 'INTERVAL YEAR'\n"
    2343             :                                         "      WHEN 2 THEN 'INTERVAL YEAR TO MONTH'\n"
    2344             :                                         "      WHEN 3 THEN 'INTERVAL MONTH'\n"
    2345             :                                         "    END\n"
    2346             :                                         "      WHEN 'real' THEN\n"
    2347             :                                         "    CASE\n"
    2348             :                                         "      WHEN digits = 24 and tscale = 0 THEN 'REAL'\n"
    2349             :                                         "      WHEN tscale = 0 THEN 'FLOAT(' || digits || ')'\n"
    2350             :                                         "      ELSE 'FLOAT(' || digits || ',' || tscale || ')'\n"
    2351             :                                         "    END\n"
    2352             :                                         "      WHEN 'sec_interval' THEN\n"
    2353             :                                         "    CASE digits\n"
    2354             :                                         "      WHEN 4 THEN 'INTERVAL DAY'\n"
    2355             :                                         "      WHEN 5 THEN 'INTERVAL DAY TO HOUR'\n"
    2356             :                                         "      WHEN 6 THEN 'INTERVAL DAY TO MINUTE'\n"
    2357             :                                         "      WHEN 7 THEN 'INTERVAL DAY TO SECOND'\n"
    2358             :                                         "      WHEN 8 THEN 'INTERVAL HOUR'\n"
    2359             :                                         "      WHEN 9 THEN 'INTERVAL HOUR TO MINUTE'\n"
    2360             :                                         "      WHEN 10 THEN 'INTERVAL HOUR TO SECOND'\n"
    2361             :                                         "      WHEN 11 THEN 'INTERVAL MINUTE'\n"
    2362             :                                         "      WHEN 12 THEN 'INTERVAL MINUTE TO SECOND'\n"
    2363             :                                         "      WHEN 13 THEN 'INTERVAL SECOND'\n"
    2364             :                                         "    END\n"
    2365             :                                         "      WHEN 'smallint' THEN 'SMALLINT'\n"
    2366             :                                         "      WHEN 'time' THEN\n"
    2367             :                                         "    CASE digits\n"
    2368             :                                         "      WHEN 1 THEN 'TIME'\n"
    2369             :                                         "      ELSE 'TIME(' || (digits - 1) || ')'\n"
    2370             :                                         "    END\n"
    2371             :                                         "      WHEN 'timestamp' THEN\n"
    2372             :                                         "    CASE digits\n"
    2373             :                                         "      WHEN 7 THEN 'TIMESTAMP'\n"
    2374             :                                         "      ELSE 'TIMESTAMP(' || (digits - 1) || ')'\n"
    2375             :                                         "    END\n"
    2376             :                                         "      WHEN 'timestamptz' THEN\n"
    2377             :                                         "    CASE digits\n"
    2378             :                                         "      WHEN 7 THEN 'TIMESTAMP'\n"
    2379             :                                         "      ELSE 'TIMESTAMP(' || (digits - 1) || ')'\n"
    2380             :                                         "    END || ' WITH TIME ZONE'\n"
    2381             :                                         "      WHEN 'timetz' THEN\n"
    2382             :                                         "    CASE digits\n"
    2383             :                                         "      WHEN 1 THEN 'TIME'\n"
    2384             :                                         "      ELSE 'TIME(' || (digits - 1) || ')'\n"
    2385             :                                         "    END || ' WITH TIME ZONE'\n"
    2386             :                                         "      WHEN 'tinyint' THEN 'TINYINT'\n"
    2387             :                                         "      WHEN 'varchar' THEN 'CHARACTER VARYING(' || digits || ')'\n"
    2388             :                                         "      ELSE\n"
    2389             :                                         "        CASE\n"
    2390             :                                         "          WHEN lower(ctype) = ctype THEN upper(ctype)\n"
    2391             :                                         "          ELSE '\"' || ctype || '\"'\n"
    2392             :                                         "        END || CASE digits\n"
    2393             :                                         "      WHEN 0 THEN ''\n"
    2394             :                                         "          ELSE '(' || digits || CASE tscale\n"
    2395             :                                         "        WHEN 0 THEN ''\n"
    2396             :                                         "            ELSE ',' || tscale\n"
    2397             :                                         "          END || ')'\n"
    2398             :                                         "    END\n"
    2399             :                                         "    END;\n"
    2400             :                                         "END;\n"
    2401             :                                         "CREATE FUNCTION sys.SQ (s STRING) RETURNS STRING BEGIN RETURN ' ''' || sys.replace(s,'''','''''') || ''' '; END;\n"
    2402             :                                         "CREATE FUNCTION sys.DQ (s STRING) RETURNS STRING BEGIN RETURN '\"' || sys.replace(s,'\"','\"\"') || '\"'; END; --TODO: Figure out why this breaks with the space\n"
    2403             :                                         "CREATE FUNCTION sys.FQN(s STRING, t STRING) RETURNS STRING BEGIN RETURN sys.DQ(s) || '.' || sys.DQ(t); END;\n"
    2404             :                                         "CREATE FUNCTION sys.ALTER_TABLE(s STRING, t STRING) RETURNS STRING BEGIN RETURN 'ALTER TABLE ' || sys.FQN(s, t) || ' '; END;\n"
    2405             :                                         "--We need pcre to implement a header guard which means adding the schema of an object explicitely to its identifier.\n"
    2406             :                                         "CREATE FUNCTION sys.replace_first(ori STRING, pat STRING, rep STRING, flg STRING) RETURNS STRING EXTERNAL NAME \"pcre\".\"replace_first\";\n"
    2407             :                                         "CREATE FUNCTION sys.schema_guard(sch STRING, nme STRING, stmt STRING) RETURNS STRING BEGIN\n"
    2408             :                                         "RETURN\n"
    2409             :                                         "    SELECT sys.replace_first(stmt, '(\\\\s*\"?' || sch ||  '\"?\\\\s*\\\\.|)\\\\s*\"?' || nme || '\"?\\\\s*', ' ' || sys.FQN(sch, nme) || ' ', 'imsx');\n"
    2410             :                                         "END;\n"
    2411             :                                         "CREATE VIEW sys.describe_constraints AS\n"
    2412             :                                         "    SELECT\n"
    2413             :                                         "        s.name sch,\n"
    2414             :                                         "        t.name tbl,\n"
    2415             :                                         "        kc.name col,\n"
    2416             :                                         "        k.name con,\n"
    2417             :                                         "        CASE WHEN k.type = 0 THEN 'PRIMARY KEY' WHEN k.type = 1 THEN 'UNIQUE' END tpe\n"
    2418             :                                         "    FROM sys.schemas s, sys._tables t, sys.objects kc, sys.keys k\n"
    2419             :                                         "    WHERE kc.id = k.id\n"
    2420             :                                         "        AND k.table_id = t.id\n"
    2421             :                                         "        AND s.id = t.schema_id\n"
    2422             :                                         "        AND t.system = FALSE\n"
    2423             :                                         "        AND k.type in (0, 1)\n"
    2424             :                                         "        AND t.type IN (0, 6);\n"
    2425             :                                         "CREATE VIEW sys.describe_indices AS\n"
    2426             :                                         "    WITH it (id, idx) AS (VALUES (0, 'INDEX'), (4, 'IMPRINTS INDEX'), (5, 'ORDERED INDEX')) --UNIQUE INDEX wraps to INDEX.\n"
    2427             :                                         "    SELECT\n"
    2428             :                                         "        i.name ind,\n"
    2429             :                                         "        s.name sch,\n"
    2430             :                                         "        t.name tbl,\n"
    2431             :                                         "        c.name col,\n"
    2432             :                                         "        it.idx tpe\n"
    2433             :                                         "    FROM\n"
    2434             :                                         "        sys.idxs AS i LEFT JOIN sys.keys AS k ON i.name = k.name,\n"
    2435             :                                         "        sys.objects AS kc,\n"
    2436             :                                         "        sys._columns AS c,\n"
    2437             :                                         "        sys.schemas s,\n"
    2438             :                                         "        sys._tables AS t,\n"
    2439             :                                         "        it\n"
    2440             :                                         "    WHERE\n"
    2441             :                                         "        i.table_id = t.id\n"
    2442             :                                         "        AND i.id = kc.id\n"
    2443             :                                         "        AND kc.name = c.name\n"
    2444             :                                         "        AND t.id = c.table_id\n"
    2445             :                                         "        AND t.schema_id = s.id\n"
    2446             :                                         "        AND k.type IS NULL\n"
    2447             :                                         "        AND i.type = it.id\n"
    2448             :                                         "    ORDER BY i.name, kc.nr;\n"
    2449             :                                         "CREATE VIEW sys.describe_column_defaults AS\n"
    2450             :                                         "    SELECT\n"
    2451             :                                         "        s.name sch,\n"
    2452             :                                         "        t.name tbl,\n"
    2453             :                                         "        c.name col,\n"
    2454             :                                         "        c.\"default\" def\n"
    2455             :                                         "    FROM sys.schemas s, sys.tables t, sys.columns c\n"
    2456             :                                         "    WHERE\n"
    2457             :                                         "        s.id = t.schema_id AND\n"
    2458             :                                         "        t.id = c.table_id AND\n"
    2459             :                                         "        s.name <> 'tmp' AND\n"
    2460             :                                         "        NOT t.system AND\n"
    2461             :                                         "        c.\"default\" IS NOT NULL;\n"
    2462             :                                         "CREATE VIEW sys.describe_foreign_keys AS\n"
    2463             :                                         "        WITH action_type (id, act) AS (VALUES\n"
    2464             :                                         "            (0, 'NO ACTION'),\n"
    2465             :                                         "            (1, 'CASCADE'),\n"
    2466             :                                         "            (2, 'RESTRICT'),\n"
    2467             :                                         "            (3, 'SET NULL'),\n"
    2468             :                                         "            (4, 'SET DEFAULT'))\n"
    2469             :                                         "        SELECT\n"
    2470             :                                         "            fs.name fk_s,\n"
    2471             :                                         "            fkt.name fk_t,\n"
    2472             :                                         "            fkkc.name fk_c,\n"
    2473             :                                         "            fkkc.nr o,\n"
    2474             :                                         "            fkk.name fk,\n"
    2475             :                                         "            ps.name pk_s,\n"
    2476             :                                         "            pkt.name pk_t,\n"
    2477             :                                         "            pkkc.name pk_c,\n"
    2478             :                                         "            ou.act on_update,\n"
    2479             :                                         "            od.act on_delete\n"
    2480             :                                         "        FROM sys._tables fkt,\n"
    2481             :                                         "            sys.objects fkkc,\n"
    2482             :                                         "            sys.keys fkk,\n"
    2483             :                                         "            sys._tables pkt,\n"
    2484             :                                         "            sys.objects pkkc,\n"
    2485             :                                         "            sys.keys pkk,\n"
    2486             :                                         "            sys.schemas ps,\n"
    2487             :                                         "            sys.schemas fs,\n"
    2488             :                                         "            action_type ou,\n"
    2489             :                                         "            action_type od\n"
    2490             :                                         "        WHERE fkt.id = fkk.table_id\n"
    2491             :                                         "        AND pkt.id = pkk.table_id\n"
    2492             :                                         "        AND fkk.id = fkkc.id\n"
    2493             :                                         "        AND pkk.id = pkkc.id\n"
    2494             :                                         "        AND fkk.rkey = pkk.id\n"
    2495             :                                         "        AND fkkc.nr = pkkc.nr\n"
    2496             :                                         "        AND pkt.schema_id = ps.id\n"
    2497             :                                         "        AND fkt.schema_id = fs.id\n"
    2498             :                                         "        AND (fkk.\"action\" & 255)         = od.id\n"
    2499             :                                         "        AND ((fkk.\"action\" >> 8) & 255)  = ou.id\n"
    2500             :                                         "        ORDER BY fkk.name, fkkc.nr;\n"
    2501             :                                         "--TODO: CRASHES when this function gets inlined into describe_tables\n"
    2502             :                                         "CREATE FUNCTION sys.get_merge_table_partition_expressions(tid INT) RETURNS STRING\n"
    2503             :                                         "BEGIN\n"
    2504             :                                         "    RETURN\n"
    2505             :                                         "        SELECT\n"
    2506             :                                         "            CASE WHEN tp.table_id IS NOT NULL THEN    --updatable merge table\n"
    2507             :                                         "                ' PARTITION BY ' ||\n"
    2508             :                                         "                CASE\n"
    2509             :                                         "                    WHEN bit_and(tp.type, 2) = 2\n"
    2510             :                                         "                    THEN 'VALUES '\n"
    2511             :                                         "                    ELSE 'RANGE '\n"
    2512             :                                         "                END ||\n"
    2513             :                                         "                CASE\n"
    2514             :                                         "                    WHEN bit_and(tp.type, 4) = 4 --column expression\n"
    2515             :                                         "                    THEN 'ON ' || '(' || (SELECT sys.DQ(c.name) || ')' FROM sys.columns c WHERE c.id = tp.column_id)\n"
    2516             :                                         "                    ELSE 'USING ' || '(' || tp.expression || ')' --generic expression\n"
    2517             :                                         "                END\n"
    2518             :                                         "            ELSE                                    --read only partition merge table.\n"
    2519             :                                         "                ''\n"
    2520             :                                         "            END\n"
    2521             :                                         "        FROM (VALUES (tid)) t(id) LEFT JOIN sys.table_partitions tp ON t.id = tp.table_id;\n"
    2522             :                                         "END;\n"
    2523             :                                         "--TODO: gives mergejoin errors when inlined\n"
    2524             :                                         "CREATE FUNCTION sys.get_remote_table_expressions(s STRING, t STRING) RETURNS STRING BEGIN\n"
    2525             :                                         "    RETURN SELECT ' ON ' || sys.SQ(uri) || ' WITH USER ' || sys.SQ(username) || ' ENCRYPTED PASSWORD ' || sys.SQ(\"hash\") FROM sys.remote_table_credentials(s ||'.' || t);\n"
    2526             :                                         "END;\n"
    2527             :                                         "CREATE VIEW sys.describe_tables AS\n"
    2528             :                                         "    SELECT\n"
    2529             :                                         "        t.id o,\n"
    2530             :                                         "        s.name sch,\n"
    2531             :                                         "        t.name tab,\n"
    2532             :                                         "        ts.table_type_name typ,\n"
    2533             :                                         "        (SELECT\n"
    2534             :                                         "            ' (' ||\n"
    2535             :                                         "            GROUP_CONCAT(\n"
    2536             :                                         "                sys.DQ(c.name) || ' ' ||\n"
    2537             :                                         "                sys.describe_type(c.type, c.type_digits, c.type_scale) ||\n"
    2538             :                                         "                ifthenelse(c.\"null\" = 'false', ' NOT NULL', '')\n"
    2539             :                                         "            , ', ') || ')'\n"
    2540             :                                         "        FROM sys._columns c\n"
    2541             :                                         "        WHERE c.table_id = t.id) col,\n"
    2542             :                                         "        CASE\n"
    2543             :                                         "            WHEN ts.table_type_name = 'REMOTE TABLE' THEN\n"
    2544             :                                         "                sys.get_remote_table_expressions(s.name, t.name)\n"
    2545             :                                         "            WHEN ts.table_type_name = 'MERGE TABLE' THEN\n"
    2546             :                                         "                sys.get_merge_table_partition_expressions(t.id)\n"
    2547             :                                         "            WHEN ts.table_type_name = 'VIEW' THEN\n"
    2548             :                                         "                sys.schema_guard(s.name, t.name, t.query)\n"
    2549             :                                         "            ELSE\n"
    2550             :                                         "                ''\n"
    2551             :                                         "        END opt\n"
    2552             :                                         "    FROM sys.schemas s, sys.table_types ts, sys.tables t\n"
    2553             :                                         "    WHERE ts.table_type_name IN ('TABLE', 'VIEW', 'MERGE TABLE', 'REMOTE TABLE', 'REPLICA TABLE')\n"
    2554             :                                         "        AND t.system = FALSE\n"
    2555             :                                         "        AND s.id = t.schema_id\n"
    2556             :                                         "        AND ts.table_type_id = t.type\n"
    2557             :                                         "        AND s.name <> 'tmp';\n"
    2558             :                                         "CREATE VIEW sys.describe_triggers AS\n"
    2559             :                                         "        SELECT\n"
    2560             :                                         "            s.name sch,\n"
    2561             :                                         "            t.name tab,\n"
    2562             :                                         "            tr.name tri,\n"
    2563             :                                         "            tr.statement def\n"
    2564             :                                         "        FROM sys.schemas s, sys.tables t, sys.triggers tr\n"
    2565             :                                         "        WHERE s.id = t.schema_id AND t.id = tr.table_id AND NOT t.system;\n"
    2566             :                                         "CREATE VIEW sys.describe_comments AS\n"
    2567             :                                         "        SELECT\n"
    2568             :                                         "            o.id id,\n"
    2569             :                                         "            o.tpe tpe,\n"
    2570             :                                         "            o.nme fqn,\n"
    2571             :                                         "            c.remark rem\n"
    2572             :                                         "        FROM (\n"
    2573             :                                         "            SELECT id, 'SCHEMA', sys.DQ(name) FROM sys.schemas\n"
    2574             :                                         "            UNION ALL\n"
    2575             :                                         "            SELECT t.id, CASE WHEN ts.table_type_name = 'VIEW' THEN 'VIEW' ELSE 'TABLE' END, sys.FQN(s.name, t.name)\n"
    2576             :                                         "            FROM sys.schemas s JOIN sys.tables t ON s.id = t.schema_id JOIN sys.table_types ts ON t.type = ts.table_type_id\n"
    2577             :                                         "            WHERE NOT s.name <> 'tmp'\n"
    2578             :                                         "            UNION ALL\n"
    2579             :                                         "            SELECT c.id, 'COLUMN', sys.FQN(s.name, t.name) || '.' || sys.DQ(c.name) FROM sys.columns c, sys.tables t, sys.schemas s WHERE c.table_id = t.id AND t.schema_id = s.id\n"
    2580             :                                         "            UNION ALL\n"
    2581             :                                         "            SELECT idx.id, 'INDEX', sys.FQN(s.name, idx.name) FROM sys.idxs idx, sys._tables t, sys.schemas s WHERE idx.table_id = t.id AND t.schema_id = s.id\n"
    2582             :                                         "            UNION ALL\n"
    2583             :                                         "            SELECT seq.id, 'SEQUENCE', sys.FQN(s.name, seq.name) FROM sys.sequences seq, sys.schemas s WHERE seq.schema_id = s.id\n"
    2584             :                                         "            UNION ALL\n"
    2585             :                                         "            SELECT f.id, ft.function_type_keyword, sys.FQN(s.name, f.name) FROM sys.functions f, sys.function_types ft, sys.schemas s WHERE f.type = ft.function_type_id AND f.schema_id = s.id\n"
    2586             :                                         "            ) AS o(id, tpe, nme)\n"
    2587             :                                         "            JOIN sys.comments c ON c.id = o.id;\n"
    2588             :                                         "CREATE VIEW sys.fully_qualified_functions AS\n"
    2589             :                                         "    WITH fqn(id, tpe, sig, num) AS\n"
    2590             :                                         "    (\n"
    2591             :                                         "        SELECT\n"
    2592             :                                         "            f.id,\n"
    2593             :                                         "            ft.function_type_keyword,\n"
    2594             :                                         "            CASE WHEN a.type IS NULL THEN\n"
    2595             :                                         "                s.name || '.' || f.name || '()'\n"
    2596             :                                         "            ELSE\n"
    2597             :                                         "                s.name || '.' || f.name || '(' || group_concat(sys.describe_type(a.type, a.type_digits, a.type_scale), ',') OVER (PARTITION BY f.id ORDER BY a.number)  || ')'\n"
    2598             :                                         "            END,\n"
    2599             :                                         "            a.number\n"
    2600             :                                         "        FROM sys.schemas s, sys.function_types ft, sys.functions f LEFT JOIN sys.args a ON f.id = a.func_id\n"
    2601             :                                         "        WHERE s.id= f.schema_id AND f.type = ft.function_type_id\n"
    2602             :                                         "    )\n"
    2603             :                                         "    SELECT\n"
    2604             :                                         "        fqn1.id id,\n"
    2605             :                                         "        fqn1.tpe tpe,\n"
    2606             :                                         "        fqn1.sig nme\n"
    2607             :                                         "    FROM\n"
    2608             :                                         "        fqn fqn1 JOIN (SELECT id, max(num) FROM fqn GROUP BY id)  fqn2(id, num)\n"
    2609             :                                         "        ON fqn1.id = fqn2.id AND (fqn1.num = fqn2.num OR fqn1.num IS NULL AND fqn2.num is NULL);\n"
    2610             :                                         "CREATE VIEW sys.describe_privileges AS\n"
    2611             :                                         "    SELECT\n"
    2612             :                                         "        CASE\n"
    2613             :                                         "            WHEN o.tpe IS NULL AND pc.privilege_code_name = 'SELECT' THEN --GLOBAL privileges: SELECT maps to COPY FROM\n"
    2614             :                                         "                'COPY FROM'\n"
    2615             :                                         "            WHEN o.tpe IS NULL AND pc.privilege_code_name = 'UPDATE' THEN --GLOBAL privileges: UPDATE maps to COPY INTO\n"
    2616             :                                         "                'COPY INTO'\n"
    2617             :                                         "            ELSE\n"
    2618             :                                         "                o.nme\n"
    2619             :                                         "        END o_nme,\n"
    2620             :                                         "        CASE\n"
    2621             :                                         "            WHEN o.tpe IS NOT NULL THEN\n"
    2622             :                                         "                o.tpe\n"
    2623             :                                         "            ELSE\n"
    2624             :                                         "                'GLOBAL'\n"
    2625             :                                         "        END o_tpe,\n"
    2626             :                                         "        pc.privilege_code_name p_nme,\n"
    2627             :                                         "        a.name a_nme,\n"
    2628             :                                         "        g.name g_nme,\n"
    2629             :                                         "        p.grantable grantable\n"
    2630             :                                         "    FROM\n"
    2631             :                                         "        sys.privileges p LEFT JOIN\n"
    2632             :                                         "        (\n"
    2633             :                                         "        SELECT t.id, s.name || '.' || t.name , 'TABLE'\n"
    2634             :                                         "            from sys.schemas s, sys.tables t where s.id = t.schema_id\n"
    2635             :                                         "        UNION ALL\n"
    2636             :                                         "            SELECT c.id, s.name || '.' || t.name || '.' || c.name, 'COLUMN'\n"
    2637             :                                         "            FROM sys.schemas s, sys.tables t, sys.columns c where s.id = t.schema_id AND t.id = c.table_id\n"
    2638             :                                         "        UNION ALL\n"
    2639             :                                         "            SELECT f.id, f.nme, f.tpe\n"
    2640             :                                         "            FROM sys.fully_qualified_functions f\n"
    2641             :                                         "        ) o(id, nme, tpe) ON o.id = p.obj_id,\n"
    2642             :                                         "        sys.privilege_codes pc,\n"
    2643             :                                         "        auths a, auths g\n"
    2644             :                                         "    WHERE\n"
    2645             :                                         "        p.privileges = pc.privilege_code_id AND\n"
    2646             :                                         "        p.auth_id = a.id AND\n"
    2647             :                                         "        p.grantor = g.id;\n"
    2648             :                                         "CREATE FUNCTION sys.describe_table(schemaName string, tableName string)\n"
    2649             :                                         "  RETURNS TABLE(name string, query string, type string, id integer, remark string)\n"
    2650             :                                         "BEGIN\n"
    2651             :                                         "    RETURN SELECT t.name, t.query, tt.table_type_name, t.id, c.remark\n"
    2652             :                                         "        FROM sys.schemas s, sys.table_types tt, sys._tables t\n"
    2653             :                                         "        LEFT OUTER JOIN sys.comments c ON t.id = c.id\n"
    2654             :                                         "            WHERE s.name = schemaName\n"
    2655             :                                         "            AND t.schema_id = s.id\n"
    2656             :                                         "            AND t.name = tableName\n"
    2657             :                                         "            AND t.type = tt.table_type_id;\n"
    2658             :                                         "END;\n"
    2659             :                                         "CREATE VIEW sys.describe_user_defined_types AS\n"
    2660             :                                         "    SELECT\n"
    2661             :                                         "        s.name sch,\n"
    2662             :                                         "        t.sqlname sql_tpe,\n"
    2663             :                                         "        t.systemname ext_tpe\n"
    2664             :                                         "    FROM sys.types t JOIN sys.schemas s ON t.schema_id = s.id\n"
    2665             :                                         "    WHERE\n"
    2666             :                                         "        t.eclass = 18 AND\n"
    2667             :                                         "        (\n"
    2668             :                                         "            (s.name = 'sys' AND t.sqlname not in ('geometrya', 'mbr', 'url', 'inet', 'json', 'uuid', 'xml')) OR\n"
    2669             :                                         "            (s.name <> 'sys')\n"
    2670             :                                         "        );\n"
    2671             :                                         "CREATE VIEW sys.describe_partition_tables AS\n"
    2672             :                                         "    SELECT \n"
    2673             :                                         "        m_sch,\n"
    2674             :                                         "        m_tbl,\n"
    2675             :                                         "        p_sch,\n"
    2676             :                                         "        p_tbl,\n"
    2677             :                                         "        CASE\n"
    2678             :                                         "            WHEN p_raw_type IS NULL THEN 'READ ONLY'\n"
    2679             :                                         "            WHEN (p_raw_type = 'VALUES' AND pvalues IS NULL) OR (p_raw_type = 'RANGE' AND minimum IS NULL AND maximum IS NULL AND with_nulls) THEN 'FOR NULLS'\n"
    2680             :                                         "            ELSE p_raw_type\n"
    2681             :                                         "        END AS tpe,\n"
    2682             :                                         "        pvalues,\n"
    2683             :                                         "        minimum,\n"
    2684             :                                         "        maximum,\n"
    2685             :                                         "        with_nulls\n"
    2686             :                                         "    FROM \n"
    2687             :                                         "    (WITH\n"
    2688             :                                         "        tp(\"type\", table_id) AS\n"
    2689             :                                         "        (SELECT CASE WHEN (table_partitions.\"type\" & 2) = 2 THEN 'VALUES' ELSE 'RANGE' END, table_partitions.table_id FROM sys.table_partitions),\n"
    2690             :                                         "        subq(m_tid, p_mid, \"type\", m_sch, m_tbl, p_sch, p_tbl) AS\n"
    2691             :                                         "        (SELECT m_t.id, p_m.id, m_t.\"type\", m_s.name, m_t.name, p_s.name, p_m.name\n"
    2692             :                                         "        FROM sys.schemas m_s, sys._tables m_t, sys.dependencies d, sys.schemas p_s, sys._tables p_m\n"
    2693             :                                         "        WHERE m_t.\"type\" IN (3, 6)\n"
    2694             :                                         "            AND m_t.schema_id = m_s.id\n"
    2695             :                                         "            AND m_s.name <> 'tmp'\n"
    2696             :                                         "            AND m_t.system = FALSE\n"
    2697             :                                         "            AND m_t.id = d.depend_id\n"
    2698             :                                         "            AND d.id = p_m.id\n"
    2699             :                                         "            AND p_m.schema_id = p_s.id\n"
    2700             :                                         "        ORDER BY m_t.id, p_m.id)\n"
    2701             :                                         "    SELECT\n"
    2702             :                                         "        subq.m_sch,\n"
    2703             :                                         "        subq.m_tbl,\n"
    2704             :                                         "        subq.p_sch,\n"
    2705             :                                         "        subq.p_tbl,\n"
    2706             :                                         "        tp.\"type\" AS p_raw_type,\n"
    2707             :                                         "        CASE WHEN tp.\"type\" = 'VALUES'\n"
    2708             :                                         "            THEN (SELECT GROUP_CONCAT(vp.value, ',')FROM sys.value_partitions vp WHERE vp.table_id = subq.p_mid)\n"
    2709             :                                         "            ELSE NULL\n"
    2710             :                                         "        END AS pvalues,\n"
    2711             :                                         "        CASE WHEN tp.\"type\" = 'RANGE'\n"
    2712             :                                         "            THEN (SELECT minimum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    2713             :                                         "            ELSE NULL\n"
    2714             :                                         "        END AS minimum,\n"
    2715             :                                         "        CASE WHEN tp.\"type\" = 'RANGE'\n"
    2716             :                                         "            THEN (SELECT maximum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    2717             :                                         "            ELSE NULL\n"
    2718             :                                         "        END AS maximum,\n"
    2719             :                                         "        CASE WHEN tp.\"type\" = 'VALUES'\n"
    2720             :                                         "            THEN EXISTS(SELECT vp.value FROM sys.value_partitions vp WHERE vp.table_id = subq.p_mid AND vp.value IS NULL)\n"
    2721             :                                         "            ELSE (SELECT rp.with_nulls FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    2722             :                                         "        END AS with_nulls\n"
    2723             :                                         "    FROM \n"
    2724             :                                         "        subq LEFT OUTER JOIN tp\n"
    2725             :                                         "        ON subq.m_tid = tp.table_id) AS tmp_pi;\n"
    2726             :                                         "CREATE VIEW sys.describe_sequences AS\n"
    2727             :                                         "    SELECT\n"
    2728             :                                         "        s.name as sch,\n"
    2729             :                                         "        seq.name as seq,\n"
    2730             :                                         "        seq.\"start\" s,\n"
    2731             :                                         "        get_value_for(s.name, seq.name) AS rs,\n"
    2732             :                                         "        seq.\"minvalue\" mi,\n"
    2733             :                                         "        seq.\"maxvalue\" ma,\n"
    2734             :                                         "        seq.\"increment\" inc,\n"
    2735             :                                         "        seq.\"cacheinc\" cache,\n"
    2736             :                                         "        seq.\"cycle\" cycle\n"
    2737             :                                         "    FROM sys.sequences seq, sys.schemas s\n"
    2738             :                                         "    WHERE s.id = seq.schema_id\n"
    2739             :                                         "    AND s.name <> 'tmp'\n"
    2740             :                                         "    ORDER BY s.name, seq.name;\n"
    2741             :                                         "CREATE VIEW sys.describe_functions AS\n"
    2742             :                                         "    SELECT\n"
    2743             :                                         "        f.id o,\n"
    2744             :                                         "        s.name sch,\n"
    2745             :                                         "        f.name fun,\n"
    2746             :                                         "        f.func def\n"
    2747             :                                         "    FROM sys.functions f JOIN sys.schemas s ON f.schema_id = s.id WHERE s.name <> 'tmp' AND NOT f.system;\n"
    2748             :                                         "CREATE FUNCTION sys.describe_columns(schemaName string, tableName string)\n"
    2749             :                                         "    RETURNS TABLE(name string, type string, digits integer, scale integer, Nulls boolean, cDefault string, number integer, sqltype string, remark string)\n"
    2750             :                                         "BEGIN\n"
    2751             :                                         "    RETURN SELECT c.name, c.\"type\", c.type_digits, c.type_scale, c.\"null\", c.\"default\", c.number, sys.describe_type(c.\"type\", c.type_digits, c.type_scale), com.remark\n"
    2752             :                                         "        FROM sys._tables t, sys.schemas s, sys._columns c\n"
    2753             :                                         "        LEFT OUTER JOIN sys.comments com ON c.id = com.id\n"
    2754             :                                         "            WHERE c.table_id = t.id\n"
    2755             :                                         "            AND t.name = tableName\n"
    2756             :                                         "            AND t.schema_id = s.id\n"
    2757             :                                         "            AND s.name = schemaName\n"
    2758             :                                         "        ORDER BY c.number;\n"
    2759             :                                         "END;\n"
    2760             :                                         "CREATE FUNCTION sys.describe_function(schemaName string, functionName string)\n"
    2761             :                                         "    RETURNS TABLE(id integer, name string, type string, language string, remark string)\n"
    2762             :                                         "BEGIN\n"
    2763             :                                         "    RETURN SELECT f.id, f.name, ft.function_type_keyword, fl.language_keyword, c.remark\n"
    2764             :                                         "        FROM sys.functions f\n"
    2765             :                                         "        JOIN sys.schemas s ON f.schema_id = s.id\n"
    2766             :                                         "        JOIN sys.function_types ft ON f.type = ft.function_type_id\n"
    2767             :                                         "        LEFT OUTER JOIN sys.function_languages fl ON f.language = fl.language_id\n"
    2768             :                                         "        LEFT OUTER JOIN sys.comments c ON f.id = c.id\n"
    2769             :                                         "        WHERE f.name=functionName AND s.name = schemaName;\n"
    2770             :                                         "END;\n");
    2771             : 
    2772             :                         /* 75_storagemodel.sql not changed but dependencies changed
    2773             :                          * since sys.objects has a new column */
    2774           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2775             :                                         "drop procedure sys.storagemodelinit() cascade;\n"
    2776             :                                         "create procedure sys.storagemodelinit()\n"
    2777             :                                         "begin\n"
    2778             :                                         "    delete from sys.storagemodelinput;\n"
    2779             :                                         "    insert into sys.storagemodelinput\n"
    2780             :                                         "    select \"schema\", \"table\", \"column\", \"type\", typewidth, \"count\",\n"
    2781             :                                         "        -- assume all variable size types contain distinct values\n"
    2782             :                                         "        case when (\"unique\" or \"type\" IN ('varchar', 'char', 'clob', 'json', 'url', 'blob', 'geometry', 'geometrya'))\n"
    2783             :                                         "            then \"count\" else 0 end,\n"
    2784             :                                         "        case when \"count\" > 0 and heapsize >= 8192 and \"type\" in ('varchar', 'char', 'clob', 'json', 'url')\n"
    2785             :                                         "            -- string heaps have a header of 8192\n"
    2786             :                                         "            then cast((heapsize - 8192) / \"count\" as bigint)\n"
    2787             :                                         "        when \"count\" > 0 and heapsize >= 32 and \"type\" in ('blob', 'geometry', 'geometrya')\n"
    2788             :                                         "            -- binary data heaps have a header of 32\n"
    2789             :                                         "            then cast((heapsize - 32) / \"count\" as bigint)\n"
    2790             :                                         "        else typewidth end,\n"
    2791             :                                         "        FALSE, case sorted when true then true else false end, \"unique\", TRUE\n"
    2792             :                                         "      from sys.\"storage\";  -- view sys.\"storage\" excludes system tables (as those are not useful to be modeled for storagesize by application users)\n"
    2793             :                                         "    update sys.storagemodelinput\n"
    2794             :                                         "       set reference = TRUE\n"
    2795             :                                         "     where (\"schema\", \"table\", \"column\") in (\n"
    2796             :                                         "        SELECT fkschema.\"name\", fktable.\"name\", fkkeycol.\"name\"\n"
    2797             :                                         "          FROM    sys.\"keys\" AS fkkey,\n"
    2798             :                                         "            sys.\"objects\" AS fkkeycol,\n"
    2799             :                                         "            sys.\"tables\" AS fktable,\n"
    2800             :                                         "            sys.\"schemas\" AS fkschema\n"
    2801             :                                         "        WHERE fktable.\"id\" = fkkey.\"table_id\"\n"
    2802             :                                         "          AND fkkey.\"id\" = fkkeycol.\"id\"\n"
    2803             :                                         "          AND fkschema.\"id\" = fktable.\"schema_id\"\n"
    2804             :                                         "          AND fkkey.\"rkey\" > -1 );\n"
    2805             :                                         "    update sys.storagemodelinput\n"
    2806             :                                         "       set isacolumn = FALSE\n"
    2807             :                                         "     where (\"schema\", \"table\", \"column\") NOT in (\n"
    2808             :                                         "        SELECT sch.\"name\", tbl.\"name\", col.\"name\"\n"
    2809             :                                         "          FROM sys.\"schemas\" AS sch,\n"
    2810             :                                         "            sys.\"tables\" AS tbl,\n"
    2811             :                                         "            sys.\"columns\" AS col\n"
    2812             :                                         "        WHERE sch.\"id\" = tbl.\"schema_id\"\n"
    2813             :                                         "          AND tbl.\"id\" = col.\"table_id\");\n"
    2814             :                                         "end;\n"
    2815             :                                         "update sys.functions set system = true where name = 'storagemodelinit' and schema_id = 2000;\n");
    2816             : 
    2817             :                         /* 76_dump.sql */
    2818           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    2819             :                                         "CREATE VIEW sys.dump_create_roles AS\n"
    2820             :                                         "    SELECT\n"
    2821             :                                         "        'CREATE ROLE ' || sys.dq(name) || ';' stmt FROM sys.auths\n"
    2822             :                                         "    WHERE name NOT IN (SELECT name FROM sys.db_user_info)\n"
    2823             :                                         "    AND grantor <> 0;\n"
    2824             :                                         "CREATE VIEW sys.dump_create_users AS\n"
    2825             :                                         "    SELECT\n"
    2826             :                                         "        'CREATE USER ' ||  sys.dq(ui.name) ||  ' WITH ENCRYPTED PASSWORD ' ||\n"
    2827             :                                         "        sys.sq(sys.password_hash(ui.name)) ||\n"
    2828             :                                         "    ' NAME ' || sys.sq(ui.fullname) ||  ' SCHEMA sys;' stmt\n"
    2829             :                                         "    FROM sys.db_user_info ui, sys.schemas s\n"
    2830             :                                         "    WHERE ui.default_schema = s.id\n"
    2831             :                                         "        AND ui.name <> 'monetdb'\n"
    2832             :                                         "        AND ui.name <> '.snapshot';\n"
    2833             :                                         "CREATE VIEW sys.dump_create_schemas AS\n"
    2834             :                                         "    SELECT\n"
    2835             :                                         "        'CREATE SCHEMA ' ||  sys.dq(s.name) || ifthenelse(a.name <> 'sysadmin', ' AUTHORIZATION ' || a.name, ' ') || ';' stmt\n"
    2836             :                                         "    FROM sys.schemas s, sys.auths a\n"
    2837             :                                         "    WHERE s.authorization = a.id AND s.system = FALSE;\n"
    2838             :                                         "CREATE VIEW sys.dump_add_schemas_to_users AS\n"
    2839             :                                         "    SELECT\n"
    2840             :                                         "        'ALTER USER ' || sys.dq(ui.name) || ' SET SCHEMA ' || sys.dq(s.name) || ';' stmt\n"
    2841             :                                         "    FROM sys.db_user_info ui, sys.schemas s\n"
    2842             :                                         "    WHERE ui.default_schema = s.id\n"
    2843             :                                         "        AND ui.name <> 'monetdb'\n"
    2844             :                                         "        AND ui.name <> '.snapshot'\n"
    2845             :                                         "        AND s.name <> 'sys';\n"
    2846             :                                         "CREATE VIEW sys.dump_grant_user_privileges AS\n"
    2847             :                                         "    SELECT\n"
    2848             :                                         "        'GRANT ' || sys.dq(a2.name) || ' ' || ifthenelse(a1.name = 'public', 'PUBLIC', sys.dq(a1.name)) || ';' stmt\n"
    2849             :                                         "    FROM sys.auths a1, sys.auths a2, sys.user_role ur\n"
    2850             :                                         "    WHERE a1.id = ur.login_id AND a2.id = ur.role_id;\n"
    2851             :                                         "CREATE VIEW sys.dump_table_constraint_type AS\n"
    2852             :                                         "    SELECT\n"
    2853             :                                         "        'ALTER TABLE ' || sys.DQ(sch) || '.' || sys.DQ(tbl) ||\n"
    2854             :                                         "        ' ADD CONSTRAINT ' || sys.DQ(con) || ' '||\n"
    2855             :                                         "        tpe || ' (' || GROUP_CONCAT(sys.DQ(col), ', ') || ');' stmt\n"
    2856             :                                         "    FROM sys.describe_constraints GROUP BY sch, tbl, con, tpe;\n"
    2857             :                                         "CREATE VIEW sys.dump_indices AS\n"
    2858             :                                         "    SELECT\n"
    2859             :                                         "        'CREATE ' || tpe || ' ' ||\n"
    2860             :                                         "        sys.DQ(ind) || ' ON ' || sys.DQ(sch) || '.' || sys.DQ(tbl) ||\n"
    2861             :                                         "        '(' || GROUP_CONCAT(col) || ');' stmt\n"
    2862             :                                         "    FROM sys.describe_indices GROUP BY ind, tpe, sch, tbl;\n"
    2863             :                                         "CREATE VIEW sys.dump_column_defaults AS\n"
    2864             :                                         "    SELECT 'ALTER TABLE ' || sys.FQN(sch, tbl) || ' ALTER COLUMN ' || sys.DQ(col) || ' SET DEFAULT ' || def || ';' stmt\n"
    2865             :                                         "    FROM sys.describe_column_defaults;\n"
    2866             :                                         "CREATE VIEW sys.dump_foreign_keys AS\n"
    2867             :                                         "    SELECT\n"
    2868             :                                         "        'ALTER TABLE ' || sys.DQ(fk_s) || '.'|| sys.DQ(fk_t) || ' ADD CONSTRAINT ' || sys.DQ(fk) || ' ' ||\n"
    2869             :                                         "        'FOREIGN KEY(' || GROUP_CONCAT(sys.DQ(fk_c), ',') ||') ' ||\n"
    2870             :                                         "        'REFERENCES ' || sys.DQ(pk_s) || '.' || sys.DQ(pk_t) || '(' || GROUP_CONCAT(sys.DQ(pk_c), ',') || ') ' ||\n"
    2871             :                                         "        'ON DELETE ' || on_delete || ' ON UPDATE ' || on_update ||\n"
    2872             :                                         "        ';' stmt\n"
    2873             :                                         "    FROM sys.describe_foreign_keys GROUP BY fk_s, fk_t, pk_s, pk_t, fk, on_delete, on_update;\n"
    2874             :                                         "CREATE VIEW sys.dump_partition_tables AS\n"
    2875             :                                         "    SELECT\n"
    2876             :                                         "        sys.ALTER_TABLE(m_sch, m_tbl) || ' ADD TABLE ' || sys.FQN(p_sch, p_tbl) ||\n"
    2877             :                                         "        CASE \n"
    2878             :                                         "            WHEN tpe = 'VALUES' THEN ' AS PARTITION IN (' || pvalues || ')'\n"
    2879             :                                         "            WHEN tpe = 'RANGE' THEN ' AS PARTITION FROM ' || ifthenelse(minimum IS NOT NULL, sys.SQ(minimum), 'RANGE MINVALUE') || ' TO ' || ifthenelse(maximum IS NOT NULL, sys.SQ(maximum), 'RANGE MAXVALUE')\n"
    2880             :                                         "            WHEN tpe = 'FOR NULLS' THEN ' AS PARTITION FOR NULL VALUES'\n"
    2881             :                                         "            ELSE '' --'READ ONLY'\n"
    2882             :                                         "        END ||\n"
    2883             :                                         "        CASE WHEN tpe in ('VALUES', 'RANGE') AND with_nulls THEN ' WITH NULL VALUES' ELSE '' END ||\n"
    2884             :                                         "        ';' stmt\n"
    2885             :                                         "    FROM sys.describe_partition_tables;\n"
    2886             :                                         "CREATE VIEW sys.dump_sequences AS\n"
    2887             :                                         "    SELECT\n"
    2888             :                                         "        'CREATE SEQUENCE ' || sys.FQN(sch, seq) || ' AS BIGINT ' ||\n"
    2889             :                                         "        CASE WHEN \"s\" <> 0 THEN 'START WITH ' || \"rs\" ELSE '' END ||\n"
    2890             :                                         "        CASE WHEN \"inc\" <> 1 THEN ' INCREMENT BY ' || \"inc\" ELSE '' END ||\n"
    2891             :                                         "        CASE WHEN \"mi\" <> 0 THEN ' MINVALUE ' || \"mi\" ELSE '' END ||\n"
    2892             :                                         "        CASE WHEN \"ma\" <> 0 THEN ' MAXVALUE ' || \"ma\" ELSE '' END ||\n"
    2893             :                                         "        CASE WHEN \"cache\" <> 1 THEN ' CACHE ' || \"cache\" ELSE '' END ||\n"
    2894             :                                         "        CASE WHEN \"cycle\" THEN ' CYCLE' ELSE '' END || ';' stmt\n"
    2895             :                                         "    FROM sys.describe_sequences;\n"
    2896             :                                         "CREATE VIEW sys.dump_start_sequences AS\n"
    2897             :                                         "    SELECT\n"
    2898             :                                         "        'UPDATE sys.sequences seq SET start = ' || s  ||\n"
    2899             :                                         "        ' WHERE name = ' || sys.SQ(seq) ||\n"
    2900             :                                         "        ' AND schema_id = (SELECT s.id FROM sys.schemas s WHERE s.name = ' || sys.SQ(sch) || ');' stmt\n"
    2901             :                                         "    FROM sys.describe_sequences;\n"
    2902             :                                         "CREATE VIEW sys.dump_functions AS\n"
    2903             :                                         "    SELECT f.o o, sys.schema_guard(f.sch, f.fun, f.def) stmt FROM sys.describe_functions f;\n"
    2904             :                                         "CREATE VIEW sys.dump_tables AS\n"
    2905             :                                         "    SELECT\n"
    2906             :                                         "        t.o o,\n"
    2907             :                                         "        CASE\n"
    2908             :                                         "            WHEN t.typ <> 'VIEW' THEN\n"
    2909             :                                         "                'CREATE ' || t.typ || ' ' || sys.FQN(t.sch, t.tab) || t.col || t.opt || ';'\n"
    2910             :                                         "            ELSE\n"
    2911             :                                         "                t.opt\n"
    2912             :                                         "        END stmt\n"
    2913             :                                         "    FROM sys.describe_tables t;\n"
    2914             :                                         "CREATE VIEW sys.dump_triggers AS\n"
    2915             :                                         "    SELECT sys.schema_guard(sch, tab, def) stmt FROM sys.describe_triggers;\n"
    2916             :                                         "CREATE VIEW sys.dump_comments AS\n"
    2917             :                                         "    SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\n"
    2918             :                                         "CREATE VIEW sys.dump_user_defined_types AS\n"
    2919             :                                         "        SELECT 'CREATE TYPE ' || sys.FQN(sch, sql_tpe) || ' EXTERNAL NAME ' || sys.DQ(ext_tpe) || ';' stmt FROM sys.describe_user_defined_types;\n"
    2920             :                                         "CREATE VIEW sys.dump_privileges AS\n"
    2921             :                                         "    SELECT\n"
    2922             :                                         "        'INSERT INTO sys.privileges VALUES (' ||\n"
    2923             :                                         "            CASE\n"
    2924             :                                         "                WHEN dp.o_tpe = 'GLOBAL' THEN\n"
    2925             :                                         "                    '0,'\n"
    2926             :                                         "                WHEN dp.o_tpe = 'TABLE' THEN\n"
    2927             :                                         "                    '(SELECT t.id FROM sys.schemas s, sys.tables t WHERE s.id = t.schema_id' ||\n"
    2928             :                                         "                        ' AND s.name || ''.'' || t.name =' || sys.SQ(dp.o_nme) || '),'\n"
    2929             :                                         "                WHEN dp.o_tpe = 'COLUMN' THEN\n"
    2930             :                                         "                    '(SELECT c.id FROM sys.schemas s, sys.tables t, sys.columns c WHERE s.id = t.schema_id AND t.id = c.table_id' ||\n"
    2931             :                                         "                        ' AND s.name || ''.'' || t.name || ''.'' || c.name =' || sys.SQ(dp.o_nme) || '),'\n"
    2932             :                                         "                ELSE -- FUNCTION-LIKE\n"
    2933             :                                         "                    '(SELECT fqn.id FROM sys.fully_qualified_functions fqn WHERE' ||\n"
    2934             :                                         "                        ' fqn.nme = ' || sys.SQ(dp.o_nme) || ' AND fqn.tpe = ' || sys.SQ(dp.o_tpe) || '),'\n"
    2935             :                                         "            END ||\n"
    2936             :                                         "            '(SELECT id FROM sys.auths a WHERE a.name = ' || sys.SQ(dp.a_nme) || '),' ||\n"
    2937             :                                         "            '(SELECT pc.privilege_code_id FROM sys.privilege_codes pc WHERE pc.privilege_code_name = ' || sys.SQ(p_nme) || '),'\n"
    2938             :                                         "            '(SELECT id FROM sys.auths g WHERE g.name = ' || sys.SQ(dp.g_nme) || '),' ||\n"
    2939             :                                         "            dp.grantable ||\n"
    2940             :                                         "        ');' stmt\n"
    2941             :                                         "    FROM sys.describe_privileges dp;\n"
    2942             :                                         "CREATE PROCEDURE sys.EVAL(stmt STRING) EXTERNAL NAME sql.eval;\n"
    2943             :                                         "CREATE FUNCTION sys.esc(s STRING) RETURNS STRING BEGIN RETURN '\"' || sys.replace(sys.replace(sys.replace(s,E'\\\\', E'\\\\\\\\'), E'\\n', E'\\\\n'), '\"', E'\\\\\"') || '\"'; END;\n"
    2944             :                                         "CREATE FUNCTION sys.prepare_esc(s STRING, t STRING) RETURNS STRING\n"
    2945             :                                         "BEGIN\n"
    2946             :                                         "    RETURN\n"
    2947             :                                         "        CASE\n"
    2948             :                                         "            WHEN (t = 'varchar' OR t ='char' OR t = 'clob' OR t = 'json' OR t = 'geometry' OR t = 'url') THEN\n"
    2949             :                                         "                'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE ' || 'sys.esc(' || sys.DQ(s) || ')' || ' END'\n"
    2950             :                                         "            ELSE\n"
    2951             :                                         "                'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE CAST(' || sys.DQ(s) || ' AS STRING) END'\n"
    2952             :                                         "        END;\n"
    2953             :                                         "END;\n"
    2954             :                                         "CREATE TABLE sys.dump_statements(o INT, s STRING);\n"
    2955             :                                         "CREATE PROCEDURE sys._dump_table_data(sch STRING, tbl STRING) BEGIN\n"
    2956             :                                         "    DECLARE k INT;\n"
    2957             :                                         "    SET k = (SELECT MIN(c.id) FROM sys.columns c, sys.tables t WHERE c.table_id = t.id AND t.name = tbl);\n"
    2958             :                                         "    IF k IS NOT NULL THEN\n"
    2959             :                                         "        DECLARE cname STRING;\n"
    2960             :                                         "        DECLARE ctype STRING;\n"
    2961             :                                         "        SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    2962             :                                         "        SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    2963             :                                         "        DECLARE COPY_INTO_STMT STRING;\n"
    2964             :                                         "        DECLARE _cnt INT;\n"
    2965             :                                         "        SET _cnt = (SELECT MIN(s.count) FROM sys.storage() s WHERE s.schema = sch AND s.table = tbl);\n"
    2966             :                                         "        IF _cnt > 0 THEN\n"
    2967             :                                         "            SET COPY_INTO_STMT = 'COPY ' || _cnt ||  ' RECORDS INTO ' || sys.FQN(sch, tbl) || '(' || sys.DQ(cname);\n"
    2968             :                                         "            DECLARE SELECT_DATA_STMT STRING;\n"
    2969             :                                         "            SET SELECT_DATA_STMT = 'SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), ' || sys.prepare_esc(cname, ctype);\n"
    2970             :                                         "            DECLARE M INT;\n"
    2971             :                                         "            SET M = (SELECT MAX(c.id) FROM sys.columns c, sys.tables t WHERE c.table_id = t.id AND t.name = tbl);\n"
    2972             :                                         "            WHILE (k < M) DO\n"
    2973             :                                         "                SET k = (SELECT MIN(c.id) FROM sys.columns c, sys.tables t WHERE c.table_id = t.id AND t.name = tbl AND c.id > k);\n"
    2974             :                                         "                SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    2975             :                                         "                SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    2976             :                                         "                SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || sys.DQ(cname));\n"
    2977             :                                         "                SET SELECT_DATA_STMT = SELECT_DATA_STMT || '|| ''|'' || ' || sys.prepare_esc(cname, ctype);\n"
    2978             :                                         "            END WHILE;\n"
    2979             :                                         "            SET COPY_INTO_STMT = (COPY_INTO_STMT || ') FROM STDIN USING DELIMITERS ''|'',E''\\\\n'',''\"'';');\n"
    2980             :                                         "            SET SELECT_DATA_STMT =  SELECT_DATA_STMT || ' FROM ' || sys.FQN(sch, tbl);\n"
    2981             :                                         "            insert into sys.dump_statements VALUES ( (SELECT COUNT(*) FROM sys.dump_statements) + 1, COPY_INTO_STMT);\n"
    2982             :                                         "            CALL sys.EVAL('INSERT INTO sys.dump_statements ' || SELECT_DATA_STMT || ';');\n"
    2983             :                                         "        END IF;\n"
    2984             :                                         "    END IF;\n"
    2985             :                                         "END;\n"
    2986             :                                         "CREATE PROCEDURE sys.dump_table_data() BEGIN\n"
    2987             :                                         "    DECLARE i INT;\n"
    2988             :                                         "    SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    2989             :                                         "    IF i IS NOT NULL THEN\n"
    2990             :                                         "        DECLARE M INT;\n"
    2991             :                                         "        SET M = (SELECT MAX(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    2992             :                                         "        DECLARE sch STRING;\n"
    2993             :                                         "        DECLARE tbl STRING;\n"
    2994             :                                         "        WHILE i < M DO\n"
    2995             :                                         "            set sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    2996             :                                         "            set tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    2997             :                                         "            CALL sys._dump_table_data(sch, tbl);\n"
    2998             :                                         "            SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system AND t.id > i);\n"
    2999             :                                         "        END WHILE;\n"
    3000             :                                         "        set sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    3001             :                                         "        set tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    3002             :                                         "        CALL sys._dump_table_data(sch, tbl);\n"
    3003             :                                         "    END IF;\n"
    3004             :                                         "END;\n"
    3005             :                                         "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    3006             :                                         "BEGIN\n"
    3007             :                                         "    SET SCHEMA sys;\n"
    3008             :                                         "    TRUNCATE sys.dump_statements;\n"
    3009             :                                         "    INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    3010             :                                         "    INSERT INTO sys.dump_statements VALUES ( (SELECT COUNT(*) FROM sys.dump_statements) + 1, 'SET SCHEMA \"sys\";');\n"
    3011             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    3012             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    3013             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    3014             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    3015             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    3016             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    3017             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    3018             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    3019             :                                         "    --functions and table-likes can be interdependent. They should be inserted in the order of their catalogue id.\n"
    3020             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    3021             :                                         "    FROM (\n"
    3022             :                                         "            SELECT * FROM sys.dump_functions f\n"
    3023             :                                         "            UNION\n"
    3024             :                                         "            SELECT * FROM sys.dump_tables t\n"
    3025             :                                         "        ) AS stmts(o, s);\n"
    3026             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    3027             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    3028             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    3029             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    3030             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    3031             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    3032             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    3033             :                                         "    --We are dumping ALL privileges so we need to erase existing privileges on the receiving side;\n"
    3034             :                                         "    INSERT INTO sys.dump_statements VALUES ( (SELECT COUNT(*) FROM sys.dump_statements) + 1, 'TRUNCATE sys.privileges;');\n"
    3035             :                                         "    INSERT INTO sys.dump_statements SELECT  (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_privileges;\n"
    3036             :                                         "    IF NOT DESCRIBE THEN\n"
    3037             :                                         "        CALL sys.dump_table_data();\n"
    3038             :                                         "    END IF;\n"
    3039             :                                         "    INSERT INTO sys.dump_statements VALUES ( (SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    3040             :                                         "    RETURN sys.dump_statements;\n"
    3041             :                                         "END;\n");
    3042             : 
    3043             :                         // Set the system flag for the new dump and describe SQL objects.
    3044           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3045             :                                         "UPDATE sys.functions SET system = true WHERE\n"
    3046             :                                         "    system <> true AND\n"
    3047             :                                         "    schema_id = 2000 AND\n"
    3048             :                                         "    type = %d AND\n"
    3049             :                                         "    name in (\n"
    3050             :                                         "        'describe_columns',\n"
    3051             :                                         "        'describe_function',\n"
    3052             :                                         "        'describe_table',\n"
    3053             :                                         "        'dump_database'\n"
    3054             :                                         "    );\n",
    3055             :                                         F_UNION);
    3056           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3057             :                                         "UPDATE sys.functions SET system = true WHERE\n"
    3058             :                                         "    system <> true AND\n"
    3059             :                                         "    schema_id = 2000 AND\n"
    3060             :                                         "    type = %d AND\n"
    3061             :                                         "    name in (\n"
    3062             :                                         "        'alter_table',\n"
    3063             :                                         "        'describe_type',\n"
    3064             :                                         "        'dq',\n"
    3065             :                                         "        'esc',\n"
    3066             :                                         "        'fqn',\n"
    3067             :                                         "        'get_merge_table_partition_expressions',\n"
    3068             :                                         "        'get_remote_table_expressions',\n"
    3069             :                                         "        'prepare_esc',\n"
    3070             :                                         "        'replace_first',\n"
    3071             :                                         "        'schema_guard',\n"
    3072             :                                         "        'sq'\n"
    3073             :                                         "    );\n",
    3074             :                                         F_FUNC);
    3075           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3076             :                                         "UPDATE sys.functions SET system = true WHERE\n"
    3077             :                                         "    system <> true AND\n"
    3078             :                                         "    schema_id = 2000 AND\n"
    3079             :                                         "    type = %d AND\n"
    3080             :                                         "    name in (\n"
    3081             :                                         "        '_dump_table_data',\n"
    3082             :                                         "        'dump_table_data',\n"
    3083             :                                         "        'eval'\n"
    3084             :                                         "    );\n",
    3085             :                                         F_PROC);
    3086           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3087             :                                         "UPDATE sys._tables SET system = true WHERE\n"
    3088             :                                         "    system <> true AND\n"
    3089             :                                         "    schema_id = 2000 AND\n"
    3090             :                                         "    type = %d AND\n"
    3091             :                                         "    name = 'dump_statements';\n",
    3092             :                                         (int) tt_table);
    3093           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3094             :                                         "UPDATE sys._tables SET system = true WHERE\n"
    3095             :                                         "    system <> true AND\n"
    3096             :                                         "    schema_id = 2000 AND\n"
    3097             :                                         "    type = %d AND\n"
    3098             :                                         "    name in (\n"
    3099             :                                         "        'describe_column_defaults',\n"
    3100             :                                         "        'describe_comments',\n"
    3101             :                                         "        'describe_constraints',\n"
    3102             :                                         "        'describe_foreign_keys',\n"
    3103             :                                         "        'describe_functions',\n"
    3104             :                                         "        'describe_indices',\n"
    3105             :                                         "        'describe_partition_tables',\n"
    3106             :                                         "        'describe_privileges',\n"
    3107             :                                         "        'describe_sequences',\n"
    3108             :                                         "        'describe_tables',\n"
    3109             :                                         "        'describe_triggers',\n"
    3110             :                                         "        'describe_user_defined_types',\n"
    3111             :                                         "        'dump_add_schemas_to_users',\n"
    3112             :                                         "        'dump_column_defaults',\n"
    3113             :                                         "        'dump_comments',\n"
    3114             :                                         "        'dump_create_roles',\n"
    3115             :                                         "        'dump_create_schemas',\n"
    3116             :                                         "        'dump_create_users',\n"
    3117             :                                         "        'dump_foreign_keys',\n"
    3118             :                                         "        'dump_functions',\n"
    3119             :                                         "        'dump_grant_user_privileges',\n"
    3120             :                                         "        'dump_indices',\n"
    3121             :                                         "        'dump_partition_tables',\n"
    3122             :                                         "        'dump_privileges',\n"
    3123             :                                         "        'dump_sequences',\n"
    3124             :                                         "        'dump_start_sequences',\n"
    3125             :                                         "        'dump_statements',\n"
    3126             :                                         "        'dump_table_constraint_type',\n"
    3127             :                                         "        'dump_tables',\n"
    3128             :                                         "        'dump_triggers',\n"
    3129             :                                         "        'dump_user_defined_types',\n"
    3130             :                                         "        'fully_qualified_functions'\n"
    3131             :                                         "    );\n",
    3132             :                                         (int) tt_view);
    3133             : 
    3134             :                         /* scoping2 branch changes, the 'users' view has to be re-created because of the 'schema_path' addition on 'db_user_info' table
    3135             :                            However 'dependency_schemas_on_users' has a dependency on 'users', so it has to be re-created as well */
    3136           0 :                         t = mvc_bind_table(sql, s, "users");
    3137           0 :                         t->system = 0;       /* make it non-system else the drop view will fail */
    3138           0 :                         t = mvc_bind_table(sql, s, "dependency_schemas_on_users");
    3139           0 :                         t->system = 0;       /* make it non-system else the drop view will fail */
    3140           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    3141             :                                         "DROP VIEW sys.dependency_schemas_on_users CASCADE;\n"
    3142             :                                         "DROP VIEW sys.users CASCADE;\n"
    3143             : 
    3144             :                                         "ALTER TABLE sys.db_user_info ADD COLUMN schema_path CLOB;\n"
    3145             :                                         "UPDATE sys.db_user_info SET schema_path = '\"sys\"';\n"
    3146             : 
    3147             :                                         "CREATE VIEW sys.users AS\n"
    3148             :                                         "SELECT u.\"name\" AS \"name\", ui.\"fullname\", ui.\"default_schema\", ui.\"schema_path\"\n"
    3149             :                                         " FROM sys.db_users() AS u\n"
    3150             :                                         " LEFT JOIN \"sys\".\"db_user_info\" AS ui ON u.\"name\" = ui.\"name\";\n"
    3151             :                                         "CREATE VIEW sys.dependency_schemas_on_users AS\n"
    3152             :                                         " SELECT s.id AS schema_id, s.name AS schema_name, u.name AS user_name, CAST(6 AS smallint) AS depend_type\n"
    3153             :                                         " FROM sys.users AS u, sys.schemas AS s\n"
    3154             :                                         " WHERE u.default_schema = s.id\n"
    3155             :                                         " ORDER BY s.name, u.name;\n"
    3156             :                                         "GRANT SELECT ON sys.dependency_schemas_on_users TO PUBLIC;\n"
    3157             :                                         "update sys._tables set system = true where system <> true and name in ('users','dependency_schemas_on_users')"
    3158             :                                         " and schema_id = 2000 and type = %d;\n", (int) tt_view);
    3159             : 
    3160           0 :                         pos += snprintf(buf + pos, bufsize - pos, "commit;\n");
    3161             : 
    3162           0 :                         assert(pos < bufsize);
    3163           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    3164           0 :                         fflush(stdout);
    3165           0 :                         if ((err = SQLstatementIntern(c, buf, "update", true, false, NULL)) != MAL_SUCCEED)
    3166           0 :                                 goto bailout;
    3167             : 
    3168           0 :                         pos = snprintf(buf, bufsize,
    3169             :                                         "ALTER TABLE sys.keywords SET READ ONLY;\n"
    3170             :                                         "ALTER TABLE sys.table_types SET READ ONLY;\n"
    3171             :                                         "ALTER TABLE sys.function_types SET READ ONLY;\n");
    3172           0 :                         assert(pos < bufsize);
    3173           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    3174           0 :                         fflush(stdout);
    3175           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    3176             :                 }
    3177             :         } else {
    3178           0 :                 err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
    3179             :         }
    3180             : 
    3181           0 : bailout:
    3182         101 :         BBPreclaim(b);
    3183         101 :         if (output)
    3184         101 :                 res_table_destroy(output);
    3185         101 :         GDKfree(buf);
    3186         101 :         return err;             /* usually MAL_SUCCEED */
    3187             : }
    3188             : 
    3189             : /* upgrades after Jul2021_3 build */
    3190             : static str
    3191         101 : sql_update_jul2021_5(Client c, mvc *sql)
    3192             : {
    3193         101 :         size_t bufsize = 65536, pos = 0;
    3194         101 :         char *buf = NULL, *err = NULL;
    3195         101 :         res_table *output = NULL;
    3196         101 :         sql_schema *s = mvc_bind_schema(sql, "sys");
    3197         101 :         sql_table *t;
    3198             : 
    3199         101 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    3200           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    3201             : 
    3202             :         /* if the string 'partition of merge table' is not in the sys.ids
    3203             :          * query, upgrade */
    3204         101 :         pos += snprintf(buf + pos, bufsize - pos,
    3205             :                                         "select query from sys._tables where name = 'ids' and schema_id = 2000 and query like '%%partition of merge table%%';\n");
    3206         101 :         assert(pos < bufsize);
    3207         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)) == NULL) {
    3208         101 :                 BAT *b;
    3209         101 :                 if ((b = BATdescriptor(output->cols[0].b))) {
    3210         101 :                         if (BATcount(b) == 0) {
    3211             :                                 /* 21_dependency_views.sql */
    3212           0 :                                 t = mvc_bind_table(sql, s, "ids");
    3213           0 :                                 t->system = 0;       /* make it non-system else the drop view will fail */
    3214           0 :                                 t = mvc_bind_table(sql, s, "dependencies_vw");
    3215           0 :                                 t->system = 0;       /* make it non-system else the drop view will fail */
    3216           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    3217             :                                                                 "drop view sys.dependencies_vw cascade;\n"
    3218             :                                                                 "drop view sys.ids cascade;\n");
    3219           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    3220             :                                                                 "CREATE VIEW sys.ids (id, name, schema_id, table_id, table_name, obj_type, sys_table) AS\n"
    3221             :                                                                 "SELECT id, name, cast(null as int) as schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'author' AS obj_type, 'sys.auths' AS sys_table FROM sys.auths UNION ALL\n"
    3222             :                                                                 "SELECT id, name, cast(null as int) as schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'schema', 'sys.schemas' FROM sys.schemas UNION ALL\n"
    3223             :                                                                 "SELECT id, name, schema_id, id as table_id, name as table_name, case when type = 1 then 'view' else 'table' end, 'sys._tables' FROM sys._tables UNION ALL\n"
    3224             :                                                                 "SELECT id, name, schema_id, id as table_id, name as table_name, case when type = 1 then 'view' else 'table' end, 'tmp._tables' FROM tmp._tables UNION ALL\n"
    3225             :                                                                 "SELECT c.id, c.name, t.schema_id, c.table_id, t.name as table_name, 'column', 'sys._columns' FROM sys._columns c JOIN sys._tables t ON c.table_id = t.id UNION ALL\n"
    3226             :                                                                 "SELECT c.id, c.name, t.schema_id, c.table_id, t.name as table_name, 'column', 'tmp._columns' FROM tmp._columns c JOIN tmp._tables t ON c.table_id = t.id UNION ALL\n"
    3227             :                                                                 "SELECT k.id, k.name, t.schema_id, k.table_id, t.name as table_name, 'key', 'sys.keys' FROM sys.keys k JOIN sys._tables t ON k.table_id = t.id UNION ALL\n"
    3228             :                                                                 "SELECT k.id, k.name, t.schema_id, k.table_id, t.name as table_name, 'key', 'tmp.keys' FROM tmp.keys k JOIN tmp._tables t ON k.table_id = t.id UNION ALL\n"
    3229             :                                                                 "SELECT i.id, i.name, t.schema_id, i.table_id, t.name as table_name, 'index', 'sys.idxs' FROM sys.idxs i JOIN sys._tables t ON i.table_id = t.id UNION ALL\n"
    3230             :                                                                 "SELECT i.id, i.name, t.schema_id, i.table_id, t.name as table_name, 'index', 'tmp.idxs' FROM tmp.idxs i JOIN tmp._tables t ON i.table_id = t.id UNION ALL\n"
    3231             :                                                                 "SELECT g.id, g.name, t.schema_id, g.table_id, t.name as table_name, 'trigger', 'sys.triggers' FROM sys.triggers g JOIN sys._tables t ON g.table_id = t.id UNION ALL\n"
    3232             :                                                                 "SELECT g.id, g.name, t.schema_id, g.table_id, t.name as table_name, 'trigger', 'tmp.triggers' FROM tmp.triggers g JOIN tmp._tables t ON g.table_id = t.id UNION ALL\n"
    3233             :                                                                 "SELECT id, name, schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, case when type = 2 then 'procedure' else 'function' end, 'sys.functions' FROM sys.functions UNION ALL\n"
    3234             :                                                                 "SELECT a.id, a.name, f.schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, case when f.type = 2 then 'procedure arg' else 'function arg' end, 'sys.args' FROM sys.args a JOIN sys.functions f ON a.func_id = f.id UNION ALL\n"
    3235             :                                                                 "SELECT id, name, schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'sequence', 'sys.sequences' FROM sys.sequences UNION ALL\n"
    3236             :                                                                 "SELECT o.id, o.name, pt.schema_id, pt.id, pt.name, 'partition of merge table', 'sys.objects' FROM sys.objects o JOIN sys._tables pt ON o.sub = pt.id JOIN sys._tables mt ON o.nr = mt.id WHERE mt.type = 3 UNION ALL\n"
    3237             :                                                                 "SELECT id, sqlname, schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'type', 'sys.types' FROM sys.types WHERE id > 2000\n"
    3238             :                                                                 " ORDER BY id;\n"
    3239             :                                                                 "GRANT SELECT ON sys.ids TO PUBLIC;\n");
    3240           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    3241             :                                                                 "CREATE VIEW sys.dependencies_vw AS\n"
    3242             :                                                                 "SELECT d.id, i1.obj_type, i1.name,\n"
    3243             :                                                                 "       d.depend_id as used_by_id, i2.obj_type as used_by_obj_type, i2.name as used_by_name,\n"
    3244             :                                                                 "       d.depend_type, dt.dependency_type_name\n"
    3245             :                                                                 "  FROM sys.dependencies d\n"
    3246             :                                                                 "  JOIN sys.ids i1 ON d.id = i1.id\n"
    3247             :                                                                 "  JOIN sys.ids i2 ON d.depend_id = i2.id\n"
    3248             :                                                                 "  JOIN sys.dependency_types dt ON d.depend_type = dt.dependency_type_id\n"
    3249             :                                                                 " ORDER BY id, depend_id;\n"
    3250             :                                                                 "GRANT SELECT ON sys.dependencies_vw TO PUBLIC;\n");
    3251           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    3252             :                                                                 "UPDATE sys._tables SET system = true WHERE name in ('ids', 'dependencies_vw') AND schema_id = 2000;\n");
    3253             : 
    3254           0 :                                 assert(pos < bufsize);
    3255           0 :                                 printf("Running database upgrade commands:\n%s\n", buf);
    3256           0 :                                 fflush(stdout);
    3257           0 :                                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    3258             :                         }
    3259         101 :                         BBPunfix(b->batCacheid);
    3260             :                 } else {
    3261           0 :                         err = createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
    3262             :                 }
    3263         101 :                 res_table_destroy(output);
    3264             :         }
    3265             : 
    3266         101 :         GDKfree(buf);
    3267         101 :         return err;             /* usually MAL_SUCCEED */
    3268             : }
    3269             : 
    3270             : static str
    3271         101 : sql_update_jan2022(Client c, mvc *sql)
    3272             : {
    3273         101 :         sql_subtype tp;
    3274         101 :         size_t bufsize = 65536, pos = 0;
    3275         101 :         char *buf = NULL, *err = NULL;
    3276         101 :         sql_schema *s = mvc_bind_schema(sql, "sys");
    3277         101 :         sql_table *t;
    3278             : 
    3279             :         /* this bit of code is to upgrade from a Jan2022 RC to the Jan2022 release */
    3280         101 :         allocator *old_sa = sql->sa;
    3281         101 :         if ((sql->sa = sa_create(sql->pa)) != NULL) {
    3282         101 :                 list *l;
    3283         101 :                 if ((l = sa_list(sql->sa)) != NULL) {
    3284         101 :                         sql_find_subtype(&tp, "varchar", 0, 0);
    3285         101 :                         list_append(l, &tp);
    3286         101 :                         list_append(l, &tp);
    3287         101 :                         list_append(l, &tp);
    3288         101 :                         if (sql_bind_func_(sql, s->base.name, "strimp_create", l, F_PROC, true, true)) {
    3289             :                                 /* do the upgrade by removing the two functions */
    3290           0 :                                 const char *query =
    3291             :                                         "drop filter function sys.strimp_filter(string, string) cascade;\n"
    3292             :                                         "drop procedure sys.strimp_create(string, string, string) cascade;\n";
    3293           0 :                                 printf("Running database upgrade commands:\n%s\n", query);
    3294           0 :                                 fflush(stdout);
    3295           0 :                                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    3296             :                         }
    3297         101 :                         sql->session->status = 0; /* if the function was not found clean the error */
    3298         101 :                         sql->errstr[0] = '\0';
    3299             :                 }
    3300         101 :                 sa_destroy(sql->sa);
    3301         101 :                 if (err)
    3302             :                         return err;
    3303             :         }
    3304         101 :         sql->sa = old_sa;
    3305             : 
    3306         101 :         sql_find_subtype(&tp, "bigint", 0, 0);
    3307         101 :         if (!sql_bind_func(sql, s->base.name, "epoch", &tp, NULL, F_FUNC, true, true)) {
    3308         101 :                 sql->session->status = 0; /* if the function was not found clean the error */
    3309         101 :                 sql->errstr[0] = '\0';
    3310             :                 /* nothing to do */
    3311         101 :                 return NULL;
    3312             :         }
    3313             : 
    3314           0 :         if ((buf = GDKmalloc(bufsize)) == NULL)
    3315           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    3316             : 
    3317             :         /* sys.epoch_ms now returns a decimal(18,3) */
    3318           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3319             :                                         "update sys.args set type = 'decimal', type_digits = 18, type_scale = 3 where func_id in (select id from sys.functions where name = 'epoch_ms' and schema_id = 2000) and number = 0 and type = 'bigint';\n");
    3320             : 
    3321             :         /* 16_tracelog */
    3322           0 :         t = mvc_bind_table(sql, s, "tracelog");
    3323           0 :         t->system = 0; /* make it non-system else the drop view will fail */
    3324           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3325             :                         "drop view sys.tracelog cascade;\n"
    3326             :                         "drop function sys.tracelog() cascade;\n"
    3327             :                         "create function sys.tracelog()\n"
    3328             :                         " returns table (\n"
    3329             :                         "  ticks bigint, -- time in microseconds\n"
    3330             :                         "  stmt string,  -- actual statement executed\n"
    3331             :                         "  event string  -- profiler event executed\n"
    3332             :                         " )\n"
    3333             :                         " external name sql.dump_trace;\n"
    3334             :                         "create view sys.tracelog as select * from sys.tracelog();\n"
    3335             :                         "update sys._tables set system = true where system <> true and schema_id = 2000"
    3336             :                         " and name = 'tracelog';\n"
    3337             :                         "update sys.functions set system = true where system <> true and schema_id = 2000"
    3338             :                         " and name = 'tracelog' and type = %d;\n", (int) F_UNION);
    3339             : 
    3340             :         /* 17_temporal.sql */
    3341           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3342             :                                         "drop function sys.epoch(bigint) cascade;\n");
    3343           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3344             :                                         "create function sys.epoch(sec DECIMAL(18,3)) "
    3345             :                                         "returns TIMESTAMP WITH TIME ZONE\n"
    3346             :                                         "external name mtime.epoch;\n"
    3347             :                                         "grant execute on function sys.epoch (DECIMAL(18,3)) to public;\n"
    3348             :                                         "update sys.functions set system = true where system <> true and name in ('epoch') and schema_id = 2000 and type = %d;\n", F_FUNC);
    3349             : 
    3350             :         /* 25_debug.sql */
    3351           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3352             :                                         "drop function sys.malfunctions() cascade;\n"
    3353             :                                         "create function sys.malfunctions()\n"
    3354             :                                         " returns table(\"module\" string, \"function\" string, \"signature\" string, \"address\" string, \"comment\" string)\n"
    3355             :                                         " external name \"manual\".\"functions\";\n"
    3356             :                                         "create view sys.malfunctions as select * from sys.malfunctions();\n"
    3357             :                                         "update sys._tables set system = true where system <> true and schema_id = 2000"
    3358             :                                         " and name = 'malfunctions';\n"
    3359             :                                         "update sys.functions set system = true where system <> true and schema_id = 2000"
    3360             :                                         " and name = 'malfunctions';\n");
    3361             : 
    3362             :         /* 21_dependency_views.sql */
    3363           0 :         t = mvc_bind_table(sql, s, "ids");
    3364           0 :         t->system = 0; /* make it non-system else the drop view will fail */
    3365           0 :         t = mvc_bind_table(sql, s, "dependencies_vw");
    3366           0 :         t->system = 0;       /* make it non-system else the drop view will fail */
    3367           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3368             :                                         "drop view sys.dependencies_vw cascade;\n" /* depends on sys.ids */
    3369             :                                         "drop view sys.ids cascade;\n"
    3370             :                                         "CREATE VIEW sys.ids (id, name, schema_id, table_id, table_name, obj_type, sys_table, system) AS\n"
    3371             :                                         "SELECT id, name, cast(null as int) as schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'author' AS obj_type, 'sys.auths' AS sys_table, (name in ('public','sysadmin','monetdb','.snapshot')) AS system FROM sys.auths UNION ALL\n"
    3372             :                                         "SELECT id, name, cast(null as int) as schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, ifthenelse(system, 'system schema', 'schema'), 'sys.schemas', system FROM sys.schemas UNION ALL\n"
    3373             :                                         "SELECT t.id, name, t.schema_id, t.id as table_id, t.name as table_name, cast(lower(tt.table_type_name) as varchar(40)), 'sys.tables', t.system FROM sys.tables t left outer join sys.table_types tt on t.type = tt.table_type_id UNION ALL\n"
    3374             :                                         "SELECT c.id, c.name, t.schema_id, c.table_id, t.name as table_name, ifthenelse(t.system, 'system column', 'column'), 'sys._columns', t.system FROM sys._columns c JOIN sys._tables t ON c.table_id = t.id UNION ALL\n"
    3375             :                                         "SELECT c.id, c.name, t.schema_id, c.table_id, t.name as table_name, 'column', 'tmp._columns', t.system FROM tmp._columns c JOIN tmp._tables t ON c.table_id = t.id UNION ALL\n"
    3376             :                                         "SELECT k.id, k.name, t.schema_id, k.table_id, t.name as table_name, ifthenelse(t.system, 'system key', 'key'), 'sys.keys', t.system FROM sys.keys k JOIN sys._tables t ON k.table_id = t.id UNION ALL\n"
    3377             :                                         "SELECT k.id, k.name, t.schema_id, k.table_id, t.name as table_name, 'key', 'tmp.keys', t.system FROM tmp.keys k JOIN tmp._tables t ON k.table_id = t.id UNION ALL\n"
    3378             :                                         "SELECT i.id, i.name, t.schema_id, i.table_id, t.name as table_name, ifthenelse(t.system, 'system index', 'index'), 'sys.idxs', t.system FROM sys.idxs i JOIN sys._tables t ON i.table_id = t.id UNION ALL\n"
    3379             :                                         "SELECT i.id, i.name, t.schema_id, i.table_id, t.name as table_name, 'index' , 'tmp.idxs', t.system FROM tmp.idxs i JOIN tmp._tables t ON i.table_id = t.id UNION ALL\n"
    3380             :                                         "SELECT g.id, g.name, t.schema_id, g.table_id, t.name as table_name, ifthenelse(t.system, 'system trigger', 'trigger'), 'sys.triggers', t.system FROM sys.triggers g JOIN sys._tables t ON g.table_id = t.id UNION ALL\n"
    3381             :                                         "SELECT g.id, g.name, t.schema_id, g.table_id, t.name as table_name, 'trigger', 'tmp.triggers', t.system FROM tmp.triggers g JOIN tmp._tables t ON g.table_id = t.id UNION ALL\n"
    3382             :                                         "SELECT f.id, f.name, f.schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, cast(ifthenelse(f.system, 'system ', '') || lower(ft.function_type_keyword) as varchar(40)), 'sys.functions', f.system FROM sys.functions f left outer join sys.function_types ft on f.type = ft.function_type_id UNION ALL\n"
    3383             :                                         "SELECT a.id, a.name, f.schema_id, a.func_id as table_id, f.name as table_name, cast(ifthenelse(f.system, 'system ', '') || lower(ft.function_type_keyword) || ' arg' as varchar(44)), 'sys.args', f.system FROM sys.args a JOIN sys.functions f ON a.func_id = f.id left outer join sys.function_types ft on f.type = ft.function_type_id UNION ALL\n"
    3384             :                                         "SELECT id, name, schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'sequence', 'sys.sequences', false FROM sys.sequences UNION ALL\n"
    3385             :                                         "SELECT o.id, o.name, pt.schema_id, pt.id, pt.name, 'partition of merge table', 'sys.objects', false FROM sys.objects o JOIN sys._tables pt ON o.sub = pt.id JOIN sys._tables mt ON o.nr = mt.id WHERE mt.type = 3 UNION ALL\n"
    3386             :                                         "SELECT id, sqlname, schema_id, cast(null as int) as table_id, cast(null as varchar(124)) as table_name, 'type', 'sys.types', (sqlname in ('inet','json','url','uuid')) FROM sys.types WHERE id > 2000\n"
    3387             :                                         " ORDER BY id;\n"
    3388             :                                         "GRANT SELECT ON sys.ids TO PUBLIC;\n");
    3389           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3390             :                                         "CREATE VIEW sys.dependencies_vw AS\n"
    3391             :                                         "SELECT d.id, i1.obj_type, i1.name,\n"
    3392             :                                         "       d.depend_id as used_by_id, i2.obj_type as used_by_obj_type, i2.name as used_by_name,\n"
    3393             :                                         "       d.depend_type, dt.dependency_type_name\n"
    3394             :                                         "  FROM sys.dependencies d\n"
    3395             :                                         "  JOIN sys.ids i1 ON d.id = i1.id\n"
    3396             :                                         "  JOIN sys.ids i2 ON d.depend_id = i2.id\n"
    3397             :                                         "  JOIN sys.dependency_types dt ON d.depend_type = dt.dependency_type_id\n"
    3398             :                                         " ORDER BY id, depend_id;\n"
    3399             :                                         "GRANT SELECT ON sys.dependencies_vw TO PUBLIC;\n");
    3400           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3401             :                                         "UPDATE sys._tables SET system = true WHERE name in ('ids', 'dependencies_vw') AND schema_id = 2000;\n");
    3402             : 
    3403             :         /* 52_describe.sql; but we need to drop most everything from
    3404             :          * 76_dump.sql first */
    3405           0 :         t = mvc_bind_table(sql, s, "describe_comments");
    3406           0 :         t->system = 0;
    3407           0 :         t = mvc_bind_table(sql, s, "describe_constraints");
    3408           0 :         t->system = 0;
    3409           0 :         t = mvc_bind_table(sql, s, "describe_functions");
    3410           0 :         t->system = 0;
    3411           0 :         t = mvc_bind_table(sql, s, "describe_partition_tables");
    3412           0 :         t->system = 0;
    3413           0 :         t = mvc_bind_table(sql, s, "describe_privileges");
    3414           0 :         t->system = 0;
    3415           0 :         t = mvc_bind_table(sql, s, "describe_sequences");
    3416           0 :         t->system = 0;
    3417           0 :         t = mvc_bind_table(sql, s, "describe_tables");
    3418           0 :         t->system = 0;
    3419           0 :         t = mvc_bind_table(sql, s, "dump_add_schemas_to_users");
    3420           0 :         t->system = 0;
    3421           0 :         t = mvc_bind_table(sql, s, "dump_column_defaults");
    3422           0 :         t->system = 0;
    3423           0 :         t = mvc_bind_table(sql, s, "dump_comments");
    3424           0 :         t->system = 0;
    3425           0 :         t = mvc_bind_table(sql, s, "dump_create_roles");
    3426           0 :         t->system = 0;
    3427           0 :         t = mvc_bind_table(sql, s, "dump_create_schemas");
    3428           0 :         t->system = 0;
    3429           0 :         t = mvc_bind_table(sql, s, "dump_create_users");
    3430           0 :         t->system = 0;
    3431           0 :         t = mvc_bind_table(sql, s, "dump_foreign_keys");
    3432           0 :         t->system = 0;
    3433           0 :         t = mvc_bind_table(sql, s, "dump_functions");
    3434           0 :         t->system = 0;
    3435           0 :         t = mvc_bind_table(sql, s, "dump_grant_user_privileges");
    3436           0 :         t->system = 0;
    3437           0 :         t = mvc_bind_table(sql, s, "dump_indices");
    3438           0 :         t->system = 0;
    3439           0 :         t = mvc_bind_table(sql, s, "dump_partition_tables");
    3440           0 :         t->system = 0;
    3441           0 :         t = mvc_bind_table(sql, s, "dump_privileges");
    3442           0 :         t->system = 0;
    3443           0 :         t = mvc_bind_table(sql, s, "dump_sequences");
    3444           0 :         t->system = 0;
    3445           0 :         t = mvc_bind_table(sql, s, "dump_start_sequences");
    3446           0 :         t->system = 0;
    3447           0 :         t = mvc_bind_table(sql, s, "dump_table_constraint_type");
    3448           0 :         t->system = 0;
    3449           0 :         t = mvc_bind_table(sql, s, "dump_tables");
    3450           0 :         t->system = 0;
    3451           0 :         t = mvc_bind_table(sql, s, "dump_triggers");
    3452           0 :         t->system = 0;
    3453           0 :         t = mvc_bind_table(sql, s, "dump_user_defined_types");
    3454           0 :         t->system = 0;
    3455           0 :         t = mvc_bind_table(sql, s, "fully_qualified_functions");
    3456           0 :         t->system = 0;
    3457           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3458             :                                         /* drop dependant stuff from 76_dump.sql */
    3459             :                                         "drop function sys.dump_database(boolean) cascade;\n"
    3460             :                                         "drop procedure sys.dump_table_data() cascade;\n"
    3461             :                                         "drop procedure sys._dump_table_data(string, string) cascade;\n"
    3462             :                                         "drop function sys.prepare_esc(string, string) cascade;\n"
    3463             :                                         "drop function sys.esc(string) cascade;\n"
    3464             :                                         "drop view sys.dump_privileges cascade;\n"
    3465             :                                         "drop view sys.dump_user_defined_types cascade;\n"
    3466             :                                         "drop view sys.dump_comments cascade;\n"
    3467             :                                         "drop view sys.dump_triggers cascade;\n"
    3468             :                                         "drop view sys.dump_tables cascade;\n"
    3469             :                                         "drop view sys.dump_functions cascade;\n"
    3470             :                                         "drop view sys.dump_start_sequences cascade;\n"
    3471             :                                         "drop view sys.dump_sequences cascade;\n"
    3472             :                                         "drop view sys.dump_partition_tables cascade;\n"
    3473             :                                         "drop view sys.dump_foreign_keys cascade;\n"
    3474             :                                         "drop view sys.dump_column_defaults cascade;\n"
    3475             :                                         "drop view sys.dump_indices cascade;\n"
    3476             :                                         "drop view sys.dump_table_constraint_type cascade;\n"
    3477             :                                         "drop view sys.dump_grant_user_privileges cascade;\n"
    3478             :                                         "drop view sys.dump_add_schemas_to_users cascade;\n"
    3479             :                                         "drop view sys.dump_create_schemas cascade;\n"
    3480             :                                         "drop view sys.dump_create_users cascade;\n"
    3481             :                                         "drop view sys.dump_create_roles cascade;\n"
    3482             : 
    3483             :                                         "drop view sys.describe_functions cascade;\n"
    3484             :                                         "drop view sys.describe_partition_tables cascade;\n"
    3485             :                                         "drop view sys.describe_privileges cascade;\n"
    3486             :                                         "drop view sys.fully_qualified_functions cascade;\n"
    3487             :                                         "drop view sys.describe_comments cascade;\n"
    3488             :                                         "drop view sys.describe_tables cascade;\n"
    3489             :                                         "drop view sys.describe_sequences cascade;\n"
    3490             :                                         "drop function sys.schema_guard(string, string, string) cascade;\n"
    3491             :                                         "drop function sys.get_remote_table_expressions(string, string) cascade;\n"
    3492             :                                         "drop function sys.get_merge_table_partition_expressions(int) cascade;\n"
    3493             :                                         "drop view sys.describe_constraints cascade;\n"
    3494             :                                         "drop function sys.alter_table(string, string) cascade;\n"
    3495             :                                         "drop function sys.FQN(string, string) cascade;\n"
    3496             :                                         "drop function sys.sq(string) cascade;\n");
    3497           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3498             :                                         "CREATE FUNCTION sys.SQ (s STRING) RETURNS STRING BEGIN RETURN '''' || sys.replace(s,'''','''''') || ''''; END;\n"
    3499             :                                         "CREATE FUNCTION sys.FQN(s STRING, t STRING) RETURNS STRING BEGIN RETURN '\"' || sys.replace(s,'\"','\"\"') || '\".\"' || sys.replace(t,'\"','\"\"') || '\"'; END;\n"
    3500             :                                         "CREATE FUNCTION sys.schema_guard(sch STRING, nme STRING, stmt STRING) RETURNS STRING BEGIN\n"
    3501             :                                         "RETURN\n"
    3502             :                                         "    SELECT sys.replace_first(stmt, '(\\\\s*\"?' || sch ||  '\"?\\\\s*\\\\.|)\\\\s*\"?' || nme || '\"?\\\\s*', ' ' || sys.FQN(sch, nme) || ' ', 'imsx');\n"
    3503             :                                         "END;\n"
    3504             :                                         "CREATE VIEW sys.describe_constraints AS\n"
    3505             :                                         "  SELECT\n"
    3506             :                                         "          s.name sch,\n"
    3507             :                                         "          t.name tbl,\n"
    3508             :                                         "          kc.name col,\n"
    3509             :                                         "          k.name con,\n"
    3510             :                                         "          CASE k.type WHEN 0 THEN 'PRIMARY KEY' WHEN 1 THEN 'UNIQUE' END tpe\n"
    3511             :                                         "  FROM sys.schemas s, sys._tables t, sys.objects kc, sys.keys k\n"
    3512             :                                         "  WHERE kc.id = k.id\n"
    3513             :                                         "          AND k.table_id = t.id\n"
    3514             :                                         "          AND s.id = t.schema_id\n"
    3515             :                                         "          AND t.system = FALSE\n"
    3516             :                                         "          AND k.type in (0, 1);\n"
    3517             :                                         "CREATE FUNCTION sys.get_merge_table_partition_expressions(tid INT) RETURNS STRING\n"
    3518             :                                         "BEGIN\n"
    3519             :                                         "  RETURN\n"
    3520             :                                         "          SELECT\n"
    3521             :                                         "                  CASE WHEN tp.table_id IS NOT NULL THEN\n"
    3522             :                                         "                          ' PARTITION BY ' ||\n"
    3523             :                                         "                          ifthenelse(bit_and(tp.type, 2) = 2, 'VALUES ', 'RANGE ') ||\n"
    3524             :                                         "                          CASE\n"
    3525             :                                         "                                  WHEN bit_and(tp.type, 4) = 4\n"
    3526             :                                         "                                  THEN 'ON ' || '(' || (SELECT sys.DQ(c.name) || ')' FROM sys.columns c WHERE c.id = tp.column_id)\n"
    3527             :                                         "                                  ELSE 'USING ' || '(' || tp.expression || ')'\n"
    3528             :                                         "                          END\n"
    3529             :                                         "                  ELSE\n"
    3530             :                                         "                          ''\n"
    3531             :                                         "                  END\n"
    3532             :                                         "          FROM (VALUES (tid)) t(id) LEFT JOIN sys.table_partitions tp ON t.id = tp.table_id;\n"
    3533             :                                         "END;\n"
    3534             :                                         "CREATE FUNCTION sys.get_remote_table_expressions(s STRING, t STRING) RETURNS STRING BEGIN\n"
    3535             :                                         "  RETURN SELECT ' ON ' || sys.SQ(uri) || ' WITH USER ' || sys.SQ(username) || ' ENCRYPTED PASSWORD ' || sys.SQ(\"hash\") FROM sys.remote_table_credentials(s ||'.' || t);\n"
    3536             :                                         "END;\n"
    3537             :                                         "CREATE VIEW sys.describe_tables AS\n"
    3538             :                                         "  SELECT\n"
    3539             :                                         "          t.id o,\n"
    3540             :                                         "          s.name sch,\n"
    3541             :                                         "          t.name tab,\n"
    3542             :                                         "          ts.table_type_name typ,\n"
    3543             :                                         "          (SELECT\n"
    3544             :                                         "                  ' (' ||\n"
    3545             :                                         "                  GROUP_CONCAT(\n"
    3546             :                                         "                          sys.DQ(c.name) || ' ' ||\n"
    3547             :                                         "                          sys.describe_type(c.type, c.type_digits, c.type_scale) ||\n"
    3548             :                                         "                          ifthenelse(c.\"null\" = 'false', ' NOT NULL', '')\n"
    3549             :                                         "                  , ', ') || ')'\n"
    3550             :                                         "          FROM sys._columns c\n"
    3551             :                                         "          WHERE c.table_id = t.id) col,\n"
    3552             :                                         "          CASE ts.table_type_name\n"
    3553             :                                         "                  WHEN 'REMOTE TABLE' THEN\n"
    3554             :                                         "                          sys.get_remote_table_expressions(s.name, t.name)\n"
    3555             :                                         "                  WHEN 'MERGE TABLE' THEN\n"
    3556             :                                         "                          sys.get_merge_table_partition_expressions(t.id)\n"
    3557             :                                         "                  WHEN 'VIEW' THEN\n"
    3558             :                                         "                          sys.schema_guard(s.name, t.name, t.query)\n"
    3559             :                                         "                  ELSE\n"
    3560             :                                         "                          ''\n"
    3561             :                                         "          END opt\n"
    3562             :                                         "  FROM sys.schemas s, sys.table_types ts, sys.tables t\n"
    3563             :                                         "  WHERE ts.table_type_name IN ('TABLE', 'VIEW', 'MERGE TABLE', 'REMOTE TABLE', 'REPLICA TABLE')\n"
    3564             :                                         "          AND t.system = FALSE\n"
    3565             :                                         "          AND s.id = t.schema_id\n"
    3566             :                                         "          AND ts.table_type_id = t.type\n"
    3567             :                                         "          AND s.name <> 'tmp';\n"
    3568             :                                         "CREATE VIEW sys.fully_qualified_functions AS\n"
    3569             :                                         "  WITH fqn(id, tpe, sig, num) AS\n"
    3570             :                                         "  (\n"
    3571             :                                         "          SELECT\n"
    3572             :                                         "                  f.id,\n"
    3573             :                                         "                  ft.function_type_keyword,\n"
    3574             :                                         "                  CASE WHEN a.type IS NULL THEN\n"
    3575             :                                         "                          sys.fqn(s.name, f.name) || '()'\n"
    3576             :                                         "                  ELSE\n"
    3577             :                                         "                          sys.fqn(s.name, f.name) || '(' || group_concat(sys.describe_type(a.type, a.type_digits, a.type_scale), ',') OVER (PARTITION BY f.id ORDER BY a.number)  || ')'\n"
    3578             :                                         "                  END,\n"
    3579             :                                         "                  a.number\n"
    3580             :                                         "          FROM sys.schemas s, sys.function_types ft, sys.functions f LEFT JOIN sys.args a ON f.id = a.func_id\n"
    3581             :                                         "          WHERE s.id= f.schema_id AND f.type = ft.function_type_id\n"
    3582             :                                         "  )\n"
    3583             :                                         "  SELECT\n"
    3584             :                                         "          fqn1.id id,\n"
    3585             :                                         "          fqn1.tpe tpe,\n"
    3586             :                                         "          fqn1.sig nme\n"
    3587             :                                         "  FROM\n"
    3588             :                                         "          fqn fqn1 JOIN (SELECT id, max(num) FROM fqn GROUP BY id)  fqn2(id, num)\n"
    3589             :                                         "          ON fqn1.id = fqn2.id AND (fqn1.num = fqn2.num OR fqn1.num IS NULL AND fqn2.num is NULL);\n"
    3590             :                                         "CREATE VIEW sys.describe_comments AS\n"
    3591             :                                         "          SELECT\n"
    3592             :                                         "                  o.id id,\n"
    3593             :                                         "                  o.tpe tpe,\n"
    3594             :                                         "                  o.nme fqn,\n"
    3595             :                                         "                  c.remark rem\n"
    3596             :                                         "          FROM (\n"
    3597             :                                         "                  SELECT id, 'SCHEMA', sys.DQ(name) FROM sys.schemas\n"
    3598             :                                         "                  UNION ALL\n"
    3599             :                                         "                  SELECT t.id, ifthenelse(ts.table_type_name = 'VIEW', 'VIEW', 'TABLE'), sys.FQN(s.name, t.name)\n"
    3600             :                                         "                  FROM sys.schemas s JOIN sys.tables t ON s.id = t.schema_id JOIN sys.table_types ts ON t.type = ts.table_type_id\n"
    3601             :                                         "                  WHERE s.name <> 'tmp'\n"
    3602             :                                         "                  UNION ALL\n"
    3603             :                                         "                  SELECT c.id, 'COLUMN', sys.FQN(s.name, t.name) || '.' || sys.DQ(c.name) FROM sys.columns c, sys.tables t, sys.schemas s WHERE c.table_id = t.id AND t.schema_id = s.id\n"
    3604             :                                         "                  UNION ALL\n"
    3605             :                                         "                  SELECT idx.id, 'INDEX', sys.FQN(s.name, idx.name) FROM sys.idxs idx, sys._tables t, sys.schemas s WHERE idx.table_id = t.id AND t.schema_id = s.id\n"
    3606             :                                         "                  UNION ALL\n"
    3607             :                                         "                  SELECT seq.id, 'SEQUENCE', sys.FQN(s.name, seq.name) FROM sys.sequences seq, sys.schemas s WHERE seq.schema_id = s.id\n"
    3608             :                                         "                  UNION ALL\n"
    3609             :                                         "                  SELECT f.id, ft.function_type_keyword, qf.nme FROM sys.functions f, sys.function_types ft, sys.schemas s, sys.fully_qualified_functions qf WHERE f.type = ft.function_type_id AND f.schema_id = s.id AND qf.id = f.id\n"
    3610             :                                         "                  ) AS o(id, tpe, nme)\n"
    3611             :                                         "                  JOIN sys.comments c ON c.id = o.id;\n"
    3612             :                                         "CREATE VIEW sys.describe_privileges AS\n"
    3613             :                                         "  SELECT\n"
    3614             :                                         "          CASE\n"
    3615             :                                         "                  WHEN o.tpe IS NULL AND pc.privilege_code_name = 'SELECT' THEN --GLOBAL privileges: SELECT maps to COPY FROM\n"
    3616             :                                         "                          'COPY FROM'\n"
    3617             :                                         "                  WHEN o.tpe IS NULL AND pc.privilege_code_name = 'UPDATE' THEN --GLOBAL privileges: UPDATE maps to COPY INTO\n"
    3618             :                                         "                          'COPY INTO'\n"
    3619             :                                         "                  ELSE\n"
    3620             :                                         "                          o.nme\n"
    3621             :                                         "          END o_nme,\n"
    3622             :                                         "          coalesce(o.tpe, 'GLOBAL') o_tpe,\n"
    3623             :                                         "          pc.privilege_code_name p_nme,\n"
    3624             :                                         "          a.name a_nme,\n"
    3625             :                                         "          g.name g_nme,\n"
    3626             :                                         "          p.grantable grantable\n"
    3627             :                                         "  FROM\n"
    3628             :                                         "          sys.privileges p LEFT JOIN\n"
    3629             :                                         "          (\n"
    3630             :                                         "          SELECT t.id, s.name || '.' || t.name , 'TABLE'\n"
    3631             :                                         "                  from sys.schemas s, sys.tables t where s.id = t.schema_id\n"
    3632             :                                         "          UNION ALL\n"
    3633             :                                         "                  SELECT c.id, s.name || '.' || t.name || '.' || c.name, 'COLUMN'\n"
    3634             :                                         "                  FROM sys.schemas s, sys.tables t, sys.columns c where s.id = t.schema_id AND t.id = c.table_id\n"
    3635             :                                         "          UNION ALL\n"
    3636             :                                         "                  SELECT f.id, f.nme, f.tpe\n"
    3637             :                                         "                  FROM sys.fully_qualified_functions f\n"
    3638             :                                         "          ) o(id, nme, tpe) ON o.id = p.obj_id,\n"
    3639             :                                         "          sys.privilege_codes pc,\n"
    3640             :                                         "          auths a, auths g\n"
    3641             :                                         "  WHERE\n"
    3642             :                                         "          p.privileges = pc.privilege_code_id AND\n"
    3643             :                                         "          p.auth_id = a.id AND\n"
    3644             :                                         "          p.grantor = g.id;\n"
    3645             :                                         "CREATE VIEW sys.describe_partition_tables AS\n"
    3646             :                                         "  SELECT \n"
    3647             :                                         "          m_sch,\n"
    3648             :                                         "          m_tbl,\n"
    3649             :                                         "          p_sch,\n"
    3650             :                                         "          p_tbl,\n"
    3651             :                                         "          CASE\n"
    3652             :                                         "                  WHEN p_raw_type IS NULL THEN 'READ ONLY'\n"
    3653             :                                         "                  WHEN (p_raw_type = 'VALUES' AND pvalues IS NULL) OR (p_raw_type = 'RANGE' AND minimum IS NULL AND maximum IS NULL AND with_nulls) THEN 'FOR NULLS'\n"
    3654             :                                         "                  ELSE p_raw_type\n"
    3655             :                                         "          END AS tpe,\n"
    3656             :                                         "          pvalues,\n"
    3657             :                                         "          minimum,\n"
    3658             :                                         "          maximum,\n"
    3659             :                                         "          with_nulls\n"
    3660             :                                         "  FROM \n"
    3661             :                                         "    (WITH\n"
    3662             :                                         "          tp(\"type\", table_id) AS\n"
    3663             :                                         "          (SELECT ifthenelse((table_partitions.\"type\" & 2) = 2, 'VALUES', 'RANGE'), table_partitions.table_id FROM sys.table_partitions),\n"
    3664             :                                         "          subq(m_tid, p_mid, \"type\", m_sch, m_tbl, p_sch, p_tbl) AS\n"
    3665             :                                         "          (SELECT m_t.id, p_m.id, m_t.\"type\", m_s.name, m_t.name, p_s.name, p_m.name\n"
    3666             :                                         "          FROM sys.schemas m_s, sys._tables m_t, sys.dependencies d, sys.schemas p_s, sys._tables p_m\n"
    3667             :                                         "          WHERE m_t.\"type\" IN (3, 6)\n"
    3668             :                                         "                  AND m_t.schema_id = m_s.id\n"
    3669             :                                         "                  AND m_s.name <> 'tmp'\n"
    3670             :                                         "                  AND m_t.system = FALSE\n"
    3671             :                                         "                  AND m_t.id = d.depend_id\n"
    3672             :                                         "                  AND d.id = p_m.id\n"
    3673             :                                         "                  AND p_m.schema_id = p_s.id\n"
    3674             :                                         "          ORDER BY m_t.id, p_m.id)\n"
    3675             :                                         "  SELECT\n"
    3676             :                                         "          subq.m_sch,\n"
    3677             :                                         "          subq.m_tbl,\n"
    3678             :                                         "          subq.p_sch,\n"
    3679             :                                         "          subq.p_tbl,\n"
    3680             :                                         "          tp.\"type\" AS p_raw_type,\n"
    3681             :                                         "          CASE WHEN tp.\"type\" = 'VALUES'\n"
    3682             :                                         "                  THEN (SELECT GROUP_CONCAT(vp.value, ',') FROM sys.value_partitions vp WHERE vp.table_id = subq.p_mid)\n"
    3683             :                                         "                  ELSE NULL\n"
    3684             :                                         "          END AS pvalues,\n"
    3685             :                                         "          CASE WHEN tp.\"type\" = 'RANGE'\n"
    3686             :                                         "                  THEN (SELECT minimum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    3687             :                                         "                  ELSE NULL\n"
    3688             :                                         "          END AS minimum,\n"
    3689             :                                         "          CASE WHEN tp.\"type\" = 'RANGE'\n"
    3690             :                                         "                  THEN (SELECT maximum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    3691             :                                         "                  ELSE NULL\n"
    3692             :                                         "          END AS maximum,\n"
    3693             :                                         "          CASE WHEN tp.\"type\" = 'VALUES'\n"
    3694             :                                         "                  THEN EXISTS(SELECT vp.value FROM sys.value_partitions vp WHERE vp.table_id = subq.p_mid AND vp.value IS NULL)\n"
    3695             :                                         "                  ELSE (SELECT rp.with_nulls FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    3696             :                                         "          END AS with_nulls\n"
    3697             :                                         "  FROM \n"
    3698             :                                         "          subq LEFT OUTER JOIN tp\n"
    3699             :                                         "          ON subq.m_tid = tp.table_id) AS tmp_pi;\n"
    3700             :                                         "CREATE VIEW sys.describe_functions AS\n"
    3701             :                                         "  WITH func_args_all(func_id, number, max_number, func_arg) AS\n"
    3702             :                                         "  (\n"
    3703             :                                         "          SELECT\n"
    3704             :                                         "                  func_id,\n"
    3705             :                                         "                  number,\n"
    3706             :                                         "                  max(number) OVER (PARTITION BY func_id ORDER BY number DESC),\n"
    3707             :                                         "                  group_concat(sys.dq(name) || ' ' || sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number)\n"
    3708             :                                         "          FROM sys.args\n"
    3709             :                                         "          WHERE inout = 1\n"
    3710             :                                         "  ),\n"
    3711             :                                         "  func_args(func_id, func_arg) AS\n"
    3712             :                                         "  (\n"
    3713             :                                         "          SELECT func_id, func_arg\n"
    3714             :                                         "          FROM func_args_all\n"
    3715             :                                         "          WHERE number = max_number\n"
    3716             :                                         "  ),\n"
    3717             :                                         "  func_rets_all(func_id, number, max_number, func_ret, func_ret_type) AS\n"
    3718             :                                         "  (\n"
    3719             :                                         "          SELECT\n"
    3720             :                                         "                  func_id,\n"
    3721             :                                         "                  number,\n"
    3722             :                                         "                  max(number) OVER (PARTITION BY func_id ORDER BY number DESC),\n"
    3723             :                                         "                  group_concat(sys.dq(name) || ' ' || sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number),\n"
    3724             :                                         "                  group_concat(sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number)\n"
    3725             :                                         "          FROM sys.args\n"
    3726             :                                         "          WHERE inout = 0\n"
    3727             :                                         "  ),\n"
    3728             :                                         "  func_rets(func_id, func_ret, func_ret_type) AS\n"
    3729             :                                         "  (\n"
    3730             :                                         "          SELECT\n"
    3731             :                                         "                  func_id,\n"
    3732             :                                         "                  func_ret,\n"
    3733             :                                         "                  func_ret_type\n"
    3734             :                                         "          FROM func_rets_all\n"
    3735             :                                         "          WHERE number = max_number\n"
    3736             :                                         "  )\n"
    3737             :                                         "  SELECT\n"
    3738             :                                         "          f.id o,\n"
    3739             :                                         "          s.name sch,\n"
    3740             :                                         "          f.name fun,\n"
    3741             :                                         "          CASE WHEN f.language IN (1, 2) THEN f.func ELSE 'CREATE ' || ft.function_type_keyword || ' ' || sys.FQN(s.name, f.name) || '(' || coalesce(fa.func_arg, '') || ')' || CASE WHEN f.type = 5 THEN ' RETURNS TABLE (' || coalesce(fr.func_ret, '') || ')' WHEN f.type IN (1,3) THEN ' RETURNS ' || fr.func_ret_type ELSE '' END || CASE WHEN fl.language_keyword IS NULL THEN '' ELSE ' LANGUAGE ' || fl.language_keyword END || ' ' || f.func END def\n"
    3742             :                                         "  FROM sys.functions f\n"
    3743             :                                         "          LEFT OUTER JOIN func_args fa ON fa.func_id = f.id\n"
    3744             :                                         "          LEFT OUTER JOIN func_rets fr ON fr.func_id = f.id\n"
    3745             :                                         "          JOIN sys.schemas s ON f.schema_id = s.id\n"
    3746             :                                         "          JOIN sys.function_types ft ON f.type = ft.function_type_id\n"
    3747             :                                         "          LEFT OUTER JOIN sys.function_languages fl ON f.language = fl.language_id\n"
    3748             :                                         "  WHERE s.name <> 'tmp' AND NOT f.system;\n"
    3749             :                                         "CREATE VIEW sys.describe_sequences AS\n"
    3750             :                                         "  SELECT\n"
    3751             :                                         "          s.name sch,\n"
    3752             :                                         "          seq.name seq,\n"
    3753             :                                         "          seq.\"start\" s,\n"
    3754             :                                         "          get_value_for(s.name, seq.name) rs,\n"
    3755             :                                         "          seq.\"minvalue\" mi,\n"
    3756             :                                         "          seq.\"maxvalue\" ma,\n"
    3757             :                                         "          seq.\"increment\" inc,\n"
    3758             :                                         "          seq.\"cacheinc\" cache,\n"
    3759             :                                         "          seq.\"cycle\" cycle,\n"
    3760             :                                         "          CASE WHEN seq.\"minvalue\" = -9223372036854775807 AND seq.\"increment\" > 0 AND seq.\"start\" =  1 THEN TRUE ELSE FALSE END nomin,\n"
    3761             :                                         "          CASE WHEN seq.\"maxvalue\" =  9223372036854775807 AND seq.\"increment\" < 0 AND seq.\"start\" = -1 THEN TRUE ELSE FALSE END nomax,\n"
    3762             :                                         "          CASE\n"
    3763             :                                         "                  WHEN seq.\"minvalue\" = 0 AND seq.\"increment\" > 0 THEN NULL\n"
    3764             :                                         "                  WHEN seq.\"minvalue\" <> -9223372036854775807 THEN seq.\"minvalue\"\n"
    3765             :                                         "                  ELSE\n"
    3766             :                                         "                          CASE\n"
    3767             :                                         "                                  WHEN seq.\"increment\" < 0  THEN NULL\n"
    3768             :                                         "                                  ELSE CASE WHEN seq.\"start\" = 1 THEN NULL ELSE seq.\"maxvalue\" END\n"
    3769             :                                         "                          END\n"
    3770             :                                         "          END rmi,\n"
    3771             :                                         "          CASE\n"
    3772             :                                         "                  WHEN seq.\"maxvalue\" = 0 AND seq.\"increment\" < 0 THEN NULL\n"
    3773             :                                         "                  WHEN seq.\"maxvalue\" <> 9223372036854775807 THEN seq.\"maxvalue\"\n"
    3774             :                                         "                  ELSE\n"
    3775             :                                         "                          CASE\n"
    3776             :                                         "                                  WHEN seq.\"increment\" > 0  THEN NULL\n"
    3777             :                                         "                                  ELSE CASE WHEN seq.\"start\" = -1 THEN NULL ELSE seq.\"maxvalue\" END\n"
    3778             :                                         "                          END\n"
    3779             :                                         "          END rma\n"
    3780             :                                         "  FROM sys.sequences seq, sys.schemas s\n"
    3781             :                                         "  WHERE s.id = seq.schema_id\n"
    3782             :                                         "  AND s.name <> 'tmp'\n"
    3783             :                                         "  ORDER BY s.name, seq.name;\n"
    3784             :                                         "GRANT SELECT ON sys.describe_constraints TO PUBLIC;\n"
    3785             :                                         "GRANT SELECT ON sys.describe_indices TO PUBLIC;\n"
    3786             :                                         "GRANT SELECT ON sys.describe_column_defaults TO PUBLIC;\n"
    3787             :                                         "GRANT SELECT ON sys.describe_foreign_keys TO PUBLIC;\n"
    3788             :                                         "GRANT SELECT ON sys.describe_tables TO PUBLIC;\n"
    3789             :                                         "GRANT SELECT ON sys.describe_triggers TO PUBLIC;\n"
    3790             :                                         "GRANT SELECT ON sys.describe_comments TO PUBLIC;\n"
    3791             :                                         "GRANT SELECT ON sys.fully_qualified_functions TO PUBLIC;\n"
    3792             :                                         "GRANT SELECT ON sys.describe_privileges TO PUBLIC;\n"
    3793             :                                         "GRANT SELECT ON sys.describe_user_defined_types TO PUBLIC;\n"
    3794             :                                         "GRANT SELECT ON sys.describe_partition_tables TO PUBLIC;\n"
    3795             :                                         "GRANT SELECT ON sys.describe_sequences TO PUBLIC;\n"
    3796             :                                         "GRANT SELECT ON sys.describe_functions TO PUBLIC;\n");
    3797           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3798             :                                         "update sys.functions set system = true where system <> true and name in ('sq', 'fqn', 'get_merge_table_partition_expressions', 'get_remote_table_expressions', 'schema_guard') and schema_id = 2000 and type = %d;\n", F_FUNC);
    3799           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3800             :                                         "update sys._tables set system = true where name in ('describe_constraints', 'describe_tables', 'fully_qualified_functions', 'describe_comments', 'describe_privileges', 'describe_partition_tables', 'describe_sequences', 'describe_functions') AND schema_id = 2000;\n");
    3801             : 
    3802             :         /* 76_dump.sql (most everything already dropped) */
    3803           0 :         pos += snprintf(buf + pos, bufsize - pos,
    3804             :                                         "CREATE VIEW sys.dump_create_roles AS\n"
    3805             :                                         "  SELECT\n"
    3806             :                                         "    'CREATE ROLE ' || sys.dq(name) || ';' stmt,\n"
    3807             :                                         "    name user_name\n"
    3808             :                                         "    FROM sys.auths\n"
    3809             :                                         "   WHERE name NOT IN (SELECT name FROM sys.db_user_info)\n"
    3810             :                                         "     AND grantor <> 0;\n"
    3811             :                                         "CREATE VIEW sys.dump_create_users AS\n"
    3812             :                                         "  SELECT\n"
    3813             :                                         "    'CREATE USER ' || sys.dq(ui.name) || ' WITH ENCRYPTED PASSWORD ' ||\n"
    3814             :                                         "      sys.sq(sys.password_hash(ui.name)) ||\n"
    3815             :                                         "      ' NAME ' || sys.sq(ui.fullname) || ' SCHEMA sys' || ifthenelse(ui.schema_path = '\"sys\"', '', ' SCHEMA PATH ' || sys.sq(ui.schema_path)) || ';' stmt,\n"
    3816             :                                         "    ui.name user_name\n"
    3817             :                                         "    FROM sys.db_user_info ui, sys.schemas s\n"
    3818             :                                         "   WHERE ui.default_schema = s.id\n"
    3819             :                                         "     AND ui.name <> 'monetdb'\n"
    3820             :                                         "     AND ui.name <> '.snapshot';\n"
    3821             :                                         "CREATE VIEW sys.dump_create_schemas AS\n"
    3822             :                                         "  SELECT\n"
    3823             :                                         "    'CREATE SCHEMA ' || sys.dq(s.name) || ifthenelse(a.name <> 'sysadmin', ' AUTHORIZATION ' || sys.dq(a.name), ' ') || ';' stmt,\n"
    3824             :                                         "    s.name schema_name\n"
    3825             :                                         "    FROM sys.schemas s, sys.auths a\n"
    3826             :                                         "   WHERE s.authorization = a.id AND s.system = FALSE;\n"
    3827             :                                         "CREATE VIEW sys.dump_add_schemas_to_users AS\n"
    3828             :                                         "  SELECT\n"
    3829             :                                         "    'ALTER USER ' || sys.dq(ui.name) || ' SET SCHEMA ' || sys.dq(s.name) || ';' stmt,\n"
    3830             :                                         "    s.name schema_name,\n"
    3831             :                                         "    ui.name user_name\n"
    3832             :                                         "    FROM sys.db_user_info ui, sys.schemas s\n"
    3833             :                                         "   WHERE ui.default_schema = s.id\n"
    3834             :                                         "     AND ui.name <> 'monetdb'\n"
    3835             :                                         "     AND ui.name <> '.snapshot'\n"
    3836             :                                         "     AND s.name <> 'sys';\n"
    3837             :                                         "CREATE VIEW sys.dump_grant_user_privileges AS\n"
    3838             :                                         "  SELECT\n"
    3839             :                                         "    'GRANT ' || sys.dq(a2.name) || ' ' || ifthenelse(a1.name = 'public', 'PUBLIC', sys.dq(a1.name)) || ';' stmt,\n"
    3840             :                                         "    a2.name grantee,\n"
    3841             :                                         "    a1.name grantor\n"
    3842             :                                         "    FROM sys.auths a1, sys.auths a2, sys.user_role ur\n"
    3843             :                                         "   WHERE a1.id = ur.login_id AND a2.id = ur.role_id;\n"
    3844             :                                         "CREATE VIEW sys.dump_table_constraint_type AS\n"
    3845             :                                         "  SELECT\n"
    3846             :                                         "    'ALTER TABLE ' || sys.FQN(sch, tbl) || ' ADD CONSTRAINT ' || sys.DQ(con) || ' '||\n"
    3847             :                                         "      tpe || ' (' || GROUP_CONCAT(sys.DQ(col), ', ') || ');' stmt,\n"
    3848             :                                         "    sch schema_name,\n"
    3849             :                                         "    tbl table_name,\n"
    3850             :                                         "    con constraint_name\n"
    3851             :                                         "    FROM sys.describe_constraints GROUP BY sch, tbl, con, tpe;\n"
    3852             :                                         "CREATE VIEW sys.dump_table_grants AS\n"
    3853             :                                         "  WITH table_grants (sname, tname, grantee, grants, grantor, grantable)\n"
    3854             :                                         "  AS (SELECT s.name, t.name, a.name, sum(p.privileges), g.name, p.grantable\n"
    3855             :                                         "  FROM sys.schemas s, sys.tables t, sys.auths a, sys.privileges p, sys.auths g\n"
    3856             :                                         "       WHERE p.obj_id = t.id AND p.auth_id = a.id AND t.schema_id = s.id AND t.system = FALSE AND p.grantor = g.id\n"
    3857             :                                         "       GROUP BY s.name, t.name, a.name, g.name, p.grantable\n"
    3858             :                                         "       ORDER BY s.name, t.name, a.name, g.name, p.grantable)\n"
    3859             :                                         "  SELECT\n"
    3860             :                                         "    'GRANT ' || pc.privilege_code_name || ' ON TABLE ' || sys.FQN(sname, tname)\n"
    3861             :                                         "      || ' TO ' || ifthenelse(grantee = 'public', 'PUBLIC', sys.dq(grantee))\n"
    3862             :                                         "      || CASE WHEN grantable = 1 THEN ' WITH GRANT OPTION' ELSE '' END || ';' stmt,\n"
    3863             :                                         "    sname schema_name,\n"
    3864             :                                         "    tname table_name,\n"
    3865             :                                         "    grantee\n"
    3866             :                                         "    FROM table_grants LEFT OUTER JOIN sys.privilege_codes pc ON grants = pc.privilege_code_id;\n"
    3867             :                                         "CREATE VIEW sys.dump_column_grants AS\n"
    3868             :                                         "  SELECT\n"
    3869             :                                         "    'GRANT ' || pc.privilege_code_name || '(' || sys.dq(c.name) || ') ON ' || sys.FQN(s.name, t.name)\n"
    3870             :                                         "      || ' TO ' || ifthenelse(a.name = 'public', 'PUBLIC', sys.dq(a.name))\n"
    3871             :                                         "      || CASE WHEN p.grantable = 1 THEN ' WITH GRANT OPTION' ELSE '' END || ';' stmt,\n"
    3872             :                                         "    s.name schema_name,\n"
    3873             :                                         "    t.name table_name,\n"
    3874             :                                         "    c.name column_name,\n"
    3875             :                                         "    a.name grantee\n"
    3876             :                                         "    FROM sys.schemas s,\n"
    3877             :                                         "   sys.tables t,\n"
    3878             :                                         "   sys.columns c,\n"
    3879             :                                         "   sys.auths a,\n"
    3880             :                                         "   sys.privileges p,\n"
    3881             :                                         "   sys.auths g,\n"
    3882             :                                         "   sys.privilege_codes pc\n"
    3883             :                                         "   WHERE p.obj_id = c.id\n"
    3884             :                                         "     AND c.table_id = t.id\n"
    3885             :                                         "     AND p.auth_id = a.id\n"
    3886             :                                         "     AND t.schema_id = s.id\n"
    3887             :                                         "     AND NOT t.system\n"
    3888             :                                         "     AND p.grantor = g.id\n"
    3889             :                                         "     AND p.privileges = pc.privilege_code_id\n"
    3890             :                                         "   ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable;\n"
    3891             :                                         "CREATE VIEW sys.dump_function_grants AS\n"
    3892             :                                         "  WITH func_args_all(func_id, number, max_number, func_arg) AS\n"
    3893             :                                         "  (SELECT a.func_id,\n"
    3894             :                                         "    a.number,\n"
    3895             :                                         "    max(a.number) OVER (PARTITION BY a.func_id ORDER BY a.number DESC),\n"
    3896             :                                         "    group_concat(sys.describe_type(a.type, a.type_digits, a.type_scale), ', ') OVER (PARTITION BY a.func_id ORDER BY a.number)\n"
    3897             :                                         "     FROM sys.args a\n"
    3898             :                                         "    WHERE a.inout = 1),\n"
    3899             :                                         "  func_args(func_id, func_arg) AS\n"
    3900             :                                         "  (SELECT func_id, func_arg FROM func_args_all WHERE number = max_number)\n"
    3901             :                                         "  SELECT\n"
    3902             :                                         "    'GRANT ' || pc.privilege_code_name || ' ON ' || ft.function_type_keyword || ' '\n"
    3903             :                                         "      || sys.FQN(s.name, f.name) || '(' || coalesce(fa.func_arg, '') || ') TO '\n"
    3904             :                                         "      || ifthenelse(a.name = 'public', 'PUBLIC', sys.dq(a.name))\n"
    3905             :                                         "      || CASE WHEN p.grantable = 1 THEN ' WITH GRANT OPTION' ELSE '' END || ';' stmt,\n"
    3906             :                                         "    s.name schema_name,\n"
    3907             :                                         "    f.name function_name,\n"
    3908             :                                         "    a.name grantee\n"
    3909             :                                         "    FROM sys.schemas s,\n"
    3910             :                                         "   sys.functions f LEFT OUTER JOIN func_args fa ON f.id = fa.func_id,\n"
    3911             :                                         "   sys.auths a,\n"
    3912             :                                         "   sys.privileges p,\n"
    3913             :                                         "   sys.auths g,\n"
    3914             :                                         "   sys.function_types ft,\n"
    3915             :                                         "   sys.privilege_codes pc\n"
    3916             :                                         "   WHERE s.id = f.schema_id\n"
    3917             :                                         "     AND f.id = p.obj_id\n"
    3918             :                                         "     AND p.auth_id = a.id\n"
    3919             :                                         "     AND p.grantor = g.id\n"
    3920             :                                         "     AND p.privileges = pc.privilege_code_id\n"
    3921             :                                         "     AND f.type = ft.function_type_id\n"
    3922             :                                         "     AND NOT f.system\n"
    3923             :                                         "   ORDER BY s.name, f.name, a.name, g.name, p.grantable;\n"
    3924             :                                         "CREATE VIEW sys.dump_indices AS\n"
    3925             :                                         "  SELECT\n"
    3926             :                                         "    'CREATE ' || tpe || ' ' || sys.DQ(ind) || ' ON ' || sys.FQN(sch, tbl) || '(' || GROUP_CONCAT(col) || ');' stmt,\n"
    3927             :                                         "    sch schema_name,\n"
    3928             :                                         "    tbl table_name,\n"
    3929             :                                         "    ind index_name\n"
    3930             :                                         "    FROM sys.describe_indices GROUP BY ind, tpe, sch, tbl;\n"
    3931             :                                         "CREATE VIEW sys.dump_column_defaults AS\n"
    3932             :                                         "  SELECT 'ALTER TABLE ' || sys.FQN(sch, tbl) || ' ALTER COLUMN ' || sys.DQ(col) || ' SET DEFAULT ' || def || ';' stmt,\n"
    3933             :                                         "   sch schema_name,\n"
    3934             :                                         "   tbl table_name,\n"
    3935             :                                         "   col column_name\n"
    3936             :                                         "    FROM sys.describe_column_defaults;\n"
    3937             :                                         "CREATE VIEW sys.dump_foreign_keys AS\n"
    3938             :                                         "  SELECT\n"
    3939             :                                         "    'ALTER TABLE ' || sys.FQN(fk_s, fk_t) || ' ADD CONSTRAINT ' || sys.DQ(fk) || ' ' ||\n"
    3940             :                                         "      'FOREIGN KEY(' || GROUP_CONCAT(sys.DQ(fk_c), ',') ||') ' ||\n"
    3941             :                                         "      'REFERENCES ' || sys.FQN(pk_s, pk_t) || '(' || GROUP_CONCAT(sys.DQ(pk_c), ',') || ') ' ||\n"
    3942             :                                         "      'ON DELETE ' || on_delete || ' ON UPDATE ' || on_update ||\n"
    3943             :                                         "      ';' stmt,\n"
    3944             :                                         "    fk_s foreign_schema_name,\n"
    3945             :                                         "    fk_t foreign_table_name,\n"
    3946             :                                         "    pk_s primary_schema_name,\n"
    3947             :                                         "    pk_t primary_table_name,\n"
    3948             :                                         "    fk key_name\n"
    3949             :                                         "    FROM sys.describe_foreign_keys GROUP BY fk_s, fk_t, pk_s, pk_t, fk, on_delete, on_update;\n"
    3950             :                                         "CREATE VIEW sys.dump_partition_tables AS\n"
    3951             :                                         "  SELECT\n"
    3952             :                                         "    'ALTER TABLE ' || sys.FQN(m_sch, m_tbl) || ' ADD TABLE ' || sys.FQN(p_sch, p_tbl) ||\n"
    3953             :                                         "      CASE \n"
    3954             :                                         "      WHEN tpe = 'VALUES' THEN ' AS PARTITION IN (' || pvalues || ')'\n"
    3955             :                                         "      WHEN tpe = 'RANGE' THEN ' AS PARTITION FROM ' || ifthenelse(minimum IS NOT NULL, sys.SQ(minimum), 'RANGE MINVALUE') || ' TO ' || ifthenelse(maximum IS NOT NULL, sys.SQ(maximum), 'RANGE MAXVALUE')\n"
    3956             :                                         "      WHEN tpe = 'FOR NULLS' THEN ' AS PARTITION FOR NULL VALUES'\n"
    3957             :                                         "      ELSE ''\n"
    3958             :                                         "      END ||\n"
    3959             :                                         "      CASE WHEN tpe in ('VALUES', 'RANGE') AND with_nulls THEN ' WITH NULL VALUES' ELSE '' END ||\n"
    3960             :                                         "      ';' stmt,\n"
    3961             :                                         "    m_sch merge_schema_name,\n"
    3962             :                                         "    m_tbl merge_table_name,\n"
    3963             :                                         "    p_sch partition_schema_name,\n"
    3964             :                                         "    p_tbl partition_table_name\n"
    3965             :                                         "    FROM sys.describe_partition_tables;\n"
    3966             :                                         "CREATE VIEW sys.dump_sequences AS\n"
    3967             :                                         "  SELECT\n"
    3968             :                                         "    'CREATE SEQUENCE ' || sys.FQN(sch, seq) || ' AS BIGINT ' ||\n"
    3969             :                                         "    CASE WHEN \"s\" <> 0 THEN 'START WITH ' ||  \"rs\" ELSE '' END ||\n"
    3970             :                                         "    CASE WHEN \"inc\" <> 1 THEN ' INCREMENT BY ' ||  \"inc\" ELSE '' END ||\n"
    3971             :                                         "    CASE\n"
    3972             :                                         "      WHEN nomin THEN ' NO MINVALUE'\n"
    3973             :                                         "      WHEN rmi IS NOT NULL THEN ' MINVALUE ' || rmi\n"
    3974             :                                         "      ELSE ''\n"
    3975             :                                         "    END ||\n"
    3976             :                                         "    CASE\n"
    3977             :                                         "      WHEN nomax THEN ' NO MAXVALUE'\n"
    3978             :                                         "      WHEN rma IS NOT NULL THEN ' MAXVALUE ' || rma\n"
    3979             :                                         "      ELSE ''\n"
    3980             :                                         "    END ||\n"
    3981             :                                         "    CASE WHEN \"cache\" <> 1 THEN ' CACHE ' ||  \"cache\" ELSE '' END ||\n"
    3982             :                                         "    CASE WHEN \"cycle\" THEN ' CYCLE' ELSE '' END ||\n"
    3983             :                                         "    ';' stmt,\n"
    3984             :                                         "    sch schema_name,\n"
    3985             :                                         "    seq seqname\n"
    3986             :                                         "    FROM sys.describe_sequences;\n"
    3987             :                                         "CREATE VIEW sys.dump_start_sequences AS\n"
    3988             :                                         "  SELECT\n"
    3989             :                                         "    'UPDATE sys.sequences seq SET start = ' || s ||\n"
    3990             :                                         "      ' WHERE name = ' || sys.SQ(seq) ||\n"
    3991             :                                         "      ' AND schema_id = (SELECT s.id FROM sys.schemas s WHERE s.name = ' || sys.SQ(sch) || ');' stmt,\n"
    3992             :                                         "    sch schema_name,\n"
    3993             :                                         "    seq sequence_name\n"
    3994             :                                         "    FROM sys.describe_sequences;\n"
    3995             :                                         "CREATE VIEW sys.dump_functions AS\n"
    3996             :                                         "  SELECT f.o o, sys.schema_guard(f.sch, f.fun, f.def) stmt,\n"
    3997             :                                         "   f.sch schema_name,\n"
    3998             :                                         "   f.fun function_name\n"
    3999             :                                         "    FROM sys.describe_functions f;\n"
    4000             :                                         "CREATE VIEW sys.dump_tables AS\n"
    4001             :                                         "  SELECT\n"
    4002             :                                         "    t.o o,\n"
    4003             :                                         "    CASE\n"
    4004             :                                         "      WHEN t.typ <> 'VIEW' THEN\n"
    4005             :                                         "      'CREATE ' || t.typ || ' ' || sys.FQN(t.sch, t.tab) || t.col || t.opt || ';'\n"
    4006             :                                         "      ELSE\n"
    4007             :                                         "      t.opt\n"
    4008             :                                         "      END stmt,\n"
    4009             :                                         "    t.sch schema_name,\n"
    4010             :                                         "    t.tab table_name\n"
    4011             :                                         "    FROM sys.describe_tables t;\n"
    4012             :                                         "CREATE VIEW sys.dump_triggers AS\n"
    4013             :                                         "  SELECT sys.schema_guard(sch, tab, def) stmt,\n"
    4014             :                                         "   sch schema_name,\n"
    4015             :                                         "   tab table_name,\n"
    4016             :                                         "   tri trigger_name\n"
    4017             :                                         "    FROM sys.describe_triggers;\n"
    4018             :                                         "CREATE VIEW sys.dump_comments AS\n"
    4019             :                                         "  SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\n"
    4020             :                                         "CREATE VIEW sys.dump_user_defined_types AS\n"
    4021             :                                         "  SELECT 'CREATE TYPE ' || sys.FQN(sch, sql_tpe) || ' EXTERNAL NAME ' || sys.DQ(ext_tpe) || ';' stmt,\n"
    4022             :                                         "   sch schema_name,\n"
    4023             :                                         "   sql_tpe type_name\n"
    4024             :                                         "    FROM sys.describe_user_defined_types;\n"
    4025             :                                         "CREATE FUNCTION sys.esc(s STRING) RETURNS STRING BEGIN RETURN '\"' || sys.replace(sys.replace(sys.replace(s,E'\\\\', E'\\\\\\\\'), E'\\n', E'\\\\n'), '\"', E'\\\\\"') || '\"'; END;\n"
    4026             :                                         "CREATE FUNCTION sys.prepare_esc(s STRING, t STRING) RETURNS STRING\n"
    4027             :                                         "BEGIN\n"
    4028             :                                         "  RETURN\n"
    4029             :                                         "    CASE\n"
    4030             :                                         "    WHEN (t = 'varchar' OR t ='char' OR t = 'clob' OR t = 'json' OR t = 'geometry' OR t = 'url') THEN\n"
    4031             :                                         "    'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE ' || 'sys.esc(' || sys.DQ(s) || ')' || ' END'\n"
    4032             :                                         "    ELSE\n"
    4033             :                                         "    'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE CAST(' || sys.DQ(s) || ' AS STRING) END'\n"
    4034             :                                         "    END;\n"
    4035             :                                         "END;\n"
    4036             :                                         "CREATE PROCEDURE sys.dump_table_data(sch STRING, tbl STRING)\n"
    4037             :                                         "BEGIN\n"
    4038             :                                         "  DECLARE k INT;\n"
    4039             :                                         "  SET k = (SELECT MIN(c.id) FROM sys.columns c, sys.tables t, sys.schemas s WHERE c.table_id = t.id AND t.name = tbl AND t.schema_id = s.id AND s.name = sch);\n"
    4040             :                                         "  IF k IS NOT NULL THEN\n"
    4041             :                                         "    DECLARE cname STRING;\n"
    4042             :                                         "    DECLARE ctype STRING;\n"
    4043             :                                         "    SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    4044             :                                         "    SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    4045             :                                         "    DECLARE COPY_INTO_STMT STRING;\n"
    4046             :                                         "    DECLARE _cnt INT;\n"
    4047             :                                         "    SET _cnt = (SELECT count FROM sys.storage(sch, tbl, cname));\n"
    4048             :                                         "    IF _cnt > 0 THEN\n"
    4049             :                                         "      SET COPY_INTO_STMT = 'COPY ' || _cnt || ' RECORDS INTO ' || sys.FQN(sch, tbl) || '(' || sys.DQ(cname);\n"
    4050             :                                         "      DECLARE SELECT_DATA_STMT STRING;\n"
    4051             :                                         "      SET SELECT_DATA_STMT = 'SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), ' || sys.prepare_esc(cname, ctype);\n"
    4052             :                                         "      DECLARE M INT;\n"
    4053             :                                         "      SET M = (SELECT MAX(c.id) FROM sys.columns c, sys.tables t WHERE c.table_id = t.id AND t.name = tbl);\n"
    4054             :                                         "      WHILE (k < M) DO\n"
    4055             :                                         "  SET k = (SELECT MIN(c.id) FROM sys.columns c, sys.tables t WHERE c.table_id = t.id AND t.name = tbl AND c.id > k);\n"
    4056             :                                         "        SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    4057             :                                         "  SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    4058             :                                         "  SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || sys.DQ(cname));\n"
    4059             :                                         "  SET SELECT_DATA_STMT = SELECT_DATA_STMT || '|| ''|'' || ' || sys.prepare_esc(cname, ctype);\n"
    4060             :                                         "      END WHILE;\n"
    4061             :                                         "      SET COPY_INTO_STMT = (COPY_INTO_STMT || ') FROM STDIN USING DELIMITERS ''|'',E''\\\\n'',''\"'';');\n"
    4062             :                                         "      SET SELECT_DATA_STMT = SELECT_DATA_STMT || ' FROM ' || sys.FQN(sch, tbl);\n"
    4063             :                                         "      insert into sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, COPY_INTO_STMT);\n"
    4064             :                                         "      CALL sys.EVAL('INSERT INTO sys.dump_statements ' || SELECT_DATA_STMT || ';');\n"
    4065             :                                         "    END IF;\n"
    4066             :                                         "  END IF;\n"
    4067             :                                         "END;\n"
    4068             :                                         "CREATE PROCEDURE sys.dump_table_data()\n"
    4069             :                                         "BEGIN\n"
    4070             :                                         "  DECLARE i INT;\n"
    4071             :                                         "  SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    4072             :                                         "  IF i IS NOT NULL THEN\n"
    4073             :                                         "    DECLARE M INT;\n"
    4074             :                                         "    SET M = (SELECT MAX(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    4075             :                                         "    DECLARE sch STRING;\n"
    4076             :                                         "    DECLARE tbl STRING;\n"
    4077             :                                         "    WHILE i < M DO\n"
    4078             :                                         "      set sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4079             :                                         "      set tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4080             :                                         "      CALL sys.dump_table_data(sch, tbl);\n"
    4081             :                                         "      SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system AND t.id > i);\n"
    4082             :                                         "    END WHILE;\n"
    4083             :                                         "    set sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4084             :                                         "    set tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4085             :                                         "    CALL sys.dump_table_data(sch, tbl);\n"
    4086             :                                         "  END IF;\n"
    4087             :                                         "END;\n"
    4088             :                                         "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    4089             :                                         "BEGIN\n"
    4090             :                                         "  SET SCHEMA sys;\n"
    4091             :                                         "  TRUNCATE sys.dump_statements;\n"
    4092             :                                         "  INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    4093             :                                         "  INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'SET SCHEMA \"sys\";');\n"
    4094             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    4095             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    4096             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    4097             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    4098             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    4099             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    4100             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    4101             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    4102             :                                         "                              FROM (\n"
    4103             :                                         "                                SELECT f.o, f.stmt FROM sys.dump_functions f\n"
    4104             :                                         "                                 UNION\n"
    4105             :                                         "                                SELECT t.o, t.stmt FROM sys.dump_tables t\n"
    4106             :                                         "                              ) AS stmts(o, s);\n"
    4107             :                                         "  IF NOT DESCRIBE THEN\n"
    4108             :                                         "    CALL sys.dump_table_data();\n"
    4109             :                                         "  END IF;\n"
    4110             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    4111             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    4112             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    4113             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    4114             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    4115             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    4116             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    4117             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    4118             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_grants;\n"
    4119             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_grants;\n"
    4120             :                                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_function_grants;\n"
    4121             :                                         "  INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    4122             :                                         "  RETURN sys.dump_statements;\n"
    4123             :                                         "END;\n");
    4124           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4125             :                                         "update sys.functions set system = true where system <> true and name in ('esc', 'prepare_esc') and schema_id = 2000 and type = %d;\n", F_FUNC);
    4126           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4127             :                                         "update sys.functions set system = true where system <> true and name in ('dump_database') and schema_id = 2000 and type = %d;\n", F_UNION);
    4128           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4129             :                                         "update sys.functions set system = true where system <> true and name in ('dump_table_data') and schema_id = 2000 and type = %d;\n", F_PROC);
    4130           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4131             :                                         "update sys._tables set system = true where name in ('dump_create_roles', 'dump_create_users', 'dump_create_schemas', 'dump_add_schemas_to_users', 'dump_grant_user_privileges', 'dump_table_constraint_type', 'dump_table_grants', 'dump_column_grants', 'dump_function_grants', 'dump_indices', 'dump_column_defaults', 'dump_foreign_keys', 'dump_partition_tables', 'dump_sequences', 'dump_start_sequences', 'dump_functions', 'dump_tables', 'dump_triggers', 'dump_comments', 'dump_user_defined_types') AND schema_id = 2000;\n");
    4132             : 
    4133             :         /* 80_udf.sql (removed) */
    4134           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4135             :                                         "drop function sys.reverse(string) cascade;\n"
    4136             :                                         "drop all function sys.fuse cascade;\n");
    4137             : 
    4138             :         /* 26_sysmon.sql */
    4139           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4140             :                                         "create procedure sys.vacuum(sname string, tname string, cname string)\n"
    4141             :                                         "  external name sql.vacuum;\n"
    4142             :                                         "create procedure sys.vacuum(sname string, tname string, cname string, interval int)\n"
    4143             :                                         "  external name sql.vacuum;\n"
    4144             :                                         "create procedure sys.stop_vacuum(sname string, tname string, cname string)\n"
    4145             :                                         "  external name sql.stop_vacuum;\n");
    4146           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4147             :                                         "update sys.functions set system = true where system <> true and name in ('vacuum', 'stop_vacuum') and schema_id = 2000 and type = %d;\n", F_PROC);
    4148             : 
    4149             :         /* 10_sys_schema_extension.sql */
    4150           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4151             :                                         "CREATE TABLE sys.fkey_actions (\n"
    4152             :                                         "    action_id   SMALLINT NOT NULL PRIMARY KEY,\n"
    4153             :                                         "    action_name VARCHAR(15) NOT NULL);\n"
    4154             :                                         "INSERT INTO sys.fkey_actions (action_id, action_name) VALUES\n"
    4155             :                                         "  (0, 'NO ACTION'),\n"
    4156             :                                         "  (1, 'CASCADE'),\n"
    4157             :                                         "  (2, 'RESTRICT'),\n"
    4158             :                                         "  (3, 'SET NULL'),\n"
    4159             :                                         "  (4, 'SET DEFAULT');\n"
    4160             :                                         "ALTER TABLE sys.fkey_actions SET READ ONLY;\n"
    4161             :                                         "GRANT SELECT ON sys.fkey_actions TO PUBLIC;\n"
    4162             :                                         "CREATE VIEW sys.fkeys AS\n"
    4163             :                                         "SELECT id, table_id, type, name, rkey, update_action_id, upd.action_name as update_action, delete_action_id, del.action_name as delete_action FROM (\n"
    4164             :                                         " SELECT id, table_id, type, name, rkey, cast(((\"action\" >> 8) & 255) as smallint) as update_action_id, cast((\"action\" & 255) as smallint) AS delete_action_id FROM sys.keys WHERE type = 2\n"
    4165             :                                         " UNION ALL\n"
    4166             :                                         " SELECT id, table_id, type, name, rkey, cast(((\"action\" >> 8) & 255) as smallint) as update_action_id, cast((\"action\" & 255) as smallint) AS delete_action_id FROM tmp.keys WHERE type = 2\n"
    4167             :                                         ") AS fks\n"
    4168             :                                         "JOIN sys.fkey_actions upd ON fks.update_action_id = upd.action_id\n"
    4169             :                                         "JOIN sys.fkey_actions del ON fks.delete_action_id = del.action_id;\n"
    4170             :                                         "GRANT SELECT ON sys.fkeys TO PUBLIC;\n"
    4171             :                                         );
    4172           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4173             :                                         "update sys._tables set system = true where name in ('fkey_actions', 'fkeys') AND schema_id = 2000;\n");
    4174             : 
    4175             :         /* recreate SQL functions that just need to be recompiled since the
    4176             :          * MAL functions's "unsafe" property was changed */
    4177           0 :         sql_schema *lg = mvc_bind_schema(sql, "logging");
    4178           0 :         t = mvc_bind_table(sql, lg, "compinfo");
    4179           0 :         t->system = 0;
    4180           0 :         t = mvc_bind_table(sql, s, "schemastorage");
    4181           0 :         t->system = 0;
    4182           0 :         t = mvc_bind_table(sql, s, "tablestorage");
    4183           0 :         t->system = 0;
    4184           0 :         t = mvc_bind_table(sql, s, "storage");
    4185           0 :         t->system = 0;
    4186           0 :         t = mvc_bind_table(sql, s, "rejects");
    4187           0 :         t->system = 0;
    4188           0 :         t = mvc_bind_table(sql, s, "queue");
    4189           0 :         t->system = 0;
    4190           0 :         t = mvc_bind_table(sql, s, "optimizers");
    4191           0 :         t->system = 0;
    4192           0 :         t = mvc_bind_table(sql, s, "prepared_statements_args");
    4193           0 :         t->system = 0;
    4194           0 :         t = mvc_bind_table(sql, s, "prepared_statements");
    4195           0 :         t->system = 0;
    4196           0 :         t = mvc_bind_table(sql, s, "sessions");
    4197           0 :         t->system = 0;
    4198           0 :         t = mvc_bind_table(sql, s, "querylog_calls");
    4199           0 :         t->system = 0;
    4200           0 :         t = mvc_bind_table(sql, s, "querylog_history");
    4201           0 :         t->system = 0;
    4202           0 :         t = mvc_bind_table(sql, s, "querylog_catalog");
    4203           0 :         t->system = 0;
    4204           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4205             :                                         "drop view logging.compinfo cascade;\n"
    4206             :                                         "drop function logging.compinfo cascade;\n"
    4207             :                                         "drop procedure sys.storagemodelinit() cascade;\n"
    4208             :                                         "drop view sys.schemastorage cascade;\n"
    4209             :                                         "drop view sys.tablestorage cascade;\n"
    4210             :                                         "drop view sys.storage cascade;\n"
    4211             :                                         "drop function sys.storage() cascade;\n"
    4212             :                                         "drop function if exists wlr.tick cascade;\n"
    4213             :                                         "drop function if exists wlr.clock cascade;\n"
    4214             :                                         "drop function if exists wlc.tick cascade;\n"
    4215             :                                         "drop function if exists wlc.clock cascade;\n"
    4216             :                                         "drop function profiler.getlimit cascade;\n"
    4217             :                                         "drop view sys.rejects cascade;\n"
    4218             :                                         "drop function sys.rejects cascade;\n"
    4219             :                                         "drop function sys.user_statistics cascade;\n"
    4220             :                                         "drop view sys.queue cascade;\n"
    4221             :                                         "drop function sys.queue cascade;\n"
    4222             :                                         "drop function sys.debugflags cascade;\n"
    4223             :                                         "drop function sys.bbp cascade;\n"
    4224             :                                         "drop view sys.optimizers cascade;\n"
    4225             :                                         "drop function sys.optimizers cascade;\n"
    4226             :                                         "drop function sys.querycache cascade;\n"
    4227             :                                         "drop function sys.optimizer_stats cascade;\n"
    4228             :                                         "drop function sys.current_sessionid cascade;\n"
    4229             :                                         "drop view sys.prepared_statements_args cascade;\n"
    4230             :                                         "drop function sys.prepared_statements_args cascade;\n"
    4231             :                                         "drop view sys.prepared_statements cascade;\n"
    4232             :                                         "drop function sys.prepared_statements cascade;\n"
    4233             :                                         "drop view sys.sessions cascade;\n"
    4234             :                                         "drop function sys.sessions cascade;\n"
    4235             :                                         "drop view sys.querylog_history cascade;\n"
    4236             :                                         "drop view sys.querylog_calls cascade;\n"
    4237             :                                         "drop function sys.querylog_calls cascade;\n"
    4238             :                                         "drop view sys.querylog_catalog cascade;\n"
    4239             :                                         "drop function sys.querylog_catalog cascade;\n"
    4240             :                                         "create function sys.querylog_catalog()\n"
    4241             :                                         "returns table(\n"
    4242             :                                         " id oid,\n"
    4243             :                                         " owner string,\n"
    4244             :                                         " defined timestamp,\n"
    4245             :                                         " query string,\n"
    4246             :                                         " pipe string,\n"
    4247             :                                         " \"plan\" string,\n"
    4248             :                                         " mal int,\n"
    4249             :                                         " optimize bigint\n"
    4250             :                                         ")\n"
    4251             :                                         "external name sql.querylog_catalog;\n"
    4252             :                                         "create view sys.querylog_catalog as select * from sys.querylog_catalog();\n"
    4253             :                                         "create function sys.querylog_calls()\n"
    4254             :                                         "returns table(\n"
    4255             :                                         " id oid,\n"
    4256             :                                         " \"start\" timestamp,\n"
    4257             :                                         " \"stop\" timestamp,\n"
    4258             :                                         " arguments string,\n"
    4259             :                                         " tuples bigint,\n"
    4260             :                                         " run bigint,\n"
    4261             :                                         " ship bigint,\n"
    4262             :                                         " cpu int,\n"
    4263             :                                         " io int\n"
    4264             :                                         ")\n"
    4265             :                                         "external name sql.querylog_calls;\n"
    4266             :                                         "create view sys.querylog_calls as select * from sys.querylog_calls();\n"
    4267             :                                         "create view sys.querylog_history as\n"
    4268             :                                         "select qd.*, ql.\"start\",ql.\"stop\", ql.arguments, ql.tuples, ql.run, ql.ship, ql.cpu, ql.io\n"
    4269             :                                         "from sys.querylog_catalog() qd, sys.querylog_calls() ql\n"
    4270             :                                         "where qd.id = ql.id and qd.owner = user;\n"
    4271             :                                         "create function sys.sessions()\n"
    4272             :                                         "returns table(\n"
    4273             :                                         " \"sessionid\" int,\n"
    4274             :                                         " \"username\" string,\n"
    4275             :                                         " \"login\" timestamp,\n"
    4276             :                                         " \"idle\" timestamp,\n"
    4277             :                                         " \"optimizer\" string,\n"
    4278             :                                         " \"sessiontimeout\" int,\n"
    4279             :                                         " \"querytimeout\" int,\n"
    4280             :                                         " \"workerlimit\" int,\n"
    4281             :                                         " \"memorylimit\" int\n"
    4282             :                                         ")\n"
    4283             :                                         "external name sql.sessions;\n"
    4284             :                                         "create view sys.sessions as select * from sys.sessions();\n"
    4285             :                                         "create function sys.prepared_statements()\n"
    4286             :                                         "returns table(\n"
    4287             :                                         " \"sessionid\" int,\n"
    4288             :                                         " \"username\" string,\n"
    4289             :                                         " \"statementid\" int,\n"
    4290             :                                         " \"statement\" string,\n"
    4291             :                                         " \"created\" timestamp\n"
    4292             :                                         ")\n"
    4293             :                                         "external name sql.prepared_statements;\n"
    4294             :                                         "grant execute on function sys.prepared_statements to public;\n"
    4295             :                                         "create view sys.prepared_statements as select * from sys.prepared_statements();\n"
    4296             :                                         "grant select on sys.prepared_statements to public;\n"
    4297             :                                         "create function sys.prepared_statements_args()\n"
    4298             :                                         "returns table(\n"
    4299             :                                         " \"statementid\" int,\n"
    4300             :                                         " \"type\" string,\n"
    4301             :                                         " \"type_digits\" int,\n"
    4302             :                                         " \"type_scale\" int,\n"
    4303             :                                         " \"inout\" tinyint,\n"
    4304             :                                         " \"number\" int,\n"
    4305             :                                         " \"schema\" string,\n"
    4306             :                                         " \"table\" string,\n"
    4307             :                                         " \"column\" string\n"
    4308             :                                         ")\n"
    4309             :                                         "external name sql.prepared_statements_args;\n"
    4310             :                                         "grant execute on function sys.prepared_statements_args to public;\n"
    4311             :                                         "create view sys.prepared_statements_args as select * from sys.prepared_statements_args();\n"
    4312             :                                         "grant select on sys.prepared_statements_args to public;\n"
    4313             :                                         "create function sys.current_sessionid() returns int\n"
    4314             :                                         "external name clients.current_sessionid;\n"
    4315             :                                         "grant execute on function sys.current_sessionid to public;\n"
    4316             :                                         "create function sys.optimizer_stats()\n"
    4317             :                                         " returns table (optname string, count int, timing bigint)\n"
    4318             :                                         " external name inspect.optimizer_stats;\n"
    4319             :                                         "create function sys.querycache()\n"
    4320             :                                         " returns table (query string, count int)\n"
    4321             :                                         " external name sql.dump_cache;\n"
    4322             :                                         "create function sys.optimizers ()\n"
    4323             :                                         " returns table (name string, def string, status string)\n"
    4324             :                                         " external name sql.optimizers;\n"
    4325             :                                         "create view sys.optimizers as select * from sys.optimizers();\n"
    4326             :                                         "create function sys.bbp ()\n"
    4327             :                                         " returns table (id int, name string,\n"
    4328             :                                         " ttype string, count bigint, refcnt int, lrefcnt int,\n"
    4329             :                                         " location string, heat int, dirty string,\n"
    4330             :                                         " status string, kind string)\n"
    4331             :                                         " external name bbp.get;\n"
    4332             :                                         "create function sys.debugflags()\n"
    4333             :                                         " returns table(flag string, val bool)\n"
    4334             :                                         " external name mdb.\"getDebugFlags\";\n"
    4335             :                                         "create function sys.queue()\n"
    4336             :                                         "returns table(\n"
    4337             :                                         " \"tag\" bigint,\n"
    4338             :                                         " \"sessionid\" int,\n"
    4339             :                                         " \"username\" string,\n"
    4340             :                                         " \"started\" timestamp,\n"
    4341             :                                         " \"status\" string,\n"
    4342             :                                         " \"query\" string,\n"
    4343             :                                         " \"finished\" timestamp,\n"
    4344             :                                         " \"maxworkers\" int,\n"
    4345             :                                         " \"footprint\" int\n"
    4346             :                                         ")\n"
    4347             :                                         "external name sysmon.queue;\n"
    4348             :                                         "grant execute on function sys.queue to public;\n"
    4349             :                                         "create view sys.queue as select * from sys.queue();\n"
    4350             :                                         "grant select on sys.queue to public;\n"
    4351             :                                         "create function sys.user_statistics()\n"
    4352             :                                         "returns table(\n"
    4353             :                                         " username string,\n"
    4354             :                                         " querycount bigint,\n"
    4355             :                                         " totalticks bigint,\n"
    4356             :                                         " started timestamp,\n"
    4357             :                                         " finished timestamp,\n"
    4358             :                                         " maxticks bigint,\n"
    4359             :                                         " maxquery string\n"
    4360             :                                         ")\n"
    4361             :                                         "external name sysmon.user_statistics;\n"
    4362             :                                         "create function sys.rejects()\n"
    4363             :                                         "returns table(\n"
    4364             :                                         " rowid bigint,\n"
    4365             :                                         " fldid int,\n"
    4366             :                                         " \"message\" string,\n"
    4367             :                                         " \"input\" string\n"
    4368             :                                         ")\n"
    4369             :                                         "external name sql.copy_rejects;\n"
    4370             :                                         "grant execute on function rejects to public;\n"
    4371             :                                         "create view sys.rejects as select * from sys.rejects();\n"
    4372             :                                         "create function profiler.getlimit() returns integer external name profiler.getlimit;\n"
    4373             :                                         "create function sys.\"storage\"()\n"
    4374             :                                         "returns table (\n"
    4375             :                                         " \"schema\" varchar(1024),\n"
    4376             :                                         " \"table\" varchar(1024),\n"
    4377             :                                         " \"column\" varchar(1024),\n"
    4378             :                                         " \"type\" varchar(1024),\n"
    4379             :                                         " \"mode\" varchar(15),\n"
    4380             :                                         " location varchar(1024),\n"
    4381             :                                         " \"count\" bigint,\n"
    4382             :                                         " typewidth int,\n"
    4383             :                                         " columnsize bigint,\n"
    4384             :                                         " heapsize bigint,\n"
    4385             :                                         " hashes bigint,\n"
    4386             :                                         " phash boolean,\n"
    4387             :                                         " \"imprints\" bigint,\n"
    4388             :                                         " sorted boolean,\n"
    4389             :                                         " revsorted boolean,\n"
    4390             :                                         " \"unique\" boolean,\n"
    4391             :                                         " orderidx bigint\n"
    4392             :                                         ")\n"
    4393             :                                         "external name sql.\"storage\";\n"
    4394             :                                         "create view sys.\"storage\" as\n"
    4395             :                                         "select * from sys.\"storage\"()\n"
    4396             :                                         " where (\"schema\", \"table\") in (\n"
    4397             :                                         " select sch.\"name\", tbl.\"name\"\n"
    4398             :                                         " from sys.\"tables\" as tbl join sys.\"schemas\" as sch on tbl.schema_id = sch.id\n"
    4399             :                                         " where tbl.\"system\" = false)\n"
    4400             :                                         "order by \"schema\", \"table\", \"column\";\n"
    4401             :                                         "create view sys.\"tablestorage\" as\n"
    4402             :                                         "select \"schema\", \"table\",\n"
    4403             :                                         " max(\"count\") as \"rowcount\",\n"
    4404             :                                         " count(*) as \"storages\",\n"
    4405             :                                         " sum(columnsize) as columnsize,\n"
    4406             :                                         " sum(heapsize) as heapsize,\n"
    4407             :                                         " sum(hashes) as hashsize,\n"
    4408             :                                         " sum(\"imprints\") as imprintsize,\n"
    4409             :                                         " sum(orderidx) as orderidxsize\n"
    4410             :                                         " from sys.\"storage\"\n"
    4411             :                                         "group by \"schema\", \"table\"\n"
    4412             :                                         "order by \"schema\", \"table\";\n"
    4413             :                                         "create view sys.\"schemastorage\" as\n"
    4414             :                                         "select \"schema\",\n"
    4415             :                                         " count(*) as \"storages\",\n"
    4416             :                                         " sum(columnsize) as columnsize,\n"
    4417             :                                         " sum(heapsize) as heapsize,\n"
    4418             :                                         " sum(hashes) as hashsize,\n"
    4419             :                                         " sum(\"imprints\") as imprintsize,\n"
    4420             :                                         " sum(orderidx) as orderidxsize\n"
    4421             :                                         " from sys.\"storage\"\n"
    4422             :                                         "group by \"schema\"\n"
    4423             :                                         "order by \"schema\";\n"
    4424             :                                         "create procedure sys.storagemodelinit()\n"
    4425             :                                         "begin\n"
    4426             :                                         " delete from sys.storagemodelinput;\n"
    4427             :                                         " insert into sys.storagemodelinput\n"
    4428             :                                         " select \"schema\", \"table\", \"column\", \"type\", typewidth, \"count\",\n"
    4429             :                                         " case when (\"unique\" or \"type\" in ('varchar', 'char', 'clob', 'json', 'url', 'blob', 'geometry', 'geometrya'))\n"
    4430             :                                         " then \"count\" else 0 end,\n"
    4431             :                                         " case when \"count\" > 0 and heapsize >= 8192 and \"type\" in ('varchar', 'char', 'clob', 'json', 'url')\n"
    4432             :                                         " then cast((heapsize - 8192) / \"count\" as bigint)\n"
    4433             :                                         " when \"count\" > 0 and heapsize >= 32 and \"type\" in ('blob', 'geometry', 'geometrya')\n"
    4434             :                                         " then cast((heapsize - 32) / \"count\" as bigint)\n"
    4435             :                                         " else typewidth end,\n"
    4436             :                                         " false, case sorted when true then true else false end, \"unique\", true\n"
    4437             :                                         " from sys.\"storage\";\n"
    4438             :                                         " update sys.storagemodelinput\n"
    4439             :                                         " set reference = true\n"
    4440             :                                         " where (\"schema\", \"table\", \"column\") in (\n"
    4441             :                                         " select fkschema.\"name\", fktable.\"name\", fkkeycol.\"name\"\n"
    4442             :                                         " from sys.\"keys\" as fkkey,\n"
    4443             :                                         " sys.\"objects\" as fkkeycol,\n"
    4444             :                                         " sys.\"tables\" as fktable,\n"
    4445             :                                         " sys.\"schemas\" as fkschema\n"
    4446             :                                         " where fktable.\"id\" = fkkey.\"table_id\"\n"
    4447             :                                         " and fkkey.\"id\" = fkkeycol.\"id\"\n"
    4448             :                                         " and fkschema.\"id\" = fktable.\"schema_id\"\n"
    4449             :                                         " and fkkey.\"rkey\" > -1 );\n"
    4450             :                                         " update sys.storagemodelinput\n"
    4451             :                                         " set isacolumn = false\n"
    4452             :                                         " where (\"schema\", \"table\", \"column\") not in (\n"
    4453             :                                         " select sch.\"name\", tbl.\"name\", col.\"name\"\n"
    4454             :                                         " from sys.\"schemas\" as sch,\n"
    4455             :                                         " sys.\"tables\" as tbl,\n"
    4456             :                                         " sys.\"columns\" as col\n"
    4457             :                                         " where sch.\"id\" = tbl.\"schema_id\"\n"
    4458             :                                         " and tbl.\"id\" = col.\"table_id\");\n"
    4459             :                                         "end;\n"
    4460             :                                         "create function logging.compinfo()\n"
    4461             :                                         "returns table(\n"
    4462             :                                         " \"id\" int,\n"
    4463             :                                         " \"component\" string,\n"
    4464             :                                         " \"log_level\" string\n"
    4465             :                                         ")\n"
    4466             :                                         "external name logging.compinfo;\n"
    4467             :                                         "grant execute on function logging.compinfo to public;\n"
    4468             :                                         "create view logging.compinfo as select * from logging.compinfo();\n"
    4469             :                                         "grant select on logging.compinfo to public;\n"
    4470             :                                         "update sys._tables set system = true where system <> true and schema_id = 2000 and name in ('schemastorage', 'tablestorage', 'storage', 'rejects', 'queue', 'optimizers', 'prepared_statements_args', 'prepared_statements', 'sessions', 'querylog_history', 'querylog_calls', 'querylog_catalog');\n"
    4471             :                                         "update sys._tables set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'logging') and name = 'compinfo';\n"
    4472             :                                         "update sys.functions set system = true where system <> true and schema_id = 2000 and name in ('storagemodelinit', 'storage', 'rejects', 'user_statistics', 'queue', 'debugflags', 'bbp', 'optimizers', 'querycache', 'optimizer_stats', 'current_sessionid', 'prepared_statements_args', 'prepared_statements', 'sessions', 'querylog_calls', 'querylog_catalog');\n"
    4473             :                                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'logging') and name = 'compinfo';\n"
    4474             :                                         "update sys.functions set system = true where system <> true and schema_id = (select id from sys.schemas where name = 'profiler') and name = 'getlimit';\n"
    4475             :                 );
    4476             : 
    4477             :         /* 99_system.sql */
    4478           0 :         t = mvc_bind_table(sql, s, "systemfunctions");
    4479           0 :         t->system = 0;
    4480           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4481             :                         "drop view sys.systemfunctions cascade;\n");
    4482             : 
    4483             :         /* 80_statistics.sql */
    4484           0 :         t = mvc_bind_table(sql, s, "statistics");
    4485           0 :         t->system = 0;
    4486           0 :         pos += snprintf(buf + pos, bufsize - pos,
    4487             :                                 "drop table sys.statistics cascade;\n"
    4488             :                                 "drop procedure sys.analyze(int,bigint) cascade;\n"
    4489             :                                 "drop procedure sys.analyze(int,bigint,string) cascade;\n"
    4490             :                                 "drop procedure sys.analyze(int,bigint,string,string) cascade;\n"
    4491             :                                 "drop procedure sys.analyze(int,bigint,string,string,string) cascade;\n"
    4492             :                                 "create procedure sys.\"analyze\"()\n"
    4493             :                                 "external name sql.\"analyze\";\n"
    4494             :                                 "grant execute on procedure sys.\"analyze\"() to public;\n"
    4495             :                                 "create procedure sys.\"analyze\"(\"sname\" varchar(1024))\n"
    4496             :                                 "external name sql.\"analyze\";\n"
    4497             :                                 "grant execute on procedure sys.\"analyze\"(varchar(1024)) to public;\n"
    4498             :                                 "create procedure sys.\"analyze\"(\"sname\" varchar(1024), \"tname\" varchar(1024))\n"
    4499             :                                 "external name sql.\"analyze\";\n"
    4500             :                                 "grant execute on procedure sys.\"analyze\"(varchar(1024),varchar(1024)) to public;\n"
    4501             :                                 "create procedure sys.\"analyze\"(\"sname\" varchar(1024), \"tname\" varchar(1024), \"cname\" varchar(1024))\n"
    4502             :                                 "external name sql.\"analyze\";\n"
    4503             :                                 "grant execute on procedure sys.\"analyze\"(varchar(1024),varchar(1024),varchar(1024)) to public;\n"
    4504             :                                 "create function sys.\"statistics\"()\n"
    4505             :                                 "returns table (\n"
    4506             :                                 "  \"column_id\" integer,\n"
    4507             :                                 "  \"schema\" varchar(1024),\n"
    4508             :                                 "  \"table\" varchar(1024),\n"
    4509             :                                 "  \"column\" varchar(1024),\n"
    4510             :                                 "  \"type\" varchar(1024),\n"
    4511             :                                 "  \"width\" integer,\n"
    4512             :                                 "  \"count\" bigint,\n"
    4513             :                                 "  \"unique\" boolean,\n"
    4514             :                                 "  \"nils\" boolean,\n"
    4515             :                                 "  \"minval\" string,\n"
    4516             :                                 "  \"maxval\" string,\n"
    4517             :                                 "  \"sorted\" boolean,\n"
    4518             :                                 "  \"revsorted\" boolean\n"
    4519             :                                 ")\n"
    4520             :                                 "external name sql.\"statistics\";\n"
    4521             :                                 "grant execute on function sys.\"statistics\"() to public;\n"
    4522             :                                 "create view sys.\"statistics\" as\n"
    4523             :                                 "select * from sys.\"statistics\"()\n"
    4524             :                                 "-- exclude system tables\n"
    4525             :                                 "where (\"schema\", \"table\") in (\n"
    4526             :                                 "  SELECT sch.\"name\", tbl.\"name\"\n"
    4527             :                                 "  FROM sys.\"tables\" AS tbl JOIN sys.\"schemas\" AS sch ON tbl.schema_id = sch.id\n"
    4528             :                                 "  WHERE tbl.\"system\" = FALSE)\n"
    4529             :                                 "order by \"schema\", \"table\", \"column\";\n"
    4530             :                                 "grant select on sys.\"statistics\" to public;\n"
    4531             :                                 "create function sys.\"statistics\"(\"sname\" varchar(1024))\n"
    4532             :                                 "returns table (\n"
    4533             :                                 "  \"column_id\" integer,\n"
    4534             :                                 "  \"schema\" varchar(1024),\n"
    4535             :                                 "  \"table\" varchar(1024),\n"
    4536             :                                 "  \"column\" varchar(1024),\n"
    4537             :                                 "  \"type\" varchar(1024),\n"
    4538             :                                 "  \"width\" integer,\n"
    4539             :                                 "  \"count\" bigint,\n"
    4540             :                                 "  \"unique\" boolean,\n"
    4541             :                                 "  \"nils\" boolean,\n"
    4542             :                                 "  \"minval\" string,\n"
    4543             :                                 "  \"maxval\" string,\n"
    4544             :                                 "  \"sorted\" boolean,\n"
    4545             :                                 "  \"revsorted\" boolean\n"
    4546             :                                 ")\n"
    4547             :                                 "external name sql.\"statistics\";\n"
    4548             :                                 "grant execute on function sys.\"statistics\"(varchar(1024)) to public;\n"
    4549             :                                 "create function sys.\"statistics\"(\"sname\" varchar(1024), \"tname\" varchar(1024))\n"
    4550             :                                 "returns table (\n"
    4551             :                                 "  \"column_id\" integer,\n"
    4552             :                                 "  \"schema\" varchar(1024),\n"
    4553             :                                 "  \"table\" varchar(1024),\n"
    4554             :                                 "  \"column\" varchar(1024),\n"
    4555             :                                 "  \"type\" varchar(1024),\n"
    4556             :                                 "  \"width\" integer,\n"
    4557             :                                 "  \"count\" bigint,\n"
    4558             :                                 "  \"unique\" boolean,\n"
    4559             :                                 "  \"nils\" boolean,\n"
    4560             :                                 "  \"minval\" string,\n"
    4561             :                                 "  \"maxval\" string,\n"
    4562             :                                 "  \"sorted\" boolean,\n"
    4563             :                                 "  \"revsorted\" boolean\n"
    4564             :                                 ")\n"
    4565             :                                 "external name sql.\"statistics\";\n"
    4566             :                                 "grant execute on function sys.\"statistics\"(varchar(1024),varchar(1024)) to public;\n"
    4567             :                                 "create function sys.\"statistics\"(\"sname\" varchar(1024), \"tname\" varchar(1024), \"cname\" varchar(1024))\n"
    4568             :                                 "returns table (\n"
    4569             :                                 "  \"column_id\" integer,\n"
    4570             :                                 "  \"schema\" varchar(1024),\n"
    4571             :                                 "  \"table\" varchar(1024),\n"
    4572             :                                 "  \"column\" varchar(1024),\n"
    4573             :                                 "  \"type\" varchar(1024),\n"
    4574             :                                 "  \"width\" integer,\n"
    4575             :                                 "  \"count\" bigint,\n"
    4576             :                                 "  \"unique\" boolean,\n"
    4577             :                                 "  \"nils\" boolean,\n"
    4578             :                                 "  \"minval\" string,\n"
    4579             :                                 "  \"maxval\" string,\n"
    4580             :                                 "  \"sorted\" boolean,\n"
    4581             :                                 "  \"revsorted\" boolean\n"
    4582             :                                 ")\n"
    4583             :                                 "external name sql.\"statistics\";\n"
    4584             :                                 "grant execute on function sys.\"statistics\"(varchar(1024),varchar(1024),varchar(1024)) to public;\n"
    4585             :                                 "update sys._tables set system = true where system <> true and schema_id = 2000 and name = 'statistics';\n"
    4586             :                                 "update sys.functions set system = true where system <> true and schema_id = 2000 and name in ('analyze','statistics');\n");
    4587             : 
    4588           0 :         assert(pos < bufsize);
    4589           0 :         printf("Running database upgrade commands:\n%s\n", buf);
    4590           0 :         fflush(stdout);
    4591           0 :         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    4592             : 
    4593           0 :         GDKfree(buf);
    4594           0 :         return err;             /* usually MAL_SUCCEED */
    4595             : }
    4596             : 
    4597             : static str
    4598         101 : sql_update_sep2022(Client c, mvc *sql, sql_schema *s)
    4599             : {
    4600         101 :         size_t bufsize = 65536, pos = 0;
    4601         101 :         char *err = NULL, *buf = GDKmalloc(bufsize);
    4602         101 :         res_table *output;
    4603         101 :         BAT *b;
    4604             : 
    4605         101 :         if (buf == NULL)
    4606           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    4607             : 
    4608             :         /* if sys.db_user_info does not have a column password, we need to
    4609             :          * add a bunch of columns */
    4610         101 :         sql_table *db_user_info = find_sql_table(sql->session->tr, s, "db_user_info");
    4611         101 :         if (find_sql_column(db_user_info, "password") == NULL) {
    4612           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    4613             :                                                 "alter table sys.db_user_info add column max_memory bigint;\n"
    4614             :                                                 "alter table sys.db_user_info add column max_workers int;\n"
    4615             :                                                 "alter table sys.db_user_info add column optimizer varchar(1024);\n"
    4616             :                                                 "alter table sys.db_user_info add column default_role int;\n"
    4617             :                                                 "alter table sys.db_user_info add column password varchar(256);\n");
    4618           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    4619             :                                                 "update sys.db_user_info u set max_memory = 0, max_workers = 0, optimizer = 'default_pipe', default_role = (select id from sys.auths a where a.name = u.name);\n");
    4620           0 :                 int endprint = (int) pos;
    4621           0 :                 bat bid;
    4622           0 :                 BAT *u = NULL, *p = NULL, *d = NULL;
    4623           0 :                 if ((bid = BBPindex("M5system_auth_user")) == 0 ||
    4624           0 :                         (u = BATdescriptor(bid)) == NULL ||
    4625           0 :                         (bid = BBPindex("M5system_auth_passwd_v2")) == 0 ||
    4626           0 :                         (p = BATdescriptor(bid)) == NULL ||
    4627           0 :                         (bid = BBPindex("M5system_auth_deleted")) == 0 ||
    4628           0 :                         (d = BATdescriptor(bid)) == NULL) {
    4629           0 :                         BBPreclaim(u);
    4630           0 :                         BBPreclaim(p);
    4631           0 :                         BBPreclaim(d);
    4632           0 :                         throw(SQL, __func__, INTERNAL_BAT_ACCESS);
    4633             :                 }
    4634           0 :                 BATiter ui = bat_iterator(u);
    4635           0 :                 BATiter pi = bat_iterator(p);
    4636           0 :                 for (oid i = 0; i < ui.count; i++) {
    4637           0 :                         if (BUNfnd(d, &i) == BUN_NONE) {
    4638           0 :                                 const char *user = BUNtvar(ui, i);
    4639           0 :                                 const char *pass = BUNtvar(pi, i);
    4640           0 :                                 if (pos + 4 * (strlen(user) + strlen(pass)) + 64 >= bufsize) {
    4641           0 :                                         char *nbuf = GDKrealloc(buf, bufsize + 65536);
    4642           0 :                                         if (nbuf == NULL) {
    4643           0 :                                                 err = createException(SQL, __func__, MAL_MALLOC_FAIL);
    4644           0 :                                                 break;
    4645             :                                         }
    4646             :                                         buf = nbuf;
    4647             :                                         bufsize += 65536;
    4648             :                                 }
    4649           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    4650             :                                                                 "update sys.db_user_info set password = e'");
    4651           0 :                                 for (const char *p = pass; *p; p++) {
    4652           0 :                                         if (*p < '\040' || *p >= '\177') {
    4653             :                                                 /* control character or high bit set */
    4654           0 :                                                 pos += snprintf(buf + pos, bufsize - pos,
    4655             :                                                                                 "\\%03o", (unsigned char) *p);
    4656             :                                         } else {
    4657           0 :                                                 if (*p == '\\' || *p == '\'')
    4658           0 :                                                         buf[pos++] = *p;
    4659           0 :                                                 buf[pos++] = *p;
    4660             :                                         }
    4661             :                                 }
    4662           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    4663             :                                                                 "' where name = e'");
    4664           0 :                                 for (const char *p = user; *p; p++) {
    4665           0 :                                         if (*p < '\040' || *p >= '\177') {
    4666             :                                                 /* control character or high bit set */
    4667           0 :                                                 pos += snprintf(buf + pos, bufsize - pos,
    4668             :                                                                                 "\\%03o", (unsigned char) *p);
    4669             :                                         } else {
    4670           0 :                                                 if (*p == '\\' || *p == '\'')
    4671           0 :                                                         buf[pos++] = *p;
    4672           0 :                                                 buf[pos++] = *p;
    4673             :                                         }
    4674             :                                 }
    4675           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    4676             :                                                                 "';\n");
    4677             :                         }
    4678             :                 }
    4679           0 :                 if (err == MAL_SUCCEED) {
    4680           0 :                         assert(pos < bufsize);
    4681           0 :                         printf("Running database upgrade commands:\n%.*s-- and copying passwords\n\n", endprint, buf);
    4682           0 :                         fflush(stdout);
    4683           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    4684             :                 }
    4685           0 :                 bat_iterator_end(&ui);
    4686           0 :                 bat_iterator_end(&pi);
    4687           0 :                 bat authbats[4];
    4688           0 :                 authbats[0] = 0;
    4689           0 :                 authbats[1] = u->batCacheid;
    4690           0 :                 authbats[2] = p->batCacheid;
    4691           0 :                 authbats[3] = d->batCacheid;
    4692           0 :                 if (err == MAL_SUCCEED &&
    4693           0 :                         (BATmode(u, true) != GDK_SUCCEED ||
    4694           0 :                          BATmode(p, true) != GDK_SUCCEED ||
    4695           0 :                          BATmode(d, true) != GDK_SUCCEED ||
    4696           0 :                          BBPrename(u, NULL) != 0 ||
    4697           0 :                          BBPrename(p, NULL) != 0 ||
    4698           0 :                          BBPrename(d, NULL) != 0 ||
    4699           0 :                          TMsubcommit_list(authbats, NULL, 4, -1) != GDK_SUCCEED)) {
    4700           0 :                                 fprintf(stderr, "Committing removal of old user/password BATs failed\n");
    4701             :                 }
    4702           0 :                 BBPunfix(u->batCacheid);
    4703           0 :                 BBPunfix(p->batCacheid);
    4704           0 :                 BBPunfix(d->batCacheid);
    4705             : 
    4706           0 :                 if (err == MAL_SUCCEED) {
    4707           0 :                         sql_schema *s = mvc_bind_schema(sql, "sys");
    4708           0 :                         sql_table *t = mvc_bind_table(sql, s, "roles");
    4709           0 :                         t->system = 0;
    4710           0 :                         t = mvc_bind_table(sql, s, "users");
    4711           0 :                         t->system = 0;
    4712           0 :                         t = mvc_bind_table(sql, s, "dependency_schemas_on_users");
    4713           0 :                         t->system = 0;
    4714           0 :                         pos = 0;
    4715           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    4716             :                                                         "drop view sys.dependency_schemas_on_users cascade;\n"
    4717             :                                                         "drop view sys.roles cascade;\n"
    4718             :                                                         "drop view sys.users cascade;\n"
    4719             :                                                         "drop function sys.db_users() cascade;\n"
    4720             :                                                         "CREATE VIEW sys.roles AS SELECT id, name, grantor FROM sys.auths a WHERE a.name NOT IN (SELECT u.name FROM sys.db_user_info u);\n"
    4721             :                                                         "GRANT SELECT ON sys.roles TO PUBLIC;\n"
    4722             :                                                         "CREATE VIEW sys.users AS SELECT name, fullname, default_schema, schema_path, max_memory, max_workers, optimizer, default_role FROM sys.db_user_info;\n"
    4723             :                                                         "GRANT SELECT ON sys.users TO PUBLIC;\n"
    4724             :                                                         "CREATE FUNCTION sys.db_users() RETURNS TABLE(name varchar(2048)) RETURN SELECT name FROM sys.db_user_info;\n"
    4725             :                                                         "CREATE VIEW sys.dependency_schemas_on_users AS\n"
    4726             :                                                         "SELECT s.id AS schema_id, s.name AS schema_name, u.name AS user_name, CAST(6 AS smallint) AS depend_type\n"
    4727             :                                                         " FROM sys.db_user_info AS u, sys.schemas AS s\n"
    4728             :                                                         " WHERE u.default_schema = s.id\n"
    4729             :                                                         " ORDER BY s.name, u.name;\n"
    4730             :                                                         "GRANT SELECT ON sys.dependency_schemas_on_users TO PUBLIC;\n"
    4731             :                                                         "update sys._tables set system = true where name in ('users', 'roles', 'dependency_schemas_on_users') AND schema_id = 2000;\n"
    4732             :                                                         "update sys.functions set system = true where system <> true and name in ('db_users') and schema_id = 2000 and type = %d;\n", F_UNION);
    4733           0 :                         assert(pos < bufsize);
    4734           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    4735           0 :                         fflush(stdout);
    4736           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    4737             :                 }
    4738             :         }
    4739         101 :         if (err != MAL_SUCCEED) {
    4740           0 :                 GDKfree(buf);
    4741           0 :                 return err;
    4742             :         }
    4743             : 
    4744             :         /* if 'describe_partition_tables' system view doesn't use 'vals'
    4745             :          * CTE, re-create it; while we're at it, also update the sequence
    4746             :          * dumping code */
    4747         101 :         pos = snprintf(buf, bufsize,
    4748             :                         "select 1 from sys.tables where schema_id = (select \"id\" from sys.schemas where \"name\" = 'sys') and \"name\" = 'describe_partition_tables' and \"query\" not like '%%vals%%';\n");
    4749         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output))) {
    4750           0 :                 GDKfree(buf);
    4751           0 :                 return err;
    4752             :         }
    4753             : 
    4754         101 :         if ((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) > 0) {
    4755             :                 /* 52_describe.sql; but we need to drop dependencies from 76_dump.sql first */
    4756           0 :                 sql_schema *s = mvc_bind_schema(sql, "sys");
    4757           0 :                 sql_table *t = mvc_bind_table(sql, s, "describe_partition_tables");
    4758           0 :                 t->system = 0;
    4759           0 :                 t = mvc_bind_table(sql, s, "dump_partition_tables");
    4760           0 :                 t->system = 0;
    4761           0 :                 t = mvc_bind_table(sql, s, "dump_sequences");
    4762           0 :                 t->system = 0;
    4763           0 :                 t = mvc_bind_table(sql, s, "dump_start_sequences");
    4764           0 :                 t->system = 0;
    4765           0 :                 t = mvc_bind_table(sql, s, "describe_tables");
    4766           0 :                 t->system = 0;
    4767           0 :                 t = mvc_bind_table(sql, s, "dump_tables");
    4768           0 :                 t->system = 0;
    4769           0 :                 t = mvc_bind_table(sql, s, "dump_create_users");
    4770           0 :                 t->system = 0;
    4771           0 :                 t = mvc_bind_table(sql, s, "dump_functions");
    4772           0 :                 t->system = 0;
    4773           0 :                 t = mvc_bind_table(sql, s, "dump_triggers");
    4774           0 :                 t->system = 0;
    4775             : 
    4776           0 :                 pos = 0;
    4777           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    4778             :                         /* drop dependent stuff from 76_dump.sql */
    4779             :                         "drop function sys.dump_database(boolean) cascade;\n"
    4780             :                         "drop procedure sys.dump_table_data() cascade;\n"
    4781             :                         "drop procedure sys.dump_table_data(string, string) cascade;\n"
    4782             :                         "drop view sys.dump_partition_tables cascade;\n"
    4783             :                         "drop view sys.describe_partition_tables cascade;\n"
    4784             :                         "drop view sys.dump_sequences cascade;\n"
    4785             :                         "drop view sys.dump_start_sequences cascade;\n"
    4786             :                         "drop view sys.dump_tables cascade;\n"
    4787             :                         "drop view sys.describe_tables cascade;\n"
    4788             :                         "drop view sys.dump_create_users cascade;\n"
    4789             :                         "drop view sys.dump_functions cascade;\n"
    4790             :                         "drop view sys.dump_triggers cascade;\n"
    4791             :                         "drop function sys.schema_guard cascade;\n"
    4792             :                         "drop function sys.replace_first(string, string, string, string) cascade;\n");
    4793             : 
    4794           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    4795             :                         "CREATE FUNCTION sys.schema_guard(sch STRING, nme STRING, stmt STRING) RETURNS STRING BEGIN\n"
    4796             :                         "RETURN\n"
    4797             :                         " SELECT 'SET SCHEMA ' || sys.dq(sch) || '; ' || stmt;\n"
    4798             :                         "END;\n"
    4799             :                         "CREATE VIEW sys.dump_functions AS\n"
    4800             :                         " SELECT f.o o, sys.schema_guard(f.sch, f.fun, f.def) stmt,\n"
    4801             :                         " f.sch schema_name,\n"
    4802             :                         " f.fun function_name\n"
    4803             :                         " FROM sys.describe_functions f;\n"
    4804             :                         "CREATE VIEW sys.dump_triggers AS\n"
    4805             :                         " SELECT sys.schema_guard(sch, tab, def) stmt,\n"
    4806             :                         " sch schema_name,\n"
    4807             :                         " tab table_name,\n"
    4808             :                         " tri trigger_name\n"
    4809             :                         " FROM sys.describe_triggers;\n"
    4810             :                         "CREATE VIEW sys.describe_partition_tables AS\n"
    4811             :                         " SELECT\n"
    4812             :                         " m_sch,\n"
    4813             :                         " m_tbl,\n"
    4814             :                         " p_sch,\n"
    4815             :                         " p_tbl,\n"
    4816             :                         " CASE\n"
    4817             :                         " WHEN p_raw_type IS NULL THEN 'READ ONLY'\n"
    4818             :                         " WHEN (p_raw_type = 'VALUES' AND pvalues IS NULL) OR (p_raw_type = 'RANGE' AND minimum IS NULL AND maximum IS NULL AND with_nulls) THEN 'FOR NULLS'\n"
    4819             :                         " ELSE p_raw_type\n"
    4820             :                         " END AS tpe,\n"
    4821             :                         " pvalues,\n"
    4822             :                         " minimum,\n"
    4823             :                         " maximum,\n"
    4824             :                         " with_nulls\n"
    4825             :                         " FROM\n"
    4826             :                         " (WITH\n"
    4827             :                         " tp(\"type\", table_id) AS\n"
    4828             :                         " (SELECT ifthenelse((table_partitions.\"type\" & 2) = 2, 'VALUES', 'RANGE'), table_partitions.table_id FROM sys.table_partitions),\n"
    4829             :                         " subq(m_tid, p_mid, \"type\", m_sch, m_tbl, p_sch, p_tbl) AS\n"
    4830             :                         " (SELECT m_t.id, p_m.id, m_t.\"type\", m_s.name, m_t.name, p_s.name, p_m.name\n"
    4831             :                         " FROM sys.schemas m_s, sys._tables m_t, sys.dependencies d, sys.schemas p_s, sys._tables p_m\n"
    4832             :                         " WHERE m_t.\"type\" IN (3, 6)\n"
    4833             :                         " AND m_t.schema_id = m_s.id\n"
    4834             :                         " AND m_s.name <> 'tmp'\n"
    4835             :                         " AND m_t.system = FALSE\n"
    4836             :                         " AND m_t.id = d.depend_id\n"
    4837             :                         " AND d.id = p_m.id\n"
    4838             :                         " AND p_m.schema_id = p_s.id\n"
    4839             :                         " ORDER BY m_t.id, p_m.id),\n"
    4840             :                         " vals(id,vals) as\n"
    4841             :                         " (SELECT vp.table_id, GROUP_CONCAT(vp.value, ',') FROM sys.value_partitions vp GROUP BY vp.table_id)\n"
    4842             :                         " SELECT\n"
    4843             :                         " subq.m_sch,\n"
    4844             :                         " subq.m_tbl,\n"
    4845             :                         " subq.p_sch,\n"
    4846             :                         " subq.p_tbl,\n"
    4847             :                         " tp.\"type\" AS p_raw_type,\n"
    4848             :                         " CASE WHEN tp.\"type\" = 'VALUES'\n"
    4849             :                         " THEN (SELECT vals.vals FROM vals WHERE vals.id = subq.p_mid)\n"
    4850             :                         " ELSE NULL\n"
    4851             :                         " END AS pvalues,\n"
    4852             :                         " CASE WHEN tp.\"type\" = 'RANGE'\n"
    4853             :                         " THEN (SELECT minimum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    4854             :                         " ELSE NULL\n"
    4855             :                         " END AS minimum,\n"
    4856             :                         " CASE WHEN tp.\"type\" = 'RANGE'\n"
    4857             :                         " THEN (SELECT maximum FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    4858             :                         " ELSE NULL\n"
    4859             :                         " END AS maximum,\n"
    4860             :                         " CASE WHEN tp.\"type\" = 'VALUES'\n"
    4861             :                         " THEN EXISTS(SELECT vp.value FROM sys.value_partitions vp WHERE vp.table_id = subq.p_mid AND vp.value IS NULL)\n"
    4862             :                         " ELSE (SELECT rp.with_nulls FROM sys.range_partitions rp WHERE rp.table_id = subq.p_mid)\n"
    4863             :                         " END AS with_nulls\n"
    4864             :                         " FROM\n"
    4865             :                         " subq LEFT OUTER JOIN tp\n"
    4866             :                         " ON subq.m_tid = tp.table_id) AS tmp_pi;\n"
    4867             :                         "GRANT SELECT ON sys.describe_partition_tables TO PUBLIC;\n"
    4868             :                         "CREATE VIEW sys.dump_partition_tables AS\n"
    4869             :                         "SELECT\n"
    4870             :                         " 'ALTER TABLE ' || sys.FQN(m_sch, m_tbl) || ' ADD TABLE ' || sys.FQN(p_sch, p_tbl) ||\n"
    4871             :                         " CASE\n"
    4872             :                         " WHEN tpe = 'VALUES' THEN ' AS PARTITION IN (' || pvalues || ')'\n"
    4873             :                         " WHEN tpe = 'RANGE' THEN ' AS PARTITION FROM ' || ifthenelse(minimum IS NOT NULL, sys.SQ(minimum), 'RANGE MINVALUE') || ' TO ' || ifthenelse(maximum IS NOT NULL, sys.SQ(maximum), 'RANGE MAXVALUE')\n"
    4874             :                         " WHEN tpe = 'FOR NULLS' THEN ' AS PARTITION FOR NULL VALUES'\n"
    4875             :                         " ELSE '' --'READ ONLY'\n"
    4876             :                         " END ||\n"
    4877             :                         " CASE WHEN tpe in ('VALUES', 'RANGE') AND with_nulls THEN ' WITH NULL VALUES' ELSE '' END ||\n"
    4878             :                         " ';' stmt,\n"
    4879             :                         " m_sch merge_schema_name,\n"
    4880             :                         " m_tbl merge_table_name,\n"
    4881             :                         " p_sch partition_schema_name,\n"
    4882             :                         " p_tbl partition_table_name\n"
    4883             :                         " FROM sys.describe_partition_tables;\n"
    4884             :                         "CREATE VIEW sys.dump_sequences AS\n"
    4885             :                         " SELECT\n"
    4886             :                         " 'CREATE SEQUENCE ' || sys.FQN(sch, seq) || ' AS BIGINT;' stmt,\n"
    4887             :                         " sch schema_name,\n"
    4888             :                         " seq seqname\n"
    4889             :                         " FROM sys.describe_sequences;\n"
    4890             :                         "CREATE VIEW sys.dump_start_sequences AS\n"
    4891             :                         " SELECT 'ALTER SEQUENCE ' || sys.FQN(sch, seq) ||\n"
    4892             :                         " CASE WHEN s = 0 THEN '' ELSE ' RESTART WITH ' || rs END ||\n"
    4893             :                         " CASE WHEN inc = 1 THEN '' ELSE ' INCREMENT BY ' || inc END ||\n"
    4894             :                         " CASE WHEN nomin THEN ' NO MINVALUE' WHEN rmi IS NULL THEN '' ELSE ' MINVALUE ' || rmi END ||\n"
    4895             :                         " CASE WHEN nomax THEN ' NO MAXVALUE' WHEN rma IS NULL THEN '' ELSE ' MAXVALUE ' || rma END ||\n"
    4896             :                         " CASE WHEN \"cache\" = 1 THEN '' ELSE ' CACHE ' || \"cache\" END ||\n"
    4897             :                         " CASE WHEN \"cycle\" THEN '' ELSE ' NO' END || ' CYCLE;' stmt,\n"
    4898             :                         " sch schema_name,\n"
    4899             :                         " seq sequence_name\n"
    4900             :                         " FROM sys.describe_sequences;\n"
    4901             :                         "CREATE PROCEDURE sys.dump_table_data(sch STRING, tbl STRING)\n"
    4902             :                         "BEGIN\n"
    4903             :                         " DECLARE tid INT;\n"
    4904             :                         " SET tid = (SELECT MIN(t.id) FROM sys.tables t, sys.schemas s WHERE t.name = tbl AND t.schema_id = s.id AND s.name = sch);\n"
    4905             :                         " IF tid IS NOT NULL THEN\n"
    4906             :                         " DECLARE k INT;\n"
    4907             :                         " DECLARE m INT;\n"
    4908             :                         " SET k = (SELECT MIN(c.id) FROM sys.columns c WHERE c.table_id = tid);\n"
    4909             :                         " SET m = (SELECT MAX(c.id) FROM sys.columns c WHERE c.table_id = tid);\n"
    4910             :                         " IF k IS NOT NULL AND m IS NOT NULL THEN\n"
    4911             :                         " DECLARE cname STRING;\n"
    4912             :                         " DECLARE ctype STRING;\n"
    4913             :                         " DECLARE _cnt INT;\n"
    4914             :                         " SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    4915             :                         " SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    4916             :                         " SET _cnt = (SELECT count FROM sys.storage(sch, tbl, cname));\n"
    4917             :                         " IF _cnt > 0 THEN\n"
    4918             :                         " DECLARE COPY_INTO_STMT STRING;\n"
    4919             :                         " DECLARE SELECT_DATA_STMT STRING;\n"
    4920             :                         " SET COPY_INTO_STMT = 'COPY ' || _cnt || ' RECORDS INTO ' || sys.FQN(sch, tbl) || '(' || sys.DQ(cname);\n"
    4921             :                         " SET SELECT_DATA_STMT = 'SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), ' || sys.prepare_esc(cname, ctype);\n"
    4922             :                         " WHILE (k < m) DO\n"
    4923             :                         " SET k = (SELECT MIN(c.id) FROM sys.columns c WHERE c.table_id = tid AND c.id > k);\n"
    4924             :                         " SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    4925             :                         " SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    4926             :                         " SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || sys.DQ(cname));\n"
    4927             :                         " SET SELECT_DATA_STMT = (SELECT_DATA_STMT || '|| ''|'' || ' || sys.prepare_esc(cname, ctype));\n"
    4928             :                         " END WHILE;\n"
    4929             :                         " SET COPY_INTO_STMT = (COPY_INTO_STMT || ') FROM STDIN USING DELIMITERS ''|'',E''\\\\n'',''\"'';');\n"
    4930             :                         " SET SELECT_DATA_STMT = (SELECT_DATA_STMT || ' FROM ' || sys.FQN(sch, tbl));\n"
    4931             :                         " INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, COPY_INTO_STMT);\n"
    4932             :                         " CALL sys.EVAL('INSERT INTO sys.dump_statements ' || SELECT_DATA_STMT || ';');\n"
    4933             :                         " END IF;\n"
    4934             :                         " END IF;\n"
    4935             :                         " END IF;\n"
    4936             :                         "END;\n"
    4937             :                         "CREATE PROCEDURE sys.dump_table_data()\n"
    4938             :                         "BEGIN\n"
    4939             :                         " DECLARE i INT;\n"
    4940             :                         " SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    4941             :                         " IF i IS NOT NULL THEN\n"
    4942             :                         " DECLARE M INT;\n"
    4943             :                         " SET M = (SELECT MAX(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    4944             :                         " DECLARE sch STRING;\n"
    4945             :                         " DECLARE tbl STRING;\n"
    4946             :                         " WHILE i IS NOT NULL AND i <= M DO\n"
    4947             :                         " SET sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4948             :                         " SET tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    4949             :                         " CALL sys.dump_table_data(sch, tbl);\n"
    4950             :                         " SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system AND t.id > i);\n"
    4951             :                         " END WHILE;\n"
    4952             :                         " END IF;\n"
    4953             :                         "END;\n"
    4954             :                         "CREATE VIEW sys.dump_create_users AS\n"
    4955             :                         " SELECT\n"
    4956             :                         " 'CREATE USER ' || sys.dq(ui.name) || ' WITH ENCRYPTED PASSWORD ' ||\n"
    4957             :                         " sys.sq(sys.password_hash(ui.name)) ||\n"
    4958             :                         " ' NAME ' || sys.sq(ui.fullname) || ' SCHEMA sys' || ifthenelse(ui.schema_path = '\"sys\"', '', ' SCHEMA PATH ' || sys.sq(ui.schema_path)) || ';' stmt,\n"
    4959             :                         " ui.name user_name\n"
    4960             :                         " FROM sys.db_user_info ui, sys.schemas s\n"
    4961             :                         " WHERE ui.default_schema = s.id\n"
    4962             :                         " AND ui.name <> 'monetdb'\n"
    4963             :                         " AND ui.name <> '.snapshot';\n");
    4964             : 
    4965           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    4966             :                         "CREATE VIEW sys.describe_tables AS\n"
    4967             :                         " SELECT\n"
    4968             :                         " t.id o,\n"
    4969             :                         " s.name sch,\n"
    4970             :                         " t.name tab,\n"
    4971             :                         " ts.table_type_name typ,\n"
    4972             :                         " (SELECT\n"
    4973             :                         " ' (' ||\n"
    4974             :                         " GROUP_CONCAT(\n"
    4975             :                         " sys.DQ(c.name) || ' ' ||\n"
    4976             :                         " sys.describe_type(c.type, c.type_digits, c.type_scale) ||\n"
    4977             :                         " ifthenelse(c.\"null\" = 'false', ' NOT NULL', '')\n"
    4978             :                         " , ', ') || ')'\n"
    4979             :                         " FROM sys._columns c\n"
    4980             :                         " WHERE c.table_id = t.id) col,\n"
    4981             :                         " CASE ts.table_type_name\n"
    4982             :                         " WHEN 'REMOTE TABLE' THEN\n"
    4983             :                         " sys.get_remote_table_expressions(s.name, t.name)\n"
    4984             :                         " WHEN 'MERGE TABLE' THEN\n"
    4985             :                         " sys.get_merge_table_partition_expressions(t.id)\n"
    4986             :                         " WHEN 'VIEW' THEN\n"
    4987             :                         " sys.schema_guard(s.name, t.name, t.query)\n"
    4988             :                         " ELSE\n"
    4989             :                         " ''\n"
    4990             :                         " END opt\n"
    4991             :                         " FROM sys.schemas s, sys.table_types ts, sys.tables t\n"
    4992             :                         " WHERE ts.table_type_name IN ('TABLE', 'VIEW', 'MERGE TABLE', 'REMOTE TABLE', 'REPLICA TABLE', 'UNLOGGED TABLE')\n"
    4993             :                         " AND t.system = FALSE\n"
    4994             :                         " AND s.id = t.schema_id\n"
    4995             :                         " AND ts.table_type_id = t.type\n"
    4996             :                         " AND s.name <> 'tmp';\n"
    4997             :                         "GRANT SELECT ON sys.describe_tables TO PUBLIC;\n"
    4998             :                         "CREATE VIEW sys.dump_tables AS\n"
    4999             :                         " SELECT\n"
    5000             :                         " t.o o,\n"
    5001             :                         " CASE\n"
    5002             :                         " WHEN t.typ <> 'VIEW' THEN\n"
    5003             :                         " 'CREATE ' || t.typ || ' ' || sys.FQN(t.sch, t.tab) || t.col || t.opt || ';'\n"
    5004             :                         " ELSE\n"
    5005             :                         " t.opt\n"
    5006             :                         " END stmt,\n"
    5007             :                         " t.sch schema_name,\n"
    5008             :                         " t.tab table_name\n"
    5009             :                         " FROM sys.describe_tables t;\n"
    5010             :                         "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    5011             :                         "BEGIN\n"
    5012             :                         " SET SCHEMA sys;\n"
    5013             :                         " TRUNCATE sys.dump_statements;\n"
    5014             :                         " INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    5015             :                         " INSERT INTO sys.dump_statements VALUES (2, 'SET SCHEMA \"sys\";');\n"
    5016             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    5017             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    5018             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    5019             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    5020             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    5021             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    5022             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    5023             :                         " --functions and table-likes can be interdependent. They should be inserted in the order of their catalogue id.\n"
    5024             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    5025             :                         " FROM (\n"
    5026             :                         " SELECT f.o, f.stmt FROM sys.dump_functions f\n"
    5027             :                         " UNION ALL\n"
    5028             :                         " SELECT t.o, t.stmt FROM sys.dump_tables t\n"
    5029             :                         " ) AS stmts(o, s);\n"
    5030             :                         " -- dump table data before adding constraints and fixing sequences\n"
    5031             :                         " IF NOT DESCRIBE THEN\n"
    5032             :                         " CALL sys.dump_table_data();\n"
    5033             :                         " END IF;\n"
    5034             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    5035             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    5036             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    5037             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    5038             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    5039             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    5040             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    5041             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    5042             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_grants;\n"
    5043             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_grants;\n"
    5044             :                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_function_grants;\n"
    5045             :                         " --TODO Improve performance of dump_table_data.\n"
    5046             :                         " --TODO loaders ,procedures, window and filter sys.functions.\n"
    5047             :                         " --TODO look into order dependent group_concat\n"
    5048             :                         " INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    5049             :                         " RETURN sys.dump_statements;\n"
    5050             :                         "END;\n");
    5051           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    5052             :                         "update sys._tables set system = true where name in ('describe_partition_tables', 'dump_partition_tables', 'dump_sequences', 'dump_start_sequences', 'describe_tables', 'dump_tables', 'dump_create_users', 'dump_functions', 'dump_triggers') AND schema_id = 2000;\n");
    5053           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    5054             :                         "update sys.functions set system = true where system <> true and name in ('dump_table_data') and schema_id = 2000 and type = %d;\n", F_PROC);
    5055           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    5056             :                         "update sys.functions set system = true where system <> true and name in ('dump_database') and schema_id = 2000 and type = %d;\n", F_UNION);
    5057           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    5058             :                         "update sys.functions set system = true where system <> true and name in ('schema_guard') and schema_id = 2000 and type = %d;\n", F_FUNC);
    5059             : 
    5060             :                 /* 12_url.sql */
    5061           0 :                 pos += snprintf(buf + pos, bufsize - pos,
    5062             :                                                 "CREATE function sys.url_extract_host(url string, no_www bool) RETURNS STRING\n"
    5063             :                                                 "EXTERNAL NAME url.\"extractURLHost\";\n"
    5064             :                                                 "GRANT EXECUTE ON FUNCTION url_extract_host(string, bool) TO PUBLIC;\n"
    5065             :                                                 "update sys.functions set system = true where system <> true and name = 'url_extract_host' and schema_id = 2000 and type = %d;\n", F_FUNC);
    5066             : 
    5067           0 :                 assert(pos < bufsize);
    5068           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5069           0 :                 fflush(stdout);
    5070           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5071             :         }
    5072         101 :         res_table_destroy(output);
    5073         101 :         output = NULL;
    5074         101 :         if (err != MAL_SUCCEED) {
    5075           0 :                 GDKfree(buf);
    5076           0 :                 return err;
    5077             :         }
    5078             : 
    5079             :         /* 10_sys_schema_extensions */
    5080             :         /* if the keyword LOCKED is in the list of keywords, upgrade */
    5081         101 :         pos = snprintf(buf, bufsize, "select keyword from sys.keywords where keyword = 'LOCKED';\n");
    5082         101 :         assert(pos < bufsize);
    5083         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)))
    5084           0 :                 goto bailout;
    5085         101 :         if ((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) > 0) {
    5086           0 :                 pos = snprintf(buf, bufsize,
    5087             :                         "ALTER TABLE sys.keywords SET READ WRITE;\n"
    5088             :                         "DELETE FROM sys.keywords WHERE keyword IN ('LOCKED');\n");
    5089           0 :                 assert(pos < bufsize);
    5090           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5091           0 :                 fflush(stdout);
    5092           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5093           0 :                 if (err == MAL_SUCCEED) {
    5094           0 :                         pos = snprintf(buf, bufsize, "ALTER TABLE sys.keywords SET READ ONLY;\n");
    5095           0 :                         assert(pos < bufsize);
    5096           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    5097           0 :                         fflush(stdout);
    5098           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5099             :                 }
    5100             :         }
    5101         101 :         res_table_destroy(output);
    5102         101 :         output = NULL;
    5103         101 :         if (err != MAL_SUCCEED) {
    5104           0 :                 GDKfree(buf);
    5105           0 :                 return err;
    5106             :         }
    5107             : 
    5108             :         /* if the table type UNLOGGED TABLE is not in the list of table
    5109             :          * types, upgrade */
    5110         101 :         pos = snprintf(buf, bufsize, "select table_type_name from sys.table_types where table_type_name = 'UNLOGGED TABLE';\n");
    5111         101 :         assert(pos < bufsize);
    5112         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)))
    5113           0 :                 goto bailout;
    5114         101 :         if ((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) == 0) {
    5115           0 :                 pos = snprintf(buf, bufsize,
    5116             :                                 "ALTER TABLE sys.table_types SET READ WRITE;\n"
    5117             :                                 "INSERT INTO sys.table_types VALUES (7, 'UNLOGGED TABLE');\n");
    5118           0 :                 assert(pos < bufsize);
    5119           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5120           0 :                 fflush(stdout);
    5121           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5122           0 :                 if (err == MAL_SUCCEED) {
    5123           0 :                         pos = snprintf(buf, bufsize, "ALTER TABLE sys.table_types SET READ ONLY;\n");
    5124           0 :                         assert(pos < bufsize);
    5125           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    5126           0 :                         fflush(stdout);
    5127           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5128             :                 }
    5129             :         }
    5130         101 :         res_table_destroy(output);
    5131         101 :         output = NULL;
    5132             : 
    5133             :         /* 16_tracelog */
    5134         101 :         pos = snprintf(buf, bufsize,
    5135             :                                    "select f.id "
    5136             :                                    "from sys.schemas s, "
    5137             :                                                 "sys.functions f, "
    5138             :                                                 "sys.auths a, "
    5139             :                                                 "sys.privileges p, "
    5140             :                                                 "sys.auths g, "
    5141             :                                                 "sys.function_types ft, "
    5142             :                                                 "sys.privilege_codes pc "
    5143             :                                    "where s.id = f.schema_id "
    5144             :                                          "and f.id = p.obj_id "
    5145             :                                          "and p.auth_id = a.id "
    5146             :                                          "and p.grantor = g.id "
    5147             :                                          "and p.privileges = pc.privilege_code_id "
    5148             :                                          "and f.type = ft.function_type_id "
    5149             :                                          "and s.name = 'sys' "
    5150             :                                          "and f.name = 'tracelog' "
    5151             :                                          "and ft.function_type_keyword = 'FUNCTION';\n");
    5152         101 :         assert(pos < bufsize);
    5153         101 :         if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)))
    5154           0 :                 goto bailout;
    5155         101 :         if ((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) == 0) {
    5156           0 :                 pos = snprintf(buf, bufsize,
    5157             :                                            "grant execute on function sys.tracelog to public;\n"
    5158             :                                            "grant select on sys.tracelog to public;\n");
    5159           0 :                 assert(pos < bufsize);
    5160           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5161           0 :                 fflush(stdout);
    5162           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5163             :         }
    5164         101 :         res_table_destroy(output);
    5165         101 :         output = NULL;
    5166         101 :         if (err != MAL_SUCCEED) {
    5167           0 :                 GDKfree(buf);
    5168           0 :                 return err;
    5169             :         }
    5170             : 
    5171         101 : bailout:
    5172         101 :         if (output)
    5173           0 :                 res_table_destroy(output);
    5174         101 :         GDKfree(buf);
    5175         101 :         return err;             /* usually MAL_SUCCEED */
    5176             : }
    5177             : 
    5178             : static str
    5179         101 : sql_update_jun2023(Client c, mvc *sql, sql_schema *s)
    5180             : {
    5181         101 :         size_t bufsize = 65536, pos = 0;
    5182         101 :         char *err = NULL, *buf = GDKmalloc(bufsize);
    5183         101 :         res_table *output;
    5184         101 :         BAT *b;
    5185         101 :         sql_subtype t1, t2;
    5186             : 
    5187         101 :         (void) sql;
    5188         101 :         if (buf == NULL)
    5189           0 :                 throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    5190             : 
    5191             :         /* wlc/wlr support was removed */
    5192             :         {
    5193         101 :                 sql_schema *wl = mvc_bind_schema(sql, "wlc");
    5194         101 :                 sql_schema *wr = mvc_bind_schema(sql, "wlr");
    5195         101 :                 if (wl != NULL || wr != NULL) {
    5196           0 :                         if (wl)
    5197           0 :                                 wl->system = 0;
    5198           0 :                         if (wr)
    5199           0 :                                 wr->system = 0;
    5200             : 
    5201           0 :                         const char *query =
    5202             :                                 "drop procedure if exists wlc.master() cascade;\n"
    5203             :                                 "drop procedure if exists wlc.master(string) cascade;\n"
    5204             :                                 "drop procedure if exists wlc.stop() cascade;\n"
    5205             :                                 "drop procedure if exists wlc.flush() cascade;\n"
    5206             :                                 "drop procedure if exists wlc.beat(int) cascade;\n"
    5207             :                                 "drop function if exists wlc.clock() cascade;\n"
    5208             :                                 "drop function if exists wlc.tick() cascade;\n"
    5209             :                                 "drop procedure if exists wlr.master(string) cascade;\n"
    5210             :                                 "drop procedure if exists wlr.stop() cascade;\n"
    5211             :                                 "drop procedure if exists wlr.accept() cascade;\n"
    5212             :                                 "drop procedure if exists wlr.replicate() cascade;\n"
    5213             :                                 "drop procedure if exists wlr.replicate(timestamp) cascade;\n"
    5214             :                                 "drop procedure if exists wlr.replicate(tinyint) cascade;\n"
    5215             :                                 "drop procedure if exists wlr.replicate(smallint) cascade;\n"
    5216             :                                 "drop procedure if exists wlr.replicate(integer) cascade;\n"
    5217             :                                 "drop procedure if exists wlr.replicate(bigint) cascade;\n"
    5218             :                                 "drop procedure if exists wlr.beat(integer) cascade;\n"
    5219             :                                 "drop function if exists wlr.clock() cascade;\n"
    5220             :                                 "drop function if exists wlr.tick() cascade;\n"
    5221             :                                 "drop schema if exists wlc cascade;\n"
    5222             :                                 "drop schema if exists wlr cascade;\n";
    5223           0 :                         printf("Running database upgrade commands:\n%s\n", query);
    5224           0 :                         fflush(stdout);
    5225           0 :                         err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5226             :                 }
    5227             :         }
    5228             : 
    5229             :         /* new function sys.regexp_replace */
    5230         101 :         allocator *old_sa = sql->sa;
    5231         101 :         if ((sql->sa = sa_create(sql->pa)) != NULL) {
    5232         101 :                 list *l;
    5233         101 :                 if ((l = sa_list(sql->sa)) != NULL) {
    5234         101 :                         sql_subtype tp;
    5235         101 :                         sql_find_subtype(&tp, "varchar", 0, 0);
    5236         101 :                         list_append(l, &tp);
    5237         101 :                         list_append(l, &tp);
    5238         101 :                         list_append(l, &tp);
    5239         101 :                         list_append(l, &tp);
    5240         101 :                         if (!sql_bind_func_(sql, s->base.name, "regexp_replace", l, F_FUNC, true, true)) {
    5241           0 :                                 pos = snprintf(buf, bufsize,
    5242             :                                                            "create function sys.regexp_replace(ori string, pat string, rep string, flg string)\n"
    5243             :                                                            "returns string external name pcre.replace;\n"
    5244             :                                                            "grant execute on function regexp_replace(string, string, string, string) to public;\n"
    5245             :                                                            "create function sys.regexp_replace(ori string, pat string, rep string)\n"
    5246             :                                                            "returns string\n"
    5247             :                                                            "begin\n"
    5248             :                                                            " return sys.regexp_replace(ori, pat, rep, '');\n"
    5249             :                                                            "end;\n"
    5250             :                                                            "grant execute on function regexp_replace(string, string, string) to public;\n"
    5251             :                                                            "update sys.functions set system = true where system <> true and name = 'regexp_replace' and schema_id = 2000 and type = %d;\n",
    5252             :                                                            F_FUNC);
    5253           0 :                                 assert(pos < bufsize);
    5254           0 :                                 sql->session->status = 0;
    5255           0 :                                 sql->errstr[0] = '\0';
    5256           0 :                                 printf("Running database upgrade commands:\n%s\n", buf);
    5257           0 :                                 fflush(stdout);
    5258           0 :                                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5259             :                         }
    5260         101 :                         sa_destroy(sql->sa);
    5261             :                 }
    5262             :         }
    5263         101 :         sql->sa = old_sa;
    5264             : 
    5265             :         /* fixes for handling single quotes in strings so that we can run
    5266             :          * with raw_strings after having created a database without (and
    5267             :          * v.v.) */
    5268         101 :         if ((err = SQLstatementIntern(c, "select id from sys.functions where name = 'dump_table_data' and schema_id = 2000 and func like '% R'')%';\n", "update", true, false, &output)) == NULL) {
    5269         101 :                 if (((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) == 0) || find_sql_table(sql->session->tr, s, "remote_user_info") == NULL) {
    5270           0 :                         sql_table *t;
    5271           0 :                         if ((t = mvc_bind_table(sql, s, "describe_tables")) != NULL)
    5272           0 :                                 t->system = 0;
    5273           0 :                         if ((t = mvc_bind_table(sql, s, "dump_create_users")) != NULL)
    5274           0 :                                 t->system = 0;
    5275           0 :                         if ((t = mvc_bind_table(sql, s, "dump_partition_tables")) != NULL)
    5276           0 :                                 t->system = 0;
    5277           0 :                         if ((t = mvc_bind_table(sql, s, "dump_comments")) != NULL)
    5278           0 :                                 t->system = 0;
    5279           0 :                         if ((t = mvc_bind_table(sql, s, "dump_tables")) != NULL)
    5280           0 :                                 t->system = 0;
    5281           0 :                         pos = 0;
    5282           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    5283             :                                                         "drop function if exists sys.dump_database(boolean) cascade;\n"
    5284             :                                                         "drop procedure if exists sys.dump_table_data() cascade;\n"
    5285             :                                                         "drop procedure if exists sys.dump_table_data(string, string) cascade;\n"
    5286             :                                                         "drop view if exists sys.dump_tables cascade;\n"
    5287             :                                                         "drop view if exists sys.dump_comments cascade;\n"
    5288             :                                                         "drop function if exists sys.prepare_esc(string, string) cascade;\n"
    5289             :                                                         "drop view if exists sys.dump_partition_tables cascade;\n"
    5290             :                                                         "drop view if exists sys.dump_create_users cascade;\n"
    5291             :                                                         "drop view if exists sys.describe_tables cascade;\n"
    5292             :                                                         "drop function if exists sys.get_remote_table_expressions(string, string) cascade;\n"
    5293             :                                                         "drop function if exists sys.remote_table_credentials(string) cascade;\n"
    5294             :                                                         "drop function if exists sys.sq(string) cascade;\n");
    5295           0 :                         if (find_sql_table(sql->session->tr, s, "remote_user_info") == NULL) {
    5296           0 :                                 pos += snprintf(buf + pos, bufsize - pos,
    5297             :                                                                 "create table sys.remote_user_info (table_id int, username varchar(1024), password varchar(256));\n"
    5298             :                                                                 "create function sys.decypher (cypher string) returns string external name sql.decypher;\n"
    5299             :                                                                 "update sys.functions set system = true where system <> true and name = 'decypher' and schema_id = 2000 and type = %d;\n"
    5300             :                                                                 "update sys._tables set system = true where system <> true and name = 'remote_user_info' and schema_id = 2000;\n",
    5301             :                                                                 F_FUNC);
    5302             :                         }
    5303           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    5304             :                                                         "CREATE FUNCTION sys.SQ (s STRING) RETURNS STRING BEGIN RETURN '''' || sys.replace(s,'''','''''') || ''''; END;\n"
    5305             :                                                         "CREATE FUNCTION sys.get_remote_table_expressions(s STRING, t STRING) RETURNS STRING BEGIN\n"
    5306             :                                                         " RETURN SELECT ' ON ' || sys.SQ(tt.query) || ' WITH USER ' || sys.SQ(username) || ' ENCRYPTED PASSWORD ' || sys.SQ(sys.decypher(\"password\")) FROM sys.remote_user_info r, sys._tables tt, sys.schemas ss where tt.name = t and ss.name = s and tt.schema_id = ss.id and r.table_id = tt.id;\n"
    5307             :                                                         "END;\n"
    5308             :                                                         "CREATE VIEW sys.describe_tables AS\n"
    5309             :                                                         " SELECT\n"
    5310             :                                                         " t.id o,\n"
    5311             :                                                         " s.name sch,\n"
    5312             :                                                         " t.name tab,\n"
    5313             :                                                         " ts.table_type_name typ,\n"
    5314             :                                                         " (SELECT\n"
    5315             :                                                         " ' (' ||\n"
    5316             :                                                         " GROUP_CONCAT(\n"
    5317             :                                                         " sys.DQ(c.name) || ' ' ||\n"
    5318             :                                                         " sys.describe_type(c.type, c.type_digits, c.type_scale) ||\n"
    5319             :                                                         " ifthenelse(c.\"null\" = 'false', ' NOT NULL', '')\n"
    5320             :                                                         " , ', ') || ')'\n"
    5321             :                                                         " FROM sys._columns c\n"
    5322             :                                                         " WHERE c.table_id = t.id) col,\n"
    5323             :                                                         " CASE ts.table_type_name\n"
    5324             :                                                         " WHEN 'REMOTE TABLE' THEN\n"
    5325             :                                                         " sys.get_remote_table_expressions(s.name, t.name)\n"
    5326             :                                                         " WHEN 'MERGE TABLE' THEN\n"
    5327             :                                                         " sys.get_merge_table_partition_expressions(t.id)\n"
    5328             :                                                         " WHEN 'VIEW' THEN\n"
    5329             :                                                         " sys.schema_guard(s.name, t.name, t.query)\n"
    5330             :                                                         " ELSE\n"
    5331             :                                                         " ''\n"
    5332             :                                                         " END opt\n"
    5333             :                                                         " FROM sys.schemas s, sys.table_types ts, sys.tables t\n"
    5334             :                                                         " WHERE ts.table_type_name IN ('TABLE', 'VIEW', 'MERGE TABLE', 'REMOTE TABLE', 'REPLICA TABLE', 'UNLOGGED TABLE')\n"
    5335             :                                                         " AND t.system = FALSE\n"
    5336             :                                                         " AND s.id = t.schema_id\n"
    5337             :                                                         " AND ts.table_type_id = t.type\n"
    5338             :                                                         " AND s.name <> 'tmp';\n"
    5339             :                                                         "CREATE VIEW sys.dump_create_users AS\n"
    5340             :                                                         " SELECT\n"
    5341             :                                                         " 'CREATE USER ' || sys.dq(ui.name) || ' WITH ENCRYPTED PASSWORD ' ||\n"
    5342             :                                                         " sys.sq(sys.password_hash(ui.name)) ||\n"
    5343             :                                                         " ' NAME ' || sys.sq(ui.fullname) || ' SCHEMA sys' || ifthenelse(ui.schema_path = '\"sys\"', '', ' SCHEMA PATH ' || sys.sq(ui.schema_path)) || ';' stmt,\n"
    5344             :                                                         " ui.name user_name\n"
    5345             :                                                         " FROM sys.db_user_info ui, sys.schemas s\n"
    5346             :                                                         " WHERE ui.default_schema = s.id\n"
    5347             :                                                         " AND ui.name <> 'monetdb'\n"
    5348             :                                                         " AND ui.name <> '.snapshot';\n"
    5349             :                                                         "CREATE VIEW sys.dump_partition_tables AS\n"
    5350             :                                                         " SELECT\n"
    5351             :                                                         " 'ALTER TABLE ' || sys.FQN(m_sch, m_tbl) || ' ADD TABLE ' || sys.FQN(p_sch, p_tbl) ||\n"
    5352             :                                                         " CASE\n"
    5353             :                                                         " WHEN tpe = 'VALUES' THEN ' AS PARTITION IN (' || pvalues || ')'\n"
    5354             :                                                         " WHEN tpe = 'RANGE' THEN ' AS PARTITION FROM ' || ifthenelse(minimum IS NOT NULL, sys.SQ(minimum), 'RANGE MINVALUE') || ' TO ' || ifthenelse(maximum IS NOT NULL, sys.SQ(maximum), 'RANGE MAXVALUE')\n"
    5355             :                                                         " WHEN tpe = 'FOR NULLS' THEN ' AS PARTITION FOR NULL VALUES'\n"
    5356             :                                                         " ELSE '' --'READ ONLY'\n"
    5357             :                                                         " END ||\n"
    5358             :                                                         " CASE WHEN tpe in ('VALUES', 'RANGE') AND with_nulls THEN ' WITH NULL VALUES' ELSE '' END ||\n"
    5359             :                                                         " ';' stmt,\n"
    5360             :                                                         " m_sch merge_schema_name,\n"
    5361             :                                                         " m_tbl merge_table_name,\n"
    5362             :                                                         " p_sch partition_schema_name,\n"
    5363             :                                                         " p_tbl partition_table_name\n"
    5364             :                                                         " FROM sys.describe_partition_tables;\n"
    5365             :                                                         "CREATE VIEW sys.dump_tables AS\n"
    5366             :                                                         " SELECT\n"
    5367             :                                                         " t.o o,\n"
    5368             :                                                         " CASE\n"
    5369             :                                                         " WHEN t.typ <> 'VIEW' THEN\n"
    5370             :                                                         " 'CREATE ' || t.typ || ' ' || sys.FQN(t.sch, t.tab) || t.col || t.opt || ';'\n"
    5371             :                                                         " ELSE\n"
    5372             :                                                         " t.opt\n"
    5373             :                                                         " END stmt,\n"
    5374             :                                                         " t.sch schema_name,\n"
    5375             :                                                         " t.tab table_name\n"
    5376             :                                                         " FROM sys.describe_tables t;\n"
    5377             :                                                         "CREATE VIEW sys.dump_comments AS\n"
    5378             :                                                         " SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\n"
    5379             :                                                         "CREATE FUNCTION sys.prepare_esc(s STRING, t STRING) RETURNS STRING\n"
    5380             :                                                         "BEGIN\n"
    5381             :                                                         " RETURN\n"
    5382             :                                                         " CASE\n"
    5383             :                                                         " WHEN (t = 'varchar' OR t ='char' OR t = 'clob' OR t = 'json' OR t = 'geometry' OR t = 'url') THEN\n"
    5384             :                                                         " 'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE ' || 'sys.esc(' || sys.DQ(s) || ')' || ' END'\n"
    5385             :                                                         " ELSE\n"
    5386             :                                                         " 'CASE WHEN ' || sys.DQ(s) || ' IS NULL THEN ''null'' ELSE CAST(' || sys.DQ(s) || ' AS STRING) END'\n"
    5387             :                                                         " END;\n"
    5388             :                                                         "END;\n"
    5389             :                                                         "CREATE PROCEDURE sys.dump_table_data(sch STRING, tbl STRING)\n"
    5390             :                                                         "BEGIN\n"
    5391             :                                                         " DECLARE tid INT;\n"
    5392             :                                                         " SET tid = (SELECT MIN(t.id) FROM sys.tables t, sys.schemas s WHERE t.name = tbl AND t.schema_id = s.id AND s.name = sch);\n"
    5393             :                                                         " IF tid IS NOT NULL THEN\n"
    5394             :                                                         " DECLARE k INT;\n"
    5395             :                                                         " DECLARE m INT;\n"
    5396             :                                                         " SET k = (SELECT MIN(c.id) FROM sys.columns c WHERE c.table_id = tid);\n"
    5397             :                                                         " SET m = (SELECT MAX(c.id) FROM sys.columns c WHERE c.table_id = tid);\n"
    5398             :                                                         " IF k IS NOT NULL AND m IS NOT NULL THEN\n"
    5399             :                                                         " DECLARE cname STRING;\n"
    5400             :                                                         " DECLARE ctype STRING;\n"
    5401             :                                                         " DECLARE _cnt INT;\n"
    5402             :                                                         " SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    5403             :                                                         " SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    5404             :                                                         " SET _cnt = (SELECT count FROM sys.storage(sch, tbl, cname));\n"
    5405             :                                                         " IF _cnt > 0 THEN\n"
    5406             :                                                         " DECLARE COPY_INTO_STMT STRING;\n"
    5407             :                                                         " DECLARE SELECT_DATA_STMT STRING;\n"
    5408             :                                                         " SET COPY_INTO_STMT = 'COPY ' || _cnt || ' RECORDS INTO ' || sys.FQN(sch, tbl) || '(' || sys.DQ(cname);\n"
    5409             :                                                         " SET SELECT_DATA_STMT = 'SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), ' || sys.prepare_esc(cname, ctype);\n"
    5410             :                                                         " WHILE (k < m) DO\n"
    5411             :                                                         " SET k = (SELECT MIN(c.id) FROM sys.columns c WHERE c.table_id = tid AND c.id > k);\n"
    5412             :                                                         " SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);\n"
    5413             :                                                         " SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);\n"
    5414             :                                                         " SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || sys.DQ(cname));\n"
    5415             :                                                         " SET SELECT_DATA_STMT = (SELECT_DATA_STMT || '|| ''|'' || ' || sys.prepare_esc(cname, ctype));\n"
    5416             :                                                         " END WHILE;\n"
    5417             :                                                         " SET COPY_INTO_STMT = (COPY_INTO_STMT || R') FROM STDIN USING DELIMITERS ''|'',E''\\n'',''\"'';');\n"
    5418             :                                                         " SET SELECT_DATA_STMT = (SELECT_DATA_STMT || ' FROM ' || sys.FQN(sch, tbl));\n"
    5419             :                                                         " INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, COPY_INTO_STMT);\n"
    5420             :                                                         " CALL sys.EVAL('INSERT INTO sys.dump_statements ' || SELECT_DATA_STMT || ';');\n"
    5421             :                                                         " END IF;\n"
    5422             :                                                         " END IF;\n"
    5423             :                                                         " END IF;\n"
    5424             :                                                         " END;\n"
    5425             :                                                         "CREATE PROCEDURE sys.dump_table_data()\n"
    5426             :                                                         "BEGIN\n"
    5427             :                                                         " DECLARE i INT;\n"
    5428             :                                                         " SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    5429             :                                                         " IF i IS NOT NULL THEN\n"
    5430             :                                                         " DECLARE M INT;\n"
    5431             :                                                         " SET M = (SELECT MAX(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);\n"
    5432             :                                                         " DECLARE sch STRING;\n"
    5433             :                                                         " DECLARE tbl STRING;\n"
    5434             :                                                         " WHILE i IS NOT NULL AND i <= M DO\n"
    5435             :                                                         " SET sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    5436             :                                                         " SET tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
    5437             :                                                         " CALL sys.dump_table_data(sch, tbl);\n"
    5438             :                                                         " SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system AND t.id > i);\n"
    5439             :                                                         " END WHILE;\n"
    5440             :                                                         " END IF;\n"
    5441             :                                                         "END;\n"
    5442             :                                                         "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    5443             :                                                         "BEGIN\n"
    5444             :                                                         " SET SCHEMA sys;\n"
    5445             :                                                         " TRUNCATE sys.dump_statements;\n"
    5446             :                                                         " INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    5447             :                                                         " INSERT INTO sys.dump_statements VALUES (2, 'SET SCHEMA \"sys\";');\n"
    5448             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    5449             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    5450             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    5451             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    5452             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    5453             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    5454             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    5455             :                                                         " --functions and table-likes can be interdependent. They should be inserted in the order of their catalogue id.\n"
    5456             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    5457             :                                                         " FROM (\n"
    5458             :                                                         " SELECT f.o, f.stmt FROM sys.dump_functions f\n"
    5459             :                                                         " UNION ALL\n"
    5460             :                                                         " SELECT t.o, t.stmt FROM sys.dump_tables t\n"
    5461             :                                                         " ) AS stmts(o, s);\n"
    5462             :                                                         " -- dump table data before adding constraints and fixing sequences\n"
    5463             :                                                         " IF NOT DESCRIBE THEN\n"
    5464             :                                                         " CALL sys.dump_table_data();\n"
    5465             :                                                         " END IF;\n"
    5466             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    5467             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    5468             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    5469             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    5470             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    5471             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    5472             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    5473             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    5474             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_grants;\n"
    5475             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_grants;\n"
    5476             :                                                         " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_function_grants;\n"
    5477             :                                                         " --TODO Improve performance of dump_table_data.\n"
    5478             :                                                         " --TODO loaders ,procedures, window and filter sys.functions.\n"
    5479             :                                                         " --TODO look into order dependent group_concat\n"
    5480             :                                                         " INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    5481             :                                                         " RETURN sys.dump_statements;\n"
    5482             :                                                         "END;\n"
    5483             :                                                         "update sys.functions set system = true where system <> true and name in ('sq', 'get_remote_table_expressions', 'prepare_esc') and schema_id = 2000 and type = %d;\n"
    5484             :                                                         "update sys._tables set system = true where system <> true and name in ('describe_tables', 'dump_create_users', 'dump_partition_tables', 'dump_comments', 'dump_tables') and schema_id = 2000;\n"
    5485             :                                                         "update sys.functions set system = true where system <> true and name = 'dump_table_data' and schema_id = 2000 and type = %d;\n"
    5486             :                                                         "update sys.functions set system = true where system <> true and name = 'dump_database' and schema_id = 2000 and type = %d;\n"
    5487             :                                                         "GRANT SELECT ON sys.describe_tables TO PUBLIC;\n",
    5488             :                                                         F_FUNC, F_PROC, F_UNION);
    5489           0 :                         assert(pos < bufsize);
    5490           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    5491           0 :                         fflush(stdout);
    5492           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5493             :                 }
    5494         101 :                 res_table_destroy(output);
    5495         101 :                 output = NULL;
    5496             :         }
    5497             : 
    5498             :         /* Add new column 'function_id' to views
    5499             :          * sys.dependency_tables_on_functions and dependency_views_on_functions */
    5500             :         {
    5501         101 :                 sql_table *t = find_sql_table(sql->session->tr, s, "dependency_tables_on_functions");
    5502         101 :                 if (t != NULL && find_sql_column(t, "function_id") == NULL) {
    5503           0 :                         t->system = 0;               /* sys.dependency_tables_on_functions */
    5504           0 :                         if ((t = mvc_bind_table(sql, s, "dependency_views_on_functions")) != NULL)
    5505           0 :                                 t->system = 0;
    5506           0 :                         pos = 0;
    5507           0 :                         pos += snprintf(buf + pos, bufsize - pos,
    5508             :                                                         "drop view if exists sys.dependency_tables_on_functions cascade;\n"
    5509             :                                                         "drop view if exists sys.dependency_views_on_functions cascade;\n"
    5510             :                                                         "CREATE VIEW sys.dependency_tables_on_functions AS\n"
    5511             :                                                         "SELECT t.schema_id AS table_schema_id, t.id AS table_id, t.name AS table_name,"
    5512             :                                                         " f.id AS function_id, f.name AS function_name, f.type AS function_type, dep.depend_type AS depend_type\n"
    5513             :                                                         "  FROM sys.functions AS f, sys.tables AS t, sys.dependencies AS dep\n"
    5514             :                                                         " WHERE t.id = dep.id AND f.id = dep.depend_id\n"
    5515             :                                                         "   AND dep.depend_type = 7 AND f.type <> 2 AND t.type NOT IN (1, 11)\n"
    5516             :                                                         " ORDER BY t.name, t.schema_id, f.name, f.id;\n"
    5517             :                                                         "GRANT SELECT ON sys.dependency_tables_on_functions TO PUBLIC;\n"
    5518             :                                                         "CREATE VIEW sys.dependency_views_on_functions AS\n"
    5519             :                                                         "SELECT v.schema_id AS view_schema_id, v.id AS view_id, v.name AS view_name,"
    5520             :                                                         " f.id AS function_id, f.name AS function_name, f.type AS function_type, dep.depend_type AS depend_type\n"
    5521             :                                                         "  FROM sys.functions AS f, sys.tables AS v, sys.dependencies AS dep\n"
    5522             :                                                         " WHERE v.id = dep.id AND f.id = dep.depend_id\n"
    5523             :                                                         "   AND dep.depend_type = 7 AND f.type <> 2 AND v.type IN (1, 11)\n"
    5524             :                                                         " ORDER BY v.name, v.schema_id, f.name, f.id;\n"
    5525             :                                                         "GRANT SELECT ON sys.dependency_views_on_functions TO PUBLIC;\n"
    5526             :                                                         "update sys._tables set system = true where system <> true and name in "
    5527             :                                                         "('dependency_tables_on_functions','dependency_views_on_functions') and schema_id = 2000;\n");
    5528           0 :                         assert(pos < bufsize);
    5529           0 :                         printf("Running database upgrade commands:\n%s\n", buf);
    5530           0 :                         fflush(stdout);
    5531           0 :                         err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5532             :                 }
    5533             :         }
    5534             : 
    5535         101 :         if (!sql_bind_func(sql, "sys", "database", NULL, NULL, F_FUNC, true, true)) {
    5536           0 :                 sql->session->status = 0; /* if the function was not found clean the error */
    5537           0 :                 sql->errstr[0] = '\0';
    5538           0 :                 pos = snprintf(buf, bufsize,
    5539             :                                            "create function sys.database ()\n"
    5540             :                                            "returns string\n"
    5541             :                                            "external name inspect.\"getDatabaseName\";\n"
    5542             :                                            "grant execute on function sys.database() to public;\n"
    5543             :                                            "update sys.functions set system = true where system <> true and name = 'database' and schema_id = 2000 and type = %d;\n",
    5544             :                                            (int) F_FUNC);
    5545           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5546           0 :                 fflush(stdout);
    5547           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5548             :         }
    5549             : 
    5550             :         /* Add new sysadmin procedure calls: stop, pause and resume with two
    5551             :            arguments, first arg is query OID and second the user username that
    5552             :            the query in bound to. */
    5553         101 :         sql_find_subtype(&t1, "bigint", 64, 0);
    5554         101 :         sql_find_subtype(&t2, "varchar", 0, 0);
    5555         101 :         if (!sql_bind_func(sql, "sys", "pause", &t1, &t2, F_PROC, true, true)) {
    5556           0 :                 sql->session->status = 0; /* if the function was not found clean the error */
    5557           0 :                 sql->errstr[0] = '\0';
    5558           0 :                 const char *query =
    5559             :                         "create function sys.queue(username string) returns table(\"tag\" bigint, \"sessionid\" int, \"username\" string, \"started\" timestamp, \"status\" string, \"query\" string, \"finished\" timestamp, \"maxworkers\" int, \"footprint\" int) external name sysmon.queue;\n"
    5560             :                         "create procedure sys.pause(tag bigint, username string) external name sysmon.pause;\n"
    5561             :                         "create procedure sys.resume(tag bigint, username string) external name sysmon.resume;\n"
    5562             :                         "create procedure sys.stop(tag bigint, username string) external name sysmon.stop;\n"
    5563             :                         "update sys.functions set system = true where system <> true and mod = 'sysmon' and name in ('stop', 'pause', 'resume', 'queue');\n";
    5564           0 :                 printf("Running database upgrade commands:\n%s\n", query);
    5565           0 :                 fflush(stdout);
    5566           0 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5567             :         }
    5568             : 
    5569             :         /* sys.settimeout and sys.setsession where removed */
    5570         101 :         if (sql_bind_func(sql, "sys", "settimeout", &t1, NULL, F_PROC, true, true)) {
    5571           0 :                 const char *query =
    5572             :                         "drop procedure sys.settimeout(bigint) cascade;\n"
    5573             :                         "drop procedure sys.settimeout(bigint, bigint) cascade;\n"
    5574             :                         "drop procedure sys.setsession(bigint) cascade;\n";
    5575           0 :                 printf("Running database upgrade commands:\n%s\n", query);
    5576           0 :                 fflush(stdout);
    5577           0 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5578             :         }
    5579         101 :         sql->session->status = 0; /* if the function was not found clean the error */
    5580         101 :         sql->errstr[0] = '\0';
    5581             : 
    5582         101 :         if (!sql_bind_func(sql, "sys", "jarowinkler", &t2, &t2, F_FUNC, true, true)) {
    5583           0 :                 sql->session->status = 0; /* if the function was not found clean the error */
    5584           0 :                 sql->errstr[0] = '\0';
    5585           0 :                 pos = snprintf(buf, bufsize,
    5586             :                                            "create function sys.levenshtein(x string, y string)\n"
    5587             :                                            "returns int external name txtsim.levenshtein;\n"
    5588             :                                            "grant execute on function levenshtein(string, string) to public;\n"
    5589             :                                            "create function sys.levenshtein(x string, y string, insdel int, rep int)\n"
    5590             :                                            "returns int external name txtsim.levenshtein;\n"
    5591             :                                            "grant execute on function levenshtein(string, string, int, int) to public;\n"
    5592             :                                            "create function sys.levenshtein(x string, y string, insdel int, rep int, trans int)\n"
    5593             :                                            "returns int external name txtsim.levenshtein;\n"
    5594             :                                            "grant execute on function levenshtein(string, string, int, int, int) to public;\n"
    5595             :                                            "create filter function sys.maxlevenshtein(x string, y string, k int)\n"
    5596             :                                            "external name txtsim.maxlevenshtein;\n"
    5597             :                                            "grant execute on filter function maxlevenshtein(string, string, int) to public;\n"
    5598             :                                            "create filter function sys.maxlevenshtein(x string, y string, k int, insdel int, rep int)\n"
    5599             :                                            "external name txtsim.maxlevenshtein;\n"
    5600             :                                            "grant execute on filter function maxlevenshtein(string, string, int, int, int) to public;\n"
    5601             :                                            "create function sys.jarowinkler(x string, y string)\n"
    5602             :                                            "returns double external name txtsim.jarowinkler;\n"
    5603             :                                            "grant execute on function jarowinkler(string, string) to public;\n"
    5604             :                                            "create filter function minjarowinkler(x string, y string, threshold double)\n"
    5605             :                                            "external name txtsim.minjarowinkler;\n"
    5606             :                                            "grant execute on filter function minjarowinkler(string, string, double) to public;\n"
    5607             :                                            "create function sys.dameraulevenshtein(x string, y string)\n"
    5608             :                                            "returns int external name txtsim.dameraulevenshtein;\n"
    5609             :                                            "grant execute on function dameraulevenshtein(string, string) to public;\n"
    5610             :                                            "create function sys.dameraulevenshtein(x string, y string, insdel int, rep int, trans int)\n"
    5611             :                                            "returns int external name txtsim.dameraulevenshtein;\n"
    5612             :                                            "grant execute on function dameraulevenshtein(string, string, int, int, int) to public;\n"
    5613             : 
    5614             :                                            "create function sys.editdistance(x string, y string)\n"
    5615             :                                            "returns int external name txtsim.editdistance;\n"
    5616             :                                            "grant execute on function editdistance(string, string) to public;\n"
    5617             :                                            "create function sys.editdistance2(x string, y string)\n"
    5618             :                                            "returns int external name txtsim.editdistance2;\n"
    5619             :                                            "grant execute on function editdistance2(string, string) to public;\n"
    5620             :                                            "create function sys.soundex(x string)\n"
    5621             :                                            "returns string external name txtsim.soundex;\n"
    5622             :                                            "grant execute on function soundex(string) to public;\n"
    5623             :                                            "create function sys.difference(x string, y string)\n"
    5624             :                                            "returns int external name txtsim.stringdiff;\n"
    5625             :                                            "grant execute on function difference(string, string) to public;\n"
    5626             :                                            "create function sys.qgramnormalize(x string)\n"
    5627             :                                            "returns string external name txtsim.qgramnormalize;\n"
    5628             :                                            "grant execute on function qgramnormalize(string) to public;\n"
    5629             : 
    5630             :                                            "create function asciify(x string)\n"
    5631             :                                            "returns string external name str.asciify;\n"
    5632             :                                            "grant execute on function asciify(string) to public;\n"
    5633             :                                            "create function sys.startswith(x string, y string)\n"
    5634             :                                            "returns boolean external name str.startswith;\n"
    5635             :                                            "grant execute on function startswith(string, string) to public;\n"
    5636             :                                            "create function sys.startswith(x string, y string, icase boolean)\n"
    5637             :                                            "returns boolean external name str.startswith;\n"
    5638             :                                            "grant execute on function startswith(string, string, boolean) to public;\n"
    5639             :                                            "create filter function sys.startswith(x string, y string)\n"
    5640             :                                            "external name str.startswith;\n"
    5641             :                                            "grant execute on filter function startswith(string, string) to public;\n"
    5642             :                                            "create filter function sys.startswith(x string, y string, icase boolean)\n"
    5643             :                                            "external name str.startswith;\n"
    5644             :                                            "grant execute on filter function startswith(string, string, boolean) to public;\n"
    5645             :                                            "create function sys.endswith(x string, y string)\n"
    5646             :                                            "returns boolean external name str.endswith;\n"
    5647             :                                            "grant execute on function endswith(string, string) to public;\n"
    5648             :                                            "create function sys.endswith(x string, y string, icase boolean)\n"
    5649             :                                            "returns boolean external name str.endswith;\n"
    5650             :                                            "grant execute on function endswith(string, string, boolean) to public;\n"
    5651             :                                            "create filter function sys.endswith(x string, y string)\n"
    5652             :                                            "external name str.endswith;\n"
    5653             :                                            "grant execute on filter function endswith(string, string) to public;\n"
    5654             :                                            "create filter function sys.endswith(x string, y string, icase boolean)\n"
    5655             :                                            "external name str.endswith;\n"
    5656             :                                            "grant execute on filter function endswith(string, string, boolean) to public;\n"
    5657             :                                            "create function sys.contains(x string, y string)\n"
    5658             :                                            "returns boolean external name str.contains;\n"
    5659             :                                            "grant execute on function contains(string, string) to public;\n"
    5660             :                                            "create function sys.contains(x string, y string, icase boolean)\n"
    5661             :                                            "returns boolean external name str.contains;\n"
    5662             :                                            "grant execute on function contains(string, string, boolean) to public;\n"
    5663             :                                            "create filter function sys.contains(x string, y string)\n"
    5664             :                                            "external name str.contains;\n"
    5665             :                                            "grant execute on filter function contains(string, string) to public;\n"
    5666             :                                            "create filter function sys.contains(x string, y string, icase boolean)\n"
    5667             :                                            "external name str.contains;\n"
    5668             :                                            "grant execute on filter function contains(string, string, boolean) to public;\n"
    5669             : 
    5670             :                                            "update sys.functions set system = true where system <> true and name in ('levenshtein', 'dameraulevenshtein', 'jarowinkler', 'editdistance', 'editdistance2', 'soundex', 'difference', 'qgramnormalize') and schema_id = 2000 and type = %d;\n"
    5671             :                                            "update sys.functions set system = true where system <> true and name in ('maxlevenshtein', 'minjarowinkler') and schema_id = 2000 and type = %d;\n"
    5672             :                                            "update sys.functions set system = true where system <> true and name in ('asciify', 'startswith', 'endswith', 'contains') and schema_id = 2000 and type = %d;\n"
    5673             :                                            "update sys.functions set system = true where system <> true and name in ('startswith', 'endswith', 'contains') and schema_id = 2000 and type = %d;\n"
    5674             : 
    5675             :                                            "delete from sys.triggers where name = 'system_update_tables' and table_id = 2067;\n",
    5676             :                                            F_FUNC, F_FILT, F_FUNC, F_FILT);
    5677           0 :                 assert(pos < bufsize);
    5678           0 :                 printf("Running database upgrade commands:\n%s\n", buf);
    5679           0 :                 fflush(stdout);
    5680           0 :                 err = SQLstatementIntern(c, buf, "update", true, false, NULL);
    5681             :         }
    5682             : 
    5683             :         /* remote credentials where moved */
    5684         101 :         sql_trans *tr = sql->session->tr;
    5685         101 :         sqlstore *store = tr->store;
    5686         101 :         sql_table *remote_user_info = find_sql_table(tr, s, "remote_user_info");
    5687         101 :         sql_column *remote_user_info_id = find_sql_column(remote_user_info, "table_id");
    5688         101 :         BAT *rt_key = NULL, *rt_username = NULL, *rt_pwhash = NULL, *rt_uri = NULL, *rt_deleted = NULL;
    5689         101 :         if (!err && store->storage_api.count_col(tr, remote_user_info_id, 0) == 0 && BBPindex("M5system_auth_rt_key")) {
    5690             : 
    5691           0 :                 rt_key = BATdescriptor(BBPindex("M5system_auth_rt_key"));
    5692           0 :                 rt_uri = BATdescriptor(BBPindex("M5system_auth_rt_uri"));
    5693           0 :                 rt_username = BATdescriptor(BBPindex("M5system_auth_rt_remoteuser"));
    5694           0 :                 rt_pwhash = BATdescriptor(BBPindex("M5system_auth_rt_hashedpwd"));
    5695           0 :                 rt_deleted = BATdescriptor(BBPindex("M5system_auth_rt_deleted"));
    5696           0 :                 if (rt_key == NULL || rt_username == NULL || rt_pwhash == NULL || rt_uri == NULL || rt_deleted == NULL) {
    5697             :                         /* cleanup remainders and continue or full stop ? */
    5698           0 :                         BBPreclaim(rt_key);
    5699           0 :                         BBPreclaim(rt_uri);
    5700           0 :                         BBPreclaim(rt_username);
    5701           0 :                         BBPreclaim(rt_pwhash);
    5702           0 :                         BBPreclaim(rt_deleted);
    5703           0 :                         throw(SQL, __func__, "cannot find M5system_auth bats");
    5704             :                 }
    5705             : 
    5706           0 :                 BATiter ik = bat_iterator(rt_key);
    5707           0 :                 BATiter iu = bat_iterator(rt_username);
    5708           0 :                 BATiter ip = bat_iterator(rt_pwhash);
    5709           0 :                 for (oid p = 0; p < ik.count; p++) {
    5710           0 :                         if (BUNfnd(rt_deleted, &p) == BUN_NONE) {
    5711           0 :                                 char *key = GDKstrdup(BUNtvar(ik, p));
    5712           0 :                                 char *username = BUNtvar(iu, p);
    5713           0 :                                 char *pwhash = BUNtvar(ip, p);
    5714             : 
    5715           0 :                                 if (!key) {
    5716           0 :                                         bat_iterator_end(&ik);
    5717           0 :                                         bat_iterator_end(&iu);
    5718           0 :                                         bat_iterator_end(&ip);
    5719           0 :                                         BBPunfix(rt_key->batCacheid);
    5720           0 :                                         BBPunfix(rt_username->batCacheid);
    5721           0 :                                         BBPunfix(rt_pwhash->batCacheid);
    5722           0 :                                         BBPunfix(rt_deleted->batCacheid);
    5723           0 :                                         throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    5724             :                                 }
    5725           0 :                                 char *d = strchr(key, '.');
    5726             :                                 /* . not found simply skip */
    5727           0 :                                 if (d) {
    5728           0 :                                         *d++ = '\0';
    5729           0 :                                         sql_schema *s = find_sql_schema(tr, key);
    5730           0 :                                         if (s) {
    5731           0 :                                                 sql_table *t = find_sql_table(tr, s, d);
    5732           0 :                                                 if (t && store->table_api.table_insert(tr, remote_user_info, &t->base.id, &username, &pwhash) != LOG_OK) {
    5733           0 :                                                         bat_iterator_end(&ik);
    5734           0 :                                                         bat_iterator_end(&iu);
    5735           0 :                                                         bat_iterator_end(&ip);
    5736           0 :                                                         BBPunfix(rt_key->batCacheid);
    5737           0 :                                                         BBPunfix(rt_username->batCacheid);
    5738           0 :                                                         BBPunfix(rt_pwhash->batCacheid);
    5739           0 :                                                         BBPunfix(rt_deleted->batCacheid);
    5740           0 :                                                         GDKfree(key);
    5741           0 :                                                         throw(SQL, __func__, "Failed to insert remote credentials during upgrade");
    5742             :                                                 }
    5743             :                                         }
    5744             :                                 }
    5745           0 :                                 GDKfree(key);
    5746             :                         }
    5747             :                 }
    5748           0 :                 bat_iterator_end(&ik);
    5749           0 :                 bat_iterator_end(&iu);
    5750           0 :                 bat_iterator_end(&ip);
    5751             :         }
    5752         101 :         if (!err && rt_key) {
    5753           0 :                 bat rtauthbats[6];
    5754             : 
    5755           0 :                 rtauthbats[0] = 0;
    5756           0 :                 rtauthbats[1] = rt_key->batCacheid;
    5757           0 :                 rtauthbats[2] = rt_uri->batCacheid;
    5758           0 :                 rtauthbats[3] = rt_username->batCacheid;
    5759           0 :                 rtauthbats[4] = rt_pwhash->batCacheid;
    5760           0 :                 rtauthbats[5] = rt_deleted->batCacheid;
    5761             : 
    5762           0 :                 if (BATmode(rt_key, true) != GDK_SUCCEED ||
    5763           0 :                         BBPrename(rt_key, NULL) != 0 ||
    5764           0 :                         BATmode(rt_username, true) != GDK_SUCCEED ||
    5765           0 :                         BBPrename(rt_username, NULL) != 0 ||
    5766           0 :                         BATmode(rt_pwhash, true) != GDK_SUCCEED ||
    5767           0 :                         BBPrename(rt_pwhash, NULL) != 0 ||
    5768           0 :                         BATmode(rt_uri, true) != GDK_SUCCEED ||
    5769           0 :                         BBPrename(rt_uri, NULL) != 0 ||
    5770           0 :                         BATmode(rt_deleted, true) != GDK_SUCCEED ||
    5771           0 :                         BBPrename(rt_deleted, NULL) != 0 ||
    5772           0 :                         TMsubcommit_list(rtauthbats, NULL, 6, -1) != GDK_SUCCEED) {
    5773           0 :                         fprintf(stderr, "Committing removal of old remote user/password BATs failed\n");
    5774             :                 }
    5775           0 :                 BBPunfix(rt_key->batCacheid);
    5776           0 :                 BBPunfix(rt_username->batCacheid);
    5777           0 :                 BBPunfix(rt_pwhash->batCacheid);
    5778           0 :                 BBPunfix(rt_uri->batCacheid);
    5779           0 :                 BBPunfix(rt_deleted->batCacheid);
    5780             :         }
    5781             : 
    5782         101 :         GDKfree(buf);
    5783         101 :         return err;             /* usually MAL_SUCCEED */
    5784             : }
    5785             : 
    5786             : static str
    5787         101 : sql_update_jun2023_sp3(Client c, mvc *sql, sql_schema *s)
    5788             : {
    5789         101 :         (void)s;
    5790         101 :         char *err = NULL;
    5791         101 :         sql_subtype t1, t2;
    5792             : 
    5793         101 :         sql_find_subtype(&t1, "timestamp", 0, 0);
    5794         101 :         sql_find_subtype(&t2, "varchar", 0, 0);
    5795             : 
    5796         101 :         if (!sql_bind_func(sql, "sys", "timestamp_to_str", &t1, &t2, F_FUNC, true, true)) {
    5797           0 :                 sql->session->status = 0;
    5798           0 :                 sql->errstr[0] = '\0';
    5799             : 
    5800           0 :                 char *query = GDKmalloc(512);
    5801           0 :                 if (query == NULL)
    5802           0 :                         throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
    5803             : 
    5804           0 :                 snprintf(query, 512, "CREATE FUNCTION timestamp_to_str(d TIMESTAMP, format STRING) RETURNS STRING "
    5805             :                                  "EXTERNAL NAME mtime.\"timestamp_to_str\";\n"
    5806             :                                  "GRANT EXECUTE ON FUNCTION timestamp_to_str(TIMESTAMP, STRING) TO PUBLIC;\n"
    5807             :                                  "UPDATE sys.functions SET system = true WHERE system <> true AND name = 'timestamp_to_str' "
    5808             :                                  "AND schema_id = 2000 and type = %d;\n", F_FUNC);
    5809             : 
    5810           0 :                 printf("Running database upgrade commands:\n%s\n", query);
    5811           0 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5812           0 :                 GDKfree(query);
    5813             :         }
    5814             : 
    5815             :         return err;             /* usually MAL_SUCCEED */
    5816             : }
    5817             : 
    5818             : static str
    5819         101 : sql_update_dec2023_geom(Client c, mvc *sql, sql_schema *s)
    5820             : {
    5821         101 :         sql_subtype tp;
    5822         101 :         char *err = NULL;
    5823             : 
    5824             :         /* the shp module was changed: drop the old stuff if it exists, only
    5825             :          * add the new stuff if the appropriate module is available */
    5826         101 :         sql_find_subtype(&tp, "varchar", 0, 0);
    5827             :         /* Drop old SHP procedures */
    5828         101 :         if (sql_bind_func(sql, s->base.name, "shpattach", &tp, NULL, F_PROC, true, true)) {
    5829           8 :                 if ((err = sql_drop_shp(c)) != NULL)
    5830             :                         return err;
    5831             :         }
    5832         101 :         sql->session->status = 0; /* if the shpattach function was not found clean the error */
    5833         101 :         sql->errstr[0] = '\0';
    5834             : #ifdef HAVE_GEOM
    5835         101 :         if (backend_has_module(&(int){0}, "geom")) {
    5836             : #ifdef HAVE_SHP
    5837         101 :                 if (backend_has_module(&(int){0}, "shp")) {
    5838             :                         /* if shpload with two varchar args does not exist, add the
    5839             :                          * procedures */
    5840         101 :                         if (!sql_bind_func(sql, s->base.name, "shpload", &tp, &tp, F_PROC, true, true)) {
    5841           8 :                                 sql->session->status = 0;
    5842           8 :                                 sql->errstr[0] = '\0';
    5843           8 :                                 if ((err = sql_create_shp(c)) != NULL)
    5844           0 :                                         return err;
    5845             :                         }
    5846             :                 }
    5847             : #endif
    5848         101 :                 sql_find_subtype(&tp, "geometry", 0, 0);
    5849         101 :                 if (!sql_bind_func(sql, s->base.name, "st_intersects_noindex", &tp, &tp, F_FILT, true, true)) {
    5850           8 :                         sql->session->status = 0;
    5851           8 :                         sql->errstr[0] = '\0';
    5852           8 :                         sql_table *t;
    5853           8 :                         if ((t = mvc_bind_table(sql, s, "geometry_columns")) != NULL)
    5854           8 :                                 t->system = 0;
    5855           8 :                         const char *query =
    5856             :                                 "drop function if exists sys.st_intersects(geometry, geometry) cascade;\n"
    5857             :                                 "drop function if exists sys.st_dwithin(geometry, geometry, double) cascade;\n"
    5858             :                                 "drop view if exists sys.geometry_columns cascade;\n"
    5859             :                                 "drop function if exists sys.st_collect(geometry, geometry) cascade;\n"
    5860             :                                 "drop aggregate if exists sys.st_collect(geometry) cascade;\n"
    5861             :                                 "drop aggregate if exists sys.st_makeline(geometry) cascade;\n"
    5862             :                                 "create view sys.geometry_columns as\n"
    5863             :                                 " select cast(null as varchar(1)) as f_table_catalog,\n"
    5864             :                                 "  s.name as f_table_schema,\n"
    5865             :                                 "  t.name as f_table_name,\n"
    5866             :                                 "  c.name as f_geometry_column,\n"
    5867             :                                 "  cast(has_z(c.type_digits) + has_m(c.type_digits) +2 as integer) as coord_dimension,\n"
    5868             :                                 "  c.type_scale as srid,\n"
    5869             :                                 "  get_type(c.type_digits, 0) as geometry_type\n"
    5870             :                                 " from sys.columns c, sys.tables t, sys.schemas s\n"
    5871             :                                 " where c.table_id = t.id and t.schema_id = s.id\n"
    5872             :                                 "  and c.type in (select sqlname from sys.types where systemname in ('wkb', 'wkba'));\n"
    5873             :                                 "GRANT SELECT ON sys.geometry_columns TO PUBLIC;\n"
    5874             :                                 "CREATE FUNCTION ST_Collect(geom1 Geometry, geom2 Geometry) RETURNS Geometry EXTERNAL NAME geom.\"Collect\";\n"
    5875             :                                 "GRANT EXECUTE ON FUNCTION ST_Collect(Geometry, Geometry) TO PUBLIC;\n"
    5876             :                                 "CREATE AGGREGATE ST_Collect(geom Geometry) RETURNS Geometry external name aggr.\"Collect\";\n"
    5877             :                                 "GRANT EXECUTE ON AGGREGATE ST_Collect(Geometry) TO PUBLIC;\n"
    5878             :                                 "CREATE FUNCTION ST_DistanceGeographic(geom1 Geometry, geom2 Geometry) RETURNS double EXTERNAL NAME geom.\"DistanceGeographic\";\n"
    5879             :                                 "GRANT EXECUTE ON FUNCTION ST_DistanceGeographic(Geometry, Geometry) TO PUBLIC;\n"
    5880             :                                 "CREATE FILTER FUNCTION ST_DWithinGeographic(geom1 Geometry, geom2 Geometry, distance double) EXTERNAL NAME geom.\"DWithinGeographic\";\n"
    5881             :                                 "GRANT EXECUTE ON FILTER ST_DWithinGeographic(Geometry, Geometry, double) TO PUBLIC;\n"
    5882             :                                 "CREATE FILTER FUNCTION ST_DWithin(geom1 Geometry, geom2 Geometry, distance double) EXTERNAL NAME rtree.\"DWithin\";\n"
    5883             :                                 "GRANT EXECUTE ON FILTER ST_DWithin(Geometry, Geometry, double) TO PUBLIC;\n"
    5884             :                                 "CREATE FILTER FUNCTION ST_DWithin_NoIndex(geom1 Geometry, geom2 Geometry, distance double) EXTERNAL NAME geom.\"DWithin_noindex\";\n"
    5885             :                                 "GRANT EXECUTE ON FILTER ST_DWithin_NoIndex(Geometry, Geometry, double) TO PUBLIC;\n"
    5886             :                                 "CREATE FUNCTION ST_DWithin2(geom1 Geometry, geom2 Geometry, bbox1 mbr, bbox2 mbr, dst double) RETURNS boolean EXTERNAL NAME geom.\"DWithin2\";\n"
    5887             :                                 "GRANT EXECUTE ON FUNCTION ST_DWithin2(Geometry, Geometry, mbr, mbr, double) TO PUBLIC;\n"
    5888             :                                 "CREATE FILTER FUNCTION ST_IntersectsGeographic(geom1 Geometry, geom2 Geometry) EXTERNAL NAME geom.\"IntersectsGeographic\";\n"
    5889             :                                 "GRANT EXECUTE ON FILTER ST_IntersectsGeographic(Geometry, Geometry) TO PUBLIC;\n"
    5890             :                                 "CREATE FILTER FUNCTION ST_Intersects(geom1 Geometry, geom2 Geometry) EXTERNAL NAME rtree.\"Intersects\";\n"
    5891             :                                 "GRANT EXECUTE ON FILTER ST_Intersects(Geometry, Geometry) TO PUBLIC;\n"
    5892             :                                 "CREATE FILTER FUNCTION ST_Intersects_NoIndex(geom1 Geometry, geom2 Geometry) EXTERNAL NAME geom.\"Intersects_noindex\";\n"
    5893             :                                 "GRANT EXECUTE ON FILTER ST_Intersects_NoIndex(Geometry, Geometry) TO PUBLIC;\n"
    5894             :                                 "CREATE AGGREGATE ST_MakeLine(geom Geometry) RETURNS Geometry external name aggr.\"MakeLine\";\n"
    5895             :                                 "GRANT EXECUTE ON AGGREGATE ST_MakeLine(Geometry) TO PUBLIC;\n"
    5896             :                                 "update sys.functions set system = true where system <> true and schema_id = 2000 and name in ('st_collect', 'st_distancegeographic', 'st_dwithingeographic', 'st_dwithin', 'st_dwithin_noindex', 'st_dwithin2', 'st_intersectsgeographic', 'st_intersects', 'st_intersects_noindex', 'st_makeline');\n"
    5897             :                                 "update sys._tables set system = true where system <> true and schema_id = 2000 and name = 'geometry_columns';\n";
    5898           8 :                         printf("Running database upgrade commands:\n%s\n", query);
    5899           8 :                         fflush(stdout);
    5900           8 :                         err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5901             :                 }
    5902             :         }
    5903             : #endif
    5904         101 :         return err;
    5905             : }
    5906             : 
    5907             : static str
    5908         101 : sql_update_dec2023(Client c, mvc *sql, sql_schema *s)
    5909             : {
    5910         101 :         sql_subtype tp;
    5911         101 :         sql_schema *info;
    5912         101 :         char *err = NULL;
    5913         101 :         res_table *output = NULL;
    5914             : 
    5915         101 :         sql_find_subtype(&tp, "varchar", 0, 0);
    5916         101 :         if (sql_bind_func(sql, s->base.name, "similarity", &tp, &tp, F_FUNC, true, true)) {
    5917           8 :                 const char *query = "drop function sys.similarity(string, string) cascade;\n";
    5918           8 :                 printf("Running database upgrade commands:\n%s\n", query);
    5919           8 :                 fflush(stdout);
    5920           8 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5921             :         } else {
    5922          93 :                 sql->session->status = 0; /* if the function was not found clean the error */
    5923          93 :                 sql->errstr[0] = '\0';
    5924             :         }
    5925             : 
    5926         101 :         if (mvc_bind_table(sql, s, "describe_accessible_tables") == NULL) {
    5927           8 :                 sql->session->status = 0; /* if the view was not found clean the error */
    5928           8 :                 sql->errstr[0] = '\0';
    5929           8 :                 const char *query =
    5930             :                 "CREATE VIEW sys.describe_accessible_tables AS\n"
    5931             :                 " SELECT\n"
    5932             :                 " schemas.name AS schema,\n"
    5933             :                 " tables.name  AS table,\n"
    5934             :                 " tt.table_type_name AS table_type,\n"
    5935             :                 " pc.privilege_code_name AS privs,\n"
    5936             :                 " p.privileges AS privs_code\n"
    5937             :                 " FROM privileges p\n"
    5938             :                 " JOIN sys.roles ON p.auth_id = roles.id\n"
    5939             :                 " JOIN sys.tables ON p.obj_id = tables.id\n"
    5940             :                 " JOIN sys.table_types tt ON tables.type = tt.table_type_id\n"
    5941             :                 " JOIN sys.schemas ON tables.schema_id = schemas.id\n"
    5942             :                 " JOIN sys.privilege_codes pc ON p.privileges = pc.privilege_code_id\n"
    5943             :                 " WHERE roles.name = current_role;\n"
    5944             :                 "GRANT SELECT ON sys.describe_accessible_tables TO PUBLIC;\n"
    5945             :                 "update sys._tables set system = true where system <> true and schema_id = 2000 and name = 'describe_accessible_tables';\n"
    5946             : 
    5947             :                         /* PYTHON_MAP and PYTHON3_MAP have been removed */
    5948             :                         "alter table sys.function_languages set read write;\n"
    5949             :                         "delete from sys.function_languages where language_keyword like 'PYTHON%_MAP';\n"
    5950             :                         /* for these two, also see load_func() */
    5951             :                         "update sys.functions set language = language - 1 where language in (7, 11);\n"
    5952             :                         "update sys.functions set mod = 'pyapi3' where mod in ('pyapi', 'pyapi3map');\n"
    5953             :                         "commit;\n";
    5954           8 :                 printf("Running database upgrade commands:\n%s\n", query);
    5955           8 :                 fflush(stdout);
    5956           8 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5957           8 :                 if (err == MAL_SUCCEED) {
    5958           8 :                         query = "alter table sys.function_languages set read only;\n";
    5959           8 :                         printf("Running database upgrade commands:\n%s\n", query);
    5960           8 :                         fflush(stdout);
    5961           8 :                         err = SQLstatementIntern(c, query, "update", true, false, NULL);
    5962             :                 }
    5963             :         }
    5964             : 
    5965             :         /* 52_describe.sql changes to update sys.describe_comments view */
    5966         101 :         if ((err = SQLstatementIntern(c, "select id from sys.tables where name = 'describe_comments' and schema_id = 2000 and query like '% not t.system%';", "update", true, false, &output)) == NULL) {
    5967         101 :                 BAT *b;
    5968         101 :                 if ((b = BBPquickdesc(output->cols[0].b)) && BATcount(b) == 0) {
    5969           8 :                         sql_table *t;
    5970             :                         /* set views internally to non-system to allow drop commands to succeed without error */
    5971           8 :                         if ((t = mvc_bind_table(sql, s, "describe_comments")) != NULL)
    5972           8 :                                 t->system = 0;
    5973           8 :                         if ((t = mvc_bind_table(sql, s, "dump_comments")) != NULL)
    5974           8 :                                 t->system = 0;
    5975             : 
    5976           8 :                         const char *cmds =
    5977             :                         "DROP FUNCTION IF EXISTS sys.dump_database(BOOLEAN) CASCADE;\n"
    5978             :                         "DROP VIEW IF EXISTS sys.dump_comments CASCADE;\n"
    5979             :                         "DROP VIEW IF EXISTS sys.describe_comments CASCADE;\n"
    5980             :                         "CREATE VIEW sys.describe_comments AS\n"
    5981             :                         "  SELECT o.id AS id, o.tpe AS tpe, o.nme AS fqn, cm.remark AS rem\n"
    5982             :                         "  FROM (\n"
    5983             :                         "          SELECT id, 'SCHEMA', sys.DQ(name) FROM sys.schemas WHERE NOT system\n"
    5984             :                         "          UNION ALL\n"
    5985             :                         "          SELECT t.id, ifthenelse(ts.table_type_name = 'VIEW', 'VIEW', 'TABLE'), sys.FQN(s.name, t.name)\n"
    5986             :                         "            FROM sys.schemas s JOIN sys._tables t ON s.id = t.schema_id JOIN sys.table_types ts ON t.type = ts.table_type_id\n"
    5987             :                         "           WHERE NOT t.system\n"
    5988             :                         "          UNION ALL\n"
    5989             :                         "          SELECT c.id, 'COLUMN', sys.FQN(s.name, t.name) || '.' || sys.DQ(c.name) FROM sys.columns c, sys._tables t, sys.schemas s WHERE NOT t.system AND c.table_id = t.id AND t.schema_id = s.id\n"
    5990             :                         "          UNION ALL\n"
    5991             :                         "          SELECT idx.id, 'INDEX', sys.FQN(s.name, idx.name) FROM sys.idxs idx, sys._tables t, sys.schemas s WHERE NOT t.system AND idx.table_id = t.id AND t.schema_id = s.id\n"
    5992             :                         "          UNION ALL\n"
    5993             :                         "          SELECT seq.id, 'SEQUENCE', sys.FQN(s.name, seq.name) FROM sys.sequences seq, sys.schemas s WHERE seq.schema_id = s.id\n"
    5994             :                         "          UNION ALL\n"
    5995             :                         "          SELECT f.id, ft.function_type_keyword, qf.nme FROM sys.functions f, sys.function_types ft, sys.schemas s, sys.fully_qualified_functions qf\n"
    5996             :                         "           WHERE NOT f.system AND f.type = ft.function_type_id AND f.schema_id = s.id AND qf.id = f.id\n"
    5997             :                         "          ) AS o(id, tpe, nme)\n"
    5998             :                         "  JOIN sys.comments cm ON cm.id = o.id;\n"
    5999             :                         "GRANT SELECT ON sys.describe_comments TO PUBLIC;\n"
    6000             :                         "CREATE VIEW sys.dump_comments AS\n"
    6001             :                         "  SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\n"
    6002             :                         "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    6003             :                         "BEGIN\n"
    6004             :                         "  SET SCHEMA sys;\n"
    6005             :                         "  TRUNCATE sys.dump_statements;\n"
    6006             :                         "  INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    6007             :                         "  INSERT INTO sys.dump_statements VALUES (2, 'SET SCHEMA \"sys\";');\n"
    6008             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    6009             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    6010             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    6011             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    6012             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    6013             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    6014             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    6015             :                         "  --functions and table-likes can be interdependent. They should be inserted in the order of their catalogue id.\n"
    6016             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    6017             :                         "                              FROM (\n"
    6018             :                         "                                SELECT f.o, f.stmt FROM sys.dump_functions f\n"
    6019             :                         "                                 UNION ALL\n"
    6020             :                         "                                SELECT t.o, t.stmt FROM sys.dump_tables t\n"
    6021             :                         "                              ) AS stmts(o, s);\n"
    6022             :                         "  IF NOT DESCRIBE THEN\n"
    6023             :                         "    CALL sys.dump_table_data();\n"
    6024             :                         "  END IF;\n"
    6025             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    6026             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    6027             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    6028             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    6029             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    6030             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    6031             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    6032             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    6033             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_grants;\n"
    6034             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_grants;\n"
    6035             :                         "  INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_function_grants;\n"
    6036             :                         "  INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    6037             :                         "  RETURN sys.dump_statements;\n"
    6038             :                         "END;\n"
    6039             :                         "update sys._tables set system = true where schema_id = 2000 and name in ('describe_comments','dump_comments');\n"
    6040             :                         "update sys.functions set system = true where system <> true and schema_id = 2000 and name = 'dump_database' and type = 5;\n";
    6041             : 
    6042           8 :                         printf("Running database upgrade commands:\n%s\n", cmds);
    6043           8 :                         fflush(stdout);
    6044           8 :                         err = SQLstatementIntern(c, cmds, "update", true, false, NULL);
    6045             :                 }
    6046         101 :                 res_table_destroy(output);
    6047         101 :                 output = NULL;
    6048             :         }
    6049             : 
    6050             :         /* 52_describe.sql New function sys.sql_datatype(mtype varchar(999), digits integer, tscale integer, nameonly boolean, shortname boolean) */
    6051         101 :         allocator *old_sa = sql->sa;
    6052         101 :         if ((sql->sa = sa_create(sql->pa)) != NULL) {
    6053         101 :                 list *l;
    6054         101 :                 if ((l = sa_list(sql->sa)) != NULL) {
    6055         101 :                         sql_subtype t1, t2;
    6056         101 :                         sql_find_subtype(&t1, "int", 0, 0);
    6057         101 :                         sql_find_subtype(&t2, "boolean", 0, 0);
    6058         101 :                         list_append(l, &tp);
    6059         101 :                         list_append(l, &t1);
    6060         101 :                         list_append(l, &t1);
    6061         101 :                         list_append(l, &t2);
    6062         101 :                         list_append(l, &t2);
    6063         101 :                         if (!sql_bind_func_(sql, s->base.name, "sql_datatype", l, F_FUNC, true, true)) {
    6064           8 :                                 const char *cmds =
    6065             :                                 "CREATE FUNCTION sys.sql_datatype(mtype varchar(999), digits integer, tscale integer, nameonly boolean, shortname boolean)\n"
    6066             :                                 "  RETURNS varchar(1024)\n"
    6067             :                                 "BEGIN\n"
    6068             :                                 "  RETURN\n"
    6069             :                                 "    CASE mtype\n"
    6070             :                                 "    WHEN 'char' THEN sys.ifthenelse(nameonly OR digits <= 1, sys.ifthenelse(shortname, 'CHAR', 'CHARACTER'), sys.ifthenelse(shortname, 'CHAR(', 'CHARACTER(') || digits || ')')\n"
    6071             :                                 "    WHEN 'varchar' THEN sys.ifthenelse(nameonly OR digits = 0, sys.ifthenelse(shortname, 'VARCHAR', 'CHARACTER VARYING'), sys.ifthenelse(shortname, 'VARCHAR(', 'CHARACTER VARYING(') || digits || ')')\n"
    6072             :                                 "    WHEN 'clob' THEN sys.ifthenelse(nameonly OR digits = 0, sys.ifthenelse(shortname, 'CLOB', 'CHARACTER LARGE OBJECT'), sys.ifthenelse(shortname, 'CLOB(', 'CHARACTER LARGE OBJECT(') || digits || ')')\n"
    6073             :                                 "    WHEN 'blob' THEN sys.ifthenelse(nameonly OR digits = 0, sys.ifthenelse(shortname, 'BLOB', 'BINARY LARGE OBJECT'), sys.ifthenelse(shortname, 'BLOB(', 'BINARY LARGE OBJECT(') || digits || ')')\n"
    6074             :                                 "    WHEN 'int' THEN 'INTEGER'\n"
    6075             :                                 "    WHEN 'bigint' THEN 'BIGINT'\n"
    6076             :                                 "    WHEN 'smallint' THEN 'SMALLINT'\n"
    6077             :                                 "    WHEN 'tinyint' THEN 'TINYINT'\n"
    6078             :                                 "    WHEN 'hugeint' THEN 'HUGEINT'\n"
    6079             :                                 "    WHEN 'boolean' THEN 'BOOLEAN'\n"
    6080             :                                 "    WHEN 'date' THEN 'DATE'\n"
    6081             :                                 "    WHEN 'time' THEN sys.ifthenelse(nameonly OR digits = 1, 'TIME', 'TIME(' || (digits -1) || ')')\n"
    6082             :                                 "    WHEN 'timestamp' THEN sys.ifthenelse(nameonly OR digits = 7, 'TIMESTAMP', 'TIMESTAMP(' || (digits -1) || ')')\n"
    6083             :                                 "    WHEN 'timestamptz' THEN sys.ifthenelse(nameonly OR digits = 7, 'TIMESTAMP WITH TIME ZONE', 'TIMESTAMP(' || (digits -1) || ') WITH TIME ZONE')\n"
    6084             :                                 "    WHEN 'timetz' THEN sys.ifthenelse(nameonly OR digits = 1, 'TIME WITH TIME ZONE', 'TIME(' || (digits -1) || ') WITH TIME ZONE')\n"
    6085             :                                 "    WHEN 'decimal' THEN sys.ifthenelse(nameonly OR digits = 0, 'DECIMAL', 'DECIMAL(' || digits || sys.ifthenelse(tscale = 0, '', ',' || tscale) || ')')\n"
    6086             :                                 "    WHEN 'double' THEN sys.ifthenelse(nameonly OR (digits = 53 AND tscale = 0), sys.ifthenelse(shortname, 'DOUBLE', 'DOUBLE PRECISION'), 'FLOAT(' || digits || ')')\n"
    6087             :                                 "    WHEN 'real' THEN sys.ifthenelse(nameonly OR (digits = 24 AND tscale = 0), 'REAL', 'FLOAT(' || digits || ')')\n"
    6088             :                                 "    WHEN 'day_interval' THEN 'INTERVAL DAY'\n"
    6089             :                                 "    WHEN 'month_interval' THEN CASE digits WHEN 1 THEN 'INTERVAL YEAR' WHEN 2 THEN 'INTERVAL YEAR TO MONTH' WHEN 3 THEN 'INTERVAL MONTH' END\n"
    6090             :                                 "    WHEN 'sec_interval' THEN\n"
    6091             :                                 "  CASE digits\n"
    6092             :                                 "  WHEN 4 THEN 'INTERVAL DAY'\n"
    6093             :                                 "  WHEN 5 THEN 'INTERVAL DAY TO HOUR'\n"
    6094             :                                 "  WHEN 6 THEN 'INTERVAL DAY TO MINUTE'\n"
    6095             :                                 "  WHEN 7 THEN 'INTERVAL DAY TO SECOND'\n"
    6096             :                                 "  WHEN 8 THEN 'INTERVAL HOUR'\n"
    6097             :                                 "  WHEN 9 THEN 'INTERVAL HOUR TO MINUTE'\n"
    6098             :                                 "  WHEN 10 THEN 'INTERVAL HOUR TO SECOND'\n"
    6099             :                                 "  WHEN 11 THEN 'INTERVAL MINUTE'\n"
    6100             :                                 "  WHEN 12 THEN 'INTERVAL MINUTE TO SECOND'\n"
    6101             :                                 "  WHEN 13 THEN 'INTERVAL SECOND'\n"
    6102             :                                 "  END\n"
    6103             :                                 "    WHEN 'oid' THEN 'OID'\n"
    6104             :                                 "    WHEN 'json' THEN sys.ifthenelse(nameonly OR digits = 0, 'JSON', 'JSON(' || digits || ')')\n"
    6105             :                                 "    WHEN 'url' THEN sys.ifthenelse(nameonly OR digits = 0, 'URL', 'URL(' || digits || ')')\n"
    6106             :                                 "    WHEN 'xml' THEN sys.ifthenelse(nameonly OR digits = 0, 'XML', 'XML(' || digits || ')')\n"
    6107             :                                 "    WHEN 'geometry' THEN\n"
    6108             :                                 "  sys.ifthenelse(nameonly, 'GEOMETRY',\n"
    6109             :                                 "  CASE digits\n"
    6110             :                                 "  WHEN 4 THEN 'GEOMETRY(POINT' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6111             :                                 "  WHEN 8 THEN 'GEOMETRY(LINESTRING' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6112             :                                 "  WHEN 16 THEN 'GEOMETRY(POLYGON' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6113             :                                 "  WHEN 20 THEN 'GEOMETRY(MULTIPOINT' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6114             :                                 "  WHEN 24 THEN 'GEOMETRY(MULTILINESTRING' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6115             :                                 "  WHEN 28 THEN 'GEOMETRY(MULTIPOLYGON' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6116             :                                 "  WHEN 32 THEN 'GEOMETRY(GEOMETRYCOLLECTION' || sys.ifthenelse(tscale = 0, ')', ',' || tscale || ')')\n"
    6117             :                                 "  ELSE 'GEOMETRY'\n"
    6118             :                                 "        END)\n"
    6119             :                                 "    ELSE sys.ifthenelse(mtype = lower(mtype), upper(mtype), '\"' || mtype || '\"') || sys.ifthenelse(nameonly OR digits = 0, '', '(' || digits || sys.ifthenelse(tscale = 0, '', ',' || tscale) || ')')\n"
    6120             :                                 "    END;\n"
    6121             :                                 "END;\n"
    6122             :                                 "GRANT EXECUTE ON FUNCTION sys.sql_datatype(varchar(999), integer, integer, boolean, boolean) TO PUBLIC;\n"
    6123             :                                 "update sys.functions set system = true where system <> true and schema_id = 2000 and name = 'sql_datatype' and type = 1 and language = 2;\n";
    6124             : 
    6125           8 :                                 sql->session->status = 0;
    6126           8 :                                 sql->errstr[0] = '\0';
    6127           8 :                                 printf("Running database upgrade commands:\n%s\n", cmds);
    6128           8 :                                 fflush(stdout);
    6129           8 :                                 err = SQLstatementIntern(c, cmds, "update", true, false, NULL);
    6130             :                         }
    6131             :                 }
    6132         101 :                 sa_destroy(sql->sa);
    6133             :         }
    6134         101 :         sql->sa = old_sa;
    6135             : 
    6136             : 
    6137             :         /* 91_information_schema.sql */
    6138         101 :         info = mvc_bind_schema(sql, "information_schema");
    6139         101 :         if (info == NULL) {
    6140           8 :                 sql->session->status = 0; /* if the schema was not found clean the error */
    6141           8 :                 sql->errstr[0] = '\0';
    6142           8 :                 const char *cmds =
    6143             :                 "CREATE SCHEMA INFORMATION_SCHEMA;\n"
    6144             :                 "COMMENT ON SCHEMA INFORMATION_SCHEMA IS 'ISO/IEC 9075-11 SQL/Schemata';\n"
    6145             :                 "update sys.schemas set system = true where name = 'information_schema';\n"
    6146             : 
    6147             :                 "CREATE VIEW INFORMATION_SCHEMA.CHARACTER_SETS AS SELECT\n"
    6148             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_CATALOG,\n"
    6149             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_SCHEMA,\n"
    6150             :                 "  cast('UTF-8' AS varchar(16)) AS CHARACTER_SET_NAME,\n"
    6151             :                 "  cast('ISO/IEC 10646:2021' AS varchar(20)) AS CHARACTER_REPERTOIRE,\n"
    6152             :                 "  cast('UTF-8' AS varchar(16)) AS FORM_OF_USE,\n"
    6153             :                 "  cast(NULL AS varchar(1)) AS DEFAULT_COLLATE_CATALOG,\n"
    6154             :                 "  cast(NULL AS varchar(1)) AS DEFAULT_COLLATE_SCHEMA,\n"
    6155             :                 "  cast(NULL AS varchar(1)) AS DEFAULT_COLLATE_NAME;\n"
    6156             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.CHARACTER_SETS TO PUBLIC WITH GRANT OPTION;\n"
    6157             : 
    6158             :                 "CREATE VIEW INFORMATION_SCHEMA.SCHEMATA AS SELECT\n"
    6159             :                 "  cast(NULL AS varchar(1)) AS CATALOG_NAME,\n"
    6160             :                 "  s.\"name\" AS SCHEMA_NAME,\n"
    6161             :                 "  a.\"name\" AS SCHEMA_OWNER,\n"
    6162             :                 "  cast(NULL AS varchar(1)) AS DEFAULT_CHARACTER_SET_CATALOG,\n"
    6163             :                 "  cast(NULL AS varchar(1)) AS DEFAULT_CHARACTER_SET_SCHEMA,\n"
    6164             :                 "  cast('UTF-8' AS varchar(16)) AS DEFAULT_CHARACTER_SET_NAME,\n"
    6165             :                 "  cast(NULL AS varchar(1)) AS SQL_PATH,\n"
    6166             :                 "  s.\"id\" AS schema_id,\n"
    6167             :                 "  s.\"system\" AS is_system,\n"
    6168             :                 "  cm.\"remark\" AS comments\n"
    6169             :                 " FROM sys.\"schemas\" s\n"
    6170             :                 " INNER JOIN sys.\"auths\" a ON s.\"owner\" = a.\"id\"\n"
    6171             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON s.\"id\" = cm.\"id\"\n"
    6172             :                 " ORDER BY s.\"name\";\n"
    6173             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.SCHEMATA TO PUBLIC WITH GRANT OPTION;\n"
    6174             : 
    6175             :                 "CREATE VIEW INFORMATION_SCHEMA.TABLES AS SELECT\n"
    6176             :                 "  cast(NULL AS varchar(1)) AS TABLE_CATALOG,\n"
    6177             :                 "  s.\"name\" AS TABLE_SCHEMA,\n"
    6178             :                 "  t.\"name\" AS TABLE_NAME,\n"
    6179             :                 "  tt.\"table_type_name\" AS TABLE_TYPE,\n"
    6180             :                 "  cast(NULL AS varchar(1)) AS SELF_REFERENCING_COLUMN_NAME,\n"
    6181             :                 "  cast(NULL AS varchar(1)) AS REFERENCE_GENERATION,\n"
    6182             :                 "  cast(NULL AS varchar(1)) AS USER_DEFINED_TYPE_CATALOG,\n"
    6183             :                 "  cast(NULL AS varchar(1)) AS USER_DEFINED_TYPE_SCHEMA,\n"
    6184             :                 "  cast(NULL AS varchar(1)) AS USER_DEFINED_TYPE_NAME,\n"
    6185             :                 "  cast(sys.ifthenelse((t.\"type\" IN (0, 3, 7, 20, 30) AND t.\"access\" IN (0, 2)), 'YES', 'NO') AS varchar(3)) AS IS_INSERTABLE_INTO,\n"
    6186             :                 "  cast('NO' AS varchar(3)) AS IS_TYPED,\n"
    6187             :                 "  cast((CASE t.\"commit_action\" WHEN 1 THEN 'DELETE' WHEN 2 THEN 'PRESERVE' WHEN 3 THEN 'DROP' ELSE NULL END) AS varchar(10)) AS COMMIT_ACTION,\n"
    6188             :                 "  t.\"schema_id\" AS schema_id,\n"
    6189             :                 "  t.\"id\" AS table_id,\n"
    6190             :                 "  t.\"type\" AS table_type_id,\n"
    6191             :                 "  st.\"count\" AS row_count,\n"
    6192             :                 "  t.\"system\" AS is_system,\n"
    6193             :                 "  sys.ifthenelse(t.\"type\" IN (1, 11), TRUE, FALSE) AS is_view,\n"
    6194             :                 "  t.\"query\" AS query_def,\n"
    6195             :                 "  cm.\"remark\" AS comments\n"
    6196             :                 " FROM sys.\"tables\" t\n"
    6197             :                 " INNER JOIN sys.\"schemas\" s ON t.\"schema_id\" = s.\"id\"\n"
    6198             :                 " INNER JOIN sys.\"table_types\" tt ON t.\"type\" = tt.\"table_type_id\"\n"
    6199             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON t.\"id\" = cm.\"id\"\n"
    6200             :                 " LEFT OUTER JOIN (SELECT DISTINCT \"schema\", \"table\", \"count\" FROM sys.\"statistics\"()) st ON (s.\"name\" = st.\"schema\" AND t.\"name\" = st.\"table\")\n"
    6201             :                 " ORDER BY s.\"name\", t.\"name\";\n"
    6202             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.TABLES TO PUBLIC WITH GRANT OPTION;\n"
    6203             : 
    6204             :                 "CREATE VIEW INFORMATION_SCHEMA.VIEWS AS SELECT\n"
    6205             :                 "  cast(NULL AS varchar(1)) AS TABLE_CATALOG,\n"
    6206             :                 "  s.\"name\" AS TABLE_SCHEMA,\n"
    6207             :                 "  t.\"name\" AS TABLE_NAME,\n"
    6208             :                 "  t.\"query\" AS VIEW_DEFINITION,\n"
    6209             :                 "  cast('NONE' AS varchar(10)) AS CHECK_OPTION,\n"
    6210             :                 "  cast('NO' AS varchar(3)) AS IS_UPDATABLE,\n"
    6211             :                 "  cast('NO' AS varchar(3)) AS INSERTABLE_INTO,\n"
    6212             :                 "  cast('NO' AS varchar(3)) AS IS_TRIGGER_UPDATABLE,\n"
    6213             :                 "  cast('NO' AS varchar(3)) AS IS_TRIGGER_DELETABLE,\n"
    6214             :                 "  cast('NO' AS varchar(3)) AS IS_TRIGGER_INSERTABLE_INTO,\n"
    6215             :                 "  t.\"schema_id\" AS schema_id,\n"
    6216             :                 "  t.\"id\" AS table_id,\n"
    6217             :                 "  cast(sys.ifthenelse(t.\"system\", t.\"type\" + 10 , t.\"type\") AS smallint) AS table_type_id,\n"
    6218             :                 "  t.\"system\" AS is_system,\n"
    6219             :                 "  cm.\"remark\" AS comments\n"
    6220             :                 " FROM sys.\"_tables\" t\n"
    6221             :                 " INNER JOIN sys.\"schemas\" s ON t.\"schema_id\" = s.\"id\"\n"
    6222             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON t.\"id\" = cm.\"id\"\n"
    6223             :                 " WHERE t.\"type\" = 1\n"
    6224             :                 " ORDER BY s.\"name\", t.\"name\";\n"
    6225             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.VIEWS TO PUBLIC WITH GRANT OPTION;\n"
    6226             : 
    6227             :                 "CREATE VIEW INFORMATION_SCHEMA.COLUMNS AS SELECT\n"
    6228             :                 "  cast(NULL AS varchar(1)) AS TABLE_CATALOG,\n"
    6229             :                 "  s.\"name\" AS TABLE_SCHEMA,\n"
    6230             :                 "  t.\"name\" AS TABLE_NAME,\n"
    6231             :                 "  c.\"name\" AS COLUMN_NAME,\n"
    6232             :                 "  cast(1 + c.\"number\" AS int) AS ORDINAL_POSITION,\n"
    6233             :                 "  c.\"default\" AS COLUMN_DEFAULT,\n"
    6234             :                 "  cast(sys.ifthenelse(c.\"null\", 'YES', 'NO') AS varchar(3)) AS IS_NULLABLE,\n"
    6235             :                 "  cast(sys.\"sql_datatype\"(c.\"type\", c.\"type_digits\", c.\"type_scale\", true, true) AS varchar(1024)) AS DATA_TYPE,\n"
    6236             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('varchar','clob','char','json','url','xml') AND c.\"type_digits\" > 0, c.\"type_digits\", NULL) AS int) AS CHARACTER_MAXIMUM_LENGTH,\n"
    6237             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('varchar','clob','char','json','url','xml') AND c.\"type_digits\" > 0, 4 * cast(c.\"type_digits\" as bigint), NULL) AS bigint) AS CHARACTER_OCTET_LENGTH,\n"
    6238             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), c.\"type_digits\", NULL) AS int) AS NUMERIC_PRECISION,\n"
    6239             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','oid'), 2, sys.ifthenelse(c.\"type\" IN ('decimal','numeric'), 10, NULL)) AS int) AS NUMERIC_PRECISION_RADIX,\n"
    6240             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), c.\"type_scale\", NULL) AS int) AS NUMERIC_SCALE,\n"
    6241             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('date','timestamp','timestamptz','time','timetz'), sys.ifthenelse(c.\"type_scale\" > 0, c.\"type_scale\" -1, 0), NULL) AS int) AS DATETIME_PRECISION,\n"
    6242             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('day_interval','month_interval','sec_interval'), sys.\"sql_datatype\"(c.\"type\", c.\"type_digits\", c.\"type_scale\", true, true), NULL) AS varchar(40)) AS INTERVAL_TYPE,\n"
    6243             :                 "  cast(CASE c.\"type\" WHEN 'day_interval' THEN 0 WHEN 'month_interval' THEN 0 WHEN 'sec_interval' THEN (sys.ifthenelse(c.\"type_digits\" IN (7, 10, 12, 13), sys.ifthenelse(c.\"type_scale\" > 0, c.\"type_scale\", 3), 0)) ELSE NULL END AS int) AS INTERVAL_PRECISION,\n"
    6244             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_CATALOG,\n"
    6245             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_SCHEMA,\n"
    6246             :                 "  cast(sys.ifthenelse(c.\"type\" IN ('varchar','clob','char','json','url','xml'), 'UTF-8', NULL) AS varchar(16)) AS CHARACTER_SET_NAME,\n"
    6247             :                 "  cast(NULL AS varchar(1)) AS COLLATION_CATALOG,\n"
    6248             :                 "  cast(NULL AS varchar(1)) AS COLLATION_SCHEMA,\n"
    6249             :                 "  cast(NULL AS varchar(1)) AS COLLATION_NAME,\n"
    6250             :                 "  cast(NULL AS varchar(1)) AS DOMAIN_CATALOG,\n"
    6251             :                 "  cast(NULL AS varchar(1)) AS DOMAIN_SCHEMA,\n"
    6252             :                 "  cast(NULL AS varchar(1)) AS DOMAIN_NAME,\n"
    6253             :                 "  cast(NULL AS varchar(1)) AS UDT_CATALOG,\n"
    6254             :                 "  cast(NULL AS varchar(1)) AS UDT_SCHEMA,\n"
    6255             :                 "  cast(NULL AS varchar(1)) AS UDT_NAME,\n"
    6256             :                 "  cast(NULL AS varchar(1)) AS SCOPE_CATALOG,\n"
    6257             :                 "  cast(NULL AS varchar(1)) AS SCOPE_SCHEMA,\n"
    6258             :                 "  cast(NULL AS varchar(1)) AS SCOPE_NAME,\n"
    6259             :                 "  cast(NULL AS int) AS MAXIMUM_CARDINALITY,\n"
    6260             :                 "  cast(NULL AS varchar(1)) AS DTD_IDENTIFIER,\n"
    6261             :                 "  cast('NO' AS varchar(3)) AS IS_SELF_REFERENCING,\n"
    6262             :                 "  cast(sys.ifthenelse(seq.\"name\" IS NULL OR c.\"null\", 'NO', 'YES') AS varchar(3)) AS IS_IDENTITY,\n"
    6263             :                 "  seq.\"name\" AS IDENTITY_GENERATION,\n"
    6264             :                 "  seq.\"start\" AS IDENTITY_START,\n"
    6265             :                 "  seq.\"increment\" AS IDENTITY_INCREMENT,\n"
    6266             :                 "  seq.\"maxvalue\" AS IDENTITY_MAXIMUM,\n"
    6267             :                 "  seq.\"minvalue\" AS IDENTITY_MINIMUM,\n"
    6268             :                 "  cast(sys.ifthenelse(seq.\"name\" IS NULL, NULL, sys.ifthenelse(seq.\"cycle\", 'YES', 'NO')) AS varchar(3)) AS IDENTITY_CYCLE,\n"
    6269             :                 "  cast(sys.ifthenelse(seq.\"name\" IS NULL, 'NO', 'YES') AS varchar(3)) AS IS_GENERATED,\n"
    6270             :                 "  cast(sys.ifthenelse(seq.\"name\" IS NULL, NULL, c.\"default\") AS varchar(1024)) AS GENERATION_EXPRESSION,\n"
    6271             :                 "  cast('NO' AS varchar(3)) AS IS_SYSTEM_TIME_PERIOD_START,\n"
    6272             :                 "  cast('NO' AS varchar(3)) AS IS_SYSTEM_TIME_PERIOD_END,\n"
    6273             :                 "  cast('NO' AS varchar(3)) AS SYSTEM_TIME_PERIOD_TIMESTAMP_GENERATION,\n"
    6274             :                 "  cast(sys.ifthenelse(t.\"type\" IN (0,3,7,20,30), 'YES', 'NO') AS varchar(3)) AS IS_UPDATABLE,\n"
    6275             :                 "  cast(NULL AS varchar(1)) AS DECLARED_DATA_TYPE,\n"
    6276             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_PRECISION,\n"
    6277             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_SCALE,\n"
    6278             :                 "  t.\"schema_id\" AS schema_id,\n"
    6279             :                 "  c.\"table_id\" AS table_id,\n"
    6280             :                 "  c.\"id\" AS column_id,\n"
    6281             :                 "  seq.\"id\" AS sequence_id,\n"
    6282             :                 "  t.\"system\" AS is_system,\n"
    6283             :                 "  cm.\"remark\" AS comments\n"
    6284             :                 " FROM sys.\"columns\" c\n"
    6285             :                 " INNER JOIN sys.\"tables\" t ON c.\"table_id\" = t.\"id\"\n"
    6286             :                 " INNER JOIN sys.\"schemas\" s ON t.\"schema_id\" = s.\"id\"\n"
    6287             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON c.\"id\" = cm.\"id\"\n"
    6288             :                 " LEFT OUTER JOIN sys.\"sequences\" seq ON ((seq.\"name\"||'\"') = substring(c.\"default\", 3 + sys.\"locate\"('\".\"seq_',c.\"default\",14)))\n"
    6289             :                 " ORDER BY s.\"name\", t.\"name\", c.\"number\";\n"
    6290             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.COLUMNS TO PUBLIC WITH GRANT OPTION;\n"
    6291             : 
    6292             :                 "CREATE VIEW INFORMATION_SCHEMA.CHECK_CONSTRAINTS AS SELECT\n"
    6293             :                 "  cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,\n"
    6294             :                 "  cast(NULL AS varchar(1024)) AS CONSTRAINT_SCHEMA,\n"
    6295             :                 "  cast(NULL AS varchar(1024)) AS CONSTRAINT_NAME,\n"
    6296             :                 "  cast(NULL AS varchar(1024)) AS CHECK_CLAUSE\n"
    6297             :                 " WHERE 1=0;\n"
    6298             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.CHECK_CONSTRAINTS TO PUBLIC WITH GRANT OPTION;\n"
    6299             : 
    6300             :                 "CREATE VIEW INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS SELECT\n"
    6301             :                 "  cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,\n"
    6302             :                 "  s.\"name\" AS CONSTRAINT_SCHEMA,\n"
    6303             :                 "  k.\"name\" AS CONSTRAINT_NAME,\n"
    6304             :                 "  cast(NULL AS varchar(1)) AS TABLE_CATALOG,\n"
    6305             :                 "  s.\"name\" AS TABLE_SCHEMA,\n"
    6306             :                 "  t.\"name\" AS TABLE_NAME,\n"
    6307             :                 "  cast(CASE k.\"type\" WHEN 0 THEN 'PRIMARY KEY' WHEN 1 THEN 'UNIQUE' WHEN 2 THEN 'FOREIGN KEY' ELSE NULL END AS varchar(16)) AS CONSTRAINT_TYPE,\n"
    6308             :                 "  cast('NO' AS varchar(3)) AS IS_DEFERRABLE,\n"
    6309             :                 "  cast('NO' AS varchar(3)) AS INITIALLY_DEFERRED,\n"
    6310             :                 "  cast('YES' AS varchar(3)) AS ENFORCED,\n"
    6311             :                 "  t.\"schema_id\" AS schema_id,\n"
    6312             :                 "  t.\"id\" AS table_id,\n"
    6313             :                 "  k.\"id\" AS key_id,\n"
    6314             :                 "  k.\"type\" AS key_type,\n"
    6315             :                 "  t.\"system\" AS is_system\n"
    6316             :                 " FROM (SELECT sk.\"id\", sk.\"table_id\", sk.\"name\", sk.\"type\" FROM sys.\"keys\" sk UNION ALL SELECT tk.\"id\", tk.\"table_id\", tk.\"name\", tk.\"type\" FROM tmp.\"keys\" tk) k\n"
    6317             :                 " INNER JOIN (SELECT st.\"id\", st.\"schema_id\", st.\"name\", st.\"system\" FROM sys.\"_tables\" st UNION ALL"
    6318             :                         " SELECT tt.\"id\", tt.\"schema_id\", tt.\"name\", tt.\"system\" FROM tmp.\"_tables\" tt) t ON k.\"table_id\" = t.\"id\"\n"
    6319             :                 " INNER JOIN sys.\"schemas\" s ON t.\"schema_id\" = s.\"id\"\n"
    6320             :                 " ORDER BY s.\"name\", t.\"name\", k.\"name\";\n"
    6321             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.TABLE_CONSTRAINTS TO PUBLIC WITH GRANT OPTION;\n"
    6322             : 
    6323             :                 "CREATE VIEW INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS SELECT\n"
    6324             :                 "  cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,\n"
    6325             :                 "  s.\"name\" AS CONSTRAINT_SCHEMA,\n"
    6326             :                 "  fk.\"name\" AS CONSTRAINT_NAME,\n"
    6327             :                 "  cast(NULL AS varchar(1)) AS UNIQUE_CONSTRAINT_CATALOG,\n"
    6328             :                 "  uks.\"name\" AS UNIQUE_CONSTRAINT_SCHEMA,\n"
    6329             :                 "  uk.\"name\" AS UNIQUE_CONSTRAINT_NAME,\n"
    6330             :                 "  cast('FULL' AS varchar(7)) AS MATCH_OPTION,\n"
    6331             :                 "  fk.\"update_action\" AS UPDATE_RULE,\n"
    6332             :                 "  fk.\"delete_action\" AS DELETE_RULE,\n"
    6333             :                 "  t.\"schema_id\" AS fk_schema_id,\n"
    6334             :                 "  t.\"id\" AS fk_table_id,\n"
    6335             :                 "  t.\"name\" AS fk_table_name,\n"
    6336             :                 "  fk.\"id\" AS fk_key_id,\n"
    6337             :                 "  ukt.\"schema_id\" AS uc_schema_id,\n"
    6338             :                 "  uk.\"table_id\" AS uc_table_id,\n"
    6339             :                 "  ukt.\"name\" AS uc_table_name,\n"
    6340             :                 "  uk.\"id\" AS uc_key_id\n"
    6341             :                 " FROM sys.\"fkeys\" fk\n"
    6342             :                 " INNER JOIN sys.\"tables\" t ON t.\"id\" = fk.\"table_id\"\n"
    6343             :                 " INNER JOIN sys.\"schemas\" s ON s.\"id\" = t.\"schema_id\"\n"
    6344             :                 " LEFT OUTER JOIN sys.\"keys\" uk ON uk.\"id\" = fk.\"rkey\"\n"
    6345             :                 " LEFT OUTER JOIN sys.\"tables\" ukt ON ukt.\"id\" = uk.\"table_id\"\n"
    6346             :                 " LEFT OUTER JOIN sys.\"schemas\" uks ON uks.\"id\" = ukt.\"schema_id\"\n"
    6347             :                 " ORDER BY s.\"name\", t.\"name\", fk.\"name\";\n"
    6348             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS TO PUBLIC WITH GRANT OPTION;\n"
    6349             : 
    6350             :                 "CREATE VIEW INFORMATION_SCHEMA.ROUTINES AS SELECT\n"
    6351             :                 "  cast(NULL AS varchar(1)) AS SPECIFIC_CATALOG,\n"
    6352             :                 "  s.\"name\" AS SPECIFIC_SCHEMA,\n"
    6353             :                 "  cast(f.\"name\"||'('||f.\"id\"||')' AS varchar(270)) AS SPECIFIC_NAME,\n"
    6354             :                 "  cast(NULL AS varchar(1)) AS ROUTINE_CATALOG,\n"
    6355             :                 "  s.\"name\" AS ROUTINE_SCHEMA,\n"
    6356             :                 "  f.\"name\" AS ROUTINE_NAME,\n"
    6357             :                 "  ft.\"function_type_keyword\" AS ROUTINE_TYPE,\n"
    6358             :                 "  cast(NULL AS varchar(1)) AS MODULE_CATALOG,\n"
    6359             :                 "  cast(NULL AS varchar(1)) AS MODULE_SCHEMA,\n"
    6360             :                 "  cast(f.\"mod\" AS varchar(128)) AS MODULE_NAME,\n"
    6361             :                 "  cast(NULL AS varchar(1)) AS UDT_CATALOG,\n"
    6362             :                 "  cast(NULL AS varchar(1)) AS UDT_SCHEMA,\n"
    6363             :                 "  cast(NULL AS varchar(1)) AS UDT_NAME,\n"
    6364             :                 "  cast(CASE f.\"type\" WHEN 1 THEN sys.\"sql_datatype\"(a.\"type\", a.\"type_digits\", a.\"type_scale\", true, true) WHEN 2 THEN NULL WHEN 5 THEN 'TABLE' WHEN 7 THEN 'TABLE' ELSE NULL END AS varchar(1024)) AS DATA_TYPE,\n"
    6365             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('varchar','clob','char','json','url','xml') AND a.\"type_digits\" > 0, a.\"type_digits\", NULL) AS int) AS CHARACTER_MAXIMUM_LENGTH,\n"
    6366             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('varchar','clob','char','json','url','xml') AND a.\"type_digits\" > 0, 4 * cast(a.\"type_digits\" as bigint), NULL) AS bigint) AS CHARACTER_OCTET_LENGTH,\n"
    6367             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_CATALOG,\n"
    6368             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_SCHEMA,\n"
    6369             :                 "  'UTF-8' AS CHARACTER_SET_NAME,\n"
    6370             :                 "  cast(NULL AS varchar(1)) AS COLLATION_CATALOG,\n"
    6371             :                 "  cast(NULL AS varchar(1)) AS COLLATION_SCHEMA,\n"
    6372             :                 "  cast(NULL AS varchar(1)) AS COLLATION_NAME,\n"
    6373             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), a.\"type_digits\", NULL) AS int) AS NUMERIC_PRECISION,\n"
    6374             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','oid'), 2, sys.ifthenelse(a.\"type\" IN ('decimal','numeric'), 10, NULL)) AS int) AS NUMERIC_PRECISION_RADIX,\n"
    6375             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), a.\"type_scale\", NULL) AS int) AS NUMERIC_SCALE,\n"
    6376             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('date','timestamp','timestamptz','time','timetz'), a.\"type_scale\" -1, NULL) AS int) AS DATETIME_PRECISION,\n"
    6377             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('day_interval','month_interval','sec_interval'), sys.\"sql_datatype\"(a.\"type\", a.\"type_digits\", a.\"type_scale\", true, true), NULL) AS varchar(40)) AS INTERVAL_TYPE,\n"
    6378             :                 "  cast(CASE a.\"type\" WHEN 'day_interval' THEN 0 WHEN 'month_interval' THEN 0 WHEN 'sec_interval' THEN (sys.ifthenelse(a.\"type_digits\" IN (7, 10, 12, 13), sys.ifthenelse(a.\"type_scale\" > 0, a.\"type_scale\", 3), 0)) ELSE NULL END AS int) AS INTERVAL_PRECISION,\n"
    6379             :                 "  cast(NULL AS varchar(1)) AS TYPE_UDT_CATALOG,\n"
    6380             :                 "  cast(NULL AS varchar(1)) AS TYPE_UDT_SCHEMA,\n"
    6381             :                 "  cast(NULL AS varchar(1)) AS TYPE_UDT_NAME,\n"
    6382             :                 "  cast(NULL AS varchar(1)) AS SCOPE_CATALOG,\n"
    6383             :                 "  cast(NULL AS varchar(1)) AS SCOPE_SCHEMA,\n"
    6384             :                 "  cast(NULL AS varchar(1)) AS SCOPE_NAME,\n"
    6385             :                 "  cast(NULL AS int) AS MAXIMUM_CARDINALITY,\n"
    6386             :                 "  cast(NULL AS int) AS DTD_IDENTIFIER,\n"
    6387             :                 "  cast(sys.\"ifthenelse\"(sys.\"locate\"('begin',f.\"func\") > 0, sys.\"ifthenelse\"(sys.\"endswith\"(f.\"func\",';'), sys.\"substring\"(f.\"func\", sys.\"locate\"('begin',f.\"func\"), sys.\"length\"(sys.\"substring\"(f.\"func\", sys.\"locate\"('begin',f.\"func\")))-1), sys.\"substring\"(f.\"func\", sys.\"locate\"('begin',f.\"func\"))), NULL) AS varchar(8196)) AS ROUTINE_BODY,\n"
    6388             :                 "  f.\"func\" AS ROUTINE_DEFINITION,\n"
    6389             :                 "  cast(sys.\"ifthenelse\"(sys.\"locate\"('external name',f.\"func\") > 0, sys.\"ifthenelse\"(sys.\"endswith\"(f.\"func\",';'), sys.\"substring\"(f.\"func\", 14 + sys.\"locate\"('external name',f.\"func\"), sys.\"length\"(sys.\"substring\"(f.\"func\", 14 + sys.\"locate\"('external name',f.\"func\")))-1), sys.\"substring\"(f.\"func\", 14 + sys.\"locate\"('external name',f.\"func\"))), NULL) AS varchar(1024)) AS EXTERNAL_NAME,\n"
    6390             :                 "  fl.\"language_keyword\" AS EXTERNAL_LANGUAGE,\n"
    6391             :                 "  'GENERAL' AS PARAMETER_STYLE,\n"
    6392             :                 "  'YES' AS IS_DETERMINISTIC,\n"
    6393             :                 "  cast(sys.ifthenelse(f.\"side_effect\", 'MODIFIES', 'READ') AS varchar(10)) AS SQL_DATA_ACCESS,\n"
    6394             :                 "  cast(CASE f.\"type\" WHEN 2 THEN NULL ELSE 'NO' END AS varchar(3)) AS IS_NULL_CALL,\n"
    6395             :                 "  cast(NULL AS varchar(1)) AS SQL_PATH,\n"
    6396             :                 "  cast(NULL AS varchar(1)) AS SCHEMA_LEVEL_ROUTINE,\n"
    6397             :                 "  cast(NULL AS int) AS MAX_DYNAMIC_RESULT_SETS,\n"
    6398             :                 "  cast(NULL AS varchar(1)) AS IS_USER_DEFINED_CAST,\n"
    6399             :                 "  cast(NULL AS varchar(1)) AS IS_IMPLICITLY_INVOCABLE,\n"
    6400             :                 "  cast(NULL AS varchar(1)) AS SECURITY_TYPE,\n"
    6401             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_CATALOG,\n"
    6402             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_SCHEMA,\n"
    6403             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_NAME,\n"
    6404             :                 "  cast(NULL AS varchar(1)) AS AS_LOCATOR,\n"
    6405             :                 "  cast(NULL AS timestamp) AS CREATED,\n"
    6406             :                 "  cast(NULL AS timestamp) AS LAST_ALTERED,\n"
    6407             :                 "  cast(NULL AS varchar(1)) AS NEW_SAVEPOINT_LEVEL,\n"
    6408             :                 "  cast(NULL AS varchar(1)) AS IS_UDT_DEPENDENT,\n"
    6409             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_FROM_DATA_TYPE,\n"
    6410             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_AS_LOCATOR,\n"
    6411             :                 "  cast(NULL AS int) AS RESULT_CAST_CHAR_MAX_LENGTH,\n"
    6412             :                 "  cast(NULL AS int) AS RESULT_CAST_CHAR_OCTET_LENGTH,\n"
    6413             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_CHAR_SET_CATALOG,\n"
    6414             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_CHAR_SET_SCHEMA,\n"
    6415             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_CHARACTER_SET_NAME,\n"
    6416             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_COLLATION_CATALOG,\n"
    6417             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_COLLATION_SCHEMA,\n"
    6418             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_COLLATION_NAME,\n"
    6419             :                 "  cast(NULL AS int) AS RESULT_CAST_NUMERIC_PRECISION,\n"
    6420             :                 "  cast(NULL AS int) AS RESULT_CAST_NUMERIC_RADIX,\n"
    6421             :                 "  cast(NULL AS int) AS RESULT_CAST_NUMERIC_SCALE,\n"
    6422             :                 "  cast(NULL AS int) AS RESULT_CAST_DATETIME_PRECISION,\n"
    6423             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_INTERVAL_TYPE,\n"
    6424             :                 "  cast(NULL AS int) AS RESULT_CAST_INTERVAL_PRECISION,\n"
    6425             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_TYPE_UDT_CATALOG,\n"
    6426             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_TYPE_UDT_SCHEMA,\n"
    6427             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_TYPE_UDT_NAME,\n"
    6428             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_SCOPE_CATALOG,\n"
    6429             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_SCOPE_SCHEMA,\n"
    6430             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_SCOPE_NAME,\n"
    6431             :                 "  cast(NULL AS int) AS RESULT_CAST_MAX_CARDINALITY,\n"
    6432             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_DTD_IDENTIFIER,\n"
    6433             :                 "  cast(NULL AS varchar(1)) AS DECLARED_DATA_TYPE,\n"
    6434             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_PRECISION,\n"
    6435             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_SCALE,\n"
    6436             :                 "  cast(NULL AS varchar(1)) AS RESULT_CAST_FROM_DECLARED_DATA_TYPE,\n"
    6437             :                 "  cast(NULL AS int) AS RESULT_CAST_DECLARED_NUMERIC_PRECISION,\n"
    6438             :                 "  cast(NULL AS int) AS RESULT_CAST_DECLARED_NUMERIC_SCALE,\n"
    6439             :                 "  f.\"schema_id\" AS schema_id,\n"
    6440             :                 "  f.\"id\" AS function_id,\n"
    6441             :                 "  f.\"type\" AS function_type,\n"
    6442             :                 "  f.\"language\" AS function_language,\n"
    6443             :                 "  f.\"system\" AS is_system,\n"
    6444             :                 "  cm.\"remark\" AS comments\n"
    6445             :                 " FROM sys.\"functions\" f\n"
    6446             :                 " INNER JOIN sys.\"schemas\" s ON s.\"id\" = f.\"schema_id\"\n"
    6447             :                 " INNER JOIN sys.\"function_types\" ft ON ft.\"function_type_id\" = f.\"type\"\n"
    6448             :                 " INNER JOIN sys.\"function_languages\" fl ON fl.\"language_id\" = f.\"language\"\n"
    6449             :                 " LEFT OUTER JOIN sys.\"args\" a ON a.\"func_id\" = f.\"id\" and a.\"inout\" = 0 and a.\"number\" = 0\n"
    6450             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON cm.\"id\" = f.\"id\"\n"
    6451             :                 " WHERE f.\"type\" in (1, 2, 5, 7)\n"
    6452             :                 " ORDER BY s.\"name\", f.\"name\";\n"
    6453             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.ROUTINES TO PUBLIC WITH GRANT OPTION;\n"
    6454             : 
    6455             :                 "CREATE VIEW INFORMATION_SCHEMA.PARAMETERS AS SELECT\n"
    6456             :                 "  cast(NULL AS varchar(1)) AS SPECIFIC_CATALOG,\n"
    6457             :                 "  s.\"name\" AS SPECIFIC_SCHEMA,\n"
    6458             :                 "  cast(f.\"name\"||'('||f.\"id\"||')' AS varchar(270)) AS SPECIFIC_NAME,\n"
    6459             :                 "  cast(sys.ifthenelse((a.\"inout\" = 0 OR f.\"type\" = 2), 1 + a.\"number\", sys.ifthenelse(f.\"type\" = 1, a.\"number\", (1 + a.\"number\" - f.count_out_cols))) AS int) AS ORDINAL_POSITION,\n"
    6460             :                 "  cast(sys.ifthenelse(a.\"inout\" = 0, 'OUT', sys.ifthenelse(a.\"inout\" = 1, 'IN', 'INOUT')) as varchar(5)) AS PARAMETER_MODE,\n"
    6461             :                 "  cast(sys.ifthenelse(a.\"inout\" = 0, 'YES', 'NO') as varchar(3)) AS IS_RESULT,\n"
    6462             :                 "  cast(NULL AS varchar(1)) AS AS_LOCATOR,\n"
    6463             :                 "  a.\"name\" AS PARAMETER_NAME,\n"
    6464             :                 "  cast(NULL AS varchar(1)) AS FROM_SQL_SPECIFIC_CATALOG,\n"
    6465             :                 "  cast(NULL AS varchar(1)) AS FROM_SQL_SPECIFIC_SCHEMA,\n"
    6466             :                 "  cast(NULL AS varchar(1)) AS FROM_SQL_SPECIFIC_NAME,\n"
    6467             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_CATALOG,\n"
    6468             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_SCHEMA,\n"
    6469             :                 "  cast(NULL AS varchar(1)) AS TO_SQL_SPECIFIC_NAME,\n"
    6470             :                 "  cast(sys.\"sql_datatype\"(a.\"type\", a.\"type_digits\", a.\"type_scale\", true, true) AS varchar(1024)) AS DATA_TYPE,\n"
    6471             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('varchar','clob','char','json','url','xml') AND a.\"type_digits\" > 0, a.\"type_digits\", NULL) AS int) AS CHARACTER_MAXIMUM_LENGTH,\n"
    6472             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('varchar','clob','char','json','url','xml') AND a.\"type_digits\" > 0, 4 * cast(a.\"type_digits\" as bigint), NULL) AS bigint) AS CHARACTER_OCTET_LENGTH,\n"
    6473             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_CATALOG,\n"
    6474             :                 "  cast(NULL AS varchar(1)) AS CHARACTER_SET_SCHEMA,\n"
    6475             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('varchar','clob','char','json','url','xml'), 'UTF-8', NULL) AS varchar(16)) AS CHARACTER_SET_NAME,\n"
    6476             :                 "  cast(NULL AS varchar(1)) AS COLLATION_CATALOG,\n"
    6477             :                 "  cast(NULL AS varchar(1)) AS COLLATION_SCHEMA,\n"
    6478             :                 "  cast(NULL AS varchar(1)) AS COLLATION_NAME,\n"
    6479             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), a.\"type_digits\", NULL) AS int) AS NUMERIC_PRECISION,\n"
    6480             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','oid'), 2, sys.ifthenelse(a.\"type\" IN ('decimal','numeric'), 10, NULL)) AS int) AS NUMERIC_PRECISION_RADIX,\n"
    6481             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('int','smallint','tinyint','bigint','hugeint','float','real','double','decimal','numeric','oid'), a.\"type_scale\", NULL) AS int) AS NUMERIC_SCALE,\n"
    6482             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('date','timestamp','timestamptz','time','timetz'), sys.ifthenelse(a.\"type_scale\" > 0, a.\"type_scale\" -1, 0), NULL) AS int) AS DATETIME_PRECISION,\n"
    6483             :                 "  cast(sys.ifthenelse(a.\"type\" IN ('day_interval','month_interval','sec_interval'), sys.\"sql_datatype\"(a.\"type\", a.\"type_digits\", a.\"type_scale\", true, true), NULL) AS varchar(40)) AS INTERVAL_TYPE,\n"
    6484             :                 "  cast(CASE a.\"type\" WHEN 'day_interval' THEN 0 WHEN 'month_interval' THEN 0 WHEN 'sec_interval' THEN (sys.ifthenelse(a.\"type_digits\" IN (7, 10, 12, 13), sys.ifthenelse(a.\"type_scale\" > 0, a.\"type_scale\", 3), 0)) ELSE NULL END AS int) AS INTERVAL_PRECISION,\n"
    6485             :                 "  cast(NULL AS varchar(1)) AS UDT_CATALOG,\n"
    6486             :                 "  cast(NULL AS varchar(1)) AS UDT_SCHEMA,\n"
    6487             :                 "  cast(NULL AS varchar(1)) AS UDT_NAME,\n"
    6488             :                 "  cast(NULL AS varchar(1)) AS SCOPE_CATALOG,\n"
    6489             :                 "  cast(NULL AS varchar(1)) AS SCOPE_SCHEMA,\n"
    6490             :                 "  cast(NULL AS varchar(1)) AS SCOPE_NAME,\n"
    6491             :                 "  cast(NULL AS int) AS MAXIMUM_CARDINALITY,\n"
    6492             :                 "  cast(NULL AS varchar(1)) AS DTD_IDENTIFIER,\n"
    6493             :                 "  cast(NULL AS varchar(1)) AS DECLARED_DATA_TYPE,\n"
    6494             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_PRECISION,\n"
    6495             :                 "  cast(NULL AS int) AS DECLARED_NUMERIC_SCALE,\n"
    6496             :                 "  cast(NULL AS varchar(1)) AS PARAMETER_DEFAULT,\n"
    6497             :                 "  f.\"schema_id\" AS schema_id,\n"
    6498             :                 "  f.\"id\" AS function_id,\n"
    6499             :                 "  a.\"id\" AS arg_id,\n"
    6500             :                 "  f.\"name\" AS function_name,\n"
    6501             :                 "  f.\"type\" AS function_type,\n"
    6502             :                 "  f.\"system\" AS is_system\n"
    6503             :                 " FROM sys.\"args\" a\n"
    6504             :                 " INNER JOIN (SELECT fun.*, (select count(*) from sys.args a0 where a0.inout = 0 and a0.func_id = fun.id) as count_out_cols FROM sys.\"functions\" fun WHERE fun.\"type\" in (1, 2, 5, 7)) f ON f.\"id\" = a.\"func_id\"\n"
    6505             :                 " INNER JOIN sys.\"schemas\" s ON s.\"id\" = f.\"schema_id\"\n"
    6506             :                 " ORDER BY s.\"name\", f.\"name\", f.\"id\", a.\"inout\" DESC, a.\"number\";\n"
    6507             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.PARAMETERS TO PUBLIC WITH GRANT OPTION;\n"
    6508             : 
    6509             :                 "CREATE VIEW INFORMATION_SCHEMA.SEQUENCES AS SELECT\n"
    6510             :                 "  cast(NULL AS varchar(1)) AS SEQUENCE_CATALOG,\n"
    6511             :                 "  s.\"name\" AS SEQUENCE_SCHEMA,\n"
    6512             :                 "  sq.\"name\" AS SEQUENCE_NAME,\n"
    6513             :                 "  cast('BIGINT' AS varchar(16)) AS DATA_TYPE,\n"
    6514             :                 "  cast(64 AS SMALLINT) AS NUMERIC_PRECISION,\n"
    6515             :                 "  cast(2 AS SMALLINT) AS NUMERIC_PRECISION_RADIX,\n"
    6516             :                 "  cast(0 AS SMALLINT) AS NUMERIC_SCALE,\n"
    6517             :                 "  sq.\"start\" AS START_VALUE,\n"
    6518             :                 "  sq.\"minvalue\" AS MINIMUM_VALUE,\n"
    6519             :                 "  sq.\"maxvalue\" AS MAXIMUM_VALUE,\n"
    6520             :                 "  sq.\"increment\" AS INCREMENT,\n"
    6521             :                 "  cast(sys.ifthenelse(sq.\"cycle\", 'YES', 'NO') AS varchar(3)) AS CYCLE_OPTION,\n"
    6522             :                 "  cast(NULL AS varchar(16)) AS DECLARED_DATA_TYPE,\n"
    6523             :                 "  cast(NULL AS SMALLINT) AS DECLARED_NUMERIC_PRECISION,\n"
    6524             :                 "  cast(NULL AS SMALLINT) AS DECLARED_NUMERIC_SCALE,\n"
    6525             :                 "  sq.\"schema_id\" AS schema_id,\n"
    6526             :                 "  sq.\"id\" AS sequence_id,\n"
    6527             :                 "  get_value_for(s.\"name\", sq.\"name\") AS current_value,\n"
    6528             :                 "  sq.\"cacheinc\" AS cacheinc,\n"
    6529             :                 "  cm.\"remark\" AS comments\n"
    6530             :                 " FROM sys.\"sequences\" sq\n"
    6531             :                 " INNER JOIN sys.\"schemas\" s ON sq.\"schema_id\" = s.\"id\"\n"
    6532             :                 " LEFT OUTER JOIN sys.\"comments\" cm ON sq.\"id\" = cm.\"id\"\n"
    6533             :                 " ORDER BY s.\"name\", sq.\"name\";\n"
    6534             :                 "GRANT SELECT ON TABLE INFORMATION_SCHEMA.SEQUENCES TO PUBLIC WITH GRANT OPTION;\n"
    6535             :                 "\n"
    6536             :                 "update sys._tables set system = true where system <> true\n"
    6537             :                 " and schema_id = (select s.id from sys.schemas s where s.name = 'information_schema')\n"
    6538             :                 " and name in ('character_sets','check_constraints','columns','parameters','routines','schemata','sequences','referential_constraints','table_constraints','tables','views');\n";
    6539           8 :                 printf("Running database upgrade commands:\n%s\n", cmds);
    6540           8 :                 fflush(stdout);
    6541           8 :                 err = SQLstatementIntern(c, cmds, "update", true, false, NULL);
    6542             :         }
    6543             : 
    6544             :         /* 77_storage.sql */
    6545         101 :         sql_find_subtype(&tp, "varchar", 0, 0);
    6546             : 
    6547         101 :         if (!sql_bind_func(sql, s->base.name, "persist_unlogged", &tp, &tp, F_UNION, true, true)) {
    6548           8 :                 sql->session->status = 0;
    6549           8 :                 sql->errstr[0] = '\0';
    6550           8 :                 const char *query =
    6551             :                         "CREATE FUNCTION sys.persist_unlogged(sname STRING, tname STRING)\n"
    6552             :                         "RETURNS TABLE(\"table\" STRING, \"table_id\" INT, \"rowcount\" BIGINT)\n"
    6553             :                         "EXTERNAL NAME sql.persist_unlogged;\n"
    6554             :                         "GRANT EXECUTE ON FUNCTION sys.persist_unlogged(string, string) TO PUBLIC;\n"
    6555             :                         "UPDATE sys.functions SET system = true WHERE system <> true AND\n"
    6556             :                         "name = 'persist_unlogged' AND schema_id = 2000 AND type = 5 AND language = 1;\n";
    6557           8 :                 printf("Running database upgrade commands:\n%s\n", query);
    6558           8 :                 fflush(stdout);
    6559           8 :                 err = SQLstatementIntern(c, query, "update", true, false, NULL);
    6560             :         }
    6561             : 
    6562         101 :         return err;
    6563             : }
    6564             : 
    6565             : static str
    6566         101 : sql_update_dec2023_sp1(Client c, mvc *sql, sql_schema *s)
    6567             : {
    6568         101 :         char *err;
    6569         101 :         res_table *output;
    6570         101 :         BAT *b;
    6571             : 
    6572         101 :         (void) sql;
    6573         101 :         (void) s;
    6574             : 
    6575             :         /* json.isvalid(json) has been fixed to return NULL on NULL input */
    6576         101 :         err = SQLstatementIntern(c, "SELECT f.id FROM sys.functions f WHERE f.name = 'isvalid' AND f.schema_id = (SELECT s.id FROM sys.schemas s WHERE s.name = 'json') AND EXISTS (SELECT * FROM sys.args a WHERE a.func_id = f.id AND a.number = 1 AND a.type = 'json') AND f.func LIKE '%begin return true%';\n", "update", true, false, &output);
    6577         101 :         if (err)
    6578             :                 return err;
    6579         101 :         b = BATdescriptor(output->cols[0].b);
    6580         101 :         if (b) {
    6581         101 :                 if (BATcount(b) > 0) {
    6582           8 :                         const char *query = "drop function json.isvalid(json);\n"
    6583             :                                 "create function json.isvalid(js json)\n"
    6584             :                                 "returns bool begin return case when js is NULL then NULL else true end; end;\n"
    6585             :                                 "GRANT EXECUTE ON FUNCTION json.isvalid(json) TO PUBLIC;\n"
    6586             :                                 "update sys.functions set system = true where system <> true and name = 'isvalid' and schema_id = (select id from sys.schemas where name = 'json');\n";
    6587           8 :                         assert(BATcount(b) == 1);
    6588           8 :                         printf("Running database upgrade commands:\n%s\n", query);
    6589           8 :                         fflush(stdout);
    6590           8 :                         err = SQLstatementIntern(c, query, "update", true, false, NULL);
    6591             :                 }
    6592         101 :                 BBPunfix(b->batCacheid);
    6593             :         }
    6594         101 :         res_table_destroy(output);
    6595         101 :         return err;
    6596             : }
    6597             : 
    6598             : static str
    6599         101 : sql_update_default(Client c, mvc *sql, sql_schema *s)
    6600             : {
    6601         101 :         char *err;
    6602         101 :         res_table *output;
    6603         101 :         BAT *b;
    6604             : 
    6605         101 :         (void) sql;
    6606         101 :         (void) s;
    6607         101 :         err = SQLstatementIntern(c, "SELECT id FROM sys.functions WHERE schema_id = 2000 AND name = 'describe_type' AND func LIKE '%sql_datatype%';\n", "update", true, false, &output);
    6608         101 :         if (err)
    6609             :                 return err;
    6610         101 :         b = BATdescriptor(output->cols[0].b);
    6611         101 :         if (b) {
    6612         101 :                 if (BATcount(b) == 0) {
    6613             :                         /* do update */
    6614          16 :                         sql_table *t;
    6615          16 :                         const char *query =
    6616             :                                 "update sys._columns set type_digits = 7 where type = 'tinyint' and type_digits <> 7;\n"
    6617             :                                 "update sys._columns set type_digits = 15 where type = 'smallint' and type_digits <> 15;\n"
    6618             :                                 "update sys._columns set type_digits = 31 where type = 'int' and type_digits <> 31;\n"
    6619             :                                 "update sys._columns set type_digits = 63 where type = 'bigint' and type_digits <> 63;\n"
    6620             :                                 "update sys._columns set type_digits = 127 where type = 'hugeint' and type_digits <> 127;\n"
    6621             :                                 "update sys._columns set type = 'varchar' where type in ('clob', 'char') and table_id in (select id from sys._tables where system and name <> 'netcdf_files');\n"
    6622             :                                 "update sys.args set type_digits = 7 where type = 'tinyint' and type_digits <> 7;\n"
    6623             :                                 "update sys.args set type_digits = 15 where type = 'smallint' and type_digits <> 15;\n"
    6624             :                                 "update sys.args set type_digits = 31 where type = 'int' and type_digits <> 31;\n"
    6625             :                                 "update sys.args set type_digits = 63 where type = 'bigint' and type_digits <> 63;\n"
    6626             :                                 "update sys.args set type_digits = 127 where type = 'hugeint' and type_digits <> 127;\n"
    6627             :                                 "update sys.args set type = 'varchar' where type in ('clob', 'char');\n"
    6628             :                                 "drop aggregate median(decimal);\n"
    6629             :                                 "drop aggregate median_avg(decimal);\n"
    6630             :                                 "drop aggregate quantile(decimal, double);\n"
    6631             :                                 "drop aggregate quantile_avg(decimal, double);\n"
    6632             :                                 "create aggregate median(val DECIMAL(2)) returns DECIMAL(2)\n"
    6633             :                                 " external name \"aggr\".\"median\";\n"
    6634             :                                 "GRANT EXECUTE ON AGGREGATE median(DECIMAL(2)) TO PUBLIC;\n"
    6635             :                                 "create aggregate median(val DECIMAL(4)) returns DECIMAL(4)\n"
    6636             :                                 " external name \"aggr\".\"median\";\n"
    6637             :                                 "GRANT EXECUTE ON AGGREGATE median(DECIMAL(4)) TO PUBLIC;\n"
    6638             :                                 "create aggregate median(val DECIMAL(9)) returns DECIMAL(9)\n"
    6639             :                                 " external name \"aggr\".\"median\";\n"
    6640             :                                 "GRANT EXECUTE ON AGGREGATE median(DECIMAL(9)) TO PUBLIC;\n"
    6641             :                                 "create aggregate median(val DECIMAL(18)) returns DECIMAL(18)\n"
    6642             :                                 " external name \"aggr\".\"median\";\n"
    6643             :                                 "GRANT EXECUTE ON AGGREGATE median(DECIMAL(18)) TO PUBLIC;\n"
    6644             : #ifdef HAVE_HGE
    6645             :                                 "create aggregate median(val DECIMAL(38)) returns DECIMAL(38)\n"
    6646             :                                 " external name \"aggr\".\"median\";\n"
    6647             :                                 "GRANT EXECUTE ON AGGREGATE median(DECIMAL(38)) TO PUBLIC;\n"
    6648             : #endif
    6649             :                                 "create aggregate median_avg(val DECIMAL(2)) returns DOUBLE\n"
    6650             :                                 " external name \"aggr\".\"median_avg\";\n"
    6651             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL(2)) TO PUBLIC;\n"
    6652             :                                 "create aggregate median_avg(val DECIMAL(4)) returns DOUBLE\n"
    6653             :                                 " external name \"aggr\".\"median_avg\";\n"
    6654             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL(4)) TO PUBLIC;\n"
    6655             :                                 "create aggregate median_avg(val DECIMAL(9)) returns DOUBLE\n"
    6656             :                                 " external name \"aggr\".\"median_avg\";\n"
    6657             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL(9)) TO PUBLIC;\n"
    6658             :                                 "create aggregate median_avg(val DECIMAL(18)) returns DOUBLE\n"
    6659             :                                 " external name \"aggr\".\"median_avg\";\n"
    6660             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL(18)) TO PUBLIC;\n"
    6661             : #ifdef HAVE_HGE
    6662             :                                 "create aggregate median_avg(val DECIMAL(38)) returns DOUBLE\n"
    6663             :                                 " external name \"aggr\".\"median_avg\";\n"
    6664             :                                 "GRANT EXECUTE ON AGGREGATE median_avg(DECIMAL(38)) TO PUBLIC;\n"
    6665             : #endif
    6666             :                                 "create aggregate quantile(val DECIMAL(2), q DOUBLE) returns DECIMAL(2)\n"
    6667             :                                 " external name \"aggr\".\"quantile\";\n"
    6668             :                                 "GRANT EXECUTE ON AGGREGATE quantile(DECIMAL(2), DOUBLE) TO PUBLIC;\n"
    6669             :                                 "create aggregate quantile(val DECIMAL(4), q DOUBLE) returns DECIMAL(4)\n"
    6670             :                                 " external name \"aggr\".\"quantile\";\n"
    6671             :                                 "GRANT EXECUTE ON AGGREGATE quantile(DECIMAL(4), DOUBLE) TO PUBLIC;\n"
    6672             :                                 "create aggregate quantile(val DECIMAL(9), q DOUBLE) returns DECIMAL(9)\n"
    6673             :                                 " external name \"aggr\".\"quantile\";\n"
    6674             :                                 "GRANT EXECUTE ON AGGREGATE quantile(DECIMAL(9), DOUBLE) TO PUBLIC;\n"
    6675             :                                 "create aggregate quantile(val DECIMAL(18), q DOUBLE) returns DECIMAL(18)\n"
    6676             :                                 " external name \"aggr\".\"quantile\";\n"
    6677             :                                 "GRANT EXECUTE ON AGGREGATE quantile(DECIMAL(18), DOUBLE) TO PUBLIC;\n"
    6678             : #ifdef HAVE_HGE
    6679             :                                 "create aggregate quantile(val DECIMAL(38), q DOUBLE) returns DECIMAL(38)\n"
    6680             :                                 " external name \"aggr\".\"quantile\";\n"
    6681             :                                 "GRANT EXECUTE ON AGGREGATE quantile(DECIMAL(38), DOUBLE) TO PUBLIC;\n"
    6682             : #endif
    6683             :                                 "create aggregate quantile_avg(val DECIMAL(2), q DOUBLE) returns DOUBLE\n"
    6684             :                                 " external name \"aggr\".\"quantile_avg\";\n"
    6685             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL(2), DOUBLE) TO PUBLIC;\n"
    6686             :                                 "create aggregate quantile_avg(val DECIMAL(4), q DOUBLE) returns DOUBLE\n"
    6687             :                                 " external name \"aggr\".\"quantile_avg\";\n"
    6688             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL(4), DOUBLE) TO PUBLIC;\n"
    6689             :                                 "create aggregate quantile_avg(val DECIMAL(9), q DOUBLE) returns DOUBLE\n"
    6690             :                                 " external name \"aggr\".\"quantile_avg\";\n"
    6691             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL(9), DOUBLE) TO PUBLIC;\n"
    6692             :                                 "create aggregate quantile_avg(val DECIMAL(18), q DOUBLE) returns DOUBLE\n"
    6693             :                                 " external name \"aggr\".\"quantile_avg\";\n"
    6694             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL(18), DOUBLE) TO PUBLIC;\n"
    6695             : #ifdef HAVE_HGE
    6696             :                                 "create aggregate quantile_avg(val DECIMAL(38), q DOUBLE) returns DOUBLE\n"
    6697             :                                 " external name \"aggr\".\"quantile_avg\";\n"
    6698             :                                 "GRANT EXECUTE ON AGGREGATE quantile_avg(DECIMAL(38), DOUBLE) TO PUBLIC;\n"
    6699             : #endif
    6700             :                                 "drop function if exists sys.time_to_str(time with time zone, string) cascade;\n"
    6701             :                                 "drop function if exists sys.timestamp_to_str(timestamp with time zone, string) cascade;\n"
    6702             :                                 "create function time_to_str(d time, format string) returns string\n"
    6703             :                                 " external name mtime.\"time_to_str\";\n"
    6704             :                                 "create function time_to_str(d time with time zone, format string) returns string\n"
    6705             :                                 " external name mtime.\"timetz_to_str\";\n"
    6706             :                                 "create function timestamp_to_str(d timestamp with time zone, format string) returns string\n"
    6707             :                                 " external name mtime.\"timestamptz_to_str\";\n"
    6708             :                                 "grant execute on function time_to_str(time, string) to public;\n"
    6709             :                                 "grant execute on function time_to_str(time with time zone, string) to public;\n"
    6710             :                                 "grant execute on function timestamp_to_str(timestamp with time zone, string) to public;\n"
    6711             :                                 "update sys.functions set system = true where not system and schema_id = 2000 and name in ('time_to_str', 'timestamp_to_str', 'median', 'median_avg', 'quantile', 'quantile_avg');\n"
    6712             :                                 "drop function if exists sys.dump_database(boolean) cascade;\n"
    6713             :                                 "drop view sys.dump_comments;\n"
    6714             :                                 "drop view sys.dump_tables;\n"
    6715             :                                 "drop view sys.dump_functions;\n"
    6716             :                                 "drop view sys.dump_function_grants;\n"
    6717             :                                 "drop function if exists sys.describe_columns(string, string) cascade;\n"
    6718             :                                 "drop view sys.describe_functions;\n"
    6719             :                                 "drop view sys.describe_privileges;\n"
    6720             :                                 "drop view sys.describe_comments;\n"
    6721             :                                 "drop view sys.fully_qualified_functions;\n"
    6722             :                                 "drop view sys.describe_tables;\n"
    6723             :                                 "drop function if exists sys.describe_type(string, integer, integer) cascade;\n"
    6724             :                                 "CREATE FUNCTION sys.describe_type(ctype string, digits integer, tscale integer)\n"
    6725             :                                 " RETURNS string\n"
    6726             :                                 "BEGIN\n"
    6727             :                                 " RETURN sys.sql_datatype(ctype, digits, tscale, false, false);\n"
    6728             :                                 "END;\n"
    6729             :                                 "CREATE VIEW sys.describe_tables AS\n"
    6730             :                                 " SELECT\n"
    6731             :                                 " t.id o,\n"
    6732             :                                 " s.name sch,\n"
    6733             :                                 " t.name tab,\n"
    6734             :                                 " ts.table_type_name typ,\n"
    6735             :                                 " (SELECT\n"
    6736             :                                 " ' (' ||\n"
    6737             :                                 " GROUP_CONCAT(\n"
    6738             :                                 " sys.DQ(c.name) || ' ' ||\n"
    6739             :                                 " sys.describe_type(c.type, c.type_digits, c.type_scale) ||\n"
    6740             :                                 " ifthenelse(c.\"null\" = 'false', ' NOT NULL', '')\n"
    6741             :                                 " , ', ') || ')'\n"
    6742             :                                 " FROM sys._columns c\n"
    6743             :                                 " WHERE c.table_id = t.id) col,\n"
    6744             :                                 " CASE ts.table_type_name\n"
    6745             :                                 " WHEN 'REMOTE TABLE' THEN\n"
    6746             :                                 " sys.get_remote_table_expressions(s.name, t.name)\n"
    6747             :                                 " WHEN 'MERGE TABLE' THEN\n"
    6748             :                                 " sys.get_merge_table_partition_expressions(t.id)\n"
    6749             :                                 " WHEN 'VIEW' THEN\n"
    6750             :                                 " sys.schema_guard(s.name, t.name, t.query)\n"
    6751             :                                 " ELSE\n"
    6752             :                                 " ''\n"
    6753             :                                 " END opt\n"
    6754             :                                 " FROM sys.schemas s, sys.table_types ts, sys.tables t\n"
    6755             :                                 " WHERE ts.table_type_name IN ('TABLE', 'VIEW', 'MERGE TABLE', 'REMOTE TABLE', 'REPLICA TABLE', 'UNLOGGED TABLE')\n"
    6756             :                                 " AND t.system = FALSE\n"
    6757             :                                 " AND s.id = t.schema_id\n"
    6758             :                                 " AND ts.table_type_id = t.type\n"
    6759             :                                 " AND s.name <> 'tmp';\n"
    6760             :                                 "CREATE VIEW sys.fully_qualified_functions AS\n"
    6761             :                                 " WITH fqn(id, tpe, sig, num) AS\n"
    6762             :                                 " (\n"
    6763             :                                 " SELECT\n"
    6764             :                                 " f.id,\n"
    6765             :                                 " ft.function_type_keyword,\n"
    6766             :                                 " CASE WHEN a.type IS NULL THEN\n"
    6767             :                                 " sys.fqn(s.name, f.name) || '()'\n"
    6768             :                                 " ELSE\n"
    6769             :                                 " sys.fqn(s.name, f.name) || '(' || group_concat(sys.describe_type(a.type, a.type_digits, a.type_scale), ',') OVER (PARTITION BY f.id ORDER BY a.number)  || ')'\n"
    6770             :                                 " END,\n"
    6771             :                                 " a.number\n"
    6772             :                                 " FROM sys.schemas s, sys.function_types ft, sys.functions f LEFT JOIN sys.args a ON f.id = a.func_id\n"
    6773             :                                 " WHERE s.id= f.schema_id AND f.type = ft.function_type_id\n"
    6774             :                                 " )\n"
    6775             :                                 " SELECT\n"
    6776             :                                 " fqn1.id id,\n"
    6777             :                                 " fqn1.tpe tpe,\n"
    6778             :                                 " fqn1.sig nme\n"
    6779             :                                 " FROM\n"
    6780             :                                 " fqn fqn1 JOIN (SELECT id, max(num) FROM fqn GROUP BY id)  fqn2(id, num)\n"
    6781             :                                 " ON fqn1.id = fqn2.id AND (fqn1.num = fqn2.num OR fqn1.num IS NULL AND fqn2.num is NULL);\n"
    6782             :                                 "CREATE VIEW sys.describe_comments AS\n"
    6783             :                                 " SELECT o.id AS id, o.tpe AS tpe, o.nme AS fqn, cm.remark AS rem\n"
    6784             :                                 " FROM (\n"
    6785             :                                 " SELECT id, 'SCHEMA', sys.DQ(name) FROM sys.schemas WHERE NOT system\n"
    6786             :                                 " UNION ALL\n"
    6787             :                                 " SELECT t.id, ifthenelse(ts.table_type_name = 'VIEW', 'VIEW', 'TABLE'), sys.FQN(s.name, t.name)\n"
    6788             :                                 " FROM sys.schemas s JOIN sys._tables t ON s.id = t.schema_id JOIN sys.table_types ts ON t.type = ts.table_type_id\n"
    6789             :                                 " WHERE NOT t.system\n"
    6790             :                                 " UNION ALL\n"
    6791             :                                 " SELECT c.id, 'COLUMN', sys.FQN(s.name, t.name) || '.' || sys.DQ(c.name) FROM sys.columns c, sys._tables t, sys.schemas s WHERE NOT t.system AND c.table_id = t.id AND t.schema_id = s.id\n"
    6792             :                                 " UNION ALL\n"
    6793             :                                 " SELECT idx.id, 'INDEX', sys.FQN(s.name, idx.name) FROM sys.idxs idx, sys._tables t, sys.schemas s WHERE NOT t.system AND idx.table_id = t.id AND t.schema_id = s.id\n"
    6794             :                                 " UNION ALL\n"
    6795             :                                 " SELECT seq.id, 'SEQUENCE', sys.FQN(s.name, seq.name) FROM sys.sequences seq, sys.schemas s WHERE seq.schema_id = s.id\n"
    6796             :                                 " UNION ALL\n"
    6797             :                                 " SELECT f.id, ft.function_type_keyword, qf.nme FROM sys.functions f, sys.function_types ft, sys.schemas s, sys.fully_qualified_functions qf\n"
    6798             :                                 " WHERE NOT f.system AND f.type = ft.function_type_id AND f.schema_id = s.id AND qf.id = f.id\n"
    6799             :                                 " ) AS o(id, tpe, nme)\n"
    6800             :                                 " JOIN sys.comments cm ON cm.id = o.id;\n"
    6801             :                                 "CREATE VIEW sys.describe_privileges AS\n"
    6802             :                                 " SELECT\n"
    6803             :                                 " CASE\n"
    6804             :                                 " WHEN o.tpe IS NULL AND pc.privilege_code_name = 'SELECT' THEN --GLOBAL privileges: SELECT maps to COPY FROM\n"
    6805             :                                 " 'COPY FROM'\n"
    6806             :                                 " WHEN o.tpe IS NULL AND pc.privilege_code_name = 'UPDATE' THEN --GLOBAL privileges: UPDATE maps to COPY INTO\n"
    6807             :                                 " 'COPY INTO'\n"
    6808             :                                 " ELSE\n"
    6809             :                                 " o.nme\n"
    6810             :                                 " END o_nme,\n"
    6811             :                                 " coalesce(o.tpe, 'GLOBAL') o_tpe,\n"
    6812             :                                 " pc.privilege_code_name p_nme,\n"
    6813             :                                 " a.name a_nme,\n"
    6814             :                                 " g.name g_nme,\n"
    6815             :                                 " p.grantable grantable\n"
    6816             :                                 " FROM\n"
    6817             :                                 " sys.privileges p LEFT JOIN\n"
    6818             :                                 " (\n"
    6819             :                                 " SELECT t.id, s.name || '.' || t.name , 'TABLE'\n"
    6820             :                                 " from sys.schemas s, sys.tables t where s.id = t.schema_id\n"
    6821             :                                 " UNION ALL\n"
    6822             :                                 " SELECT c.id, s.name || '.' || t.name || '.' || c.name, 'COLUMN'\n"
    6823             :                                 " FROM sys.schemas s, sys.tables t, sys.columns c where s.id = t.schema_id AND t.id = c.table_id\n"
    6824             :                                 " UNION ALL\n"
    6825             :                                 " SELECT f.id, f.nme, f.tpe\n"
    6826             :                                 " FROM sys.fully_qualified_functions f\n"
    6827             :                                 " ) o(id, nme, tpe) ON o.id = p.obj_id,\n"
    6828             :                                 " sys.privilege_codes pc,\n"
    6829             :                                 " auths a, auths g\n"
    6830             :                                 " WHERE\n"
    6831             :                                 " p.privileges = pc.privilege_code_id AND\n"
    6832             :                                 " p.auth_id = a.id AND\n"
    6833             :                                 " p.grantor = g.id;\n"
    6834             :                                 "CREATE VIEW sys.describe_functions AS\n"
    6835             :                                 " WITH func_args_all(func_id, number, max_number, func_arg) AS\n"
    6836             :                                 " (\n"
    6837             :                                 " SELECT\n"
    6838             :                                 " func_id,\n"
    6839             :                                 " number,\n"
    6840             :                                 " max(number) OVER (PARTITION BY func_id ORDER BY number DESC),\n"
    6841             :                                 " group_concat(sys.dq(name) || ' ' || sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number)\n"
    6842             :                                 " FROM sys.args\n"
    6843             :                                 " WHERE inout = 1\n"
    6844             :                                 " ),\n"
    6845             :                                 " func_args(func_id, func_arg) AS\n"
    6846             :                                 " (\n"
    6847             :                                 " SELECT func_id, func_arg\n"
    6848             :                                 " FROM func_args_all\n"
    6849             :                                 " WHERE number = max_number\n"
    6850             :                                 " ),\n"
    6851             :                                 " func_rets_all(func_id, number, max_number, func_ret, func_ret_type) AS\n"
    6852             :                                 " (\n"
    6853             :                                 " SELECT\n"
    6854             :                                 " func_id,\n"
    6855             :                                 " number,\n"
    6856             :                                 " max(number) OVER (PARTITION BY func_id ORDER BY number DESC),\n"
    6857             :                                 " group_concat(sys.dq(name) || ' ' || sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number),\n"
    6858             :                                 " group_concat(sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number)\n"
    6859             :                                 " FROM sys.args\n"
    6860             :                                 " WHERE inout = 0\n"
    6861             :                                 " ),\n"
    6862             :                                 " func_rets(func_id, func_ret, func_ret_type) AS\n"
    6863             :                                 " (\n"
    6864             :                                 " SELECT\n"
    6865             :                                 " func_id,\n"
    6866             :                                 " func_ret,\n"
    6867             :                                 " func_ret_type\n"
    6868             :                                 " FROM func_rets_all\n"
    6869             :                                 " WHERE number = max_number\n"
    6870             :                                 " )\n"
    6871             :                                 " SELECT\n"
    6872             :                                 " f.id o,\n"
    6873             :                                 " s.name sch,\n"
    6874             :                                 " f.name fun,\n"
    6875             :                                 " CASE WHEN f.language IN (1, 2) THEN f.func ELSE 'CREATE ' || ft.function_type_keyword || ' ' || sys.FQN(s.name, f.name) || '(' || coalesce(fa.func_arg, '') || ')' || CASE WHEN f.type = 5 THEN ' RETURNS TABLE (' || coalesce(fr.func_ret, '') || ')' WHEN f.type IN (1,3) THEN ' RETURNS ' || fr.func_ret_type ELSE '' END || CASE WHEN fl.language_keyword IS NULL THEN '' ELSE ' LANGUAGE ' || fl.language_keyword END || ' ' || f.func END def\n"
    6876             :                                 " FROM sys.functions f\n"
    6877             :                                 " LEFT OUTER JOIN func_args fa ON fa.func_id = f.id\n"
    6878             :                                 " LEFT OUTER JOIN func_rets fr ON fr.func_id = f.id\n"
    6879             :                                 " JOIN sys.schemas s ON f.schema_id = s.id\n"
    6880             :                                 " JOIN sys.function_types ft ON f.type = ft.function_type_id\n"
    6881             :                                 " LEFT OUTER JOIN sys.function_languages fl ON f.language = fl.language_id\n"
    6882             :                                 " WHERE s.name <> 'tmp' AND NOT f.system;\n"
    6883             :                                 "CREATE FUNCTION sys.describe_columns(schemaName string, tableName string)\n"
    6884             :                                 " RETURNS TABLE(name string, type string, digits integer, scale integer, Nulls boolean, cDefault string, number integer, sqltype string, remark string)\n"
    6885             :                                 "BEGIN\n"
    6886             :                                 " RETURN SELECT c.name, c.\"type\", c.type_digits, c.type_scale, c.\"null\", c.\"default\", c.number, sys.describe_type(c.\"type\", c.type_digits, c.type_scale), com.remark\n"
    6887             :                                 " FROM sys._tables t, sys.schemas s, sys._columns c\n"
    6888             :                                 " LEFT OUTER JOIN sys.comments com ON c.id = com.id\n"
    6889             :                                 " WHERE c.table_id = t.id\n"
    6890             :                                 " AND t.name = tableName\n"
    6891             :                                 " AND t.schema_id = s.id\n"
    6892             :                                 " AND s.name = schemaName\n"
    6893             :                                 " ORDER BY c.number;\n"
    6894             :                                 "END;\n"
    6895             :                                 "CREATE VIEW sys.dump_function_grants AS\n"
    6896             :                                 " WITH func_args_all(func_id, number, max_number, func_arg) AS\n"
    6897             :                                 " (SELECT a.func_id,\n"
    6898             :                                 " a.number,\n"
    6899             :                                 " max(a.number) OVER (PARTITION BY a.func_id ORDER BY a.number DESC),\n"
    6900             :                                 " group_concat(sys.describe_type(a.type, a.type_digits, a.type_scale), ', ') OVER (PARTITION BY a.func_id ORDER BY a.number)\n"
    6901             :                                 " FROM sys.args a\n"
    6902             :                                 " WHERE a.inout = 1),\n"
    6903             :                                 " func_args(func_id, func_arg) AS\n"
    6904             :                                 " (SELECT func_id, func_arg FROM func_args_all WHERE number = max_number)\n"
    6905             :                                 " SELECT\n"
    6906             :                                 " 'GRANT ' || pc.privilege_code_name || ' ON ' || ft.function_type_keyword || ' '\n"
    6907             :                                 " || sys.FQN(s.name, f.name) || '(' || coalesce(fa.func_arg, '') || ') TO '\n"
    6908             :                                 " || ifthenelse(a.name = 'public', 'PUBLIC', sys.dq(a.name))\n"
    6909             :                                 " || CASE WHEN p.grantable = 1 THEN ' WITH GRANT OPTION' ELSE '' END || ';' stmt,\n"
    6910             :                                 " s.name schema_name,\n"
    6911             :                                 " f.name function_name,\n"
    6912             :                                 " a.name grantee\n"
    6913             :                                 " FROM sys.schemas s,\n"
    6914             :                                 " sys.functions f LEFT OUTER JOIN func_args fa ON f.id = fa.func_id,\n"
    6915             :                                 " sys.auths a,\n"
    6916             :                                 " sys.privileges p,\n"
    6917             :                                 " sys.auths g,\n"
    6918             :                                 " sys.function_types ft,\n"
    6919             :                                 " sys.privilege_codes pc\n"
    6920             :                                 " WHERE s.id = f.schema_id\n"
    6921             :                                 " AND f.id = p.obj_id\n"
    6922             :                                 " AND p.auth_id = a.id\n"
    6923             :                                 " AND p.grantor = g.id\n"
    6924             :                                 " AND p.privileges = pc.privilege_code_id\n"
    6925             :                                 " AND f.type = ft.function_type_id\n"
    6926             :                                 " AND NOT f.system\n"
    6927             :                                 " ORDER BY s.name, f.name, a.name, g.name, p.grantable;\n"
    6928             :                                 "CREATE VIEW sys.dump_functions AS\n"
    6929             :                                 " SELECT f.o o, sys.schema_guard(f.sch, f.fun, f.def) stmt,\n"
    6930             :                                 " f.sch schema_name,\n"
    6931             :                                 " f.fun function_name\n"
    6932             :                                 " FROM sys.describe_functions f;\n"
    6933             :                                 "CREATE VIEW sys.dump_tables AS\n"
    6934             :                                 " SELECT\n"
    6935             :                                 " t.o o,\n"
    6936             :                                 " CASE\n"
    6937             :                                 " WHEN t.typ <> 'VIEW' THEN\n"
    6938             :                                 " 'CREATE ' || t.typ || ' ' || sys.FQN(t.sch, t.tab) || t.col || t.opt || ';'\n"
    6939             :                                 " ELSE\n"
    6940             :                                 " t.opt\n"
    6941             :                                 " END stmt,\n"
    6942             :                                 " t.sch schema_name,\n"
    6943             :                                 " t.tab table_name\n"
    6944             :                                 " FROM sys.describe_tables t;\n"
    6945             :                                 "CREATE VIEW sys.dump_comments AS\n"
    6946             :                                 " SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\n"
    6947             :                                 "CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt STRING)\n"
    6948             :                                 "BEGIN\n"
    6949             :                                 " SET SCHEMA sys;\n"
    6950             :                                 " TRUNCATE sys.dump_statements;\n"
    6951             :                                 " INSERT INTO sys.dump_statements VALUES (1, 'START TRANSACTION;');\n"
    6952             :                                 " INSERT INTO sys.dump_statements VALUES (2, 'SET SCHEMA \"sys\";');\n"
    6953             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_roles;\n"
    6954             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_users;\n"
    6955             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_create_schemas;\n"
    6956             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_user_defined_types;\n"
    6957             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_add_schemas_to_users;\n"
    6958             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_grant_user_privileges;\n"
    6959             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_sequences;\n"
    6960             :                                 "\n"
    6961             :                                 " --functions and table-likes can be interdependent. They should be inserted in the order of their catalogue id.\n"
    6962             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
    6963             :                                 " FROM (\n"
    6964             :                                 " SELECT f.o, f.stmt FROM sys.dump_functions f\n"
    6965             :                                 " UNION ALL\n"
    6966             :                                 " SELECT t.o, t.stmt FROM sys.dump_tables t\n"
    6967             :                                 " ) AS stmts(o, s);\n"
    6968             :                                 "\n"
    6969             :                                 " -- dump table data before adding constraints and fixing sequences\n"
    6970             :                                 " IF NOT DESCRIBE THEN\n"
    6971             :                                 " CALL sys.dump_table_data();\n"
    6972             :                                 " END IF;\n"
    6973             :                                 "\n"
    6974             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_start_sequences;\n"
    6975             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_defaults;\n"
    6976             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_constraint_type;\n"
    6977             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_indices;\n"
    6978             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_foreign_keys;\n"
    6979             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_partition_tables;\n"
    6980             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_triggers;\n"
    6981             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_comments;\n"
    6982             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_table_grants;\n"
    6983             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_column_grants;\n"
    6984             :                                 " INSERT INTO sys.dump_statements SELECT (SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM sys.dump_function_grants;\n"
    6985             :                                 "\n"
    6986             :                                 " --TODO Improve performance of dump_table_data.\n"
    6987             :                                 " --TODO loaders, procedures, window and filter sys.functions.\n"
    6988             :                                 " --TODO look into order dependent group_concat\n"
    6989             :                                 "\n"
    6990             :                                 " INSERT INTO sys.dump_statements VALUES ((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
    6991             :                                 "\n"
    6992             :                                 " RETURN sys.dump_statements;\n"
    6993             :                                 "END;\n"
    6994             :                                 "GRANT SELECT ON sys.describe_tables TO PUBLIC;\n"
    6995             :                                 "GRANT SELECT ON sys.describe_comments TO PUBLIC;\n"
    6996             :                                 "GRANT SELECT ON sys.fully_qualified_functions TO PUBLIC;\n"
    6997             :                                 "GRANT SELECT ON sys.describe_privileges TO PUBLIC;\n"
    6998             :                                 "GRANT SELECT ON sys.describe_functions TO PUBLIC;\n"
    6999             :                                 "update sys.functions set system = true where not system and schema_id = 2000 and name in ('dump_database', 'describe_columns', 'describe_type');\n"
    7000             :                                 "update sys._tables set system = true where not system and schema_id = 2000 and name in ('dump_comments', 'dump_tables', 'dump_functions', 'dump_function_grants', 'describe_functions', 'describe_privileges', 'describe_comments', 'fully_qualified_functions', 'describe_tables');\n";
    7001          16 :                         if ((t = mvc_bind_table(sql, s, "dump_comments")) != NULL)
    7002          16 :                                 t->system = 0;
    7003          16 :                         if ((t = mvc_bind_table(sql, s, "dump_tables")) != NULL)
    7004          16 :                                 t->system = 0;
    7005          16 :                         if ((t = mvc_bind_table(sql, s, "dump_functions")) != NULL)
    7006          16 :                                 t->system = 0;
    7007          16 :                         if ((t = mvc_bind_table(sql, s, "dump_function_grants")) != NULL)
    7008          16 :                                 t->system = 0;
    7009          16 :                         if ((t = mvc_bind_table(sql, s, "describe_functions")) != NULL)
    7010          16 :                                 t->system = 0;
    7011          16 :                         if ((t = mvc_bind_table(sql, s, "describe_privileges")) != NULL)
    7012          16 :                                 t->system = 0;
    7013          16 :                         if ((t = mvc_bind_table(sql, s, "describe_comments")) != NULL)
    7014          16 :                                 t->system = 0;
    7015          16 :                         if ((t = mvc_bind_table(sql, s, "fully_qualified_functions")) != NULL)
    7016          16 :                                 t->system = 0;
    7017          16 :                         if ((t = mvc_bind_table(sql, s, "describe_tables")) != NULL)
    7018          16 :                                 t->system = 0;
    7019          16 :                         printf("Running database upgrade commands:\n%s\n", query);
    7020          16 :                         fflush(stdout);
    7021          16 :                         err = SQLstatementIntern(c, query, "update", true, false, NULL);
    7022             :                 }
    7023         101 :                 BBPunfix(b->batCacheid);
    7024             :         }
    7025         101 :         res_table_destroy(output);
    7026         101 :         return err;
    7027             : }
    7028             : 
    7029             : int
    7030         104 : SQLupgrades(Client c, mvc *m)
    7031             : {
    7032         104 :         sql_subtype tp;
    7033         104 :         sql_subfunc *f;
    7034         104 :         char *err;
    7035         104 :         sql_schema *s = mvc_bind_schema(m, "sys");
    7036             : 
    7037         104 :         if ((err = check_sys_tables(c, m, s)) != NULL) {
    7038           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7039           0 :                 goto handle_error;
    7040             :         }
    7041             : 
    7042             : #ifdef HAVE_HGE
    7043         104 :         sql_find_subtype(&tp, "hugeint", 0, 0);
    7044         104 :         if (!sql_bind_func(m, s->base.name, "var_pop", &tp, NULL, F_AGGR, true, true)) {
    7045           8 :                 m->session->status = 0; /* if the function was not found clean the error */
    7046           8 :                 m->errstr[0] = '\0';
    7047           8 :                 if ((err = sql_update_hugeint(c, m)) != NULL) {
    7048           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7049           0 :                         goto handle_error;
    7050             :                 }
    7051             :         }
    7052             : #endif
    7053             : 
    7054         104 :         if ((err = sql_update_generator(c)) != NULL) {
    7055           3 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7056           3 :                 goto handle_error;
    7057             :         }
    7058             : 
    7059         101 :         f = sql_bind_func_(m, s->base.name, "env", NULL, F_UNION, true, true);
    7060         101 :         m->session->status = 0; /* if the function was not found clean the error */
    7061         101 :         m->errstr[0] = '\0';
    7062         101 :         sqlstore *store = m->session->tr->store;
    7063         101 :         if (f && sql_privilege(m, ROLE_PUBLIC, f->func->base.id, PRIV_EXECUTE) != PRIV_EXECUTE) {
    7064           0 :                 sql_table *privs = find_sql_table(m->session->tr, s, "privileges");
    7065           0 :                 int pub = ROLE_PUBLIC, p = PRIV_EXECUTE, zero = 0, res;
    7066             : 
    7067           0 :                 if ((res = store->table_api.table_insert(m->session->tr, privs, &f->func->base.id, &pub, &p, &zero, &zero)) != LOG_OK) {
    7068           0 :                         TRC_CRITICAL(SQL_PARSER, "Privilege creation during upgrade failed\n");
    7069           0 :                         return -1;
    7070             :                 }
    7071             :         }
    7072             : 
    7073         101 :         if (sql_bind_func(m, s->base.name, "dependencies_schemas_on_users", NULL, NULL, F_UNION, true, true)
    7074           0 :          && sql_bind_func(m, s->base.name, "dependencies_owners_on_schemas", NULL, NULL, F_UNION, true, true)
    7075           0 :          && sql_bind_func(m, s->base.name, "dependencies_tables_on_views", NULL, NULL, F_UNION, true, true)
    7076           0 :          && sql_bind_func(m, s->base.name, "dependencies_tables_on_indexes", NULL, NULL, F_UNION, true, true)
    7077           0 :          && sql_bind_func(m, s->base.name, "dependencies_tables_on_triggers", NULL, NULL, F_UNION, true, true)
    7078           0 :          && sql_bind_func(m, s->base.name, "dependencies_tables_on_foreignkeys", NULL, NULL, F_UNION, true, true)
    7079           0 :          && sql_bind_func(m, s->base.name, "dependencies_tables_on_functions", NULL, NULL, F_UNION, true, true)
    7080           0 :          && sql_bind_func(m, s->base.name, "dependencies_columns_on_views", NULL, NULL, F_UNION, true, true)
    7081           0 :          && sql_bind_func(m, s->base.name, "dependencies_columns_on_keys", NULL, NULL, F_UNION, true, true)
    7082           0 :          && sql_bind_func(m, s->base.name, "dependencies_columns_on_indexes", NULL, NULL, F_UNION, true, true)
    7083           0 :          && sql_bind_func(m, s->base.name, "dependencies_columns_on_functions", NULL, NULL, F_UNION, true, true)
    7084           0 :          && sql_bind_func(m, s->base.name, "dependencies_columns_on_triggers", NULL, NULL, F_UNION, true, true)
    7085           0 :          && sql_bind_func(m, s->base.name, "dependencies_views_on_functions", NULL, NULL, F_UNION, true, true)
    7086           0 :          && sql_bind_func(m, s->base.name, "dependencies_views_on_triggers", NULL, NULL, F_UNION, true, true)
    7087           0 :          && sql_bind_func(m, s->base.name, "dependencies_functions_on_functions", NULL, NULL, F_UNION, true, true)
    7088           0 :          && sql_bind_func(m, s->base.name, "dependencies_functions_on_triggers", NULL, NULL, F_UNION, true, true)
    7089           0 :          && sql_bind_func(m, s->base.name, "dependencies_keys_on_foreignkeys", NULL, NULL, F_UNION, true, true)) {
    7090           0 :                 if ((err = sql_drop_functions_dependencies_Xs_on_Ys(c)) != NULL) {
    7091           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7092           0 :                         goto handle_error;
    7093             :                 }
    7094             :         } else {
    7095         101 :                 m->session->status = 0; /* if the function was not found clean the error */
    7096         101 :                 m->errstr[0] = '\0';
    7097             :         }
    7098             : 
    7099         101 :         sql_find_subtype(&tp, "varchar", 0, 0);
    7100         101 :         if (!sql_bind_func3(m, s->base.name, "deltas", &tp, &tp, &tp, F_UNION, true)) {
    7101           0 :                 m->session->status = 0; /* if the function was not found clean the error */
    7102           0 :                 m->errstr[0] = '\0';
    7103           0 :                 if ((err = sql_update_nov2019_missing_dependencies(c, m)) != NULL) {
    7104           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7105           0 :                         goto handle_error;
    7106             :                 }
    7107           0 :                 if ((err = sql_update_nov2019(c, m)) != NULL) {
    7108           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7109           0 :                         goto handle_error;
    7110             :                 }
    7111             :         }
    7112             : 
    7113             : #ifdef HAVE_HGE
    7114         101 :         sql_find_subtype(&tp, "hugeint", 0, 0);
    7115         101 :         if (!sql_bind_func(m, s->base.name, "median_avg", &tp, NULL, F_AGGR, true, true)) {
    7116           0 :                 m->session->status = 0; /* if the function was not found clean the error */
    7117           0 :                 m->errstr[0] = '\0';
    7118           0 :                 if ((err = sql_update_nov2019_sp1_hugeint(c, m)) != NULL) {
    7119           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7120           0 :                         goto handle_error;
    7121             :                 }
    7122             :         }
    7123             : #endif
    7124             : 
    7125         101 :         if (!sql_bind_func(m, s->base.name, "suspend_log_flushing", NULL, NULL, F_PROC, true, true)) {
    7126           0 :                 m->session->status = 0; /* if the function was not found clean the error */
    7127           0 :                 m->errstr[0] = '\0';
    7128           0 :                 if ((err = sql_update_jun2020(c, m)) != NULL) {
    7129           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7130           0 :                         goto handle_error;
    7131             :                 }
    7132             :         }
    7133             : 
    7134         101 :         if ((err = sql_update_jun2020_bam(c, m)) != NULL) {
    7135           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7136           0 :                 goto handle_error;
    7137             :         }
    7138             : 
    7139             : #ifdef HAVE_HGE
    7140         101 :         sql_find_subtype(&tp, "hugeint", 0, 0);
    7141         101 :         if (!sql_bind_func(m, s->base.name, "covar_pop", &tp, &tp, F_AGGR, true, true)) {
    7142           0 :                 m->session->status = 0; /* if the function was not found clean the error */
    7143           0 :                 m->errstr[0] = '\0';
    7144           0 :                 if ((err = sql_update_jun2020_sp1_hugeint(c)) != NULL) {
    7145           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7146           0 :                         goto handle_error;
    7147             :                 }
    7148             :         }
    7149             : #endif
    7150             : 
    7151         101 :         sql_find_subtype(&tp, "varchar", 0, 0);
    7152         101 :         if (sql_bind_func(m, s->base.name, "lidarattach", &tp, NULL, F_PROC, true, true)) {
    7153           0 :                 if ((err = sql_update_oscar_lidar(c)) != NULL) {
    7154           0 :                         TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7155           0 :                         goto handle_error;
    7156             :                 }
    7157             :         } else {
    7158         101 :                 m->session->status = 0; /* if the function was not found clean the error */
    7159         101 :                 m->errstr[0] = '\0';
    7160             :         }
    7161             : 
    7162         101 :         if ((err = sql_update_oscar(c, m)) != NULL) {
    7163           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7164           0 :                 goto handle_error;
    7165             :         }
    7166             : 
    7167         101 :         if ((err = sql_update_oct2020(c, m)) != NULL) {
    7168           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7169           0 :                 goto handle_error;
    7170             :         }
    7171             : 
    7172         101 :         if ((err = sql_update_oct2020_sp1(c, m)) != NULL) {
    7173           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7174           0 :                 goto handle_error;
    7175             :         }
    7176             : 
    7177         101 :         if ((err = sql_update_jul2021(c, m)) != NULL) {
    7178           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7179           0 :                 goto handle_error;
    7180             :         }
    7181             : 
    7182         101 :         if ((err = sql_update_jul2021_5(c, m)) != NULL) {
    7183           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7184           0 :                 goto handle_error;
    7185             :         }
    7186             : 
    7187         101 :         if ((err = sql_update_jan2022(c, m)) != NULL) {
    7188           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7189           0 :                 goto handle_error;
    7190             :         }
    7191             : 
    7192         101 :         if ((err = sql_update_sep2022(c, m, s)) != NULL) {
    7193           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7194           0 :                 goto handle_error;
    7195             :         }
    7196             : 
    7197         101 :         if ((err = sql_update_jun2023(c, m, s)) != NULL) {
    7198           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7199           0 :                 goto handle_error;
    7200             :         }
    7201             : 
    7202         101 :         if ((err = sql_update_dec2023_geom(c, m, s)) != NULL) {
    7203           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7204           0 :                 goto handle_error;
    7205             :         }
    7206             : 
    7207         101 :         if ((err = sql_update_jun2023_sp3(c, m, s)) != NULL) {
    7208           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7209           0 :                 goto handle_error;
    7210             :         }
    7211             : 
    7212         101 :         if ((err = sql_update_dec2023(c, m, s)) != NULL) {
    7213           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7214           0 :                 goto handle_error;
    7215             :         }
    7216             : 
    7217         101 :         if ((err = sql_update_dec2023_sp1(c, m, s)) != NULL) {
    7218           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7219           0 :                 goto handle_error;
    7220             :         }
    7221             : 
    7222         101 :         if ((err = sql_update_default(c, m, s)) != NULL) {
    7223           0 :                 TRC_CRITICAL(SQL_PARSER, "%s\n", err);
    7224           0 :                 goto handle_error;
    7225             :         }
    7226             : 
    7227             :         return 0;
    7228             : 
    7229           3 : handle_error:
    7230           3 :         freeException(err);
    7231           3 :         return -1;
    7232             : }

Generated by: LCOV version 1.14