Skip to content

Commit e7ea590

Browse files
committed
test: add round-trip tests for SECURITY LABEL, CREATE USER MAPPING, CREATE TABLESPACE
Add 4 tests for SECURITY LABEL covering TABLE, NULL label, ROLE, and SCHEMA targets. Add 4 tests for CREATE USER MAPPING covering basic, IF NOT EXISTS with OPTIONS, CURRENT_USER, and PUBLIC user specifiers. Add 3 tests for CREATE TABLESPACE covering basic, OWNER, and WITH options. Refs: pgmold-115, pgmold-119, pgmold-120
1 parent d1a27d1 commit e7ea590

1 file changed

Lines changed: 136 additions & 0 deletions

File tree

tests/sqlparser_postgres.rs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9867,3 +9867,139 @@ fn parse_create_subscription_with_options() {
98679867
other => panic!("unexpected option: {other:?}"),
98689868
}
98699869
}
9870+
9871+
#[test]
9872+
fn parse_security_label_on_table() {
9873+
let sql = "SECURITY LABEL FOR selinux ON TABLE public.t IS 'system_u:object_r:sepgsql_table_t:s0'";
9874+
let Statement::SecurityLabel(stmt) = pg().verified_stmt(sql) else {
9875+
unreachable!()
9876+
};
9877+
assert_eq!(stmt.provider.as_ref().unwrap().value, "selinux");
9878+
assert!(matches!(stmt.object_kind, SecurityLabelObjectKind::Table));
9879+
assert_eq!(stmt.object_name.to_string(), "public.t");
9880+
assert_eq!(
9881+
stmt.label.as_ref().unwrap().to_string(),
9882+
"'system_u:object_r:sepgsql_table_t:s0'"
9883+
);
9884+
}
9885+
9886+
#[test]
9887+
fn parse_security_label_no_provider_null() {
9888+
let sql = "SECURITY LABEL ON TABLE public.t IS NULL";
9889+
let Statement::SecurityLabel(stmt) = pg().verified_stmt(sql) else {
9890+
unreachable!()
9891+
};
9892+
assert!(stmt.provider.is_none());
9893+
assert!(matches!(stmt.object_kind, SecurityLabelObjectKind::Table));
9894+
assert!(stmt.label.is_none());
9895+
}
9896+
9897+
#[test]
9898+
fn parse_security_label_on_role() {
9899+
let sql = "SECURITY LABEL FOR selinux ON ROLE admin IS 'system_u:object_r:sepgsql_role_t:s0'";
9900+
let Statement::SecurityLabel(stmt) = pg().verified_stmt(sql) else {
9901+
unreachable!()
9902+
};
9903+
assert_eq!(stmt.provider.as_ref().unwrap().value, "selinux");
9904+
assert!(matches!(stmt.object_kind, SecurityLabelObjectKind::Role));
9905+
assert_eq!(stmt.object_name.to_string(), "admin");
9906+
}
9907+
9908+
#[test]
9909+
fn parse_security_label_on_schema() {
9910+
let sql = "SECURITY LABEL ON SCHEMA myschema IS 'system_u:object_r:sepgsql_schema_t:s0'";
9911+
let Statement::SecurityLabel(stmt) = pg().verified_stmt(sql) else {
9912+
unreachable!()
9913+
};
9914+
assert!(stmt.provider.is_none());
9915+
assert!(matches!(stmt.object_kind, SecurityLabelObjectKind::Schema));
9916+
assert_eq!(stmt.object_name.to_string(), "myschema");
9917+
}
9918+
9919+
#[test]
9920+
fn parse_create_user_mapping_basic() {
9921+
let sql = "CREATE USER MAPPING FOR postgres SERVER my_server";
9922+
let Statement::CreateUserMapping(stmt) = pg().verified_stmt(sql) else {
9923+
unreachable!()
9924+
};
9925+
assert!(!stmt.if_not_exists);
9926+
assert!(matches!(stmt.user, UserMappingUser::Ident(_)));
9927+
if let UserMappingUser::Ident(ident) = &stmt.user {
9928+
assert_eq!(ident.value, "postgres");
9929+
}
9930+
assert_eq!(stmt.server_name.value, "my_server");
9931+
assert!(stmt.options.is_none());
9932+
}
9933+
9934+
#[test]
9935+
fn parse_create_user_mapping_if_not_exists_with_options() {
9936+
let sql = r#"CREATE USER MAPPING IF NOT EXISTS FOR postgres SERVER my_server OPTIONS ("user" 'bob')"#;
9937+
let Statement::CreateUserMapping(stmt) = pg().verified_stmt(sql) else {
9938+
unreachable!()
9939+
};
9940+
assert!(stmt.if_not_exists);
9941+
assert!(matches!(stmt.user, UserMappingUser::Ident(_)));
9942+
assert_eq!(stmt.server_name.value, "my_server");
9943+
let opts = stmt.options.as_ref().unwrap();
9944+
assert_eq!(opts.len(), 1);
9945+
assert_eq!(opts[0].key.value, "user");
9946+
assert_eq!(opts[0].value.value, "bob");
9947+
}
9948+
9949+
#[test]
9950+
fn parse_create_user_mapping_current_user() {
9951+
let sql = "CREATE USER MAPPING FOR CURRENT_USER SERVER my_server";
9952+
let Statement::CreateUserMapping(stmt) = pg().verified_stmt(sql) else {
9953+
unreachable!()
9954+
};
9955+
assert!(matches!(stmt.user, UserMappingUser::CurrentUser));
9956+
}
9957+
9958+
#[test]
9959+
fn parse_create_user_mapping_public() {
9960+
let sql = "CREATE USER MAPPING FOR PUBLIC SERVER my_server";
9961+
let Statement::CreateUserMapping(stmt) = pg().verified_stmt(sql) else {
9962+
unreachable!()
9963+
};
9964+
assert!(matches!(stmt.user, UserMappingUser::Public));
9965+
}
9966+
9967+
#[test]
9968+
fn parse_create_tablespace_basic() {
9969+
let sql = "CREATE TABLESPACE my_ts LOCATION '/mnt/data'";
9970+
let Statement::CreateTablespace(stmt) = pg().verified_stmt(sql) else {
9971+
unreachable!()
9972+
};
9973+
assert_eq!(stmt.name.value, "my_ts");
9974+
assert!(stmt.owner.is_none());
9975+
assert_eq!(stmt.location.to_string(), "'/mnt/data'");
9976+
assert!(stmt.with_options.is_empty());
9977+
}
9978+
9979+
#[test]
9980+
fn parse_create_tablespace_with_owner() {
9981+
let sql = "CREATE TABLESPACE my_ts OWNER admin LOCATION '/mnt/data'";
9982+
let Statement::CreateTablespace(stmt) = pg().verified_stmt(sql) else {
9983+
unreachable!()
9984+
};
9985+
assert_eq!(stmt.name.value, "my_ts");
9986+
assert_eq!(stmt.owner.as_ref().unwrap().value, "admin");
9987+
assert_eq!(stmt.location.to_string(), "'/mnt/data'");
9988+
}
9989+
9990+
#[test]
9991+
fn parse_create_tablespace_with_options() {
9992+
let sql = "CREATE TABLESPACE my_ts LOCATION '/mnt/data' WITH (seq_page_cost = 1.0)";
9993+
let Statement::CreateTablespace(stmt) = pg().verified_stmt(sql) else {
9994+
unreachable!()
9995+
};
9996+
assert_eq!(stmt.name.value, "my_ts");
9997+
assert_eq!(stmt.with_options.len(), 1);
9998+
match &stmt.with_options[0] {
9999+
SqlOption::KeyValue { key, value } => {
10000+
assert_eq!(key.value, "seq_page_cost");
10001+
assert_eq!(value.to_string(), "1.0");
10002+
}
10003+
other => panic!("unexpected option: {other:?}"),
10004+
}
10005+
}

0 commit comments

Comments
 (0)