Skip to content

Commit dabed7d

Browse files
Addressed reviewer concerns and extended test coveraged checked with tarpaulin
1 parent 3ce8f71 commit dabed7d

File tree

3 files changed

+28
-75
lines changed

3 files changed

+28
-75
lines changed

src/ast/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,12 @@ pub use self::ddl::{
7373
CreatePolicyCommand, CreatePolicyType, CreateTable, CreateTextSearch, CreateTrigger,
7474
CreateView, Deduplicate, DeferrableInitial, DistStyle, DropBehavior, DropExtension,
7575
DropFunction, DropOperator, DropOperatorClass, DropOperatorFamily, DropOperatorSignature,
76-
DropPolicy, DropTrigger, ForValues, FunctionReturnType, GeneratedAs,
77-
GeneratedExpressionMode, IdentityParameters,
78-
IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind, IdentityPropertyOrder,
79-
IndexColumn, IndexOption, IndexType, KeyOrIndexDisplay, Msck, NullsDistinctOption,
80-
OperatorArgTypes, OperatorClassItem, OperatorFamilyDropItem, OperatorFamilyItem,
81-
OperatorOption, OperatorPurpose, Owner, Partition, PartitionBoundValue, ProcedureParam,
82-
ReferentialAction, RenameTableNameKind, ReplicaIdentity, TagsColumnOption,
76+
DropPolicy, DropTrigger, ForValues, FunctionReturnType, GeneratedAs, GeneratedExpressionMode,
77+
IdentityParameters, IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind,
78+
IdentityPropertyOrder, IndexColumn, IndexOption, IndexType, KeyOrIndexDisplay, Msck,
79+
NullsDistinctOption, OperatorArgTypes, OperatorClassItem, OperatorFamilyDropItem,
80+
OperatorFamilyItem, OperatorOption, OperatorPurpose, Owner, Partition, PartitionBoundValue,
81+
ProcedureParam, ReferentialAction, RenameTableNameKind, ReplicaIdentity, TagsColumnOption,
8382
TextSearchObjectType, TriggerObjectKind, Truncate, UserDefinedTypeCompositeAttributeDef,
8483
UserDefinedTypeInternalLength, UserDefinedTypeRangeOption, UserDefinedTypeRepresentation,
8584
UserDefinedTypeSqlDefinitionOption, UserDefinedTypeStorage, ViewColumnDef,

src/parser/mod.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5113,12 +5113,7 @@ impl<'a> Parser<'a> {
51135113
let create_view_params = self.parse_create_view_params()?;
51145114
if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
51155115
self.parse_create_snapshot_table().map(Into::into)
5116-
} else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5117-
if or_replace || or_alter || temporary || global.is_some() || transient || persistent {
5118-
return Err(ParserError::ParserError(
5119-
"CREATE TEXT SEARCH does not support CREATE modifiers".to_string(),
5120-
));
5121-
}
5116+
} else if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
51225117
self.parse_create_text_search().map(Into::into)
51235118
} else if self.parse_keyword(Keyword::TABLE) {
51245119
self.parse_create_table(or_replace, temporary, global, transient)
@@ -5211,19 +5206,13 @@ impl<'a> Parser<'a> {
52115206
}
52125207
}
52135208

5214-
fn parse_text_search_option(&mut self) -> Result<SqlOption, ParserError> {
5215-
let key = self.parse_identifier()?;
5216-
self.expect_token(&Token::Eq)?;
5217-
let value = self.parse_expr()?;
5218-
Ok(SqlOption::KeyValue { key, value })
5219-
}
5220-
52215209
/// Parse a PostgreSQL `CREATE TEXT SEARCH ...` statement.
52225210
pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
5211+
self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52235212
let object_type = self.parse_text_search_object_type()?;
52245213
let name = self.parse_object_name(false)?;
52255214
self.expect_token(&Token::LParen)?;
5226-
let options = self.parse_comma_separated(Parser::parse_text_search_option)?;
5215+
let options = self.parse_comma_separated(Parser::parse_sql_option)?;
52275216
self.expect_token(&Token::RParen)?;
52285217
Ok(CreateTextSearch {
52295218
object_type,
@@ -5246,6 +5235,7 @@ impl<'a> Parser<'a> {
52465235

52475236
/// Parse a PostgreSQL `ALTER TEXT SEARCH ...` statement.
52485237
pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
5238+
self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52495239
let object_type = self.parse_text_search_object_type()?;
52505240
let name = self.parse_object_name(false)?;
52515241

@@ -10723,7 +10713,7 @@ impl<'a> Parser<'a> {
1072310713

1072410714
/// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
1072510715
pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10726-
if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
10716+
if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
1072710717
return self.parse_alter_text_search().map(Into::into);
1072810718
}
1072910719

tests/sqlparser_postgres.rs

Lines changed: 17 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8061,49 +8061,24 @@ fn parse_alter_operator_class() {
80618061
}
80628062

80638063
#[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-
];
8064+
fn parse_create_and_alter_text_search() {
8065+
// CREATE — one per object type
8066+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH DICTIONARY d (template = simple)");
8067+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH CONFIGURATION c (copy = english)");
8068+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (lexize = dsimple_lexize)");
8069+
pg_and_generic().verified_stmt(
8070+
"CREATE TEXT SEARCH PARSER p (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8071+
);
81018072

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-
}
8073+
// CREATE with quoted option key
8074+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (\"Init\" = init_function)");
8075+
8076+
// ALTER — one test per object type arm, one per operation kind
8077+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt = val)");
8078+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt)");
8079+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH CONFIGURATION c OWNER TO some_user");
8080+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH TEMPLATE t SET SCHEMA s");
8081+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH PARSER p RENAME TO p2");
81078082

81088083
// Object type must be an unquoted keyword-like token in this position.
81098084
assert!(pg()
@@ -8114,17 +8089,6 @@ fn parse_create_and_alter_text_search_failure_cases() {
81148089
assert!(pg()
81158090
.parse_sql_statements("CREATE TEXT SEARCH DICTIONARY d (template)")
81168091
.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());
81288092
}
81298093

81308094
#[test]

0 commit comments

Comments
 (0)