Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
38318: sql: various updates for sqlalchemy compatibility r=jordanlewis a=jordanlewis

This PR contains several compatibility fixes for problems discovered by running
the SQLAlchemy test suite against CockroachDB. A followup PR will add that test
suite to our list of ORM test suites.

- make pg_get_constraintdef output identical to Postgres for CHECK constraints
- add length, scale, precision output to format_type() when passed a typmod argument
- print foreign key constraint strings without an extra space, like Postgres does
- add pg_type_is_visible builtin that always returns true if its input is a real type
- support int2vector::string casts in the same way Postgres does

Co-authored-by: Jordan Lewis <jordanthelewis@gmail.com>
  • Loading branch information
craig[bot] and jordanlewis committed Jun 21, 2019
2 parents 644688f + 3f4d1a0 commit 0205653
Show file tree
Hide file tree
Showing 23 changed files with 289 additions and 167 deletions.
18 changes: 9 additions & 9 deletions pkg/ccl/importccl/import_stmt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ COPY t (a, b, c) FROM stdin;

// Verify the constraint is unvalidated.
`SHOW CONSTRAINTS FROM weather
`: {{"weather", "weather_city_fkey", "FOREIGN KEY", "FOREIGN KEY (city) REFERENCES cities (city)", "false"}},
`: {{"weather", "weather_city_fkey", "FOREIGN KEY", "FOREIGN KEY (city) REFERENCES cities(city)", "false"}},
},
},
{
Expand Down Expand Up @@ -497,26 +497,26 @@ COPY t (a, b, c) FROM stdin;
i INT8 NOT NULL,
k INT8 NULL,
CONSTRAINT a_pkey PRIMARY KEY (i ASC),
CONSTRAINT a_k_fkey FOREIGN KEY (k) REFERENCES a (i),
CONSTRAINT a_k_fkey FOREIGN KEY (k) REFERENCES a(i),
INDEX a_auto_index_a_k_fkey (k ASC),
CONSTRAINT a_i_fkey FOREIGN KEY (i) REFERENCES b (j),
CONSTRAINT a_i_fkey FOREIGN KEY (i) REFERENCES b(j),
FAMILY "primary" (i, k)
)`}, {
`CREATE TABLE b (
j INT8 NOT NULL,
CONSTRAINT b_pkey PRIMARY KEY (j ASC),
CONSTRAINT b_j_fkey FOREIGN KEY (j) REFERENCES a (i),
CONSTRAINT b_j_fkey FOREIGN KEY (j) REFERENCES a(i),
FAMILY "primary" (j)
)`,
}},

