Changeset: befa1b10e22b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/befa1b10e22b
Branch: nilmask
Log Message:
merged with default
diffs (truncated from 3604 to 300 lines):
diff --git a/monetdb5/modules/atoms/Tests/All b/monetdb5/modules/atoms/Tests/All
--- a/monetdb5/modules/atoms/Tests/All
+++ b/monetdb5/modules/atoms/Tests/All
@@ -38,3 +38,5 @@ startswith
endswith
contains
HAVE_ICONV?asciify
+
+ts_and_tstz_to_str_bug
diff --git a/monetdb5/modules/atoms/Tests/ts_and_tstz_to_str_bug.test
b/monetdb5/modules/atoms/Tests/ts_and_tstz_to_str_bug.test
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/Tests/ts_and_tstz_to_str_bug.test
@@ -0,0 +1,16 @@
+statement ok
+CREATE TABLE t2 (dt TIMESTAMP)
+
+statement ok
+INSERT INTO t2 (dt) VALUES('2023-10-11 11:36')
+
+query I
+SELECT
+ levenshtein(sys.timestamp_to_str(cast(dt as timestamp with time zone),
'%Y-%d-%d %H:%M:%S'),
+ sys.timestamp_to_str(dt, '%Y-%d-%d %H:%M:%S'))
+FROM t2
+----
+0
+
+statement ok
+DROP TABLE t2
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -282,7 +282,6 @@ extern str SQLflush_log(Client cntxt, Ma
extern str SQLsuspend_log_flushing(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
extern str SQLresume_log_flushing(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
extern str SQLhot_snapshot(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
-extern str SQLhot_snapshot_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
extern str SQLpersist_unlogged(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
extern str SQLsession_prepared_statements(Client cntxt, MalBlkPtr mb,
MalStkPtr stk, InstrPtr pci);
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
@@ -5179,6 +5179,7 @@ sql_update_jun2023(Client c, mvc *sql, s
char *err = NULL, *buf = GDKmalloc(bufsize);
res_table *output;
BAT *b;
+ sql_subtype t1, t2;
(void) sql;
if (buf == NULL)
@@ -5546,7 +5547,6 @@ sql_update_jun2023(Client c, mvc *sql, s
/* Add new sysadmin procedure calls: stop, pause and resume with two
arguments, first arg is query OID and second the user username that
the query in bound to. */
- sql_subtype t1, t2;
sql_find_subtype(&t1, "bigint", 64, 0);
sql_find_subtype(&t2, "varchar", 0, 0);
if (!sql_bind_func(sql, "sys", "pause", &t1, &t2, F_PROC, true)) {
@@ -5781,6 +5781,38 @@ sql_update_jun2023(Client c, mvc *sql, s
}
static str
+sql_update_jun2023_sp3(Client c, mvc *sql, sql_schema *s)
+{
+ (void)s;
+ char *err = NULL;
+ sql_subtype t1, t2;
+
+ sql_find_subtype(&t1, "timestamp", 0, 0);
+ sql_find_subtype(&t2, "varchar", 0, 0);
+
+ if (!sql_bind_func(sql, "sys", "timestamp_to_str", &t1, &t2, F_FUNC,
true)) {
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+
+ char *query = GDKmalloc(512);
+ if (query == NULL)
+ throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
+ snprintf(query, 512, "CREATE FUNCTION timestamp_to_str(d
TIMESTAMP, format STRING) RETURNS STRING "
+ "EXTERNAL NAME mtime.\"timestamp_to_str\";\n"
+ "GRANT EXECUTE ON FUNCTION
timestamp_to_str(TIMESTAMP, STRING) TO PUBLIC;\n"
+ "UPDATE sys.functions SET system = true WHERE
system <> true AND name = 'timestamp_to_str' "
+ "AND schema_id = 2000 and type = %d;\n",
F_FUNC);
+
+ printf("Running database upgrade commands:\n%s\n", query);
+ err = SQLstatementIntern(c, query, "update", true, false, NULL);
+ GDKfree(query);
+ }
+
+ return err; /* usually MAL_SUCCEED */
+}
+
+static str
sql_update_default_geom(Client c, mvc *sql, sql_schema *s)
{
sql_subtype tp;
@@ -6278,10 +6310,10 @@ sql_update_default(Client c, mvc *sql, s
"EXTERNAL NAME sql.persist_unlogged;\n"
"CREATE FUNCTION sys.persist_unlogged(sname STRING)\n"
"RETURNS TABLE(\"table\" STRING, \"table_id\" INT,
\"rowcount\" BIGINT)\n"
- "EXTERNAL NAME sql.persist_unlogged(string);\n"
+ "EXTERNAL NAME sql.persist_unlogged;\n"
"CREATE FUNCTION sys.persist_unlogged(sname STRING,
tname STRING)\n"
"RETURNS TABLE(\"table\" STRING, \"table_id\" INT,
\"rowcount\" BIGINT)\n"
- "EXTERNAL NAME sql.persist_unlogged(string, string);\n"
+ "EXTERNAL NAME sql.persist_unlogged;\n"
"GRANT EXECUTE ON FUNCTION sys.persist_unlogged() TO
PUBLIC;\n"
"UPDATE sys.functions SET system = true WHERE system <>
true AND\n"
"name = 'persist_unlogged' AND schema_id = 2000;\n";
@@ -6476,6 +6508,12 @@ SQLupgrades(Client c, mvc *m)
goto handle_error;
}
+ if ((err = sql_update_jun2023_sp3(c, m, s)) != NULL) {
+ TRC_CRITICAL(SQL_PARSER, "%s\n", err);
+ freeException(err);
+ return -1;
+ }
+
return 0;
handle_error:
diff --git a/sql/scripts/13_date.sql b/sql/scripts/13_date.sql
--- a/sql/scripts/13_date.sql
+++ b/sql/scripts/13_date.sql
@@ -21,6 +21,9 @@ create function time_to_str(d time with
create function str_to_timestamp(s string, format string) returns timestamp
with time zone
external name mtime."str_to_timestamp";
+create function timestamp_to_str(d timestamp, format string) returns string
+ external name mtime."timestamp_to_str";
+
create function timestamp_to_str(d timestamp with time zone, format string)
returns string
external name mtime."timestamp_to_str";
@@ -29,4 +32,5 @@ grant execute on function date_to_str to
grant execute on function str_to_time to public;
grant execute on function time_to_str to public;
grant execute on function str_to_timestamp to public;
-grant execute on function timestamp_to_str to public;
+grant execute on function timestamp_to_str(timestamp, string) to public;
+grant execute on function timestamp_to_str(timestamp with time zone, string)
to public;
diff --git
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
---
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
+++
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
@@ -105,7 +105,7 @@ 1
query I rowsort
select count(*) from sys.tracelog() where stmt like '%batcalc.timestamp%'
----
-1
+0
query T rowsort
SELECT sys.timestamp_to_str(case when task0."sys_created_on" >= '1999-10-31
09:00:00' and task0."sys_created_on" < '2000-04-02 10:00:00'
diff --git
a/sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
b/sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
---
a/sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
+++
b/sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
@@ -599,15 +599,15 @@ CREATE VIEW INFORMATION_SCHEMA.COLUMNS A
cast(c."number" +1 AS int) AS ORDINAL_POSITION,
c."default" AS COLUMN_DEFAULT,
cast(sys.ifthenelse(c."null", 'YES', 'NO') AS varchar(3)) AS IS_NULLABLE,
- c."type" AS DATA_TYPE,
+ CASE c."type" WHEN 'day_interval' THEN 'interval day' WHEN 'month_interval'
THEN 'interval month' WHEN 'sec_interval' THEN 'interval second' ELSE c."type"
END AS DATA_TYPE,
cast(sys.ifthenelse(c."type" IN
('varchar','clob','char','json','url','xml'), c."type_digits", NULL) AS int) AS
CHARACTER_MAXIMUM_LENGTH,
cast(sys.ifthenelse(c."type" IN
('varchar','clob','char','json','url','xml'), c."type_digits" * 3, NULL) AS
int) AS CHARACTER_OCTET_LENGTH,
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,
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,
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,
cast(sys.ifthenelse(c."type" IN
('date','timestamp','timestamptz','time','timetz'), c."type_scale" -1, NULL) AS
int) AS DATETIME_PRECISION,
- cast(CASE c."type" WHEN 'day_interval' THEN 'interval day' WHEN
'month_interval' THEN 'interval month' WHEN 'sec_interval' THEN 'interval
second' ELSE NULL END AS varchar(40)) AS INTERVAL_TYPE,
- cast(sys.ifthenelse(c."type" IN
('day_interval','month_interval','sec_interval'), c."type_scale" -1, NULL) AS
int) AS INTERVAL_PRECISION,
+ cast(CASE c."type" WHEN 'day_interval' THEN 'interval day' WHEN
'month_interval' THEN (CASE c."type_digits" WHEN 1 THEN 'interval year' WHEN 2
THEN 'interval year to month' WHEN 3 THEN 'interval month' ELSE NULL END) WHEN
'sec_interval' THEN (CASE c."type_digits" WHEN 5 THEN 'interval day to hour'
WHEN 6 THEN 'interval day to minute' WHEN 7 THEN 'interval day to second' WHEN
8 THEN 'interval hour' WHEN 9 THEN 'interval hour to minute' WHEN 10 THEN
'interval hour to second' WHEN 11 THEN 'interval minute' WHEN 12 THEN 'interval
minute to second' WHEN 13 THEN 'interval second' ELSE NULL END) ELSE NULL END
AS varchar(40)) AS INTERVAL_TYPE,
+ 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,
cast(NULL AS varchar(1)) AS CHARACTER_SET_CATALOG,
cast(NULL AS varchar(1)) AS CHARACTER_SET_SCHEMA,
cast(sys.ifthenelse(c."type" IN
('varchar','clob','char','json','url','xml'), 'UTF-8', NULL) AS varchar(16)) AS
CHARACTER_SET_NAME,
@@ -654,8 +654,110 @@ CREATE VIEW INFORMATION_SCHEMA.COLUMNS A
LEFT OUTER JOIN sys."comments" cm ON c."id" = cm."id"
ORDER BY s."name", t."name", c."number";
GRANT SELECT ON TABLE INFORMATION_SCHEMA.COLUMNS TO PUBLIC WITH GRANT OPTION;
+CREATE VIEW INFORMATION_SCHEMA.CHECK_CONSTRAINTS AS SELECT
+ cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,
+ cast(NULL AS varchar(1024)) AS CONSTRAINT_SCHEMA,
+ cast(NULL AS varchar(1024)) AS CONSTRAINT_NAME,
+ cast(NULL AS varchar(1024)) AS CHECK_CLAUSE
+ WHERE 1=0;
+GRANT SELECT ON TABLE INFORMATION_SCHEMA.CHECK_CONSTRAINTS TO PUBLIC WITH
GRANT OPTION;
+CREATE VIEW INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS SELECT
+ cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,
+ s."name" AS CONSTRAINT_SCHEMA,
+ k."name" AS CONSTRAINT_NAME,
+ cast(NULL AS varchar(1)) AS TABLE_CATALOG,
+ s."name" AS TABLE_SCHEMA,
+ t."name" AS TABLE_NAME,
+ 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,
+ cast('NO' AS varchar(3)) AS IS_DEFERRABLE,
+ cast('NO' AS varchar(3)) AS INITIALLY_DEFERRED,
+ cast('YES' AS varchar(3)) AS ENFORCED,
+ -- MonetDB column extensions
+ t."schema_id" AS schema_id,
+ t."id" AS table_id,
+ k."id" AS key_id,
+ k."type" AS key_type,
+ t."system" AS is_system
+ 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
+ INNER JOIN (SELECT st."id", st."schema_id", st."name", st."system" FROM
sys."_tables" st UNION ALL SELECT tt."id", tt."schema_id", tt."name",
tt."system" FROM tmp."_tables" tt) t ON k."table_id" = t."id"
+ INNER JOIN sys."schemas" s ON t."schema_id" = s."id"
+ ORDER BY s."name", t."name", k."name";
+GRANT SELECT ON TABLE INFORMATION_SCHEMA.TABLE_CONSTRAINTS TO PUBLIC WITH
GRANT OPTION;
+CREATE VIEW INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS SELECT
+ cast(NULL AS varchar(1)) AS CONSTRAINT_CATALOG,
+ s."name" AS CONSTRAINT_SCHEMA,
+ fk."name" AS CONSTRAINT_NAME,
+ cast(NULL AS varchar(1)) AS UNIQUE_CONSTRAINT_CATALOG,
+ uks."name" AS UNIQUE_CONSTRAINT_SCHEMA,
+ uk."name" AS UNIQUE_CONSTRAINT_NAME,
+ cast('FULL' AS varchar(7)) AS MATCH_OPTION,
+ fk."update_action" AS UPDATE_RULE,
+ fk."delete_action" AS DELETE_RULE,
+ -- MonetDB column extensions
+ t."schema_id" AS fk_schema_id,
+ t."id" AS fk_table_id,
+ t."name" AS fk_table_name,
+ fk."id" AS fk_key_id,
+ ukt."schema_id" AS uc_schema_id,
+ uk."table_id" AS uc_table_id,
+ ukt."name" AS uc_table_name,
+ uk."id" AS uc_key_id
+ FROM sys."fkeys" fk
+ INNER JOIN sys."tables" t ON t."id" = fk."table_id"
+ INNER JOIN sys."schemas" s ON s."id" = t."schema_id"
+ LEFT OUTER JOIN sys."keys" uk ON uk."id" = fk."rkey"
+ LEFT OUTER JOIN sys."tables" ukt ON ukt."id" = uk."table_id"
+ LEFT OUTER JOIN sys."schemas" uks ON uks."id" = ukt."schema_id"
+ ORDER BY s."name", t."name", fk."name";
+GRANT SELECT ON TABLE INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS TO PUBLIC
WITH GRANT OPTION;
+CREATE VIEW INFORMATION_SCHEMA.SEQUENCES AS SELECT
+ cast(NULL AS varchar(1)) AS SEQUENCE_CATALOG,
+ s."name" AS SEQUENCE_SCHEMA,
+ sq."name" AS SEQUENCE_NAME,
+ cast('bigint' AS varchar(16)) AS DATA_TYPE,
+ cast(64 AS SMALLINT) AS NUMERIC_PRECISION,
+ cast(2 AS SMALLINT) AS NUMERIC_PRECISION_RADIX,
+ cast(0 AS SMALLINT) AS NUMERIC_SCALE,
+ sq."start" AS START_VALUE,
+ sq."minvalue" AS MINIMUM_VALUE,
+ sq."maxvalue" AS MAXIMUM_VALUE,
+ sq."increment" AS INCREMENT,
+ cast(sys.ifthenelse(sq."cycle", 'YES', 'NO') AS varchar(3)) AS CYCLE_OPTION,
+ cast(NULL AS varchar(16)) AS DECLARED_DATA_TYPE,
+ cast(NULL AS SMALLINT) AS DECLARED_NUMERIC_PRECISION,
+ cast(NULL AS SMALLINT) AS DECLARED_NUMERIC_SCALE,
+ -- MonetDB column extensions
+ sq."schema_id" AS schema_id,
+ sq."id" AS sequence_id,
+ get_value_for(s."name", sq."name") AS current_value,
+ sq."cacheinc" AS cacheinc,
+ cm."remark" AS comments
+ FROM sys."sequences" sq
+ INNER JOIN sys."schemas" s ON sq."schema_id" = s."id"
+ LEFT OUTER JOIN sys."comments" cm ON sq."id" = cm."id"
+ ORDER BY s."name", sq."name";
+GRANT SELECT ON TABLE INFORMATION_SCHEMA.SEQUENCES TO PUBLIC WITH GRANT OPTION;
update sys._tables set system = true where system <> true
and schema_id = (select s.id from sys.schemas s where s.name =
'information_schema')
- and name in ('character_sets','schemata','tables','views','columns');
+ and name in
('character_sets','check_constraints','columns','schemata','sequences','referential_constraints','table_constraints','tables','views');
+Running database upgrade commands:
+CREATE FUNCTION sys.persist_unlogged()
+RETURNS TABLE("table" STRING, "table_id" INT, "rowcount" BIGINT)
+EXTERNAL NAME sql.persist_unlogged;
+CREATE FUNCTION sys.persist_unlogged(sname STRING)
+RETURNS TABLE("table" STRING, "table_id" INT, "rowcount" BIGINT)
+EXTERNAL NAME sql.persist_unlogged;
+CREATE FUNCTION sys.persist_unlogged(sname STRING, tname STRING)
+RETURNS TABLE("table" STRING, "table_id" INT, "rowcount" BIGINT)
+EXTERNAL NAME sql.persist_unlogged;
+GRANT EXECUTE ON FUNCTION sys.persist_unlogged() TO PUBLIC;
+UPDATE sys.functions SET system = true WHERE system <> true AND
+name = 'persist_unlogged' AND schema_id = 2000;
+
+Running database upgrade commands:
+CREATE FUNCTION timestamp_to_str(d TIMESTAMP, format STRING) RETURNS STRING
EXTERNAL NAME mtime."timestamp_to_str";
+GRANT EXECUTE ON FUNCTION timestamp_to_str(TIMESTAMP, STRING) TO PUBLIC;
+UPDATE sys.functions SET system = true WHERE system <> true AND name =
'timestamp_to_str' AND schema_id = 2000 and type = 1;
+
diff --git a/sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
b/sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
--- a/sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
+++ b/sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
@@ -599,15 +599,15 @@ CREATE VIEW INFORMATION_SCHEMA.COLUMNS A
cast(c."number" +1 AS int) AS ORDINAL_POSITION,
c."default" AS COLUMN_DEFAULT,
cast(sys.ifthenelse(c."null", 'YES', 'NO') AS varchar(3)) AS IS_NULLABLE,
- c."type" AS DATA_TYPE,
+ CASE c."type" WHEN 'day_interval' THEN 'interval day' WHEN 'month_interval'
THEN 'interval month' WHEN 'sec_interval' THEN 'interval second' ELSE c."type"
END AS DATA_TYPE,
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]