Skip to content

Commit 182faf5

Browse files
Addressed reviewer concerns and extended test coveraged checked with tarpaulin
1 parent 143e0ef commit 182faf5

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
@@ -74,13 +74,12 @@ pub use self::ddl::{
7474
CreatePolicyCommand, CreatePolicyType, CreateTable, CreateTextSearch, CreateTrigger,
7575
CreateView, Deduplicate, DeferrableInitial, DistStyle, DropBehavior, DropExtension,
7676
DropFunction, DropOperator, DropOperatorClass, DropOperatorFamily, DropOperatorSignature,
77-
DropPolicy, DropTrigger, ForValues, FunctionReturnType, GeneratedAs,
78-
GeneratedExpressionMode, IdentityParameters,
79-
IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind, IdentityPropertyOrder,
80-
IndexColumn, IndexOption, IndexType, KeyOrIndexDisplay, Msck, NullsDistinctOption,
81-
OperatorArgTypes, OperatorClassItem, OperatorFamilyDropItem, OperatorFamilyItem,
82-
OperatorOption, OperatorPurpose, Owner, Partition, PartitionBoundValue, ProcedureParam,
83-
ReferentialAction, RenameTableNameKind, ReplicaIdentity, TagsColumnOption,
77+
DropPolicy, DropTrigger, ForValues, FunctionReturnType, GeneratedAs, GeneratedExpressionMode,
78+
IdentityParameters, IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind,
79+
IdentityPropertyOrder, IndexColumn, IndexOption, IndexType, KeyOrIndexDisplay, Msck,
80+
NullsDistinctOption, OperatorArgTypes, OperatorClassItem, OperatorFamilyDropItem,
81+
OperatorFamilyItem, OperatorOption, OperatorPurpose, Owner, Partition, PartitionBoundValue,
82+
ProcedureParam, ReferentialAction, RenameTableNameKind, ReplicaIdentity, TagsColumnOption,
8483
TextSearchObjectType, TriggerObjectKind, Truncate, UserDefinedTypeCompositeAttributeDef,
8584
UserDefinedTypeInternalLength, UserDefinedTypeRangeOption, UserDefinedTypeRepresentation,
8685
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

@@ -10792,7 +10782,7 @@ impl<'a> Parser<'a> {
1079210782

1079310783
/// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
1079410784
pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10795-
if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
10785+
if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
1079610786
return self.parse_alter_text_search().map(Into::into);
1079710787
}
1079810788

tests/sqlparser_postgres.rs

Lines changed: 17 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8280,49 +8280,24 @@ fn parse_alter_function_and_aggregate() {
82808280
}
82818281

82828282
#[test]
8283-
fn parse_create_and_alter_text_search_failure_cases() {
8284-
let sql_cases = [
8285-
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple)",
8286-
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple)",
8287-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict2",
8288-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict3",
8289-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user2",
8290-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3",
8291-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2",
8292-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 RENAME TO alt_ts_dict4",
8293-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict4",
8294-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 OWNER TO regress_alter_generic_user2",
8295-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 SET SCHEMA alt_nsp2",
8296-
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english)",
8297-
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english)",
8298-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf2",
8299-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf3",
8300-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user2",
8301-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3",
8302-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2",
8303-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 RENAME TO alt_ts_conf4",
8304-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf4",
8305-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 OWNER TO regress_alter_generic_user2",
8306-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 SET SCHEMA alt_nsp2",
8307-
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp1 (lexize=dsimple_lexize)",
8308-
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize)",
8309-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp2",
8310-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp3",
8311-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2",
8312-
"CREATE TEXT SEARCH TEMPLATE tstemp_case (\"Init\" = init_function)",
8313-
"CREATE TEXT SEARCH PARSER alt_ts_prs1 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8314-
"CREATE TEXT SEARCH PARSER alt_ts_prs2 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8315-
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs2",
8316-
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs3",
8317-
"ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2",
8318-
"CREATE TEXT SEARCH PARSER tspars_case (\"Start\" = start_function)",
8319-
];
8283+
fn parse_create_and_alter_text_search() {
8284+
// CREATE — one per object type
8285+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH DICTIONARY d (template = simple)");
8286+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH CONFIGURATION c (copy = english)");
8287+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (lexize = dsimple_lexize)");
8288+
pg_and_generic().verified_stmt(
8289+
"CREATE TEXT SEARCH PARSER p (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8290+
);
83208291

8321-
for sql in sql_cases {
8322-
if let Err(err) = pg().parse_sql_statements(sql) {
8323-
panic!("Failed to parse `{sql}`: {err}");
8324-
}
8325-
}
8292+
// CREATE with quoted option key
8293+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (\"Init\" = init_function)");
8294+
8295+
// ALTER — one test per object type arm, one per operation kind
8296+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt = val)");
8297+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt)");
8298+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH CONFIGURATION c OWNER TO some_user");
8299+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH TEMPLATE t SET SCHEMA s");
8300+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH PARSER p RENAME TO p2");
83268301

83278302
// Object type must be an unquoted keyword-like token in this position.
83288303
assert!(pg()
@@ -8333,17 +8308,6 @@ fn parse_create_and_alter_text_search_failure_cases() {
83338308
assert!(pg()
83348309
.parse_sql_statements("CREATE TEXT SEARCH DICTIONARY d (template)")
83358310
.is_err());
8336-
8337-
// CREATE TEXT SEARCH does not support generic CREATE modifiers.
8338-
assert!(pg()
8339-
.parse_sql_statements("CREATE OR REPLACE TEXT SEARCH DICTIONARY d (template = simple)")
8340-
.is_err());
8341-
assert!(pg()
8342-
.parse_sql_statements("CREATE OR ALTER TEXT SEARCH DICTIONARY d (template = simple)")
8343-
.is_err());
8344-
assert!(pg()
8345-
.parse_sql_statements("CREATE TEMP TEXT SEARCH DICTIONARY d (template = simple)")
8346-
.is_err());
83478311
}
83488312

83498313
#[test]

0 commit comments

Comments
 (0)