`SHOW CONSTRAINTS FROM a`: {
{"a", "a_i_fkey", "FOREIGN KEY", "FOREIGN KEY (i) REFERENCES b (j)", "false"},
{"a", "a_k_fkey", "FOREIGN KEY", "FOREIGN KEY (k) REFERENCES a (i)", "false"},
{"a", "a_i_fkey", "FOREIGN KEY", "FOREIGN KEY (i) REFERENCES b(j)", "false"},
{"a", "a_k_fkey", "FOREIGN KEY", "FOREIGN KEY (k) REFERENCES a(i)", "false"},
{"a", "a_pkey", "PRIMARY KEY", "PRIMARY KEY (i ASC)", "true"},
},
`SHOW CONSTRAINTS FROM b`: {
{"b", "b_j_fkey", "FOREIGN KEY", "FOREIGN KEY (j) REFERENCES a (i)", "false"},
{"b", "b_j_fkey", "FOREIGN KEY", "FOREIGN KEY (j) REFERENCES a(i)", "false"},
{"b", "b_pkey", "PRIMARY KEY", "PRIMARY KEY (j ASC)", "true"},
},
},
Expand Down Expand Up @@ -698,7 +698,7 @@ const (
temp_hi INT8 NULL,
prcp FLOAT4 NULL,
date DATE NULL,
CONSTRAINT weather_city_fkey FOREIGN KEY (city) REFERENCES cities (city),
CONSTRAINT weather_city_fkey FOREIGN KEY (city) REFERENCES cities(city),
INDEX weather_auto_index_weather_city_fkey (city ASC),
FAMILY "primary" (city, temp_lo, temp_hi, prcp, date, rowid)
)`
Expand Down Expand Up @@ -2385,7 +2385,7 @@ func TestImportCockroachDump(t *testing.T) {
{"a", `CREATE TABLE a (
i INT8 NOT NULL,
CONSTRAINT "primary" PRIMARY KEY (i ASC),
CONSTRAINT fk_i_ref_t FOREIGN KEY (i) REFERENCES t (i),
CONSTRAINT fk_i_ref_t FOREIGN KEY (i) REFERENCES t(i),
FAMILY "primary" (i)
)`},
})
Expand Down
8 changes: 4 additions & 4 deletions pkg/cli/testdata/dump/reference_cycle
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ INSERT INTO loop_a (id, b_id) VALUES
(2, 1),
(3, 2);

ALTER TABLE loop_b ADD CONSTRAINT fk_a_id_ref_loop_a FOREIGN KEY (a_id) REFERENCES loop_a (id) ON DELETE CASCADE;
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint FOREIGN KEY (b_id) REFERENCES loop_b (id) ON DELETE CASCADE;
ALTER TABLE loop_b ADD CONSTRAINT fk_a_id_ref_loop_a FOREIGN KEY (a_id) REFERENCES loop_a(id) ON DELETE CASCADE;
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint FOREIGN KEY (b_id) REFERENCES loop_b(id) ON DELETE CASCADE;

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE loop_b VALIDATE CONSTRAINT fk_a_id_ref_loop_a;
Expand All @@ -84,8 +84,8 @@ CREATE TABLE loop_a (
FAMILY "primary" (id, b_id)
);

ALTER TABLE loop_b ADD CONSTRAINT fk_a_id_ref_loop_a FOREIGN KEY (a_id) REFERENCES loop_a (id) ON DELETE CASCADE;
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint FOREIGN KEY (b_id) REFERENCES loop_b (id) ON DELETE CASCADE;
ALTER TABLE loop_b ADD CONSTRAINT fk_a_id_ref_loop_a FOREIGN KEY (a_id) REFERENCES loop_a(id) ON DELETE CASCADE;
ALTER TABLE loop_a ADD CONSTRAINT b_id_delete_constraint FOREIGN KEY (b_id) REFERENCES loop_b(id) ON DELETE CASCADE;

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE loop_b VALIDATE CONSTRAINT fk_a_id_ref_loop_a;
Expand Down
14 changes: 7 additions & 7 deletions pkg/cli/testdata/dump/reference_order
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,11 @@ INSERT INTO s_tbl (id, v) VALUES
(1, 10),
(2, 11);

ALTER TABLE a ADD CONSTRAINT fk_i_ref_b FOREIGN KEY (i) REFERENCES b (i);
ALTER TABLE f ADD CONSTRAINT fk_g_ref_g FOREIGN KEY (g) REFERENCES g (i);
ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e (i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f (i);
ALTER TABLE c ADD CONSTRAINT fk_i_ref_d FOREIGN KEY (i) REFERENCES d (i);
ALTER TABLE a ADD CONSTRAINT fk_i_ref_b FOREIGN KEY (i) REFERENCES b(i);
ALTER TABLE f ADD CONSTRAINT fk_g_ref_g FOREIGN KEY (g) REFERENCES g(i);
ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e(i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f(i);
ALTER TABLE c ADD CONSTRAINT fk_i_ref_d FOREIGN KEY (i) REFERENCES d(i);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE a VALIDATE CONSTRAINT fk_i_ref_b;
Expand Down Expand Up @@ -163,8 +163,8 @@ INSERT INTO e (i) VALUES
INSERT INTO d (i, e, f) VALUES
(1, 1, 1);

ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e (i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f (i);
ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e(i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f(i);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE d VALIDATE CONSTRAINT fk_e_ref_e;
Expand Down
8 changes: 4 additions & 4 deletions pkg/cli/testdata/dump/reference_self
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ CREATE TABLE t (
INSERT INTO t (id, next_id) VALUES
(1, NULL);

ALTER TABLE t ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY (next_id) REFERENCES t (id);
ALTER TABLE t ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY (next_id) REFERENCES t(id);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE t VALIDATE CONSTRAINT fk_next_id_ref_t;
Expand Down Expand Up @@ -59,7 +59,7 @@ CREATE TABLE t (
INSERT INTO t (id, next_id) VALUES
(1, 1);

ALTER TABLE t ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY (next_id) REFERENCES t (id);
ALTER TABLE t ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY (next_id) REFERENCES t(id);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE t VALIDATE CONSTRAINT fk_next_id_ref_t;
Expand Down Expand Up @@ -88,7 +88,7 @@ CREATE TABLE "table" (
INSERT INTO "table" (id, "'") VALUES
(1, 1);

ALTER TABLE "table" ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY ("'") REFERENCES "table" (id);
ALTER TABLE "table" ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY ("'") REFERENCES "table"(id);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE "table" VALIDATE CONSTRAINT fk_next_id_ref_t;
Expand All @@ -108,7 +108,7 @@ CREATE TABLE "table" (
FAMILY "primary" (id, "'")
);

ALTER TABLE "table" ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY ("'") REFERENCES "table" (id);
ALTER TABLE "table" ADD CONSTRAINT fk_next_id_ref_t FOREIGN KEY ("'") REFERENCES "table"(id);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE "table" VALIDATE CONSTRAINT fk_next_id_ref_t;
Expand Down
54 changes: 27 additions & 27 deletions pkg/sql/logictest/testdata/logic_test/alter_table
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,11 @@ a f b c
query TTTTB colnames
SHOW CONSTRAINTS FROM t
----
table_name constraint_name constraint_type details validated
t check_a CHECK CHECK (a > 0) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
table_name constraint_name constraint_type details validated
t check_a CHECK CHECK ((a > 0)) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other(b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true

statement error CHECK
INSERT INTO t (a, f) VALUES (-2, 9)
Expand All @@ -120,10 +120,10 @@ INSERT INTO t (a) VALUES (-3)
query TTTTB
SHOW CONSTRAINTS FROM t
----
t check_a CHECK CHECK (a > 0) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
t check_a CHECK CHECK ((a > 0)) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other(b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true

statement error duplicate constraint name
ALTER TABLE t ADD CONSTRAINT check_a CHECK (a > 0)
Expand All @@ -138,11 +138,11 @@ ALTER TABLE t ADD CHECK (a > 0)
query TTTTB
SHOW CONSTRAINTS FROM t
----
t check_a CHECK CHECK (a > 0) true
t check_a1 CHECK CHECK (a > 0) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
t check_a CHECK CHECK ((a > 0)) true
t check_a1 CHECK CHECK ((a > 0)) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other(b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true

statement error constraint "typo" does not exist
ALTER TABLE t VALIDATE CONSTRAINT typo
Expand All @@ -160,11 +160,11 @@ ALTER TABLE t VALIDATE CONSTRAINT check_a
query TTTTB
SHOW CONSTRAINTS FROM t
----
t check_a CHECK CHECK (a > 0) true
t check_a1 CHECK CHECK (a > 0) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other (b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
t check_a CHECK CHECK ((a > 0)) true
t check_a1 CHECK CHECK ((a > 0)) true
t fk_f_ref_other FOREIGN KEY FOREIGN KEY (f) REFERENCES other(b) true
t foo UNIQUE UNIQUE (b ASC) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true

statement ok
ALTER TABLE t DROP CONSTRAINT check_a, DROP CONSTRAINT check_a1
Expand Down Expand Up @@ -387,10 +387,10 @@ ALTER TABLE t ADD f INT UNIQUE REFERENCES other
query TTTTB
SHOW CONSTRAINTS FROM t
----
t check_f CHECK CHECK (f > 1) true
t check_g CHECK CHECK (g > 0) true
t check_h CHECK CHECK (h > 0) true
t check_h1 CHECK CHECK (h < 10) true
t check_f CHECK CHECK ((f > 1)) true
t check_g CHECK CHECK ((g > 0)) true
t check_h CHECK CHECK ((h > 0)) true
t check_h1 CHECK CHECK ((h < 10)) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
t t_h_key UNIQUE UNIQUE (h ASC) true

Expand Down Expand Up @@ -425,8 +425,8 @@ ALTER TABLE t ADD COLUMN u INT UNIQUE, ADD COLUMN v INT UNIQUE, ADD CONSTRAINT c
query TTTTB
SHOW CONSTRAINTS FROM t
----
t check_c_b CHECK CHECK (c > b) true
t ck CHECK CHECK (a > 0) true
t check_c_b CHECK CHECK ((c > b)) true
t ck CHECK CHECK ((a > 0)) true
t primary PRIMARY KEY PRIMARY KEY (a ASC) true
t t_d_key UNIQUE UNIQUE (d ASC) true
t t_e_key UNIQUE UNIQUE (e ASC) true
Expand Down Expand Up @@ -967,8 +967,8 @@ INSERT INTO t VALUES (NULL)
query TTTTB
SHOW CONSTRAINTS FROM t
----
t a_auto_not_null CHECK CHECK (a IS NOT NULL) true
t a_auto_not_null1 CHECK CHECK (a IS NOT NULL) true
t a_auto_not_null CHECK CHECK ((a IS NOT NULL)) true
t a_auto_not_null1 CHECK CHECK ((a IS NOT NULL)) true

statement ok
DROP TABLE t
12 changes: 9 additions & 3 deletions pkg/sql/logictest/testdata/logic_test/builtin_function
Original file line number Diff line number Diff line change
Expand Up @@ -1782,7 +1782,7 @@ anyelement
bit
boolean
bytea
character
bpchar
date
numeric
double precision
Expand Down Expand Up @@ -1979,8 +1979,8 @@ SELECT pg_catalog.pg_get_constraintdef(oid)
FROM pg_catalog.pg_constraint
WHERE conrelid='pg_constraintdef_test'::regclass
----
FOREIGN KEY (a) REFERENCES pg_indexdef_test (a) ON DELETE CASCADE
CHECK (c > a)
FOREIGN KEY (a) REFERENCES pg_indexdef_test(a) ON DELETE CASCADE
CHECK ((c > a))
UNIQUE (b ASC)

# These functions always return NULL since we don't support comments on vtable columns and databases.
Expand Down Expand Up @@ -2213,3 +2213,9 @@ query B
SELECT count(*) = 1 FROM crdb_internal.check_consistency(true, '\xff', '')
----
true

# Sanity check pg_type_is_visible.
query BBB
SELECT pg_type_is_visible('int'::regtype), pg_type_is_visible(NULL), pg_type_is_visible(99999)
----
true NULL NULL
10 changes: 5 additions & 5 deletions pkg/sql/logictest/testdata/logic_test/create_statements
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@ SELECT create_statement, create_nofks, alter_statements, validate_statements FRO
create_statement create_nofks alter_statements validate_statements
CREATE TABLE t (
a INT8 NULL,
CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t (rowid),
CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t(rowid),
INDEX t_auto_index_fk_a_ref_t (a ASC),
FAMILY "primary" (a, rowid)
) CREATE TABLE t (
a INT8 NULL,
INDEX t_auto_index_fk_a_ref_t (a ASC),
FAMILY "primary" (a, rowid)
) {"ALTER TABLE t ADD CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t (rowid)"} {"ALTER TABLE t VALIDATE CONSTRAINT fk_a_ref_t"}
) {"ALTER TABLE t ADD CONSTRAINT fk_a_ref_t FOREIGN KEY (a) REFERENCES t(rowid)"} {"ALTER TABLE t VALIDATE CONSTRAINT fk_a_ref_t"}
CREATE TABLE v (
"'" INT8 NULL,
s STRING NULL,
CONSTRAINT fk_s_ref_v FOREIGN KEY (s) REFERENCES v (s),
CONSTRAINT fk_s_ref_v FOREIGN KEY (s) REFERENCES v(s),
UNIQUE INDEX v_s_key (s ASC),
CONSTRAINT "fk_'_ref_t" FOREIGN KEY ("'") REFERENCES t (rowid),
CONSTRAINT "fk_'_ref_t" FOREIGN KEY ("'") REFERENCES t(rowid),
INDEX "v_auto_index_fk_'_ref_t" ("'" ASC),
FAMILY "primary" ("'", s, rowid)
) CREATE TABLE v (
Expand All @@ -34,4 +34,4 @@ CREATE TABLE v (
UNIQUE INDEX v_s_key (s ASC),
INDEX "v_auto_index_fk_'_ref_t" ("'" ASC),
FAMILY "primary" ("'", s, rowid)
) {"ALTER TABLE v ADD CONSTRAINT fk_s_ref_v FOREIGN KEY (s) REFERENCES v (s)","ALTER TABLE v ADD CONSTRAINT \"fk_'_ref_t\" FOREIGN KEY (\"'\") REFERENCES t (rowid)"} {"ALTER TABLE v VALIDATE CONSTRAINT fk_s_ref_v","ALTER TABLE v VALIDATE CONSTRAINT \"fk_'_ref_t\""}
) {"ALTER TABLE v ADD CONSTRAINT fk_s_ref_v FOREIGN KEY (s) REFERENCES v(s)","ALTER TABLE v ADD CONSTRAINT \"fk_'_ref_t\" FOREIGN KEY (\"'\") REFERENCES t(rowid)"} {"ALTER TABLE v VALIDATE CONSTRAINT fk_s_ref_v","ALTER TABLE v VALIDATE CONSTRAINT \"fk_'_ref_t\""}
Loading

0 comments on commit 0205653

Please sign in to comment.