001package gudusoft.gsqlparser.sqlcmds; 002 003import gudusoft.gsqlparser.*; 004 005/** 006 * DuckDB SQL command resolver. 007 * DuckDB uses PostgreSQL-compatible syntax, so this extends the PostgreSQL command resolver 008 * and overrides the vendor to DuckDB. 009 * 010 * @since 4.1.0.9 011 */ 012public class TSqlCmdsDuckdb extends TSqlCmdsPostgresql { 013 014 public TSqlCmdsDuckdb() { 015 super(); 016 this.vendor = EDbVendor.dbvduckdb; 017 } 018 019 @Override 020 protected String getToken1Str(int token1) { 021 switch (token1) { 022 case TBaseType.rrw_duckdb_export: 023 return "export"; 024 case TBaseType.rrw_duckdb_import: 025 return "import"; 026 case TBaseType.rrw_duckdb_summarize: 027 return "summarize"; 028 case TBaseType.rrw_duckdb_install: 029 return "install"; 030 case TBaseType.rrw_duckdb_force: 031 return "force"; 032 case TBaseType.rrw_duckdb_pivot: 033 return "pivot"; 034 case TBaseType.rrw_duckdb_unpivot: 035 return "unpivot"; 036 case TBaseType.rrw_duckdb_pragma: 037 return "pragma"; 038 default: 039 return null; 040 } 041 } 042 043 @Override 044 protected void initializeCommands() { 045 // CREATE TABLE MACRO entries must be added BEFORE super.initializeCommands() 046 // so they are checked before PostgreSQL's "CREATE TABLE" 2-token pattern, 047 // which would early-return in finddbcmd() before reaching these longer patterns. 048 addCmd(TBaseType.rrw_create, "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 049 addCmd(TBaseType.rrw_create, "or", "replace", "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 050 addCmd(TBaseType.rrw_create, "temp", "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 051 addCmd(TBaseType.rrw_create, "temporary", "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 052 addCmd(TBaseType.rrw_create, "or", "replace", "temp", "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 053 addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "table", "macro", ESqlStatementType.sstduckdbCreateMacro); 054 055 super.initializeCommands(); 056 057 // DuckDB-specific statement splitter entries 058 addCmd(TBaseType.rrw_sqlite_attach, ESqlStatementType.sstduckdbAttach); 059 addCmd(TBaseType.rrw_sqlite_detach, ESqlStatementType.sstduckdbDetach); 060 addCmd(TBaseType.rrw_use, ESqlStatementType.sstUseDatabase); 061 addCmd(TBaseType.rrw_describe, ESqlStatementType.sstdescribe); 062 063 // US-003: CREATE MACRO 064 addCmd(TBaseType.rrw_create, "macro", ESqlStatementType.sstduckdbCreateMacro); 065 addCmd(TBaseType.rrw_create, "or", "replace", "macro", ESqlStatementType.sstduckdbCreateMacro); 066 addCmd(TBaseType.rrw_create, "temp", "macro", ESqlStatementType.sstduckdbCreateMacro); 067 addCmd(TBaseType.rrw_create, "temporary", "macro", ESqlStatementType.sstduckdbCreateMacro); 068 addCmd(TBaseType.rrw_create, "or", "replace", "temp", "macro", ESqlStatementType.sstduckdbCreateMacro); 069 addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "macro", ESqlStatementType.sstduckdbCreateMacro); 070 071 // US-005: DROP MACRO 072 addCmd(TBaseType.rrw_drop, "macro", ESqlStatementType.sstduckdbDropMacro); 073 addCmd(TBaseType.rrw_drop, "macro", "table", ESqlStatementType.sstduckdbDropMacro); 074 075 // US-004: CREATE SECRET / DROP SECRET 076 addCmd(TBaseType.rrw_create, "secret", ESqlStatementType.sstduckdbCreateSecret); 077 addCmd(TBaseType.rrw_create, "or", "replace", "secret", ESqlStatementType.sstduckdbCreateSecret); 078 addCmd(TBaseType.rrw_create, "temporary", "secret", ESqlStatementType.sstduckdbCreateSecret); 079 addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "secret", ESqlStatementType.sstduckdbCreateSecret); 080 addCmd(TBaseType.rrw_drop, "secret", ESqlStatementType.sstduckdbDropSecret); 081 addCmd(TBaseType.rrw_drop, "temporary", "secret", ESqlStatementType.sstduckdbDropSecret); 082 083 // US-002: Extension statements 084 addCmd(TBaseType.rrw_duckdb_export, "DATABASE", ESqlStatementType.sstduckdbExportDatabase); 085 addCmd(TBaseType.rrw_duckdb_import, "DATABASE", ESqlStatementType.sstduckdbImportDatabase); 086 addCmd(TBaseType.rrw_duckdb_summarize, ESqlStatementType.sstduckdbSummarize); 087 addCmd(TBaseType.rrw_duckdb_install, ESqlStatementType.sstduckdbInstall); 088 addCmd(TBaseType.rrw_load, ESqlStatementType.sstduckdbLoad); 089 addCmd(TBaseType.rrw_duckdb_force, "CHECKPOINT", ESqlStatementType.sstduckdbForceCheckpoint); 090 091 // US-005: PIVOT / UNPIVOT 092 addCmd(TBaseType.rrw_duckdb_pivot, ESqlStatementType.sstduckdbPivot); 093 addCmd(TBaseType.rrw_duckdb_unpivot, ESqlStatementType.sstduckdbUnpivot); 094 095 // US-006: CREATE OR REPLACE TABLE, INSERT OR REPLACE/IGNORE 096 addCmd(TBaseType.rrw_create, "or", "replace", "table", ESqlStatementType.sstcreatetable); 097 addCmd(TBaseType.rrw_create, "or", "replace", "temp", "table", ESqlStatementType.sstcreatetable); 098 addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "table", ESqlStatementType.sstcreatetable); 099 addCmd(TBaseType.rrw_insert, "or", "replace", ESqlStatementType.sstinsert); 100 addCmd(TBaseType.rrw_insert, "or", "ignore", ESqlStatementType.sstinsert); 101 102 // US-012: SET VARIABLE 103 addCmd(TBaseType.rrw_set, "variable", ESqlStatementType.sstduckdbSetVariable); 104 105 // US-012: FROM-first query syntax (FROM table_name [SELECT ...]) 106 addCmd(TBaseType.rrw_from, ESqlStatementType.sstselect); 107 108 // PRAGMA statement 109 addCmd(TBaseType.rrw_duckdb_pragma, ESqlStatementType.sstduckdbPragma); 110 111 // US-009: CREATE OR REPLACE SCHEMA/SEQUENCE 112 addCmd(TBaseType.rrw_create, "or", "replace", "schema", ESqlStatementType.sstpostgresqlCreateSchema); 113 addCmd(TBaseType.rrw_create, "or", "replace", "sequence", ESqlStatementType.sstcreatesequence); 114 addCmd(TBaseType.rrw_create, "or", "replace", "temp", "sequence", ESqlStatementType.sstcreatesequence); 115 addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "sequence", ESqlStatementType.sstcreatesequence); 116 } 117}