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}