Skip to content

Commit 3ce8f71

Browse files
tests: add PostgreSQL text search DDL regression coverage
Add regression coverage for the provided CREATE/ALTER TEXT SEARCH\nstatements and guardrails for rejected forms (quoted object type,\nmissing key/value option syntax, and unsupported CREATE modifiers).
1 parent a6ad860 commit 3ce8f71

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

tests/sqlparser_postgres.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8060,6 +8060,73 @@ fn parse_alter_operator_class() {
80608060
.is_err());
80618061
}
80628062

8063+
#[test]
8064+
fn parse_create_and_alter_text_search_failure_cases() {
8065+
let sql_cases = [
8066+
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple)",
8067+
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple)",
8068+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict2",
8069+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict3",
8070+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user2",
8071+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3",
8072+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2",
8073+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 RENAME TO alt_ts_dict4",
8074+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict4",
8075+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 OWNER TO regress_alter_generic_user2",
8076+
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 SET SCHEMA alt_nsp2",
8077+
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english)",
8078+
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english)",
8079+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf2",
8080+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf3",
8081+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user2",
8082+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3",
8083+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2",
8084+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 RENAME TO alt_ts_conf4",
8085+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf4",
8086+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 OWNER TO regress_alter_generic_user2",
8087+
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 SET SCHEMA alt_nsp2",
8088+
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp1 (lexize=dsimple_lexize)",
8089+
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize)",
8090+
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp2",
8091+
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp3",
8092+
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2",
8093+
"CREATE TEXT SEARCH TEMPLATE tstemp_case (\"Init\" = init_function)",
8094+
"CREATE TEXT SEARCH PARSER alt_ts_prs1 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8095+
"CREATE TEXT SEARCH PARSER alt_ts_prs2 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8096+
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs2",
8097+
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs3",
8098+
"ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2",
8099+
"CREATE TEXT SEARCH PARSER tspars_case (\"Start\" = start_function)",
8100+
];
8101+
8102+
for sql in sql_cases {
8103+
if let Err(err) = pg().parse_sql_statements(sql) {
8104+
panic!("Failed to parse `{sql}`: {err}");
8105+
}
8106+
}
8107+
8108+
// Object type must be an unquoted keyword-like token in this position.
8109+
assert!(pg()
8110+
.parse_sql_statements("CREATE TEXT SEARCH \"DICTIONARY\" d (template = simple)")
8111+
.is_err());
8112+
8113+
// CREATE options are key-value pairs in PostgreSQL syntax.
8114+
assert!(pg()
8115+
.parse_sql_statements("CREATE TEXT SEARCH DICTIONARY d (template)")
8116+
.is_err());
8117+
8118+
// CREATE TEXT SEARCH does not support generic CREATE modifiers.
8119+
assert!(pg()
8120+
.parse_sql_statements("CREATE OR REPLACE TEXT SEARCH DICTIONARY d (template = simple)")
8121+
.is_err());
8122+
assert!(pg()
8123+
.parse_sql_statements("CREATE OR ALTER TEXT SEARCH DICTIONARY d (template = simple)")
8124+
.is_err());
8125+
assert!(pg()
8126+
.parse_sql_statements("CREATE TEMP TEXT SEARCH DICTIONARY d (template = simple)")
8127+
.is_err());
8128+
}
8129+
80638130
#[test]
80648131
fn parse_drop_operator_family() {
80658132
for if_exists in [true, false] {

0 commit comments

Comments
 (0)