Skip to content

Commit ac37160

Browse files
Reporting unique nulls not distinct in analyze schema and assessment report (#2125)
1 parent a6b5e4c commit ac37160

File tree

15 files changed

+592
-18
lines changed

15 files changed

+592
-18
lines changed

migtests/tests/analyze-schema/dummy-export-dir/schema/tables/INDEXES_table.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,9 @@ CREATE INDEX idx_udt1 on test_udt(home_address1);
103103

104104
CREATE INDEX idx_enum on test_udt(some_field);
105105

106-
CREATE INDEX "idx&_enum2" on test_udt((some_field::non_public.enum_test));
106+
CREATE INDEX "idx&_enum2" on test_udt((some_field::non_public.enum_test));
107+
108+
-- Create a unique index on a column with NULLs with the NULLS NOT DISTINCT option
109+
CREATE UNIQUE INDEX users_unique_nulls_not_distinct_index_email
110+
ON users_unique_nulls_not_distinct_index (email)
111+
NULLS NOT DISTINCT;

migtests/tests/analyze-schema/dummy-export-dir/schema/tables/table.sql

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,3 +429,39 @@ CREATE TABLE timestamptz_multirange_table (
429429
global_event_times tstzmultirange
430430
);
431431

432+
-- Testing tables with unique nulls not distinct constraints
433+
434+
-- Control case
435+
CREATE TABLE users_unique_nulls_distinct (
436+
id SERIAL PRIMARY KEY,
437+
email TEXT,
438+
UNIQUE (email)
439+
);
440+
441+
CREATE TABLE users_unique_nulls_not_distinct (
442+
id SERIAL PRIMARY KEY,
443+
email TEXT,
444+
UNIQUE NULLS NOT DISTINCT (email)
445+
);
446+
447+
CREATE TABLE sales_unique_nulls_not_distinct (
448+
store_id INT,
449+
product_id INT,
450+
sale_date DATE,
451+
UNIQUE NULLS NOT DISTINCT (store_id, product_id, sale_date)
452+
);
453+
454+
CREATE TABLE sales_unique_nulls_not_distinct_alter (
455+
store_id INT,
456+
product_id INT,
457+
sale_date DATE
458+
);
459+
460+
ALTER TABLE sales_unique_nulls_not_distinct_alter
461+
ADD CONSTRAINT sales_unique_nulls_not_distinct_alter_unique UNIQUE NULLS NOT DISTINCT (store_id, product_id, sale_date);
462+
463+
-- Create a unique index on a column with NULLs with the NULLS NOT DISTINCT option
464+
CREATE TABLE users_unique_nulls_not_distinct_index (
465+
id INTEGER PRIMARY KEY,
466+
email TEXT
467+
);

migtests/tests/analyze-schema/expected_issues.json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,5 +2060,45 @@
20602060
"Suggestion": "Multirange data type is not yet supported in YugabyteDB, no workaround available currently",
20612061
"GH": "",
20622062
"MinimumVersionsFixedIn": null
2063+
},
2064+
{
2065+
"IssueType": "unsupported_features",
2066+
"ObjectType": "TABLE",
2067+
"ObjectName": "users_unique_nulls_not_distinct",
2068+
"Reason": "Unique Nulls Not Distinct",
2069+
"SqlStatement": "CREATE TABLE users_unique_nulls_not_distinct (\n id SERIAL PRIMARY KEY,\n email TEXT,\n UNIQUE NULLS NOT DISTINCT (email)\n);",
2070+
"Suggestion": "",
2071+
"GH": "",
2072+
"MinimumVersionsFixedIn": null
2073+
},
2074+
{
2075+
"IssueType": "unsupported_features",
2076+
"ObjectType": "TABLE",
2077+
"ObjectName": "sales_unique_nulls_not_distinct",
2078+
"Reason": "Unique Nulls Not Distinct",
2079+
"SqlStatement": "CREATE TABLE sales_unique_nulls_not_distinct (\n store_id INT,\n product_id INT,\n sale_date DATE,\n UNIQUE NULLS NOT DISTINCT (store_id, product_id, sale_date)\n);",
2080+
"Suggestion": "",
2081+
"GH": "",
2082+
"MinimumVersionsFixedIn": null
2083+
},
2084+
{
2085+
"IssueType": "unsupported_features",
2086+
"ObjectType": "TABLE",
2087+
"ObjectName": "sales_unique_nulls_not_distinct_alter",
2088+
"Reason": "Unique Nulls Not Distinct",
2089+
"SqlStatement": "ALTER TABLE sales_unique_nulls_not_distinct_alter\n\tADD CONSTRAINT sales_unique_nulls_not_distinct_alter_unique UNIQUE NULLS NOT DISTINCT (store_id, product_id, sale_date);",
2090+
"Suggestion": "",
2091+
"GH": "",
2092+
"MinimumVersionsFixedIn": null
2093+
},
2094+
{
2095+
"IssueType": "unsupported_features",
2096+
"ObjectType": "INDEX",
2097+
"ObjectName": "users_unique_nulls_not_distinct_index_email ON users_unique_nulls_not_distinct_index",
2098+
"Reason": "Unique Nulls Not Distinct",
2099+
"SqlStatement": "CREATE UNIQUE INDEX users_unique_nulls_not_distinct_index_email\n ON users_unique_nulls_not_distinct_index (email)\n NULLS NOT DISTINCT;",
2100+
"Suggestion": "",
2101+
"GH": "",
2102+
"MinimumVersionsFixedIn": null
20632103
}
20642104
]

