Skip to content

Commit bc45a40

Browse files
Snowflake: parse CREATE SECURE FUNCTION
1 parent dac170c commit bc45a40

5 files changed

Lines changed: 25 additions & 3 deletions

File tree

src/ast/ddl.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3608,6 +3608,8 @@ pub struct CreateFunction {
36083608
pub or_replace: bool,
36093609
/// True if this is a `CREATE TEMPORARY FUNCTION` statement
36103610
pub temporary: bool,
3611+
/// True if this is a `CREATE SECURE FUNCTION` statement (Snowflake).
3612+
pub secure: bool,
36113613
/// True if this is a `CREATE IF NOT EXISTS FUNCTION` statement
36123614
pub if_not_exists: bool,
36133615
/// Name of the function to be created.
@@ -3680,9 +3682,10 @@ impl fmt::Display for CreateFunction {
36803682
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
36813683
write!(
36823684
f,
3683-
"CREATE {or_alter}{or_replace}{temp}FUNCTION {if_not_exists}{name}",
3685+
"CREATE {or_alter}{or_replace}{temp}{secure}FUNCTION {if_not_exists}{name}",
36843686
name = self.name,
36853687
temp = if self.temporary { "TEMPORARY " } else { "" },
3688+
secure = if self.secure { "SECURE " } else { "" },
36863689
or_alter = if self.or_alter { "OR ALTER " } else { "" },
36873690
or_replace = if self.or_replace { "OR REPLACE " } else { "" },
36883691
if_not_exists = if self.if_not_exists {

src/parser/mod.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5405,8 +5405,10 @@ impl<'a> Parser<'a> {
54055405
self.parse_create_policy().map(Into::into)
54065406
} else if self.parse_keyword(Keyword::EXTERNAL) {
54075407
self.parse_create_external_table(or_replace).map(Into::into)
5408+
} else if self.parse_keywords(&[Keyword::SECURE, Keyword::FUNCTION]) {
5409+
self.parse_create_function(or_alter, or_replace, temporary, true)
54085410
} else if self.parse_keyword(Keyword::FUNCTION) {
5409-
self.parse_create_function(or_alter, or_replace, temporary)
5411+
self.parse_create_function(or_alter, or_replace, temporary, false)
54105412
} else if self.parse_keyword(Keyword::DOMAIN) {
54115413
self.parse_create_domain().map(Into::into)
54125414
} else if self.parse_keyword(Keyword::TRIGGER) {
@@ -5938,12 +5940,13 @@ impl<'a> Parser<'a> {
59385940
or_alter: bool,
59395941
or_replace: bool,
59405942
temporary: bool,
5943+
secure: bool,
59415944
) -> Result<Statement, ParserError> {
59425945
if dialect_of!(self is HiveDialect) {
59435946
self.parse_hive_create_function(or_replace, temporary)
59445947
.map(Into::into)
59455948
} else if dialect_of!(self is PostgreSqlDialect | GenericDialect | SnowflakeDialect) {
5946-
self.parse_postgres_create_function(or_replace, temporary)
5949+
self.parse_postgres_create_function(or_replace, temporary, secure)
59475950
.map(Into::into)
59485951
} else if dialect_of!(self is DuckDbDialect) {
59495952
self.parse_create_macro(or_replace, temporary)
@@ -5966,6 +5969,7 @@ impl<'a> Parser<'a> {
59665969
&mut self,
59675970
or_replace: bool,
59685971
temporary: bool,
5972+
secure: bool,
59695973
) -> Result<CreateFunction, ParserError> {
59705974
let name = self.parse_object_name(false)?;
59715975

@@ -6105,6 +6109,7 @@ impl<'a> Parser<'a> {
61056109
or_alter: false,
61066110
or_replace,
61076111
temporary,
6112+
secure,
61086113
name,
61096114
args: Some(args),
61106115
return_type,
@@ -6141,6 +6146,7 @@ impl<'a> Parser<'a> {
61416146
or_alter: false,
61426147
or_replace,
61436148
temporary,
6149+
secure: false,
61446150
name,
61456151
function_body: Some(body),
61466152
using,
@@ -6221,6 +6227,7 @@ impl<'a> Parser<'a> {
62216227
or_alter: false,
62226228
or_replace,
62236229
temporary,
6230+
secure: false,
62246231
if_not_exists,
62256232
name,
62266233
args: Some(args),
@@ -6312,6 +6319,7 @@ impl<'a> Parser<'a> {
63126319
or_alter,
63136320
or_replace,
63146321
temporary,
6322+
secure: false,
63156323
if_not_exists: false,
63166324
name,
63176325
args: Some(args),

tests/sqlparser_bigquery.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,6 +2285,7 @@ fn test_bigquery_create_function() {
22852285
or_alter: false,
22862286
or_replace: true,
22872287
temporary: true,
2288+
secure: false,
22882289
if_not_exists: false,
22892290
name: ObjectName::from(vec![
22902291
Ident::new("project1"),

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ fn parse_create_function() {
240240
or_alter: false,
241241
or_replace: false,
242242
temporary: false,
243+
secure: false,
243244
if_not_exists: false,
244245
name: ObjectName::from(vec![Ident::new("some_scalar_udf")]),
245246
args: Some(vec![
@@ -426,6 +427,7 @@ fn parse_create_function_parameter_default_values() {
426427
or_alter: false,
427428
or_replace: false,
428429
temporary: false,
430+
secure: false,
429431
if_not_exists: false,
430432
name: ObjectName::from(vec![Ident::new("test_func")]),
431433
args: Some(vec![OperateFunctionArg {

tests/sqlparser_postgres.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4614,6 +4614,7 @@ $$"#;
46144614
or_alter: false,
46154615
or_replace: true,
46164616
temporary: false,
4617+
secure: false,
46174618
name: ObjectName::from(vec![Ident::new("check_strings_different")]),
46184619
args: Some(vec![
46194620
OperateFunctionArg::with_name(
@@ -4661,6 +4662,7 @@ $$"#;
46614662
or_alter: false,
46624663
or_replace: true,
46634664
temporary: false,
4665+
secure: false,
46644666
name: ObjectName::from(vec![Ident::new("check_not_zero")]),
46654667
args: Some(vec![
46664668
OperateFunctionArg::with_name(
@@ -4704,6 +4706,7 @@ $$"#;
47044706
or_alter: false,
47054707
or_replace: true,
47064708
temporary: false,
4709+
secure: false,
47074710
name: ObjectName::from(vec![Ident::new("check_values_different")]),
47084711
args: Some(vec![
47094712
OperateFunctionArg::with_name(
@@ -4751,6 +4754,7 @@ $$"#;
47514754
or_alter: false,
47524755
or_replace: true,
47534756
temporary: false,
4757+
secure: false,
47544758
name: ObjectName::from(vec![Ident::new("check_values_different")]),
47554759
args: Some(vec![
47564760
OperateFunctionArg::with_name(
@@ -4794,6 +4798,7 @@ $$"#;
47944798
or_alter: false,
47954799
or_replace: true,
47964800
temporary: false,
4801+
secure: false,
47974802
name: ObjectName::from(vec![Ident::new("foo")]),
47984803
args: Some(vec![
47994804
OperateFunctionArg::with_name(
@@ -4840,6 +4845,7 @@ fn parse_create_function() {
48404845
or_alter: false,
48414846
or_replace: false,
48424847
temporary: false,
4848+
secure: false,
48434849
name: ObjectName::from(vec![Ident::new("add")]),
48444850
args: Some(vec![
48454851
OperateFunctionArg::unnamed(DataType::Integer(None)),
@@ -4976,6 +4982,7 @@ fn parse_create_function_c_with_module_pathname() {
49764982
or_alter: false,
49774983
or_replace: false,
49784984
temporary: false,
4985+
secure: false,
49794986
name: ObjectName::from(vec![Ident::new("cas_in")]),
49804987
args: Some(vec![OperateFunctionArg::with_name(
49814988
"input",
@@ -6727,6 +6734,7 @@ fn parse_trigger_related_functions() {
67276734
or_alter: false,
67286735
or_replace: false,
67296736
temporary: false,
6737+
secure: false,
67306738
if_not_exists: false,
67316739
name: ObjectName::from(vec![Ident::new("emp_stamp")]),
67326740
args: Some(vec![]),

0 commit comments

Comments
 (0)