Skip to content

Commit 36319df

Browse files
Addressed reviewer concerns and extended test coveraged checked with tarpaulin
1 parent 93b95ef commit 36319df

3 files changed

Lines changed: 31 additions & 77 deletions

File tree

src/ast/mod.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,15 @@ pub use self::ddl::{
7575
CreateTable, CreateTextSearch, CreateTrigger, CreateView, Deduplicate, DeferrableInitial,
7676
DistStyle, DropBehavior, DropExtension, DropFunction, DropOperator, DropOperatorClass,
7777
DropOperatorFamily, DropOperatorSignature, DropPolicy, DropTrigger, ForValues,
78-
FunctionReturnType, GeneratedAs, 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,
84-
TextSearchObjectType, TriggerObjectKind, Truncate, UserDefinedTypeCompositeAttributeDef,
85-
UserDefinedTypeInternalLength, UserDefinedTypeRangeOption, UserDefinedTypeRepresentation,
86-
UserDefinedTypeSqlDefinitionOption, UserDefinedTypeStorage, ViewColumnDef, WithData,
78+
FunctionReturnType, GeneratedAs, GeneratedExpressionMode, IdentityParameters, IdentityProperty,
79+
IdentityPropertyFormatKind, IdentityPropertyKind, IdentityPropertyOrder, IndexColumn,
80+
IndexOption, IndexType, KeyOrIndexDisplay, Msck, NullsDistinctOption, OperatorArgTypes,
81+
OperatorClassItem, OperatorFamilyDropItem, OperatorFamilyItem, OperatorOption, OperatorPurpose,
82+
Owner, Partition, PartitionBoundValue, ProcedureParam, ReferentialAction, RenameTableNameKind,
83+
ReplicaIdentity, TagsColumnOption, TextSearchObjectType, TriggerObjectKind, Truncate,
84+
UserDefinedTypeCompositeAttributeDef, UserDefinedTypeInternalLength,
85+
UserDefinedTypeRangeOption, UserDefinedTypeRepresentation, UserDefinedTypeSqlDefinitionOption,
86+
UserDefinedTypeStorage, ViewColumnDef, WithData,
8787
};
8888
pub use self::dml::{
8989
Delete, Insert, Merge, MergeAction, MergeClause, MergeClauseKind, MergeInsertExpr,

src/parser/mod.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5144,12 +5144,7 @@ impl<'a> Parser<'a> {
51445144
let create_view_params = self.parse_create_view_params()?;
51455145
if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
51465146
self.parse_create_snapshot_table().map(Into::into)
5147-
} else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5148-
if or_replace || or_alter || temporary || global.is_some() || transient || persistent {
5149-
return Err(ParserError::ParserError(
5150-
"CREATE TEXT SEARCH does not support CREATE modifiers".to_string(),
5151-
));
5152-
}
5147+
} else if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
51535148
self.parse_create_text_search().map(Into::into)
51545149
} else if self.parse_keyword(Keyword::TABLE) {
51555150
self.parse_create_table(or_replace, temporary, global, transient, volatile, multiset)
@@ -5244,19 +5239,13 @@ impl<'a> Parser<'a> {
52445239
}
52455240
}
52465241

