Changeset: a1afb5cdfd97 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a1afb5cdfd97 Modified Files: sql/backends/monet5/sql_scenario.c sql/scripts/40_json.sql sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.err sql/test/testdb-upgrade/Tests/upgrade.stable.out Branch: default Log Message:
Implemented upgrade from Feb2013 branch to current branch. diffs (truncated from 715 to 300 lines): diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -642,6 +642,91 @@ sql_update_feb2013_sp3(Client c) return err; /* usually MAL_SUCCEED */ } +static str +sql_update_oct2013(Client c) +{ + char *buf = GDKmalloc(10240), *err = NULL; + size_t bufsize = 10240, pos = 0; + char *fullname; + FILE *fp1 = NULL, *fp2 = NULL, *fp3 = NULL; + ValRecord *schvar = stack_get_var(((backend *) c->sqlcontext)->mvc, "current_schema"); + char *schema = NULL; + + if (schvar) + schema = strdup(schvar->val.sval); + + snprintf(buf, bufsize, "createdb%c15_querylog", DIR_SEP); + if ((fullname = MSP_locate_sqlscript(buf, 1)) != NULL) { + fp1 = fopen(fullname, "r"); + GDKfree(fullname); + } + snprintf(buf, bufsize, "createdb%c26_sysmon", DIR_SEP); + if ((fullname = MSP_locate_sqlscript(buf, 1)) != NULL) { + fp2 = fopen(fullname, "r"); + GDKfree(fullname); + } + snprintf(buf, bufsize, "createdb%c40_json", DIR_SEP); + if ((fullname = MSP_locate_sqlscript(buf, 1)) != NULL) { + fp3 = fopen(fullname, "r"); + GDKfree(fullname); + } + + pos += snprintf(buf+pos, bufsize-pos, "set schema \"sys\";\n"); + + /* new entry in 16_tracelog.sql */ + pos += snprintf(buf+pos, bufsize-pos, "create view sys.tracelog as select * from sys.tracelog();\n"); + + /* deleted entry from 22_clients.sql */ + pos += snprintf(buf+pos, bufsize-pos, "drop function sys.clients;\n"); + + /* added entry in 25_debug.sql */ + pos += snprintf(buf+pos, bufsize-pos, "create view sys.optimizers as select * from sys.optimizers();\n"); + pos += snprintf(buf+pos, bufsize-pos, "create view sys.environment as select * from sys.environment();\n"); + + /* added entry in 75_storagemodel.sql */ + pos += snprintf(buf+pos, bufsize-pos, "create view sys.storage as select * from sys.storage();\n"); + pos += snprintf(buf+pos, bufsize-pos, "create view sys.storagemodel as select * from sys.storagemodel();\n"); + + /* replaced 15_history.sql by 15_querylog.sql */ + pos += snprintf(buf+pos, bufsize-pos, "drop procedure sys.resetHistory;\n"); + pos += snprintf(buf+pos, bufsize-pos, "drop procedure sys.keepCall;\n"); + pos += snprintf(buf+pos, bufsize-pos, "drop procedure sys.keepQuery;\n"); + pos += snprintf(buf+pos, bufsize-pos, "drop view sys.queryLog;\n"); + pos += snprintf(buf+pos, bufsize-pos, "drop table sys.callHistory;\n"); + pos += snprintf(buf+pos, bufsize-pos, "drop table sys.queryHistory;\n"); + if (fp1) { + pos += fread(buf+pos, 1, bufsize-pos, fp1); + fclose(fp1); + } + + /* new file 26_sysmon.sql */ + if (fp2) { + pos += fread(buf+pos, 1, bufsize-pos, fp2); + fclose(fp2); + } + + /* new file 40_json.sql */ + if (fp3) { + pos += fread(buf+pos, 1, bufsize-pos, fp3); + fclose(fp3); + } + + pos += snprintf(buf+pos, bufsize-pos, "insert into sys.systemfunctions (select f.id from sys.functions f, sys.schemas s where f.name in ('querylog_catalog', 'querylog_calls', 'queue', 'json_filter', 'json_filter_all', 'json_path', 'json_isvalid', 'json_isvalidobject', 'json_isvalidarray', 'json_length') and f.type = %d and f.schema_id = s.id and s.name = 'sys');\n", F_FUNC); + pos += snprintf(buf+pos, bufsize-pos, "insert into sys.systemfunctions (select f.id from sys.functions f, sys.schemas s where f.name in ('querylog_empty', 'querylog_enable', 'querylog_disable', 'pause', 'resume', 'sysmon_resume', 'stop') and f.type = %d and f.schema_id = s.id and s.name = 'sys');\n", F_PROC); + pos += snprintf(buf+pos, bufsize-pos, "update sys._tables set system = true where name in ('tracelog', 'optimizers', 'environment', 'storage', 'storagemodel') and schema_id = (select id from sys.schemas where name = 'sys');\n"); + + if (schema) { + pos += snprintf(buf+pos, bufsize-pos, "set schema \"%s\";\n", schema); + free(schema); + } + + assert(pos < 10240); + + printf("Running database upgrade commands:\n%s\n", buf); + err = SQLstatementIntern(c, &buf, "update", 1, 0); + GDKfree(buf); + return err; /* usually MAL_SUCCEED */ +} str SQLinitClient(Client c) @@ -848,6 +933,14 @@ SQLinitClient(Client c) GDKfree(err); } } + /* if function sys.querylog_catalog() does not exist, we + * need to update */ + if (!sql_bind_func(m->sa, mvc_bind_schema(m,"sys"), "querylog_catalog", NULL, NULL, F_FUNC )) { + if ((err = sql_update_oct2013(c)) != NULL) { + fprintf(stderr, "!%s\n", err); + GDKfree(err); + } + } } fflush(stdout); fflush(stderr); diff --git a/sql/scripts/40_json.sql b/sql/scripts/40_json.sql --- a/sql/scripts/40_json.sql +++ b/sql/scripts/40_json.sql @@ -21,28 +21,28 @@ create type json external name json; -- access the top level key by name, return its value -create function json_filter(js json, name string) +create function sys.json_filter(js json, name string) returns json external name json.filter; -create function json_filter_all(js json, name string) +create function sys.json_filter_all(js json, name string) returns json external name json.filterall; -- a simple path extractor -create function json_path(js json, e string) +create function sys.json_path(js json, e string) returns json external name json.path; -- test string for JSON compliancy -create function json_isvalid(js string) +create function sys.json_isvalid(js string) returns bool external name json.isvalid; -create function json_isvalidobject(js string) +create function sys.json_isvalidobject(js string) returns bool external name json.isvalidobject; -create function json_isvalidarray(js string) +create function sys.json_isvalidarray(js string) returns bool external name json.isvalidarray; -- return the number of primary components -create function json_length(js json) +create function sys.json_length(js json) returns integer external name json.length; -- The remainder awaits the implementation of @@ -50,26 +50,26 @@ returns integer external name json.lengt -- unnesting the JSON structure --- create function json_unnest(js json) +-- create function sys.json_unnest(js json) -- returns table( id integer, k string, v string) external name json.unnest; --- create function json_unnest(js json) +-- create function sys.json_unnest(js json) -- returns table( k string, v string) external name json.unnest; --- create function json_unnest(js json) +-- create function sys.json_unnest(js json) -- returns table( v string) external name json.unnest; --- create function json_nest table( id integer, k string, v string) +-- create function sys.json_nest table( id integer, k string, v string) -- returns json external name json.nest; --- create function json_names(js json) +-- create function sys.json_names(js json) -- returns table ( nme string) external name json.names; --- create function json_values(js json) +-- create function sys.json_values(js json) -- returns table ( val string) external name json."values"; -- rendering functions --- create function json_object(*) +-- create function sys.json_object(*) -- returns json external name json.objectrender; --- create function json_array(*) +-- create function sys.json_array(*) -- returns json external name json.arrayrender; diff --git a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out --- a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out +++ b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out @@ -28,9 +28,247 @@ create aggregate sys.median(val WRD) ret create aggregate sys.corr(e1 WRD, e2 WRD) returns WRD external name "aggr"."corr"; insert into sys.systemfunctions (select f.id from sys.functions f, sys.schemas s where f.name in ('stddev_samp', 'stddev_pop', 'var_samp', 'var_pop', 'median', 'corr') and f.type = 3 and f.schema_id = s.id and s.name = 'sys'); -# 15:38:36 > -# 15:38:36 > "/usr/bin/python2" "upgrade.SQL.py" "upgrade" -# 15:38:36 > +Running database upgrade commands: +set schema "sys"; +create view sys.tracelog as select * from sys.tracelog(); +drop function sys.clients; +create view sys.optimizers as select * from sys.optimizers(); +create view sys.environment as select * from sys.environment(); +create view sys.storage as select * from sys.storage(); +create view sys.storagemodel as select * from sys.storagemodel(); +drop procedure sys.resetHistory; +drop procedure sys.keepCall; +drop procedure sys.keepQuery; +drop view sys.queryLog; +drop table sys.callHistory; +drop table sys.queryHistory; +-- The contents of this file are subject to the MonetDB Public License +-- Version 1.1 (the "License"); you may not use this file except in +-- compliance with the License. You may obtain a copy of the License at +-- http://www.monetdb.org/Legal/MonetDBLicense +-- +-- Software distributed under the License is distributed on an "AS IS" +-- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +-- License for the specific language governing rights and limitations +-- under the License. +-- +-- The Original Code is the MonetDB Database System. +-- +-- The Initial Developer of the Original Code is CWI. +-- Copyright August 2008-2013 MonetDB B.V. +-- All Rights Reserved. + +-- QUERY HISTORY +-- The query history mechanism of MonetDB/SQL relies on a few hooks. +-- The most important one is a global system variable which controls +-- monitoring of all sessions. + +create function sys.querylog_catalog() +returns table( + id oid, + owner string, + defined timestamp, + query string, + pipe string, + mal int, -- size of MAL plan + optimize bigint -- time in usec +) +external name sql.querylog_catalog; + +-- Each query call is stored in the table calls +-- At regular intervals the query history table should be cleaned. +-- This can be done manually on the SQL console, or be integrated +-- in the keepQuery and keepCall upon need. +-- The parameters are geared at understanding the resource claims +-- They reflect the effect of the total workload mix during execution. +-- The 'cpu' gives the average cpu load percentage over all cores on the +-- server during execution phase. +-- increasing cpu load indicates better use of multi-cores. +-- The 'io' indicate IOs during complete query run. +-- The 'space' is the total amount of intermediates created in MB. +-- Reducing the space component improves performance/ +-- All timing in usec and all storage in bytes. + +create function sys.querylog_calls() +returns table( + id oid, -- references query plan + "start" timestamp, -- time the statement was started + "stop" timestamp, -- time the statement was completely finished + arguments string, -- actual call structure + tuples wrd, -- number of tuples in the result set + run bigint, -- time spent (in usec) until the result export + ship bigint, -- time spent (in usec) to ship the result set + cpu int, -- average cpu load percentage during execution + io int, -- percentage time waiting for IO to finish + space bigint -- total storage size of intermediates created (in MB) +) +external name sql.querylog_calls; + +-- create table views for convenience +create view sys.querylog_catalog as select * from sys.querylog_catalog(); +create view sys.querylog_calls as select * from sys.querylog_calls(); +create view sys.querylog_history as +select qd.*, ql."start",ql."stop", ql.arguments, ql.tuples, ql.run, ql.ship, ql.cpu, ql.space, ql.io +from sys.querylog_catalog() qd, sys.querylog_calls() ql +where qd.id = ql.id and qd.owner = user; + +update sys._tables + set system = true + where name in ('querylog_history', 'querylog_calls', 'querylog_catalog') + and schema_id = (select id from sys.schemas where name = 'sys'); + +-- reset history for a particular user +create procedure sys.querylog_empty() +external name sql.querylog_empty; + +-- manipulate the query logger +create procedure sys.querylog_enable() +external name sql.querylog_enable; +create procedure sys.querylog_enable(threshold smallint) +external name sql.querylog_enable_threshold; +create procedure sys.querylog_disable() +external name sql.querylog_disable; +-- The contents of this file are subject to the MonetDB Public License +-- Version 1.1 (the "License"); you may not use this file except in +-- compliance with the License. You may obtain a copy of the License at +-- http://www.monetdb.org/Legal/MonetDBLicense +-- +-- Software distributed under the License is distributed on an "AS IS" _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list