Changeset: b69176fba0d0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b69176fba0d0
Added Files:
sql/scripts/53_dump.sql
Modified Files:
dump.sql
dump_output.sql
sql/backends/monet5/CMakeLists.txt
sql/scripts/52_describe.sql
sql/scripts/CMakeLists.txt
Branch: monetdbe-proxy
Log Message:
Migrate most of the describe and dump functions to sql/scripts.
diffs (truncated from 1419 to 300 lines):
diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -1,556 +1,8 @@
START TRANSACTION;
---We start with creating static versions of catalogue tables that are going to
be affected by this dump script itself.
-CREATE TEMPORARY TABLE _user_sequences AS SELECT * FROM sys.sequences;
-CREATE TEMPORARY TABLE _user_functions AS SELECT * FROM sys.functions f WHERE
NOT f.system;
-
-CREATE FUNCTION SQ (s STRING) RETURNS STRING BEGIN RETURN ' ''' || s || ''' ';
END;
-CREATE FUNCTION DQ (s STRING) RETURNS STRING BEGIN RETURN '"' || s || '"';
END; --TODO: Figure out why this breaks with the space
-CREATE FUNCTION FQTN(s STRING, t STRING) RETURNS STRING BEGIN RETURN DQ(s) ||
'.' || DQ(t); END;
-CREATE FUNCTION ALTER_TABLE(s STRING, t STRING) RETURNS STRING BEGIN RETURN
'ALTER TABLE ' || FQTN(s, t) || ' '; END;
-
---We need pcre to implement a header guard which means adding the schema of an
object explicitely to its identifier.
-CREATE FUNCTION replace_first(ori STRING, pat STRING, rep STRING, flg STRING)
RETURNS STRING EXTERNAL NAME "pcre"."replace_first";
-CREATE FUNCTION schema_guard(sch STRING, nme STRING, stmt STRING) RETURNS
STRING BEGIN
-RETURN
- SELECT replace_first(stmt, '(\\s*"?' || sch || '"?\\s*\\.|)\\s*"?' ||
nme || '"?\\s*', ' ' || FQTN(sch, nme) || ' ', 'imsx');
-END;
-
-CREATE FUNCTION dump_type(type STRING, digits INT, scale INT) RETURNS STRING
BEGIN
- RETURN
- CASE
- WHEN type = 'boolean' THEN 'BOOLEAN'
- WHEN type = 'int' THEN 'INTEGER'
- WHEN type = 'smallint' THEN 'SMALLINT'
- WHEN type = 'tinyiny' THEN 'TINYINT'
- WHEN type = 'bigint' THEN 'BIGINT'
- WHEN type = 'hugeint' THEN 'HUGEINT'
- WHEN type = 'date' THEN 'DATE'
- WHEN type = 'month_interval' THEN CASE
- WHEN digits = 1 THEN 'INTERVAL YEAR'
- WHEN digits = 2 THEN 'INTERVAL YEAR TO MONTH'
- ELSE 'INTERVAL MONTH' --ASSUMES digits = 3
- END
- WHEN type LIKE '%_INTERVAL' THEN CASE
- WHEN digits = 4 THEN 'INTERVAL DAY'
- WHEN digits = 5 THEN 'INTERVAL DAY TO HOUR'
- WHEN digits = 6 THEN 'INTERVAL DAY TO MINUTE'
- WHEN digits = 7 THEN 'INTERVAL DAY TO SECOND'
- WHEN digits = 8 THEN 'INTERVAL HOUR'
- WHEN digits = 9 THEN 'INTERVAL HOUR TO MINUTE'
- WHEN digits = 10 THEN 'INTERVAL HOUR TO SECOND'
- WHEN digits = 11 THEN 'INTERVAL MINUTE'
- WHEN digits = 12 THEN 'INTERVAL MINUTE TO SECOND'
- ELSE 'INTERVAL SECOND' --ASSUMES digits = 13
- END
- WHEN type = 'varchar' OR type = 'clob' THEN CASE
- WHEN digits = 0 THEN 'CHARACTER LARGE OBJECT'
- ELSE 'CHARACTER LARGE OBJECT(' || digits || ')'
--ASSUMES digits IS NOT NULL
- END
- WHEN type = 'blob' THEN CASE
- WHEN digits = 0 THEN 'BINARY LARGE OBJECT'
- ELSE 'BINARY LARGE OBJECT(' || digits || ')' --ASSUMES
digits IS NOT NULL
- END
- WHEN type = 'timestamp' THEN 'TIMESTAMP' || ifthenelse(digits
<> 7, '(' || (digits -1) || ') ', ' ')
- WHEN type = 'timestamptz' THEN 'TIMESTAMP' || ifthenelse(digits
<> 7, '(' || (digits -1) || ') ', ' ') || 'WITH TIME ZONE'
- WHEN type = 'time' THEN 'TIME' || ifthenelse(digits <> 1, '('
|| (digits -1) || ') ', ' ')
- WHEN type = 'timetz' THEN 'TIME' || ifthenelse(digits <> 1, '('
|| (digits -1) || ') ', ' ') || 'WITH TIME ZONE'
- WHEN type = 'real' THEN CASE
- WHEN digits = 24 AND scale=0 THEN 'REAL'
- WHEN scale=0 THEN 'FLOAT(' || digits || ')'
- ELSE 'FLOAT(' || digits || ',' || scale || ')'
- END
- WHEN type = 'double' THEN CASE
- WHEN digits = 53 AND scale=0 THEN 'DOUBLE'
- WHEN scale = 0 THEN 'FLOAT(' || digits || ')'
- ELSE 'FLOAT(' || digits || ',' || scale || ')'
- END
- WHEN type = 'decimal' THEN CASE
- WHEN (digits = 1 AND scale = 0) OR digits = 0 THEN
'DECIMAL'
- WHEN scale = 0 THEN 'DECIMAL(' || digits || ')'
- WHEN digits = 39 THEN 'DECIMAL(' || 38 || ',' || scale
|| ')'
- WHEN digits = 19 AND (SELECT COUNT(*) = 0 FROM
sys.types WHERE sqlname = 'hugeint' ) THEN 'DECIMAL(' || 18 || ',' || scale ||
')'
- ELSE 'DECIMAL(' || digits || ',' || scale || ')'
- END
- ELSE upper(type) || '(' || digits || ',' || scale || ')'
--TODO: might be a bit too simple
- END;
-END;
-
-CREATE FUNCTION dump_CONSTRAINT_type_name(id INT) RETURNS STRING BEGIN
- RETURN
- CASE
- WHEN id = 0 THEN 'PRIMARY KEY'
- WHEN id = 1 THEN 'UNIQUE'
- END;
-END;
-
-CREATE FUNCTION describe_constraints() RETURNS TABLE(s STRING, "table" STRING,
nr INT, col STRING, con STRING, type STRING) BEGIN
- RETURN
- SELECT s.name, t.name, kc.nr, kc.name, k.name,
dump_CONSTRAINT_type_name(k.type)
- FROM sys.schemas s, sys._tables t, sys.objects kc, sys.keys k
- WHERE kc.id = k.id
- AND k.table_id = t.id
- AND s.id = t.schema_id
- AND t.system = FALSE
- AND k.type in (0, 1)
- AND t.type IN (0, 6);
-END;
-
-CREATE FUNCTION dump_table_constraint_type() RETURNS TABLE(stm STRING) BEGIN
- RETURN
- SELECT
- 'ALTER TABLE ' || DQ(s) || '.' || DQ("table") ||
- ' ADD CONSTRAINT ' || DQ(con) || ' '||
- type || ' (' || GROUP_CONCAT(DQ(col), ', ') || ');'
- FROM describe_constraints() GROUP BY s, "table", con, type;
-END;
-
-CREATE FUNCTION describe_indices() RETURNS TABLE (i STRING, o INT, s STRING, t
STRING, c STRING, it STRING) BEGIN
-RETURN
- WITH it (id, idx) AS (VALUES (0, 'INDEX'), (4, 'IMPRINTS INDEX'), (5,
'ORDERED INDEX')) --UNIQUE INDEX wraps to INDEX.
- SELECT
- i.name,
- kc.nr, --TODO: Does this determine the concatenation order?
- s.name,
- t.name,
- c.name,
- it.idx
- FROM
- sys.idxs AS i LEFT JOIN sys.keys AS k ON i.name = k.name,
- sys.objects AS kc,
- sys._columns AS c,
- sys.schemas s,
- sys._tables AS t,
- it
- WHERE
- i.table_id = t.id
- AND i.id = kc.id
- AND kc.name = c.name
- AND t.id = c.table_id
- AND t.schema_id = s.id
- AND k.type IS NULL
- AND i.type = it.id
- ORDER BY i.name, kc.nr;
-END;
-
-CREATE FUNCTION dump_indices() RETURNS TABLE(stm STRING) BEGIN
- RETURN
- SELECT
- 'CREATE ' || it || ' ' ||
- DQ(i) || ' ON ' || DQ(s) || '.' || DQ(t) ||
- '(' || GROUP_CONCAT(c) || ');'
- FROM describe_indices() GROUP BY i, it, s, t;
-END;
-
-CREATE FUNCTION dump_column_definition(tid INT) RETURNS STRING BEGIN
- RETURN
- SELECT
- ' (' ||
- GROUP_CONCAT(
- DQ(c.name) || ' ' ||
- dump_type(c.type, c.type_digits, c.type_scale)
||
- ifthenelse(c."null" = 'false', ' NOT NULL', '')
- , ', ') || ')'
- FROM sys._columns c
- WHERE c.table_id = tid;
-END;
-
-CREATE FUNCTION dump_remote_table_expressions(s STRING, t STRING) RETURNS
STRING BEGIN
- RETURN SELECT ' ON ' || SQ(uri) || ' WITH USER ' || SQ(username) || '
ENCRYPTED PASSWORD ' || SQ("hash") FROM sys.remote_table_credentials(s ||'.' ||
t);
-END;
-
-CREATE FUNCTION dump_merge_table_partition_expressions(tid INT) RETURNS STRING
-BEGIN
- RETURN
- SELECT
- CASE WHEN tp.table_id IS NOT NULL THEN --updatable
merge table
- ' PARTITION BY ' ||
- CASE
- WHEN bit_and(tp.type, 2) = 2
- THEN 'VALUES '
- ELSE 'RANGE '
- END ||
- CASE
- WHEN bit_and(tp.type, 4) = 4 --column
expression
- THEN 'ON ' || '(' || (SELECT DQ(c.name)
|| ')' FROM sys.columns c WHERE c.id = tp.column_id)
- ELSE 'USING ' || '(' || tp.expression
|| ')' --generic expression
- END
- ELSE
--read only partition merge table.
- ''
- END
- FROM (VALUES (tid)) t(id) LEFT JOIN sys.table_partitions tp ON
t.id = tp.table_id;
-END;
-
-CREATE FUNCTION describe_column_defaults() RETURNS TABLE(sch STRING, tbl
STRING, col STRING, def STRING) BEGIN
-RETURN
- SELECT
- s.name,
- t.name,
- c.name,
- c."default"
- FROM schemas s, tables t, columns c
- WHERE
- s.id = t.schema_id AND
- t.id = c.table_id AND
- s.name <> 'tmp' AND
- NOT t.system AND
- c."default" IS NOT NULL;
-END;
-
-CREATE FUNCTION dump_column_defaults() RETURNS TABLE(stmt STRING) BEGIN
- RETURN
- SELECT 'ALTER TABLE ' || FQTN(sch, tbl) || ' ALTER COLUMN ' ||
DQ(col) || ' SET DEFAULT ' || def || ';'
- FROM describe_column_defaults();
-END;
-
---SELECT * FROM dump_foreign_keys();
-CREATE FUNCTION describe_foreign_keys() RETURNS TABLE(
- fk_s STRING, fk_t STRING, fk_c STRING,
- o INT, fk STRING,
- pk_s STRING, pk_t STRING, pk_c STRING,
- on_update STRING, on_delete STRING) BEGIN
-
- RETURN
- WITH action_type (id, act) AS (VALUES
- (0, 'NO ACTION'),
- (1, 'CASCADE'),
- (2, 'RESTRICT'),
- (3, 'SET NULL'),
- (4, 'SET DEFAULT'))
- SELECT
- fs.name AS fsname, fkt.name AS ktname, fkkc.name AS fcname,
- fkkc.nr AS o, fkk.name AS fkname,
- ps.name AS psname, pkt.name AS ptname, pkkc.name AS pcname,
- ou.act as on_update, od.act as on_delete
- FROM sys._tables fkt,
- sys.objects fkkc,
- sys.keys fkk,
- sys._tables pkt,
- sys.objects pkkc,
- sys.keys pkk,
- sys.schemas ps,
- sys.schemas fs,
- action_type ou,
- action_type od
-
- WHERE fkt.id = fkk.table_id
- AND pkt.id = pkk.table_id
- AND fkk.id = fkkc.id
- AND pkk.id = pkkc.id
- AND fkk.rkey = pkk.id
- AND fkkc.nr = pkkc.nr
- AND pkt.schema_id = ps.id
- AND fkt.schema_id = fs.id
- AND (fkk."action" & 255) = od.id
- AND ((fkk."action" >> 8) & 255) = ou.id
- ORDER BY fkk.name, fkkc.nr;
-END;
-
-CREATE FUNCTION dump_foreign_keys() RETURNS TABLE(stmt STRING) BEGIN
-RETURN
- SELECT
- 'ALTER TABLE ' || DQ(fk_s) || '.'|| DQ(fk_t) || ' ADD
CONSTRAINT ' || DQ(fk) || ' ' ||
- 'FOREIGN KEY(' || GROUP_CONCAT(DQ(fk_c), ',') ||') ' ||
- 'REFERENCES ' || DQ(pk_s) || '.' || DQ(pk_t) || '(' ||
GROUP_CONCAT(DQ(pk_c), ',') || ') ' ||
- 'ON DELETE ' || on_delete || ' ON UPDATE ' || on_update ||
- ';'
- FROM describe_foreign_keys() GROUP BY fk_s, fk_t, pk_s, pk_t, fk,
on_delete, on_update;
-END;
-
-CREATE FUNCTION describe_partition_tables()
-RETURNS TABLE(
- m_sname STRING,
- m_tname STRING,
- p_sname STRING,
- p_tname STRING,
- p_type STRING,
- pvalues STRING,
- minimum STRING,
- maximum STRING,
- with_nulls BOOLEAN) BEGIN
-RETURN
- SELECT
- m_sname,
- m_tname,
- p_sname,
- p_tname,
- CASE
- WHEN p_raw_type IS NULL THEN 'READ ONLY'
- 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'
- ELSE p_raw_type
- END AS p_type,
- pvalues,
- minimum,
- maximum,
- with_nulls
- FROM
- (WITH
- tp("type", table_id) AS
- (SELECT CASE WHEN (table_partitions."type" & 2) = 2 THEN
'VALUES' ELSE 'RANGE' END, table_partitions.table_id FROM table_partitions),
- subq(m_tid, p_mid, "type", m_sname, m_tname, p_sname, p_tname)
AS
- (SELECT m_t.id, p_m.id, m_t."type", m_s.name, m_t.name,
p_s.name, p_m.name
- FROM schemas m_s, sys._tables m_t, dependencies d, schemas p_s,
sys._tables p_m
- WHERE m_t."type" IN (3, 6)
- AND m_t.schema_id = m_s.id
- AND m_s.name <> 'tmp'
- AND m_t.system = FALSE
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list