Changeset: e32cde70600d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e32cde70600d
Added Files:
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Modified Files:
gdk/gdk_bbp.c
sql/backends/monet5/sql_upgrades.c
sql/common/sql_types.c
Branch: default
Log Message:
Implemented upgrade from 64 to 128 bit database.
diffs (truncated from 344 to 300 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -987,7 +987,7 @@ BBPheader(FILE *fp, oid *BBPoid, int *OI
"expected pointer size %d, got %d, expected OID size
%d, got %d.",
SIZEOF_SIZE_T, ptrsize, SIZEOF_OID, oidsize);
}
- if (intsize != SIZEOF_MAX_INT) {
+ if (intsize > SIZEOF_MAX_INT) {
GDKfatal("BBPinit: database created with incompatible server:\n"
"expected max. integer size %d, got %d.",
SIZEOF_MAX_INT, intsize);
diff --git a/sql/backends/monet5/sql_upgrades.c
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -1010,6 +1010,113 @@ sql_update_oct2014_sp1(Client c)
return err; /* usually MAL_SUCCEED */
}
+#ifdef HAVE_HGE
+static str
+sql_update_hugeint(Client c)
+{
+ size_t bufsize = 8192, pos = 0;
+ char *buf = GDKmalloc(bufsize), *err = NULL;
+ mvc *sql = ((backend*) c->sqlcontext)->mvc;
+ ValRecord *schvar = stack_get_var(sql, "current_schema");
+ char *schema = NULL;
+
+ if (schvar)
+ schema = strdup(schvar->val.sval);
+
+ pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create function sys.fuse(one
bigint, two bigint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns hugeint\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name udf.fuse;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create function
sys.generate_series(first hugeint, last hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns table (value
hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
generator.series;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create function
sys.generate_series(first hugeint, last hugeint, stepsize hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns table (value
hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
generator.series;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.stddev_samp(val hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns double\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.stdev;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.stddev_pop(val hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns double\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.stdevp;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.var_samp(val hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns double\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.variance;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.var_pop(val hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns double\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.variancep;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.median(val hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns hugeint\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.median;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate
sys.quantile(val hugeint, q double)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns hugeint\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
aggr.quantile;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create aggregate sys.corr(e1
hugeint, e2 hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns hugeint\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name aggr.corr;\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "create function
json.filter(js json, name hugeint)\n");
+ pos += snprintf(buf + pos, bufsize - pos, "returns json\n");
+ pos += snprintf(buf + pos, bufsize - pos, "external name
json.filter;\n");
+ pos += snprintf(buf + pos, bufsize - pos, "drop view
sys.tablestoragemodel;\n");
+ pos += snprintf(buf + pos, bufsize - pos, "create view
sys.tablestoragemodel\n");
+ pos += snprintf(buf + pos, bufsize - pos, "as select
\"schema\",\"table\",max(count) as \"count\",\n");
+ pos += snprintf(buf + pos, bufsize - pos, "\tsum(columnsize) as
columnsize,\n");
+ pos += snprintf(buf + pos, bufsize - pos, "\tsum(heapsize) as
heapsize,\n");
+ pos += snprintf(buf + pos, bufsize - pos, "\tsum(hashes) as hashes,\n");
+ pos += snprintf(buf + pos, bufsize - pos, "\tsum(imprints) as
imprints,\n");
+ pos += snprintf(buf + pos, bufsize - pos, "\tsum(case when sorted =
false then 8 * count else 0 end) as auxillary\n");
+ pos += snprintf(buf + pos, bufsize - pos, "from sys.storagemodel()
group by \"schema\",\"table\";\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "insert into
sys.systemfunctions (select id from sys.functions where name in ('fuse',
'generate_series', 'stddev_samp', 'stddev_pop', 'var_samp', 'var_pop',
'median', 'quantile', 'corr', 'tablestoragemodel') and schema_id = (select id
from sys.schemas where name = 'sys') and id not in (select function_id from
sys.systemfunctions));\n");
+ pos += snprintf(buf + pos, bufsize - pos, "insert into
sys.systemfunctions (select id from sys.functions where name = 'filter' and
schema_id = (select id from sys.schemas where name = 'json') and id not in
(select function_id from sys.systemfunctions));\n");
+ pos += snprintf(buf + pos, bufsize - pos, "update sys._tables set
system = true where name = 'tablestoragemodel' and schema_id = (select id from
sys.schemas where name = 'sys');\n");
+
+ pos += snprintf(buf + pos, bufsize - pos, "insert into sys.types
values(%d, 'hge', 'hugeint', 128, 1, 2, 6, 0);\n", store_next_oid());
+ pos += snprintf(buf + pos, bufsize - pos, "insert into sys.types
values(%d, 'hge', 'decimal', 39, 1, 10, 8, 0);\n", store_next_oid());
+ pos += snprintf(buf + pos, bufsize - pos, "update sys.types set digits
= 18 where systemname = 'lng' and sqlname = 'decimal';\n");
+
+ {
+ char *msg;
+ mvc *sql = NULL;
+
+ if ((msg = getSQLContext(c, c->curprg->def, &sql, NULL)) !=
MAL_SUCCEED) {
+ GDKfree(msg);
+ } else {
+ sql_schema *s;
+
+ if ((s = mvc_bind_schema(sql, "sys")) != NULL) {
+ sql_table *t;
+
+ if ((t = mvc_bind_table(sql, s,
"tablestoragemodel")) != NULL)
+ t->system = 0;
+ }
+ }
+ }
+
+ if (schema) {
+ pos += snprintf(buf + pos, bufsize - pos, "set schema
\"%s\";\n", schema);
+ free(schema);
+ }
+ assert(pos < bufsize);
+
+ printf("Running database upgrade commands:\n%s\n", buf);
+ err = SQLstatementIntern(c, &buf, "update", 1, 0, NULL);
+ GDKfree(buf);
+ return err; /* usually MAL_SUCCEED */
+}
+#endif
+
static str
sql_update_feb2015(Client c)
{
@@ -1105,6 +1212,17 @@ SQLupgrades(Client c, mvc *m)
GDKfree(err);
}
}
+
+#ifdef HAVE_HGE
+ sql_find_subtype(&tp, "hugeint", 0, 0);
+ if (!sql_bind_aggr(m->sa, mvc_bind_schema(m, "sys"), "var_pop", &tp)) {
+ if ((err = sql_update_hugeint(c)) != NULL) {
+ fprintf(stderr, "!%s\n", err);
+ GDKfree(err);
+ }
+ }
+#endif
+
/* add missing features needed beyond Oct 2014 */
sql_find_subtype(&tp, "timestamp", 0, 0);
if ( 0 && !sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "epoch",
&tp, NULL, F_FUNC) ){
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1110,8 +1110,7 @@ many of the function signatures can be o
database kernel, we have chosen for this explicit scheme for one
simple reason. The SQL standard dictates the types and we have to
check their availability in the kernel only. The kernel itself could
-include manyfunctions for which their is no standard.
-lead to unexpected
+include many functions for which there is no standard.
*/
static void
diff --git a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
new file mode 100644
--- /dev/null
+++ b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
@@ -0,0 +1,88 @@
+stdout of test 'upgrade` in directory 'sql/test/testdb-upgrade-chain` itself:
+
+
+# 15:17:06 >
+# 15:17:06 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"gdk_dbfarm=/ufs/sjoerd/Monet-stable/var/MonetDB" "--set" "mapi_open=true"
"--set" "mapi_port=36250" "--set" "monet_prompt=" "--trace" "--forcemito"
"--set" "mal_listing=2" "--dbname=mTests_test_testdb-upgrade-chain" "--set"
"mal_listing=0"
+# 15:17:06 >
+
+# MonetDB 5 server v11.11.8 (hg id: 34fcf4e7226d+)
+# This is an unreleased version
+# Serving database 'mTests_test_testdb-upgrade-chain', using 8 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically
linked
+# Found 15.629 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://madrid.ins.cwi.nl:36250/
+# MonetDB/GIS module loaded
+# MonetDB/JAQL module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+Running database upgrade commands:
+set schema "sys";
+create function sys.fuse(one bigint, two bigint)
+returns hugeint
+external name udf.fuse;
+create function sys.generate_series(first hugeint, last hugeint)
+returns table (value hugeint)
+external name generator.series;
+create function sys.generate_series(first hugeint, last hugeint, stepsize
hugeint)
+returns table (value hugeint)
+external name generator.series;
+create aggregate sys.stddev_samp(val hugeint)
+returns double
+external name aggr.stdev;
+create aggregate sys.stddev_pop(val hugeint)
+returns double
+external name aggr.stdevp;
+create aggregate sys.var_samp(val hugeint)
+returns double
+external name aggr.variance;
+create aggregate sys.var_pop(val hugeint)
+returns double
+external name aggr.variancep;
+create aggregate sys.median(val hugeint)
+returns hugeint
+external name aggr.median;
+create aggregate sys.quantile(val hugeint, q double)
+returns hugeint
+external name aggr.quantile;
+create aggregate sys.corr(e1 hugeint, e2 hugeint)
+returns hugeint
+external name aggr.corr;
+create function json.filter(js json, name hugeint)
+returns json
+external name json.filter;
+drop view sys.tablestoragemodel;
+create view sys.tablestoragemodel
+as select "schema","table",max(count) as "count",
+ sum(columnsize) as columnsize,
+ sum(heapsize) as heapsize,
+ sum(hashes) as hashes,
+ sum(imprints) as imprints,
+ sum(case when sorted = false then 8 * count else 0 end) as auxillary
+from sys.storagemodel() group by "schema","table";
+insert into sys.systemfunctions (select id from sys.functions where name in
('fuse', 'generate_series', 'stddev_samp', 'stddev_pop', 'var_samp', 'var_pop',
'median', 'quantile', 'corr', 'tablestoragemodel') and schema_id = (select id
from sys.schemas where name = 'sys') and id not in (select function_id from
sys.systemfunctions));
+insert into sys.systemfunctions (select id from sys.functions where name =
'filter' and schema_id = (select id from sys.schemas where name = 'json') and
id not in (select function_id from sys.systemfunctions));
+update sys._tables set system = true where name = 'tablestoragemodel' and
schema_id = (select id from sys.schemas where name = 'sys');
+insert into sys.types values(7233, 'hge', 'hugeint', 128, 1, 2, 6, 0);
+insert into sys.types values(7234, 'hge', 'decimal', 39, 1, 10, 8, 0);
+update sys.types set digits = 18 where systemname = 'lng' and sqlname =
'decimal';
+set schema "testschema";
+
+# 09:43:35 >
+# 09:43:35 > "/usr/bin/python2" "upgrade.SQL.py" "upgrade"
+# 09:43:35 >
+
+#select count(*) from testschema.smallstring;
+% testschema.L1 # table_name
+% L1 # name
+% wrd # type
+% 2 # length
+[ 66 ]
+
+# 15:17:06 >
+# 15:17:06 > "Done."
+# 15:17:06 >
+
diff --git a/sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
b/sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
new file mode 100644
--- /dev/null
+++ b/sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
@@ -0,0 +1,86 @@
+stdout of test 'upgrade` in directory 'sql/test/testdb-upgrade` itself:
+
+
+# 21:49:40 >
+# 21:49:40 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=30515" "--set"
"mapi_usock=/var/tmp/mtest-14642/.s.monetdb.30515" "--set" "monet_prompt="
"--forcemito" "--set" "mal_listing=2"
"--dbpath=/ufs/sjoerd/Monet-devel/var/MonetDB/mTests_sql_test_testdb-upgrade"
"--set" "mal_listing=0"
+# 21:49:40 >
+
+# MonetDB 5 server v11.16.0 (hg id: fd9db07674cf+)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_testdb-upgrade', using 8 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically
linked
+# Found 15.591 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+
+
+Ready.
+Running database upgrade commands:
+set schema "sys";
+create function sys.fuse(one bigint, two bigint)
+returns hugeint
+external name udf.fuse;
+create function sys.generate_series(first hugeint, last hugeint)
+returns table (value hugeint)
+external name generator.series;
+create function sys.generate_series(first hugeint, last hugeint, stepsize
hugeint)
+returns table (value hugeint)
+external name generator.series;
+create aggregate sys.stddev_samp(val hugeint)
+returns double
+external name aggr.stdev;
+create aggregate sys.stddev_pop(val hugeint)
+returns double
+external name aggr.stdevp;
+create aggregate sys.var_samp(val hugeint)
+returns double
+external name aggr.variance;
+create aggregate sys.var_pop(val hugeint)
+returns double
+external name aggr.variancep;
+create aggregate sys.median(val hugeint)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list