5247-
fn parse_text_search_option(&mut self) -> Result<SqlOption, ParserError> {
5248-
let key = self.parse_identifier()?;
5249-
self.expect_token(&Token::Eq)?;
5250-
let value = self.parse_expr()?;
5251-
Ok(SqlOption::KeyValue { key, value })
5252-
}
5253-
52545242
/// Parse a PostgreSQL `CREATE TEXT SEARCH ...` statement.
52555243
pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
5244+
self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52565245
let object_type = self.parse_text_search_object_type()?;
52575246
let name = self.parse_object_name(false)?;
52585247
self.expect_token(&Token::LParen)?;
5259-
let options = self.parse_comma_separated(Parser::parse_text_search_option)?;
5248+
let options = self.parse_comma_separated(Parser::parse_sql_option)?;
52605249
self.expect_token(&Token::RParen)?;
52615250
Ok(CreateTextSearch {
52625251
object_type,
@@ -5279,6 +5268,7 @@ impl<'a> Parser<'a> {
52795268

52805269
/// Parse a PostgreSQL `ALTER TEXT SEARCH ...` statement.
52815270
pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
5271+
self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
52825272
let object_type = self.parse_text_search_object_type()?;
52835273
let name = self.parse_object_name(false)?;
52845274

@@ -10943,7 +10933,7 @@ impl<'a> Parser<'a> {
1094310933

1094410934
/// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
1094510935
pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10946-
if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
10936+
if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
1094710937
return self.parse_alter_text_search().map(Into::into);
1094810938
}
1094910939

tests/sqlparser_postgres.rs

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

84988498
#[test]
8499-
fn parse_create_and_alter_text_search_failure_cases() {
8500-
let sql_cases = [
8501-
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict1 (template=simple)",
8502-
"CREATE TEXT SEARCH DICTIONARY alt_ts_dict2 (template=simple)",
8503-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict2",
8504-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict3",
8505-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user2",
8506-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 OWNER TO regress_alter_generic_user3",
8507-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict2 SET SCHEMA alt_nsp2",
8508-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 RENAME TO alt_ts_dict4",
8509-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 RENAME TO alt_ts_dict4",
8510-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 OWNER TO regress_alter_generic_user2",
8511-
"ALTER TEXT SEARCH DICTIONARY alt_ts_dict3 SET SCHEMA alt_nsp2",
8512-
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf1 (copy=english)",
8513-
"CREATE TEXT SEARCH CONFIGURATION alt_ts_conf2 (copy=english)",
8514-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf2",
8515-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf3",
8516-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user2",
8517-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 OWNER TO regress_alter_generic_user3",
8518-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf2 SET SCHEMA alt_nsp2",
8519-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 RENAME TO alt_ts_conf4",
8520-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 RENAME TO alt_ts_conf4",
8521-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 OWNER TO regress_alter_generic_user2",
8522-
"ALTER TEXT SEARCH CONFIGURATION alt_ts_conf3 SET SCHEMA alt_nsp2",
8523-
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp1 (lexize=dsimple_lexize)",
8524-
"CREATE TEXT SEARCH TEMPLATE alt_ts_temp2 (lexize=dsimple_lexize)",
8525-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp2",
8526-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp1 RENAME TO alt_ts_temp3",
8527-
"ALTER TEXT SEARCH TEMPLATE alt_ts_temp2 SET SCHEMA alt_nsp2",
8528-
"CREATE TEXT SEARCH TEMPLATE tstemp_case (\"Init\" = init_function)",
8529-
"CREATE TEXT SEARCH PARSER alt_ts_prs1 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8530-
"CREATE TEXT SEARCH PARSER alt_ts_prs2 (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8531-
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs2",
8532-
"ALTER TEXT SEARCH PARSER alt_ts_prs1 RENAME TO alt_ts_prs3",
8533-
"ALTER TEXT SEARCH PARSER alt_ts_prs2 SET SCHEMA alt_nsp2",
8534-
"CREATE TEXT SEARCH PARSER tspars_case (\"Start\" = start_function)",
8535-
];
8499+
fn parse_create_and_alter_text_search() {
8500+
// CREATE — one per object type
8501+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH DICTIONARY d (template = simple)");
8502+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH CONFIGURATION c (copy = english)");
8503+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (lexize = dsimple_lexize)");
8504+
pg_and_generic().verified_stmt(
8505+
"CREATE TEXT SEARCH PARSER p (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype)",
8506+
);
85368507

8537-
for sql in sql_cases {
8538-
if let Err(err) = pg().parse_sql_statements(sql) {
8539-
panic!("Failed to parse `{sql}`: {err}");
8540-
}
8541-
}
8508+
// CREATE with quoted option key
8509+
pg_and_generic().verified_stmt("CREATE TEXT SEARCH TEMPLATE t (\"Init\" = init_function)");
8510+
8511+
// ALTER — one test per object type arm, one per operation kind
8512+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt = val)");
8513+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH DICTIONARY d (opt)");
8514+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH CONFIGURATION c OWNER TO some_user");
8515+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH TEMPLATE t SET SCHEMA s");
8516+
pg_and_generic().verified_stmt("ALTER TEXT SEARCH PARSER p RENAME TO p2");
85428517

85438518
// Object type must be an unquoted keyword-like token in this position.
85448519
assert!(pg()
@@ -8549,17 +8524,6 @@ fn parse_create_and_alter_text_search_failure_cases() {
85498524
assert!(pg()
85508525
.parse_sql_statements("CREATE TEXT SEARCH DICTIONARY d (template)")
85518526
.is_err());
8552-
8553-
// CREATE TEXT SEARCH does not support generic CREATE modifiers.
8554-
assert!(pg()
8555-
.parse_sql_statements("CREATE OR REPLACE TEXT SEARCH DICTIONARY d (template = simple)")
8556-
.is_err());
8557-
assert!(pg()
8558-
.parse_sql_statements("CREATE OR ALTER TEXT SEARCH DICTIONARY d (template = simple)")
8559-
.is_err());
8560-
assert!(pg()
8561-
.parse_sql_statements("CREATE TEMP TEXT SEARCH DICTIONARY d (template = simple)")
8562-
.is_err());
85638527
}
85648528

85658529
#[test]

0 commit comments

Comments
 (0)