Changeset: a8a880db76ae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a8a880db76ae
Modified Files:
dump.sql
dump_output.sql
Branch: monetdbe-proxy
Log Message:
support FOREIGN KEY CONSTRAINT.
diffs (112 lines):
diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -166,6 +166,59 @@ BEGIN
WHERE tp.table_id = tid;
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) = ou.id
+ AND ((fkk."action" >> 8) & 255) = od.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 TEMPORARY TABLE dump_statements(o INT AUTO_INCREMENT, s STRING, PRIMARY
KEY (o));
CREATE PROCEDURE dump_database(describe BOOLEAN)
@@ -247,8 +300,8 @@ BEGIN
AND s.name <> 'tmp';
INSERT INTO dump_statements(s) SELECT * FROM
dump_table_constraint_type();
-
INSERT INTO dump_statements(s) SELECT * FROM dump_indices();
+ INSERT INTO dump_statements(s) SELECT * FROM dump_foreign_keys();
INSERT INTO dump_statements(s) --dump_create_comments_on_indices
SELECT comment_on('INDEX', DQ(i.name), rem.remark)
@@ -258,7 +311,9 @@ BEGIN
SELECT comment_on('COLUMN', DQ(s.name) || '.' || DQ(t.name) || '.' ||
DQ(c.name), rem.remark)
FROM sys.columns c JOIN sys.comments rem ON c.id = rem.id,
sys.tables t, sys.schemas s WHERE c.table_id = t.id AND t.schema_id = s.id AND
NOT t.system;
- --TODO FOREIGN KEYs
+ --INSERT INTO dump_statements(s) SELECT * FROM dump_foreign_keys();
+
+ --TODO ADD schema's to ALTER statements
--TODO PARTITION TABLES
--TODO details on SEQUENCES
--TODO functions
diff --git a/dump_output.sql b/dump_output.sql
--- a/dump_output.sql
+++ b/dump_output.sql
@@ -30,14 +30,16 @@ CREATE TABLE "sys"."pfoo1" ("i" INTEGER)
CREATE TABLE "sys"."pfoo2" ("i" INTEGER);
CREATE TABLE "sys"."lower_scorers" ("name" CHARACTER LARGE OBJECT,
"first_score" INTEGER, "second_score" INTEGER);
CREATE TABLE "sys"."higher_scorers" ("name" CHARACTER LARGE OBJECT,
"first_score" INTEGER, "second_score" INTEGER);
-CREATE TABLE "sys"."foo" ("i" INTEGER, "s" CHARACTER LARGE OBJECT);
-CREATE TABLE "sys"."bar" ("i" INTEGER, "s" CHARACTER LARGE OBJECT);
+CREATE TABLE "sfoo"."foo" ("fi" INTEGER, "fs" CHARACTER LARGE OBJECT);
+CREATE TABLE "sbar"."bar" ("bi" INTEGER, "bs" CHARACTER LARGE OBJECT);
CREATE REMOTE TABLE "sys"."rfoo" ("i" INTEGER) ON
'mapi:monetdb://remote.host.url:50000/dbname' WITH USER 'bob' ENCRYPTED
PASSWORD
'f8e3183d38e6c51889582cb260ab825252f395b4ac8fb0e6b13e9a71f7c10a80d5301e4a949f2783cb0c20205f1d850f87045f4420ad2271c8fd5f0cd8944be3'
;
CREATE MERGE TABLE "sys"."scorers" ("name" CHARACTER LARGE OBJECT,
"first_score" INTEGER, "second_score" INTEGER) PARTITION BY VALUES USING
("sys"."mod"("sys"."greatest"("first_score","second_score"),10));
CREATE MERGE TABLE "sys"."splitted" ("stamp" TIMESTAMP , "val" INTEGER)
PARTITION BY RANGE ON ("stamp");
CREATE REPLICA TABLE "sys"."rep" ("i" INTEGER);
ALTER TABLE "bolo" ADD CONSTRAINT "cpk" PRIMARY KEY ("s", "v");
ALTER TABLE "rolo" ADD CONSTRAINT "rolo_v_pkey" PRIMARY KEY ("v");
+ALTER TABLE "sfoo"."foo" ADD CONSTRAINT "foo_pk" PRIMARY KEY ("fi", "fs");
+ALTER TABLE "sbar"."bar" ADD CONSTRAINT "bar_pk" PRIMARY KEY ("bi", "bs");
ALTER TABLE "ungolo" ADD CONSTRAINT "ungolo_x_y_unique" UNIQUE ("x", "y");
ALTER TABLE "ungolo" ADD CONSTRAINT "ungolo_z_unique" UNIQUE ("z");
CREATE INDEX "ind1" ON "sys"."ungolo"(x,y);
@@ -45,4 +47,5 @@ CREATE IMPRINTS INDEX "ind2" ON "sys"."u
CREATE ORDERED INDEX "ind3" ON "sys"."ungolo"(x,z);
COMMENT ON INDEX "ind3" IS 'This is a comment on an index.' ;
COMMENT ON COLUMN "sfoo"."tfoo"."i" IS 'This is a comment on a column.' ;
+ALTER TABLE "sfoo"."foo" ADD CONSTRAINT "fk_foo_to_bar" FOREIGN KEY("fi","fs")
REFERENCES "sbar"."bar"("bi","bs") ON DELETE CASCADE ON UPDATE SET NULL;
COMMIT;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list