Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
068850e
Snowflake: parse CREATE OR REPLACE ROLE
sabir-akhadov-localstack Jun 23, 2026
a541ba8
Snowflake: parse CREATE/ALTER/DROP ROW ACCESS POLICY
sabir-akhadov-localstack Jun 23, 2026
98cc684
Snowflake: parse CREATE / DROP DATABASE ROLE
sabir-akhadov-localstack Jun 23, 2026
3fd1798
Snowflake: parse CREATE USER options without '=' separator
sabir-akhadov-localstack Jun 23, 2026
84c7e3c
Snowflake: always double quotes in EscapeQuotedString
hovaesco Jun 22, 2026
49b5093
Snowflake: parse CREATE DATABASE ROLE and qualified class create priv…
sabir-akhadov-localstack Jun 23, 2026
3cc0375
Snowflake: parse RLIKE/REGEXP infix form with NULL right operand
sabir-akhadov-localstack Jun 23, 2026
af8b716
Snowflake: parse CREATE / DROP ICEBERG TABLE
hovaesco Jun 23, 2026
ba170b1
Snowflake: parse SHOW PROCEDURES [LIKE]
sabir-akhadov-localstack Jun 24, 2026
fc77629
Snowflake: parse SHOW [TERSE] SEQUENCES [LIKE/IN ...]
sabir-akhadov-localstack Jun 24, 2026
abdb91a
Snowflake: parse SHOW [TERSE] PRIMARY/IMPORTED/EXPORTED KEYS
sabir-akhadov-localstack Jun 24, 2026
8d240b2
Snowflake: FILE_FORMAT = <name> shorthand in COPY INTO
Jun 22, 2026
6d1428e
Snowflake: test FILE_FORMAT = <name> shorthand; fix pre-existing rustfmt
Jun 22, 2026
18e99b5
Snowflake: parse ALL/FUTURE … IN DATABASE grant targets, STAGE/FILE F…
sabir-akhadov-localstack Jun 25, 2026
fcc476e
Snowflake: parse SHOW CONNECTIONS and SHOW SHARES [LIKE]
sabir-akhadov-localstack Jun 25, 2026
2df6479
Snowflake: parse multi-column ALTER TABLE ADD COLUMN
hovaesco Jun 26, 2026
8bab6fc
Snowflake: accept dollar-quoted text as a literal string
hovaesco Jun 29, 2026
2540681
Snowflake: parse ALTER TABLE ALTER COLUMN ... COMMENT
hovaesco Jun 29, 2026
17388b9
Snowflake: accept unquoted OAUTH_ALLOWED_SCOPES with colons (e.g. PRI…
hovaesco Jun 29, 2026
6b2da6b
Snowflake: don't require BASE_LOCATION for ICEBERG tables bound to an…
hovaesco Jun 29, 2026
5a99f8a
Snowflake: parse Python-UDF properties (runtime_version/handler/packa…
sabir-akhadov-localstack Jul 2, 2026
df342d6
Snowflake: parse SHOW PROCEDURES / SHOW FUNCTIONS [LIKE] IN <scope>
sabir-akhadov-localstack Jul 2, 2026
9ae984b
Snowflake: accept a placeholder in COPY INTO stage-name position
sabir-akhadov-localstack Jul 4, 2026
3f8a0ed
Snowflake: parse CREATE/ALTER/DROP TAG and SHOW TAGS
sabir-akhadov-localstack Jul 4, 2026
7044d97
Snowflake: parse ALTER <object> SET/UNSET TAG
sabir-akhadov-localstack Jul 5, 2026
cd6fd0d
Snowflake: don't consume statement terminator in parse_copy_into
sabir-akhadov-localstack Jul 4, 2026
448678e
Snowflake: parse PUT/GET file statements inside scripting bodies
sabir-akhadov-localstack Jul 5, 2026
b762150
Snowflake: parse ALTER SCHEMA SET/UNSET TAG
sabir-akhadov-localstack Jul 5, 2026
33afa1c
Snowflake: parse type-less column list in CREATE TABLE ... AS
sabir-akhadov-localstack Jul 7, 2026
afc556f
Snowflake: accept and discard HYBRID table modifier
sabir-akhadov-localstack Jul 7, 2026
3aad77c
Snowflake: parse CREATE OR REPLACE SEQUENCE
sabir-akhadov-localstack Jul 7, 2026
81db47f
Snowflake: parse CREATE SEQUENCE START/INCREMENT '=' form and ORDER/N…
sabir-akhadov-localstack Jul 7, 2026
e739dd1
Snowflake: parse TRANSIENT DYNAMIC, bare TARGET_LAG=DOWNSTREAM, INITI…
sabir-akhadov-localstack Jul 7, 2026
e561165
Snowflake: parse DROP/DESC/SHOW DYNAMIC TABLE, carrying dynamic-ness …
sabir-akhadov-localstack Jul 7, 2026
38667da
Snowflake: parse ALTER DYNAMIC TABLE SET/UNSET/RENAME/CLUSTER natively
sabir-akhadov-localstack Jul 7, 2026
281699d
Snowflake: make CHANGES AT/BEFORE bound optional
sabir-akhadov-localstack Jul 9, 2026
cc25e59
Snowflake: parse CREATE [OR REPLACE] STREAM [IF NOT EXISTS] <name> ON…
sabir-akhadov-localstack Jul 9, 2026
a6a00a8
Snowflake: parse SHOW STREAMS / DESCRIBE STREAM / ALTER STREAM COMMENT
sabir-akhadov-localstack Jul 9, 2026
c7af4d6
Snowflake: parse table-level STAGE_FILE_FORMAT on CREATE TABLE
sabir-akhadov-localstack Jul 10, 2026
60d7744
Snowflake: lower COPY FILE_FORMAT=() to the TOK_CONSTANT_LIST format-…
sabir-akhadov-localstack Jul 10, 2026
3e9ee9f
Snowflake: stop stage name identifier at comma for comma-join
Jul 10, 2026
c1dcee9
Snowflake tests: match new ShowObjects.dynamic field in SHOW OBJECTS …
Jul 10, 2026
ec7bd5c
Snowflake: roll back to general select-item for extended COPY data-lo…
Jul 10, 2026
988cd0a
Snowflake: accept single-quoted procedure body (AS '...')
sabir-akhadov-localstack Jul 14, 2026
36b0974
Snowflake: accept bare column ALTER ... COMMENT continuation (COLUMN …
hovaesco Jul 15, 2026
1c814f3
Snowflake: accept :placeholder as SELECT ... INTO target
sabir-akhadov-localstack Jul 20, 2026
9f387b7
Snowflake: parse DESCRIBE / ALTER / TRUNCATE MATERIALIZED VIEW
claude Jul 21, 2026
2c5d82f
Snowflake: parse CREATE/ALTER/DROP/DESCRIBE/SHOW STORAGE INTEGRATION
Jul 22, 2026
2b9fdc4
Snowflake: parse FETCH INTO, CALL INTO, ALTER PROCEDURE, WITH AS PROC…
sabir-akhadov-localstack Jul 22, 2026
f611954
Snowflake: parse LIKE/ILIKE ANY/ALL multi-pattern lists
hovaesco Jul 22, 2026
592894c
Snowflake: parse inline stage args in COPY INTO transformation subquery
Jul 23, 2026
0cb6820
Snowflake: parse CREATE STREAM ON VIEW; add StreamSourceKind discrimi…
hovaesco Jul 24, 2026
0e5e26e
Snowflake: parse informational constraint properties (ENABLE/VALIDATE…
hovaesco Jul 27, 2026
ae2fd4a
Add ColumnDef::clear_constraint_characteristics
hovaesco Jul 27, 2026
b5e11f2
Snowflake: parse masking policy statement family
sabir-akhadov-localstack Jul 29, 2026
4238599
Snowflake: decode octal/hex/unicode string-literal escapes
Jul 29, 2026
acb6baa
Snowflake: parse ALTER TAG SET/UNSET MASKING POLICY
sabir-akhadov-localstack Jul 30, 2026
cbd33aa
Snowflake: parse DESC TABLE <name> TYPE = { COLUMNS | STAGE }
hovaesco Jul 30, 2026
b40e584
Snowflake: parse UNDROP <TABLE|DYNAMIC TABLE|SCHEMA|DATABASE|VIEW> <n…
sabir-akhadov-localstack Jul 30, 2026
293dfbd
Snowflake: parse DESC[RIBE] SEQUENCE <name>
hovaesco Jul 31, 2026
e6c58b2
Snowflake: parse SHOW [TERSE] UNIQUE KEYS
hovaesco Jul 30, 2026
a3c43c9
Snowflake: accept bind placeholders as copy-option values
hovaesco Jul 31, 2026
68a1605
Snowflake: parse ALTER SEQUENCE RENAME/INCREMENT/SET|UNSET COMMENT
hovaesco Aug 3, 2026
2d471f7
Snowflake: parse CREATE/DROP/ALTER/DESC PIPE and SHOW PIPES
hovaesco Aug 4, 2026
94d37ca
Snowflake: parse CREATE STREAM ... {AT|BEFORE}(<key> => <expr>) (#19)
hovaesco Aug 11, 2026
91dca08
Snowflake: parse CREATE STREAM ... APPEND_ONLY = { TRUE | FALSE }
hovaesco Aug 12, 2026
9554a18
Snowflake: parse the EXTERNAL TABLE statement family (#20)
wojpadlo Aug 12, 2026
138b56a
Snowflake: warehouse tagging grammar — ALTER WAREHOUSE [IF EXISTS] SE…
hovaesco Aug 12, 2026
fbede46
Merge commit '9554a183' into snowflake/external-tables-rebased
Aug 12, 2026
64e4951
Snowflake: role tagging grammar — ALTER ROLE [IF EXISTS] SET/UNSET TA…
hovaesco Aug 12, 2026
7f2358e
Snowflake: parse CREATE SCHEMA ... [WITH] TAG (<t> = '<v>', ...) (#23)
hovaesco Aug 12, 2026
37c4b0a
Merge commit '138b56ab' into snowflake/external-tables-rebased
Aug 12, 2026
ff7085c
Snowflake: stage tagging grammar — ALTER STAGE [IF EXISTS] SET/UNSET …
hovaesco Aug 12, 2026
2d3db4e
Merge commit '37c4b0a1' into lav-1598-create-schema-tag-merged
hovaesco Aug 12, 2026
4ae1cfb
Merge commit '2d3db4e4' into lav-1596-role-tags-merged
hovaesco Aug 12, 2026
c1f3d5a
Merge commit 'ff7085c9' into lav-1597-stage-tags-merged
hovaesco Aug 13, 2026
bc4a981
Snowflake: accept (EXECUTE IMMEDIATE …) / (SHOW …) payload in a scrip…
Aug 13, 2026
14fe810
Snowflake: accept empty RETURNS TABLE() column list
Aug 13, 2026
ca6ead2
Snowflake: ORDER/NOORDER as a real sequence property; CREATE SEQUENCE…
hovaesco Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ $ cargo run --example cli - [--dialectname]
.expect("failed to read from stdin");
String::from_utf8(buf).expect("stdin content wasn't valid utf8")
} else {
println!("Parsing from file '{}' using {:?}", &filename, dialect);
println!("Parsing from file '{}' using {:?}", filename, dialect);
fs::read_to_string(&filename)
.unwrap_or_else(|_| panic!("Unable to read the file {}", &filename))
.unwrap_or_else(|_| panic!("Unable to read the file {}", filename))
};
let without_bom = if contents.chars().next().unwrap() as u64 != 0xfeff {
contents.as_str()
Expand Down
17 changes: 15 additions & 2 deletions src/ast/dcl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use sqlparser_derive::{Visit, VisitMut};
use super::{display_comma_separated, Expr, Ident, Password, Spanned};
use crate::ast::{
display_separated, CascadeOption, CurrentGrantsKind, GrantObjects, Grantee, ObjectName,
Privileges,
Privileges, Tag,
};
use crate::tokenizer::Span;

Expand Down Expand Up @@ -311,6 +311,8 @@ impl fmt::Display for SecondaryRoles {
pub struct CreateRole {
/// Role names to create.
pub names: Vec<ObjectName>,
/// Whether `OR REPLACE` was specified.
pub or_replace: bool,
/// Whether `IF NOT EXISTS` was specified.
pub if_not_exists: bool,
// Postgres
Expand Down Expand Up @@ -347,13 +349,17 @@ pub struct CreateRole {
// MSSQL
/// Optional authorization owner.
pub authorization_owner: Option<ObjectName>,
// Snowflake
/// Trailing `WITH TAG (<t> = '<v>' [, ...])` clause; empty when absent.
pub with_tags: Vec<Tag>,
}

impl fmt::Display for CreateRole {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"CREATE ROLE {if_not_exists}{names}{superuser}{create_db}{create_role}{inherit}{login}{replication}{bypassrls}",
"CREATE {or_replace}ROLE {if_not_exists}{names}{superuser}{create_db}{create_role}{inherit}{login}{replication}{bypassrls}",
or_replace = if self.or_replace { "OR REPLACE " } else { "" },
if_not_exists = if self.if_not_exists { "IF NOT EXISTS " } else { "" },
names = display_separated(&self.names, ", "),
superuser = match self.superuser {
Expand Down Expand Up @@ -421,6 +427,13 @@ impl fmt::Display for CreateRole {
if let Some(owner) = &self.authorization_owner {
write!(f, " AUTHORIZATION {owner}")?;
}
if !self.with_tags.is_empty() {
write!(
f,
" WITH TAG ({})",
display_comma_separated(&self.with_tags)
)?;
}
Ok(())
}
}
Expand Down
Loading
Loading