Skip to content

Commit 2be0202

Browse files
committed
test: add round-trip tests for CREATE STATISTICS, ACCESS METHOD, EVENT TRIGGER, TRANSFORM
1 parent 8c97e3d commit 2be0202

1 file changed

Lines changed: 109 additions & 0 deletions

File tree

tests/sqlparser_postgres.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9867,3 +9867,112 @@ fn parse_create_subscription_with_options() {
98679867
other => panic!("unexpected option: {other:?}"),
98689868
}
98699869
}
9870+
9871+
#[test]
9872+
fn parse_create_statistics_basic() {
9873+
let sql = "CREATE STATISTICS public.s ON a, b FROM public.t";
9874+
let Statement::CreateStatistics(stmt) = pg().verified_stmt(sql) else {
9875+
unreachable!()
9876+
};
9877+
assert!(!stmt.if_not_exists);
9878+
assert_eq!(stmt.name.to_string(), "public.s");
9879+
assert!(stmt.kinds.is_empty());
9880+
assert_eq!(stmt.on.len(), 2);
9881+
assert_eq!(stmt.from.to_string(), "public.t");
9882+
}
9883+
9884+
#[test]
9885+
fn parse_create_statistics_if_not_exists_with_kinds() {
9886+
let sql = "CREATE STATISTICS IF NOT EXISTS mystat (ndistinct, dependencies, mcv) ON col1, col2 FROM mytable";
9887+
let Statement::CreateStatistics(stmt) = pg().verified_stmt(sql) else {
9888+
unreachable!()
9889+
};
9890+
assert!(stmt.if_not_exists);
9891+
assert_eq!(stmt.name.to_string(), "mystat");
9892+
assert_eq!(
9893+
stmt.kinds,
9894+
vec![
9895+
StatisticsKind::NDistinct,
9896+
StatisticsKind::Dependencies,
9897+
StatisticsKind::Mcv,
9898+
]
9899+
);
9900+
assert_eq!(stmt.on.len(), 2);
9901+
}
9902+
9903+
#[test]
9904+
fn parse_create_access_method_index() {
9905+
let sql = "CREATE ACCESS METHOD my_am TYPE INDEX HANDLER bthandler";
9906+
let Statement::CreateAccessMethod(stmt) = pg().verified_stmt(sql) else {
9907+
unreachable!()
9908+
};
9909+
assert_eq!(stmt.name.value, "my_am");
9910+
assert_eq!(stmt.method_type, AccessMethodType::Index);
9911+
assert_eq!(stmt.handler.to_string(), "bthandler");
9912+
}
9913+
9914+
#[test]
9915+
fn parse_create_access_method_table() {
9916+
let sql = "CREATE ACCESS METHOD my_tam TYPE TABLE HANDLER heap_tableam_handler";
9917+
let Statement::CreateAccessMethod(stmt) = pg().verified_stmt(sql) else {
9918+
unreachable!()
9919+
};
9920+
assert_eq!(stmt.name.value, "my_tam");
9921+
assert_eq!(stmt.method_type, AccessMethodType::Table);
9922+
assert_eq!(stmt.handler.to_string(), "heap_tableam_handler");
9923+
}
9924+
9925+
#[test]
9926+
fn parse_create_event_trigger_basic() {
9927+
let sql = "CREATE EVENT TRIGGER myet ON ddl_command_start EXECUTE FUNCTION public.handler()";
9928+
let Statement::CreateEventTrigger(stmt) = pg().verified_stmt(sql) else {
9929+
unreachable!()
9930+
};
9931+
assert_eq!(stmt.name.value, "myet");
9932+
assert_eq!(stmt.event, EventTriggerEvent::DdlCommandStart);
9933+
assert!(stmt.when_tags.is_none());
9934+
assert_eq!(stmt.execute.to_string(), "public.handler");
9935+
assert!(!stmt.is_procedure);
9936+
}
9937+
9938+
#[test]
9939+
fn parse_create_event_trigger_with_when_tags() {
9940+
let sql = "CREATE EVENT TRIGGER myet ON ddl_command_end WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE') EXECUTE FUNCTION abort_any_command()";
9941+
let Statement::CreateEventTrigger(stmt) = pg().verified_stmt(sql) else {
9942+
unreachable!()
9943+
};
9944+
assert_eq!(stmt.event, EventTriggerEvent::DdlCommandEnd);
9945+
let tags = stmt.when_tags.unwrap();
9946+
assert_eq!(tags.len(), 2);
9947+
assert_eq!(tags[0].to_string(), "'CREATE TABLE'");
9948+
assert_eq!(tags[1].to_string(), "'ALTER TABLE'");
9949+
}
9950+
9951+
#[test]
9952+
fn parse_create_transform_basic() {
9953+
let sql = "CREATE TRANSFORM FOR INT LANGUAGE sql (FROM SQL WITH FUNCTION f1(internal), TO SQL WITH FUNCTION f2(INT))";
9954+
let Statement::CreateTransform(stmt) = pg().verified_stmt(sql) else {
9955+
unreachable!()
9956+
};
9957+
assert!(!stmt.or_replace);
9958+
assert_eq!(stmt.type_name.to_string(), "INT");
9959+
assert_eq!(stmt.language.value, "sql");
9960+
assert_eq!(stmt.elements.len(), 2);
9961+
assert!(stmt.elements[0].is_from);
9962+
assert_eq!(stmt.elements[0].function.to_string(), "f1");
9963+
assert!(!stmt.elements[1].is_from);
9964+
assert_eq!(stmt.elements[1].function.to_string(), "f2");
9965+
}
9966+
9967+
#[test]
9968+
fn parse_create_or_replace_transform() {
9969+
let sql = "CREATE OR REPLACE TRANSFORM FOR BIGINT LANGUAGE plpgsql (FROM SQL WITH FUNCTION int8recv(internal))";
9970+
let Statement::CreateTransform(stmt) = pg().verified_stmt(sql) else {
9971+
unreachable!()
9972+
};
9973+
assert!(stmt.or_replace);
9974+
assert_eq!(stmt.type_name.to_string(), "BIGINT");
9975+
assert_eq!(stmt.language.value, "plpgsql");
9976+
assert_eq!(stmt.elements.len(), 1);
9977+
assert!(stmt.elements[0].is_from);
9978+
}

0 commit comments

Comments
 (0)