From c663d743386ba6ebee94e9205a13cd465e5ffb6a Mon Sep 17 00:00:00 2001 From: Ellie Eadington Date: Tue, 13 Oct 2026 12:01:43 +0100 Subject: [PATCH] Accept Snowflake COPY GRANTS in CREATE TABLE COPY became a reserved keyword with the COPY statement support in #2643, so the generic CREATE TABLE option rule no longer accepts it and CREATE TABLE ... COPY GRANTS fails to parse. Add COPY GRANTS as an explicit table option. Co-Authored-By: Claude Opus 5.5 --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 4 ++++ .../sf/jsqlparser/statement/create/CreateTableTest.java | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 130627139..8acc47e4a 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -16055,6 +16055,10 @@ TableOption CreateTableOption(): } | LOOKAHEAD({ isMySqlTableOptionAhead() }) option=MySqlTableOption() + | + // Snowflake: COPY is reserved because it starts the COPY statement + LOOKAHEAD({ getToken(1).kind == K_COPY && "GRANTS".equalsIgnoreCase(getToken(2).image) }) + ContextualKeyword("GRANTS") { option = TableOption.raw("COPY", "GRANTS"); } | tokens=CreateParameter() { option = TableOption.raw(tokens); } ) { return option; } } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java index 2385c0414..26bc31cc7 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java @@ -60,6 +60,14 @@ public void testCreateTableOrReplace() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(statement); } + @Test + public void testCreateTableCopyGrants() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed( + "CREATE OR REPLACE TABLE testtab COPY GRANTS AS (SELECT a FROM tbl)"); + assertSqlCanBeParsedAndDeparsed( + "CREATE OR REPLACE TABLE testtab (a VARCHAR (255)) COPY GRANTS"); + } + @Test public void testCreateTable2() throws JSQLParserException { String statement = "CREATE TABLE testtab (\"test\" varchar (255))";