001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.postgresql.*;
006
007/**
008 * PostgreSQL SQL command resolver.
009 * Handles PostgreSQL statement recognition including PL/pgSQL.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsPostgresql extends AbstractSqlCmds {
014
015
016    public TSqlCmdsPostgresql() {
017        super(EDbVendor.dbvpostgresql);
018    }
019
020    @Override
021    protected void initializeCommands() {
022        // PostgreSQL commands must be sorted alphabetically by token1
023
024        // ABORT
025        addCmd(TBaseType.rrw_abort, ESqlStatementType.sstpostgresqlabort);
026
027        // ALTER commands
028        addCmd(TBaseType.rrw_alter, "aggregate", ESqlStatementType.sstpostgresqlAlterAggregate);
029        addCmd(TBaseType.rrw_alter, "collation", ESqlStatementType.sstpostgresqlAlterCollation);
030        addCmd(TBaseType.rrw_alter, "conversion", ESqlStatementType.sstpostgresqlAlterConversion);
031        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstpostgresqlalterdatabase);
032        addCmd(TBaseType.rrw_alter, "default", "privileges", ESqlStatementType.sstpostgresqlAlterDefaultPrivileges);
033        addCmd(TBaseType.rrw_alter, "domain", ESqlStatementType.sstpostgresqlAlterDomain);
034        addCmd(TBaseType.rrw_alter, "event", "trigger", ESqlStatementType.sstpostgresqlAlterEventTrigger);
035        addCmd(TBaseType.rrw_alter, "extension", ESqlStatementType.sstpostgresqlAlterExtension);
036        addCmd(TBaseType.rrw_alter, "foreign", "data", "wrapper", ESqlStatementType.sstpostgresqlAlterForeignDataWrapper);
037        addCmd(TBaseType.rrw_alter, "foreign", "Table", ESqlStatementType.sstpostgresqlAlterForeignTable);
038        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstpostgresqlAlterfunction);
039        addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstpostgresqlAlterGroup);
040        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstpostgresqlAlterIndex);
041        addCmd(TBaseType.rrw_alter, "language", ESqlStatementType.sstpostgresqlAlterLanguage);
042        addCmd(TBaseType.rrw_alter, "large", "object", ESqlStatementType.sstpostgresqlAlterLargeObject);
043        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstpostgresqlAlterMaterializedView);
044        addCmd(TBaseType.rrw_alter, "operator", ESqlStatementType.sstpostgresqlAlterOperator);
045        addCmd(TBaseType.rrw_alter, "operator", "class", ESqlStatementType.sstpostgresqlAlterOperatorClass);
046        addCmd(TBaseType.rrw_alter, "operator", "family", ESqlStatementType.sstpostgresqlAlterOperatorFamily);
047        addCmd(TBaseType.rrw_alter, "policy", ESqlStatementType.sstpostgresqlAlterPolicy);
048        addCmd(TBaseType.rrw_alter, "procedural", "language", ESqlStatementType.sstpostgresqlAlterLanguage);
049        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstpostgresqlAlterProcedure);
050        addCmd(TBaseType.rrw_alter, "publication", ESqlStatementType.sstpostgresqlAlterPublication);
051        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstpostgresqlAlterRole);
052        addCmd(TBaseType.rrw_alter, "routine", ESqlStatementType.sstpostgresqlAlterRoutine);
053        addCmd(TBaseType.rrw_alter, "rule", ESqlStatementType.sstpostgresqlAlterRule);
054        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstpostgresqlAlterSchema);
055        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstpostgresqlAlterSequence);
056        addCmd(TBaseType.rrw_alter, "server", ESqlStatementType.sstpostgresqlAlterServer);
057        addCmd(TBaseType.rrw_alter, "statistics", ESqlStatementType.sstpostgresqlAlterStatistics);
058        addCmd(TBaseType.rrw_alter, "subscription", ESqlStatementType.sstpostgresqlAlterSubscription);
059        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstpostgresqlAlterSystem);
060        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
061        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstpostgresqlAlterTablespace);
062        addCmd(TBaseType.rrw_alter, "text", "search", "configuration", ESqlStatementType.sstpostgresqlAlterTextSearchConfiguration);
063        addCmd(TBaseType.rrw_alter, "text", "search", "dictionary", ESqlStatementType.sstpostgresqlAlterTextSearchDictionary);
064        addCmd(TBaseType.rrw_alter, "text", "search", "parser", ESqlStatementType.sstpostgresqlAlterTextSearchParser);
065        addCmd(TBaseType.rrw_alter, "text", "search", "template", ESqlStatementType.sstpostgresqlAlterTextSearchTemplate);
066        addCmd(TBaseType.rrw_alter, "trigger", ESqlStatementType.sstpostgresqlAlterTrigger);
067        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstpostgresqlAlterType);
068        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstpostgresqlAlterUser);
069        addCmd(TBaseType.rrw_alter, "user", "mapping", ESqlStatementType.sstpostgresqlAlterUserMapping);
070        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstpostgresqlAlterView);
071
072        // ANALYZE
073        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstpostgresqlAnalyze);
074
075        // BEGIN
076        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstpostgresqlBegin);
077
078        // CALL
079        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
080
081        // CHECKPOINT, CLOSE
082        addCmd(TBaseType.rrw_checkpoint, ESqlStatementType.sstpostgresqlCheckpoint);
083        addCmd(TBaseType.rrw_close, ESqlStatementType.sstpostgresqlClose);
084
085        // CLUSTER
086        addCmd(TBaseType.rrw_postgresql_cluster, ESqlStatementType.sstpostgresqlCluster);
087
088        // COMMENT
089        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstpostgresqlComment);
090
091        // COMMIT
092        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstpostgresqlCommit);
093        addCmd(TBaseType.rrw_commit, "prepared", ESqlStatementType.sstpostgresqlCommitPrepared);
094
095        // COPY
096        addCmd(TBaseType.rrw_postgresql_copy, ESqlStatementType.sstpostgresqlCopy);
097
098        // CREATE commands
099        addCmd(TBaseType.rrw_create, "access", "method", ESqlStatementType.sstpostgresqlCreateAccessMethod);
100        addCmd(TBaseType.rrw_create, "aggregate", ESqlStatementType.sstpostgresqlCreateAggregate);
101        addCmd(TBaseType.rrw_create, "assertion", ESqlStatementType.sstpostgresqlCreateAssertion);
102        addCmd(TBaseType.rrw_create, "cast", ESqlStatementType.sstpostgresqlCreateCast);
103        addCmd(TBaseType.rrw_create, "collation", ESqlStatementType.sstpostgresqlCreateCollation);
104        addCmd(TBaseType.rrw_create, "constraint", "trigger", ESqlStatementType.sstcreatetrigger);
105        addCmd(TBaseType.rrw_create, "conversion", ESqlStatementType.sstpostgresqlConversion);
106        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstpostgresqlCreateDatabase);
107        addCmd(TBaseType.rrw_create, "default", "conversion", ESqlStatementType.sstpostgresqlConversion);
108        addCmd(TBaseType.rrw_create, "domain", ESqlStatementType.sstpostgresqlCreateDomain);
109        addCmd(TBaseType.rrw_create, "event", "trigger", ESqlStatementType.sstpostgresqlCreateEventTrigger);
110        addCmd(TBaseType.rrw_create, "extension", ESqlStatementType.sstcreateExtension);
111        addCmd(TBaseType.rrw_create, "foreign", "data", "wrapper", ESqlStatementType.sstpostgresqlCreateForeignDataWrapper);
112        addCmd(TBaseType.rrw_create, "foreign", "table", ESqlStatementType.sstpostgresqlCreateForeignTable);
113        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstpostgresqlCreateFunction);
114        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
115        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
116        addCmd(TBaseType.rrw_create, "global", "unlocked", "table", ESqlStatementType.sstcreatetable);
117        addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstpostgresqlCreateGroup);
118        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstpostgresqlCreateIndex);
119        addCmd(TBaseType.rrw_create, "language", ESqlStatementType.sstpostgresqlCreateLanguage);
120        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
121        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
122        addCmd(TBaseType.rrw_create, "local", "unlocked", "table", ESqlStatementType.sstcreatetable);
123        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
124        addCmd(TBaseType.rrw_create, "operator", ESqlStatementType.sstpostgresqlCreateOperator);
125        addCmd(TBaseType.rrw_create, "operator", "class", ESqlStatementType.sstpostgresqlCreateOperatorClass);
126        addCmd(TBaseType.rrw_create, "operator", "family", ESqlStatementType.sstpostgresqlCreateOperatorFimaly);
127        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstpostgresqlCreateFunction);
128        addCmd(TBaseType.rrw_create, "or", "replace", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
129        addCmd(TBaseType.rrw_create, "or", "replace", "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
130        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
131        addCmd(TBaseType.rrw_create, "or", "replace", "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
132        addCmd(TBaseType.rrw_create, "or", "replace", "role ", ESqlStatementType.sstpostgresqlCreateRole);
133        addCmd(TBaseType.rrw_create, "or", "replace", "rule ", ESqlStatementType.sstpostgresqlCreateRule);
134        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
135        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
136        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
137        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
138        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstcreatetrigger);
139        addCmd(TBaseType.rrw_create, "or", "replace", "trusted", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
140        addCmd(TBaseType.rrw_create, "or", "replace", "trusted", "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
141        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstpostgresqlCreateView);
142        addCmd(TBaseType.rrw_create, "policy", ESqlStatementType.sstpostgresqlCreatePolicy);
143        addCmd(TBaseType.rrw_create, "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
144        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
145        addCmd(TBaseType.rrw_create, "publication", ESqlStatementType.sstpostgresqlCreatePublication);
146        addCmd(TBaseType.rrw_create, "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
147        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstpostgresqlCreateRole);
148        addCmd(TBaseType.rrw_create, "rule", ESqlStatementType.sstpostgresqlCreateRule);
149        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstpostgresqlCreateSchema);
150        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
151        addCmd(TBaseType.rrw_create, "server", ESqlStatementType.sstpostgresqlCreateServer);
152        addCmd(TBaseType.rrw_create, "statistics", ESqlStatementType.sstpostgresqlCreateStatistics);
153        addCmd(TBaseType.rrw_create, "subscription", ESqlStatementType.sstpostgresqlCreateSubscription);
154        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
155        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstpostgresqlCreateTablespace);
156        addCmd(TBaseType.rrw_create, "temp", "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
157        addCmd(TBaseType.rrw_create, "temp", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
158        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
159        addCmd(TBaseType.rrw_create, "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
160        addCmd(TBaseType.rrw_create, "temporary", "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
161        addCmd(TBaseType.rrw_create, "temporary", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
162        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
163        addCmd(TBaseType.rrw_create, "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
164        addCmd(TBaseType.rrw_create, "text", "search", "configuration", ESqlStatementType.sstpostgresqlCreateTextSearchConfiguration);
165        addCmd(TBaseType.rrw_create, "text", "search", "dictionary", ESqlStatementType.sstpostgresqlCreateTextSearchDictionary);
166        addCmd(TBaseType.rrw_create, "text", "search", "parser", ESqlStatementType.sstpostgresqlCreateTextSearchParser);
167        addCmd(TBaseType.rrw_create, "text", "search", "template", ESqlStatementType.sstpostgresqlCreateTextSearchTemplate);
168        addCmd(TBaseType.rrw_create, "transform", ESqlStatementType.sstpostgresqlCreateTransform);
169        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
170        addCmd(TBaseType.rrw_create, "trusted", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
171        addCmd(TBaseType.rrw_create, "trusted", "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
172        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstpostgresqlCreateType);
173        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstpostgresqlCreateIndex);
174        addCmd(TBaseType.rrw_create, "unlocked", "table", ESqlStatementType.sstcreatetable);
175        addCmd(TBaseType.rrw_create, "unlogged", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
176        addCmd(TBaseType.rrw_create, "unlogged", "table", ESqlStatementType.sstcreatetable);
177        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstpostgresqlCreateUser);
178        addCmd(TBaseType.rrw_create, "user", "mapping", ESqlStatementType.sstpostgresqlCreateUserMapping);
179        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstpostgresqlCreateView);
180
181        // DEALLOCATE, DECLARE, DELETE
182        addCmd(TBaseType.rrw_deallocate, ESqlStatementType.sstpostgresqlDeallocate);
183        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstpostgresqlDeclare);
184        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
185
186        // DISCARD, DO
187        addCmd(TBaseType.rrw_postgresql_discard, ESqlStatementType.sstpostgresqlDiscard);
188        addCmd(TBaseType.rrw_do, ESqlStatementType.sstpostgresqlDo);
189
190        // DROP commands
191        addCmd(TBaseType.rrw_drop, "access", "method", ESqlStatementType.sstpostgresqlDropAccessMethod);
192        addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstpostgresqlDropAggregate);
193        addCmd(TBaseType.rrw_drop, "assertion", ESqlStatementType.sstpostgresqlDropAssertion);
194        addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstpostgresqlDropCast);
195        addCmd(TBaseType.rrw_drop, "collation", ESqlStatementType.sstpostgresqlDropCollation);
196        addCmd(TBaseType.rrw_drop, "conversion", ESqlStatementType.sstpostgresqlDropConversion);
197        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstpostgresqlDropDatabase);
198        addCmd(TBaseType.rrw_drop, "domain", ESqlStatementType.sstpostgresqlDropDomain);
199        addCmd(TBaseType.rrw_drop, "event", "trigger", ESqlStatementType.sstpostgresqlDropEventTrigger);
200        addCmd(TBaseType.rrw_drop, "extension", ESqlStatementType.sstpostgresqlDropExtension);
201        addCmd(TBaseType.rrw_drop, "external", "table", ESqlStatementType.sstpostgresqlDropTable);
202        addCmd(TBaseType.rrw_drop, "foreign", "data", "wrapper", ESqlStatementType.sstpostgresqlDropForeignDataWrapper);
203        addCmd(TBaseType.rrw_drop, "foreign", "table", ESqlStatementType.sstpostgresqlDropForeignTable);
204        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstpostgresqlDropFunction);
205        addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstpostgresqlDropGroup);
206        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
207        addCmd(TBaseType.rrw_drop, "language", ESqlStatementType.sstpostgresqlDropLanguage);
208        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstpostgresqlDropMaterializedView);
209        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstpostgresqlDropOperator);
210        addCmd(TBaseType.rrw_drop, "operator", "class", ESqlStatementType.sstpostgresqlDropOperatorClass);
211        addCmd(TBaseType.rrw_drop, "operator", "family ", ESqlStatementType.sstpostgresqlDropOperatorFamily);
212        addCmd(TBaseType.rrw_drop, "owned", ESqlStatementType.sstpostgresqlDropOwned);
213        addCmd(TBaseType.rrw_drop, "policy", ESqlStatementType.sstpostgresqlDropPolicy);
214        addCmd(TBaseType.rrw_drop, "procedural", "language", ESqlStatementType.sstpostgresqlDropLanguage);
215        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstpostgresqlDropProcedure);
216        addCmd(TBaseType.rrw_drop, "publication", ESqlStatementType.sstpostgresqlDropPublication);
217        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstpostgresqlDropRole);
218        addCmd(TBaseType.rrw_drop, "routine", ESqlStatementType.sstpostgresqlDropRoutine);
219        addCmd(TBaseType.rrw_drop, "rule", ESqlStatementType.sstpostgresqlDropRule);
220        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstpostgresqlDropSchema);
221        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstpostgresqlDropSequence);
222        addCmd(TBaseType.rrw_drop, "server", ESqlStatementType.sstpostgresqlDropServer);
223        addCmd(TBaseType.rrw_drop, "statistics", ESqlStatementType.sstpostgresqlDropStatistics);
224        addCmd(TBaseType.rrw_drop, "subscription", ESqlStatementType.sstpostgresqlDropSubscription);
225        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstpostgresqlDropTable);
226        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstpostgresqlDropTablespace);
227        addCmd(TBaseType.rrw_drop, "text", "search", "configuration", ESqlStatementType.sstpostgresqlDropTextSearchConfiguration);
228        addCmd(TBaseType.rrw_drop, "text", "search", "dictionary", ESqlStatementType.sstpostgresqlDropTextSearchDictionary);
229        addCmd(TBaseType.rrw_drop, "text", "search", "parser", ESqlStatementType.sstpostgresqlDropTextSearchParser);
230        addCmd(TBaseType.rrw_drop, "text", "search", "template", ESqlStatementType.sstpostgresqlDropTextSearchTemplate);
231        addCmd(TBaseType.rrw_drop, "transform", ESqlStatementType.sstpostgresqlDropTransform);
232        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstpostgresqlDropTrigger);
233        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstpostgresqlDropType);
234        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstpostgresqlDropUser);
235        addCmd(TBaseType.rrw_drop, "user", "mapping", ESqlStatementType.sstpostgresqlDropUserMapping);
236        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstpostgresqlDropView);
237
238        // END, EXECUTE, EXPLAIN
239        addCmd(TBaseType.rrw_end, ESqlStatementType.sstpostgresqlEnd);
240        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstpostgresqlExecute);
241        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstpostgresqlExplain);
242
243        // FETCH, GRANT
244        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstFetchFrom);
245        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstpostgresqlGrant);
246
247        // IMPORT
248        addCmd(TBaseType.rrw_postgresql_import, "foreign", "schema", ESqlStatementType.sstPostgresqlImport);
249
250        // INSERT
251        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
252
253        // LISTEN, LOAD, LOCK
254        addCmd(TBaseType.rrw_postgresql_listen, ESqlStatementType.sstpostgresqlListen);
255        addCmd(TBaseType.rrw_load, ESqlStatementType.sstpostgresqlLoad);
256        addCmd(TBaseType.rrw_lock, ESqlStatementType.sstpostgresqlLock);
257
258        // MERGE, MOVE
259        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
260        addCmd(TBaseType.rrw_move, ESqlStatementType.sstpostgresqlMove);
261
262        // NOTIFY
263        addCmd(TBaseType.rrw_postgresql_notify, ESqlStatementType.sstpostgresqlNotify);
264
265        // PL/pgSQL block
266        addCmd(TBaseType.rrw_plpgsql_function_delimiter, ESqlStatementType.sstPostgresqlBlock);
267
268        // PREPARE
269        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstpostgresqlPrepare);
270        addCmd(TBaseType.rrw_prepare, "transaction", ESqlStatementType.sstpostgresqlPrepareTransaction);
271
272        // REASSIGN, REFRESH, REINDEX
273        addCmd(TBaseType.rrw_postgresql_reassign, "owned", ESqlStatementType.sstpostgresqlReassignOwned);
274        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
275        addCmd(TBaseType.rrw_postgresql_reindex, ESqlStatementType.sstReindex);
276
277        // RELEASE, RESET, REVOKE
278        addCmd(TBaseType.rrw_release, ESqlStatementType.sstpostgresqlReleaseSavepoint);
279        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstpostgresqlReleaseSavepoint);
280        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstpostgresqlReset);
281        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstpostgresqlRevoke);
282
283        // ROLLBACK
284        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstpostgresqlRollback);
285        addCmd(TBaseType.rrw_rollback, "prepared", ESqlStatementType.sstpostgresqlRollbackPrepared);
286        addCmd(TBaseType.rrw_rollback, "to", "savepoint", ESqlStatementType.sstpostgresqlRollbackToSavepoint);
287
288        // SAVEPOINT
289        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstpostgresqlSavepoint);
290
291        // SECURITY LABEL
292        addCmd(TBaseType.rrw_postgresql_security, "label", ESqlStatementType.sstpostgresqlSecurityLabel);
293
294        // SELECT
295        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
296
297        // SET commands
298        addCmd(TBaseType.rrw_set, ESqlStatementType.sstpostgresqlSet);
299        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstpostgresqlSetConstraints);
300        addCmd(TBaseType.rrw_set, "local", "role", ESqlStatementType.sstpostgresqlSetRole);
301        addCmd(TBaseType.rrw_set, "local", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
302        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstpostgresqlSetRole);
303        addCmd(TBaseType.rrw_set, "search_path", ESqlStatementType.sstpostgresqlSetSearchPath);
304        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
305        addCmd(TBaseType.rrw_set, "session", "characteristics", "as", "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
306        addCmd(TBaseType.rrw_set, "session", "role", ESqlStatementType.sstpostgresqlSetRole);
307        addCmd(TBaseType.rrw_set, "session", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
308        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
309
310        // SHOW
311        addCmd(TBaseType.rrw_show, ESqlStatementType.sstpostgresqlShow);
312        addCmd(TBaseType.rrw_show, "search_path", ESqlStatementType.sstpostgresqlShowSearchPath);
313
314        // START, TABLE, TRUNCATE
315        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction);
316        addCmd(TBaseType.rrw_table, ESqlStatementType.sstPostgresqlTable);
317        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
318
319        // UNLISTEN, UPDATE
320        addCmd(TBaseType.rrw_postgresql_unlisten, ESqlStatementType.sstpostgresqlUnlisten);
321        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
322
323        // VACUUM, VALUES
324        addCmd(TBaseType.rrw_postgresql_vacuum, ESqlStatementType.sstVacuum);
325        addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues);
326    }
327
328
329    @Override
330    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
331        TCustomSqlStatement ret = null;
332
333        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
334
335        // Skip comments, whitespace, and semicolons
336        if ((token.tokencode == TBaseType.cmtdoublehyphen)
337                || (token.tokencode == TBaseType.cmtslashstar)
338                || (token.tokencode == TBaseType.lexspace)
339                || (token.tokencode == TBaseType.lexnewline)
340                || (token.tokentype == ETokenType.ttsemicolon)) {
341            return null;
342        }
343
344        int lcpos = token.posinlist;
345        TSourceTokenList lcsourcetokenlist = token.container;
346        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
347
348        // Subquery after semicolon or at first line
349        if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) { // (
350            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
351            if (k > 0) {
352                ret = new TSelectSqlStatement(vendor);
353            }
354            return ret;
355        }
356
357        // CTE detection
358        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
359            ret = findcte(token);
360            if (ret != null) return ret;
361        }
362
363        gnewsqlstatementtype = getStatementTypeForToken(token);
364
365        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
366
367        switch (gnewsqlstatementtype) {
368            case sstinvalid: {
369                ret = null;
370
371                if (state == EFindSqlStateType.stnormal) {
372                    if (token.tokencode == TBaseType.label_begin) {
373                        ret = new TCommonBlock(vendor);
374                        gnewsqlstatementtype = ret.sqlstatementtype;
375                    } else if (token.tokencode == TBaseType.rrw_declare) {
376                        ret = new TCommonBlock(vendor);
377                        gnewsqlstatementtype = ret.sqlstatementtype;
378                    } else if (token.tokencode == TBaseType.rrw_begin) {
379                        ret = new TCommonBlock(vendor);
380                        gnewsqlstatementtype = ret.sqlstatementtype;
381                    } else if (token.tokencode == TBaseType.rrw_procedure) {
382                        ret = new TCreateProcedureStmt(vendor);
383                        gnewsqlstatementtype = ret.sqlstatementtype;
384                    } else if (token.tokencode == TBaseType.rrw_function) {
385                        ret = new TCreateFunctionStmt(vendor);
386                        gnewsqlstatementtype = ret.sqlstatementtype;
387                    }
388                }
389                break;
390            }
391
392            case sstselect: {
393                boolean lcisnewsql = true;
394
395                if (state != EFindSqlStateType.stnormal) {
396                    if (lcprevsolidtoken != null) {
397                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
398                            lcisnewsql = false; // subquery
399                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
400                            lcisnewsql = false;
401                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
402                            lcisnewsql = false;
403                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
404                            lcisnewsql = false;
405                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
406                            lcisnewsql = false;
407                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
408                            lcisnewsql = false;
409                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
410                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
411                                lcisnewsql = false;
412                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
413                                lcisnewsql = false;
414                        }
415
416                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
417                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
418                            if (lcpprevsolidtoken != null) {
419                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
420                                    lcisnewsql = false;
421                            }
422                        }
423                    }
424
425                    if (lccurrentsqlstatement != null) {
426                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
427                            lcisnewsql = false;
428                    }
429                }
430
431                if (lcisnewsql)
432                    ret = new TSelectSqlStatement(vendor);
433
434                break;
435            }
436
437            case sstinsert: {
438                boolean lcisnewsql = true;
439                if (state != EFindSqlStateType.stnormal) {
440                    if (lccurrentsqlstatement != null) {
441                        // Future vendor-specific logic
442                    }
443                }
444
445                if (lcisnewsql)
446                    ret = new TInsertSqlStatement(vendor);
447
448                break;
449            }
450
451            case sstupdate: {
452                boolean lcisnewsql = true;
453                if (state != EFindSqlStateType.stnormal) {
454                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
455                    if (lcprevsolidtoken != null) {
456                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
457                            lcisnewsql = false;
458                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
459                            lcisnewsql = false;
460                    }
461
462                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
463                    if (lcnextsolidtoken != null) {
464                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
465                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
466                            if (k == 0) lcisnewsql = false;
467                        }
468                    }
469
470                    if (lccurrentsqlstatement != null) {
471                        // Future vendor-specific logic
472                    }
473                }
474
475                if (lcisnewsql) {
476                    ret = new TUpdateSqlStatement(vendor);
477                    ret.dummytag = 1; // means set clause in update is not found yet
478                }
479                break;
480            }
481
482            case sstdelete: {
483                boolean lcisnewsql = true;
484
485                if (state != EFindSqlStateType.stnormal) {
486                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
487                    if (lcprevsolidtoken != null) {
488                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
489                            lcisnewsql = false;
490                    }
491
492                    if (lccurrentsqlstatement != null) {
493                        // Future vendor-specific logic
494                    }
495                }
496
497                if (lcisnewsql)
498                    ret = new TDeleteSqlStatement(vendor);
499
500                break;
501            }
502
503            case sstmerge:
504                ret = new TMergeSqlStatement(vendor);
505                ret.sqlstatementtype = gnewsqlstatementtype;
506                break;
507
508            case sstoraclecommit:
509            case sstoraclerollback:
510            case sstoraclesavepoint:
511            case sstoraclerevoke:
512            case sstoraclegrant:
513            case sstoracleanalyze:
514            case sstoracletruncate:
515                ret = new TUnknownSqlStatement(vendor);
516                ret.sqlstatementtype = gnewsqlstatementtype;
517                break;
518
519            case sstcreatetable:
520                ret = new TCreateTableSqlStatement(vendor);
521                break;
522
523            case sstoraclecreateview:
524                ret = new TCreateViewSqlStatement(vendor);
525                break;
526
527            case sstcreatematerializedview:
528                ret = new TCreateMaterializedSqlStatement(vendor);
529                break;
530
531            case sstoraclecreateindex:
532                ret = new TCreateIndexSqlStatement(vendor);
533                break;
534
535            case sstoraclecreatedatabase:
536                ret = new TCreateDatabaseSqlStatement(vendor);
537                break;
538
539            case sstoracledroptable:
540                ret = new TDropTableSqlStatement(vendor);
541                break;
542
543            case sstoracledropview:
544                ret = new TDropViewSqlStatement(vendor);
545                break;
546
547            case sstoracledropindex:
548                ret = new TDropIndexSqlStatement(vendor);
549                break;
550
551            case sstaltertable:
552                ret = new TAlterTableStatement(vendor);
553                break;
554
555            case sstoraclealtersession:
556                ret = new TAlterSessionStatement(vendor);
557                break;
558
559            case sstCommentOn:
560                ret = new TCommentOnSqlStmt(vendor);
561                break;
562
563            case sstoraclecreatesequence:
564                ret = new TCreateSequenceStmt(vendor);
565                break;
566
567            // PostgreSQL-specific statement types
568            case sstpostgresqlCreateIndex:
569                ret = new TCreateIndexSqlStatement(vendor);
570                break;
571
572            case sstpostgresqlCreateView:
573                ret = new TCreateViewSqlStatement(vendor);
574                break;
575
576            case sstpostgresqlCreateFunction:
577                ret = new TCreateFunctionStmt(vendor);
578                break;
579
580            case sstcreatetrigger:
581                ret = new TCreateTriggerStmt(vendor);
582                break;
583
584            case sstpostgresqlMove:
585                ret = new TMoveStmt(vendor);
586                break;
587
588            case sstpostgresqlTruncate:
589                ret = new TTruncateStatement(vendor);
590                break;
591
592            case sstpostgresqlExecute:
593                ret = new TExecuteSqlStatement(vendor);
594                break;
595
596            case sstpostgresqlDropTable:
597                ret = new TDropTableSqlStatement(vendor);
598                break;
599
600            case sstPostgresqlBlock:
601                ret = new TCommonBlock(vendor);
602                break;
603
604            case sstVacuum:
605                ret = new TVacuumStmt(vendor);
606                break;
607
608            case sstReindex:
609                ret = new TReindexStmt(vendor);
610                break;
611
612            case sstcreateprocedure:
613                ret = new TCreateProcedureStmt(vendor);
614                break;
615
616            case sstpostgresqlCommit:
617                ret = new TCommitStmt(vendor);
618                break;
619
620            case sstpostgresqlCreateSchema:
621                ret = new TCreateSchemaSqlStatement(vendor);
622                break;
623
624            case sstpostgresqlDropSchema:
625                ret = new TDropSchemaSqlStatement(vendor);
626                break;
627
628            case sstpostgresqlShowSearchPath:
629                ret = new TShowSearchPathStmt(vendor);
630                break;
631
632            case sstpostgresqlCopy:
633                ret = new TCopyStmt(vendor);
634                break;
635
636            case sstcall:
637                ret = new TCallStatement(vendor);
638                break;
639
640            case sstpostgresqlAlterSchema:
641                ret = new TAlterSchemaStmt(vendor);
642                break;
643
644            case sstpostgresqlAlterfunction:
645                ret = new TAlterFunctionStmt(vendor);
646                break;
647
648            case sstStartTransaction:
649                ret = new TStartTransactionStmt(vendor);
650                break;
651
652            case sstpostgresqlComment:
653                ret = new TCommentOnSqlStmt(vendor);
654                break;
655
656            case sstpostgresqlShow:
657                ret = new TShowStmt(vendor);
658                break;
659
660            case sstpostgresqlSetSearchPath:
661            case sstpostgresqlSet:
662                if (state == EFindSqlStateType.stnormal) {
663                    ret = new TSetStmt(vendor);
664                }
665                break;
666
667            case sstpostgresqlDropFunction:
668                ret = new TDropFunctionStmt(vendor);
669                break;
670
671            case sstpostgresqlDropTrigger:
672                ret = new TDropTriggerSqlStatement(vendor);
673                break;
674
675            case sstpostgresqlDropProcedure:
676                ret = new TDropProcedureStmt(vendor);
677                break;
678
679            case sstdropindex:
680                ret = new TDropIndexSqlStatement(vendor);
681                break;
682
683            case sstpostgresqlDropSequence:
684                ret = new TDropSequenceStmt(vendor);
685                break;
686
687            case sstpostgresqlDropView:
688                ret = new TDropViewSqlStatement(vendor);
689                break;
690
691            case sstpostgresqlCreateSequence:
692                ret = new TCreateSequenceStmt(vendor);
693                break;
694
695            case sstpostgresqlAlterSequence:
696                ret = new TAlterSequenceStatement(vendor);
697                break;
698
699            case sstpostgresqlCreateType:
700                ret = new TCreateTypeStmt(vendor);
701                break;
702
703            case sstcreateExtension:
704                ret = new TCreateExtensionStmt(vendor);
705                break;
706
707            case sstpostgresqlCreateForeignTable:
708                ret = new TCreateTableSqlStatement(vendor);
709                break;
710
711            case sstPostgresqlTable:
712                ret = new TPostgresqlTableStmt(vendor);
713                break;
714
715            case sstpostgresqlDropMaterializedView:
716                ret = new TDropMaterializedViewStmt(vendor);
717                break;
718
719            case sstpostgresqlDo: {
720                boolean lcisnewsql = false;
721
722                if (state == EFindSqlStateType.stnormal) {
723                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
724                    if (lcnextsolidtoken != null) {
725                        if (lcnextsolidtoken.tokencode == TBaseType.rrw_postgresql_function_delimiter)
726                            lcisnewsql = true;
727                        else if (lcnextsolidtoken.tokencode == TBaseType.rrw_postgresql_language) {
728                            // DO LANGUAGE plpgsql $$ ... $$
729                            lcisnewsql = true;
730                        }
731                    }
732                }
733
734                if (lcisnewsql)
735                    ret = new TDoExecuteBlockStmt(vendor);
736
737                break;
738            }
739
740            case sstpostgresqlDeclare: {
741                // Distinguish between DECLARE CURSOR (standalone SQL statement) and
742                // PL/pgSQL DECLARE block.
743                // DECLARE name [BINARY] [INSENSITIVE|ASENSITIVE] [[NO] SCROLL] CURSOR ...
744                // If DECLARE is followed by an identifier, then one of CURSOR/BINARY/
745                // INSENSITIVE/ASENSITIVE/NO/SCROLL, it's a cursor declaration.
746                boolean isCursorDecl = false;
747                TSourceToken st = token.nextSolidToken();
748                if (st != null && st.tokencode == TBaseType.ident) {
749                    TSourceToken st2 = st.nextSolidToken();
750                    if (st2 != null) {
751                        String s2 = st2.toString().toUpperCase();
752                        if (s2.equals("CURSOR") || s2.equals("BINARY")
753                                || s2.equals("INSENSITIVE") || s2.equals("ASENSITIVE")
754                                || s2.equals("NO") || s2.equals("SCROLL")) {
755                            isCursorDecl = true;
756                        }
757                    }
758                }
759                if (isCursorDecl) {
760                    ret = new TDeclareCursorStmt(vendor);
761                    gnewsqlstatementtype = ret.sqlstatementtype;
762                    token.tokencode = TBaseType.rrw_postgresql_declare_cursor_stmt;
763                } else {
764                    ret = new TCommonBlock(vendor);
765                    gnewsqlstatementtype = ret.sqlstatementtype;
766                }
767                break;
768            }
769
770            case sstpostgresqlExplain:
771                ret = new TExplainPlan(vendor);
772                gnewsqlstatementtype = ret.sqlstatementtype;
773                break;
774
775            case sstpostgresqlCreateRole:
776                ret = new TCreateRoleStmt(vendor);
777                break;
778
779            case sstpostgresqlAlterRole:
780                ret = new TAlterRoleStmt(vendor);
781                break;
782
783            case sstpostgresqlAlterIndex:
784                ret = new TAlterIndexStmt(vendor);
785                break;
786
787            case sstpostgresqlGrant:
788                ret = new TGrantSqlStatement(vendor);
789                break;
790
791            case sstpostgresqlRevoke:
792                ret = new TRevokeStmt(vendor);
793                break;
794
795            default:
796                ret = new TUnknownSqlStatement(vendor);
797                ret.sqlstatementtype = gnewsqlstatementtype;
798                break;
799        }
800
801        return ret;
802    }
803
804}