migtests/tests/analyze-schema/summary.json

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,14 @@
2626
},
2727
{
2828
"ObjectType": "TABLE",
29-
"TotalCount": 59,
30-
"InvalidCount": 50,
31-
"ObjectNames": "public.json_data, employees, image, public.xml_data_example, combined_tbl1, test_arr_enum, public.locations, test_udt, combined_tbl, public.ts_query_table, public.documents, public.citext_type, public.inet_type, public.test_jsonb, test_xml_type, test_xid_type, public.range_columns_partition_test_copy, anydata_test, uritype_test, public.foreign_def_test, test_4, enum_example.bugs, table_abc, anydataset_test, unique_def_test1, test_2, table_1, public.range_columns_partition_test, table_xyz, public.users, test_3, test_5, test_7, foreign_def_test2, unique_def_test, sales_data, table_test, test_interval, test_non_pk_multi_column_list, test_9, test_8, order_details, public.employees4, anytype_test, public.meeting, test_table_in_type_file, sales, test_1, \"Test\", foreign_def_test1, salaries2, test_6, public.pr, bigint_multirange_table, date_multirange_table, int_multirange_table, numeric_multirange_table, timestamp_multirange_table, timestamptz_multirange_table" },
32-
29+
"TotalCount": 64,
30+
"InvalidCount": 53,
31+
"ObjectNames": "test_table_in_type_file, sales_data, salaries2, sales, test_1, test_2, test_non_pk_multi_column_list, test_3, test_4, test_5, test_6, test_7, test_8, test_9, order_details, public.employees4, enum_example.bugs, table_xyz, table_abc, table_1, table_test, test_interval, public.range_columns_partition_test, public.range_columns_partition_test_copy, anydata_test, anydataset_test, anytype_test, uritype_test, \"Test\", public.meeting, public.pr, public.foreign_def_test, public.users, foreign_def_test1, foreign_def_test2, unique_def_test, unique_def_test1, test_xml_type, test_xid_type, public.test_jsonb, public.inet_type, public.citext_type, public.documents, public.ts_query_table, combined_tbl, combined_tbl1, test_udt, test_arr_enum, public.locations, public.xml_data_example, image, public.json_data, employees, bigint_multirange_table, date_multirange_table, int_multirange_table, numeric_multirange_table, timestamp_multirange_table, timestamptz_multirange_table, users_unique_nulls_distinct, users_unique_nulls_not_distinct, sales_unique_nulls_not_distinct, sales_unique_nulls_not_distinct_alter, users_unique_nulls_not_distinct_index" },
3332
{
3433
"ObjectType": "INDEX",
35-
"TotalCount": 43,
36-
"InvalidCount": 39,
37-
"ObjectNames": "idx1 ON combined_tbl1, idx2 ON combined_tbl1, idx3 ON combined_tbl1, idx4 ON combined_tbl1, idx5 ON combined_tbl1, idx6 ON combined_tbl1, idx7 ON combined_tbl1, idx8 ON combined_tbl1, film_fulltext_idx ON public.film, idx_actor_last_name ON public.actor, idx_name1 ON table_name, idx_name2 ON table_name, idx_name3 ON schema_name.table_name, idx_fileinfo_name_splitted ON public.fileinfo, abc ON public.example, abc ON schema2.example, tsvector_idx ON public.documents, tsquery_idx ON public.ts_query_table, idx_citext ON public.citext_type, idx_inet ON public.inet_type, idx_json ON public.test_jsonb, idx_json2 ON public.test_jsonb, idx_valid ON public.test_jsonb, idx_array ON public.documents, idx1 ON combined_tbl, idx2 ON combined_tbl, idx3 ON combined_tbl, idx4 ON combined_tbl, idx5 ON combined_tbl, idx6 ON combined_tbl, idx7 ON combined_tbl, idx8 ON combined_tbl, idx9 ON combined_tbl, idx10 ON combined_tbl, idx11 ON combined_tbl, idx12 ON combined_tbl, idx13 ON combined_tbl, idx14 ON combined_tbl, idx15 ON combined_tbl, idx_udt ON test_udt, idx_udt1 ON test_udt, idx_enum ON test_udt, \"idx\u0026_enum2\" ON test_udt",
34+
"TotalCount": 44,
35+
"InvalidCount": 40,
36+
"ObjectNames": "film_fulltext_idx ON public.film, idx_actor_last_name ON public.actor, idx_name1 ON table_name, idx_name2 ON table_name, idx_name3 ON schema_name.table_name, idx_fileinfo_name_splitted ON public.fileinfo, abc ON public.example, abc ON schema2.example, tsvector_idx ON public.documents, tsquery_idx ON public.ts_query_table, idx_citext ON public.citext_type, idx_inet ON public.inet_type, idx_json ON public.test_jsonb, idx_json2 ON public.test_jsonb, idx_valid ON public.test_jsonb, idx_array ON public.documents, idx1 ON combined_tbl, idx2 ON combined_tbl, idx3 ON combined_tbl, idx4 ON combined_tbl, idx5 ON combined_tbl, idx6 ON combined_tbl, idx7 ON combined_tbl, idx8 ON combined_tbl, idx9 ON combined_tbl, idx10 ON combined_tbl, idx11 ON combined_tbl, idx12 ON combined_tbl, idx13 ON combined_tbl, idx14 ON combined_tbl, idx15 ON combined_tbl, idx1 ON combined_tbl1, idx2 ON combined_tbl1, idx3 ON combined_tbl1, idx4 ON combined_tbl1, idx5 ON combined_tbl1, idx6 ON combined_tbl1, idx7 ON combined_tbl1, idx8 ON combined_tbl1, idx_udt ON test_udt, idx_udt1 ON test_udt, idx_enum ON test_udt, \"idx\u0026_enum2\" ON test_udt, users_unique_nulls_not_distinct_index_email ON users_unique_nulls_not_distinct_index",
3837
"Details": "There are some GIN indexes present in the schema, but GIN indexes are partially supported in YugabyteDB as mentioned in (https://github.com/yugabyte/yugabyte-db/issues/7850) so take a look and modify them if not supported."
3938
},
4039
{

0 commit comments

Comments
 (0)