Changeset: 5cdf070153fa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5cdf070153fa
Modified Files:
clients/mapiclient/dump.c
sql/server/rel_dump.c
sql/test/testdb/Tests/dump-nogeom.stable.out
sql/test/testdb/Tests/dump.stable.out
Branch: label
Log Message:
Dump CHECK constraints.
diffs (139 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1119,7 +1119,9 @@ dump_column_definition(Mapi mid, stream
"SELECT kc.name, " /* 0 */
"kc.nr, " /* 1 */
"k.name, " /* 2 */
- "kc.id " /* 3 */
+ "kc.id, " /* 3 */
+ "k.type, " /* 4 */
+ "case when k.type = 4 then
sys.check_constraint(s.name, k.name) else null end " /* 5 */
"FROM sys.objects kc, "
"sys.keys k "
"WHERE kc.id = k.id "
@@ -1132,14 +1134,15 @@ dump_column_definition(Mapi mid, stream
"kc.nr, " /* 1 */
"k.name, " /* 2 */
"kc.id, " /* 3 */
- "k.type " /* 4 */
+ "k.type, " /* 4 */
+ "case when k.type = 4 then
sys.check_constraint(s.name, k.name) else null end " /* 5 */
"FROM sys.objects kc, "
"sys.keys k, "
"sys.schemas s, "
"sys._tables t "
"WHERE kc.id = k.id "
"AND k.table_id = t.id "
- "AND k.type in (1, 3) "
+ "AND k.type in (1, 3, 4) "
"AND t.schema_id = s.id "
"AND s.name = '%s' "
"AND t.name = '%s' "
@@ -1158,16 +1161,28 @@ dump_column_definition(Mapi mid, stream
if (strcmp(kc_nr, "0") == 0) {
if (cnt)
mnstr_write(sqlf, ")", 1, 1);
+ cnt = 0;
mnstr_printf(sqlf, ",\n\t");
if (k_name) {
mnstr_printf(sqlf, "CONSTRAINT ");
dquoted_print(sqlf, k_name, " ");
}
- mnstr_printf(sqlf, "UNIQUE%s (", strcmp(k_type, "1") ==
0 ? "" : " NULLS NOT DISTINCT");
- cnt = 1;
+ if (strcmp(k_type, "4") == 0) {
+ const char *k_check = mapi_fetch_field(hdl, 5);
+ mnstr_printf(sqlf, "CHECK (%s)", k_check);
+ } else {
+ if (strcmp(k_type, "1") == 0) {
+ mnstr_printf(sqlf, "UNIQUE");
+ } else {
+ mnstr_printf(sqlf, "UNIQUE NULLS NOT
DISTINCT");
+ }
+ mnstr_printf(sqlf, " (");
+ cnt = 1;
+ }
} else
mnstr_printf(sqlf, ", ");
- dquoted_print(sqlf, c_column, NULL);
+ if (cnt)
+ dquoted_print(sqlf, c_column, NULL);
if (mnstr_errnr(sqlf) != MNSTR_NO__ERROR)
goto bailout;
}
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -2525,6 +2525,29 @@ is_infix(sql_func *f)
return false;
}
+static void
+exp2sql_dquoted(stream *fout, const char *pref, const char *val, const char
*suff)
+{
+ if (pref)
+ mnstr_printf(fout, "%s", pref);
+ mnstr_write(fout, "\"", 1, 1);
+ while (*val) {
+ const char *p = strchr(val, '"');
+ if (p) {
+ if (p > val)
+ mnstr_write(fout, val, 1, p - val);
+ mnstr_write(fout, "\"\"", 1, 2);
+ val = p + 1;
+ } else {
+ mnstr_printf(fout, "%s", val);
+ break;
+ }
+ }
+ mnstr_write(fout, "\"", 1, 1);
+ if (suff)
+ mnstr_printf(fout, "%s", suff);
+}
+
/* only simple expressions, ie recursive no psm */
static void
exp2sql_print(mvc *sql, stream *fout, sql_exp *e)
@@ -2538,7 +2561,7 @@ exp2sql_print(mvc *sql, stream *fout, sq
mnstr_printf(fout, " %s ", sf->func->base.name);
exp2sql_print(sql, fout, args->h->next->data);
} else {
- mnstr_printf(fout, "%s(", sf->func->base.name);
+ exp2sql_dquoted(fout, NULL,
sf->func->base.name, "(");
if (args)
for (node *n = args->h; n; n = n->next)
{
exp2sql_print(sql, fout,
n->data);
@@ -2549,7 +2572,7 @@ exp2sql_print(mvc *sql, stream *fout, sq
}
} break;
case e_column:
- mnstr_printf(fout, "%s", exp_name(e));
+ exp2sql_dquoted(fout, NULL, exp_name(e), NULL);
break;
case e_convert:
mnstr_printf(fout, "CAST (" );
diff --git a/sql/test/testdb/Tests/dump-nogeom.stable.out
b/sql/test/testdb/Tests/dump-nogeom.stable.out
--- a/sql/test/testdb/Tests/dump-nogeom.stable.out
+++ b/sql/test/testdb/Tests/dump-nogeom.stable.out
@@ -101198,7 +101198,7 @@ CREATE TABLE "testschema"."nulls_not_dis
CONSTRAINT "nulls_not_distinct_id_pkey" PRIMARY KEY ("id"),
CONSTRAINT "nulls_not_distinct_unique1_unique" UNIQUE ("unique1"),
CONSTRAINT "nulls_not_distinct_unique2_nndunique" UNIQUE NULLS NOT
DISTINCT ("unique2"),
- CONSTRAINT "nulls_not_distinct_check1_check" CHECK("check1" > 0)
+ CONSTRAINT "nulls_not_distinct_check1_check" CHECK ("check1" > 0)
);
COPY 1 RECORDS INTO "testschema"."nulls_not_distinct" FROM stdin USING
DELIMITERS E'\t',E'\n','"';
1 1 1 1
diff --git a/sql/test/testdb/Tests/dump.stable.out
b/sql/test/testdb/Tests/dump.stable.out
--- a/sql/test/testdb/Tests/dump.stable.out
+++ b/sql/test/testdb/Tests/dump.stable.out
@@ -101198,7 +101198,7 @@ CREATE TABLE "testschema"."nulls_not_dis
CONSTRAINT "nulls_not_distinct_id_pkey" PRIMARY KEY ("id"),
CONSTRAINT "nulls_not_distinct_unique1_unique" UNIQUE ("unique1"),
CONSTRAINT "nulls_not_distinct_unique2_nndunique" UNIQUE NULLS NOT
DISTINCT ("unique2"),
- CONSTRAINT "nulls_not_distinct_check1_check" CHECK("check1" > 0)
+ CONSTRAINT "nulls_not_distinct_check1_check" CHECK ("check1" > 0)
);
COPY 1 RECORDS INTO "testschema"."nulls_not_distinct" FROM stdin USING
DELIMITERS E'\t',E'\n','"';
1 1 1 1
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]