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        // RETURN (PL/pgSQL)
273        addCmd(TBaseType.rrw_return, ESqlStatementType.sst_returnstmt);
274
275        // REASSIGN, REFRESH, REINDEX
276        addCmd(TBaseType.rrw_postgresql_reassign, "owned", ESqlStatementType.sstpostgresqlReassignOwned);
277        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
278        addCmd(TBaseType.rrw_postgresql_reindex, ESqlStatementType.sstReindex);
279
280        // RELEASE, RESET, REVOKE
281        addCmd(TBaseType.rrw_release, ESqlStatementType.sstpostgresqlReleaseSavepoint);
282        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstpostgresqlReleaseSavepoint);
283        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstpostgresqlReset);
284        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstpostgresqlRevoke);
285
286        // ROLLBACK
287        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstpostgresqlRollback);
288        addCmd(TBaseType.rrw_rollback, "prepared", ESqlStatementType.sstpostgresqlRollbackPrepared);
289        addCmd(TBaseType.rrw_rollback, "to", "savepoint", ESqlStatementType.sstpostgresqlRollbackToSavepoint);
290
291        // SAVEPOINT
292        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstpostgresqlSavepoint);
293
294        // SECURITY LABEL
295        addCmd(TBaseType.rrw_postgresql_security, "label", ESqlStatementType.sstpostgresqlSecurityLabel);
296
297        // SELECT
298        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
299
300        // SET commands
301        addCmd(TBaseType.rrw_set, ESqlStatementType.sstpostgresqlSet);
302        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstpostgresqlSetConstraints);
303        addCmd(TBaseType.rrw_set, "local", "role", ESqlStatementType.sstpostgresqlSetRole);
304        addCmd(TBaseType.rrw_set, "local", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
305        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstpostgresqlSetRole);
306        addCmd(TBaseType.rrw_set, "search_path", ESqlStatementType.sstpostgresqlSetSearchPath);
307        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
308        addCmd(TBaseType.rrw_set, "session", "characteristics", "as", "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
309        addCmd(TBaseType.rrw_set, "session", "role", ESqlStatementType.sstpostgresqlSetRole);
310        addCmd(TBaseType.rrw_set, "session", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
311        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
312
313        // SHOW
314        addCmd(TBaseType.rrw_show, ESqlStatementType.sstpostgresqlShow);
315        addCmd(TBaseType.rrw_show, "search_path", ESqlStatementType.sstpostgresqlShowSearchPath);
316
317        // START, TABLE, TRUNCATE
318        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction);
319        addCmd(TBaseType.rrw_table, ESqlStatementType.sstPostgresqlTable);
320        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
321
322        // UNLISTEN, UPDATE
323        addCmd(TBaseType.rrw_postgresql_unlisten, ESqlStatementType.sstpostgresqlUnlisten);
324        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
325
326        // VACUUM, VALUES
327        addCmd(TBaseType.rrw_postgresql_vacuum, ESqlStatementType.sstVacuum);
328        addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues);
329    }
330
331
332    @Override
333    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
334        TCustomSqlStatement ret = null;
335
336        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
337
338        // Skip comments, whitespace, and semicolons
339        if ((token.tokencode == TBaseType.cmtdoublehyphen)
340                || (token.tokencode == TBaseType.cmtslashstar)
341                || (token.tokencode == TBaseType.lexspace)
342                || (token.tokencode == TBaseType.lexnewline)
343                || (token.tokentype == ETokenType.ttsemicolon)) {
344            return null;
345        }
346
347        int lcpos = token.posinlist;
348        TSourceTokenList lcsourcetokenlist = token.container;
349        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
350
351        // Subquery after semicolon or at first line
352        if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) { // (
353            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
354            if (k > 0) {
355                ret = new TSelectSqlStatement(vendor);
356            }
357            return ret;
358        }
359
360        // CTE detection
361        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
362            ret = findcte(token);
363            if (ret != null) return ret;
364        }
365
366        gnewsqlstatementtype = getStatementTypeForToken(token);
367
368        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
369
370        switch (gnewsqlstatementtype) {
371            case sstinvalid: {
372                ret = null;
373
374                if (state == EFindSqlStateType.stnormal) {
375                    if (token.tokencode == TBaseType.label_begin) {
376                        ret = new TCommonBlock(vendor);
377                        gnewsqlstatementtype = ret.sqlstatementtype;
378                    } else if (token.tokencode == TBaseType.rrw_declare) {
379                        ret = new TCommonBlock(vendor);
380                        gnewsqlstatementtype = ret.sqlstatementtype;
381                    } else if (token.tokencode == TBaseType.rrw_begin) {
382                        ret = new TCommonBlock(vendor);
383                        gnewsqlstatementtype = ret.sqlstatementtype;
384                    } else if (token.tokencode == TBaseType.rrw_procedure) {
385                        ret = new TCreateProcedureStmt(vendor);
386                        gnewsqlstatementtype = ret.sqlstatementtype;
387                    } else if (token.tokencode == TBaseType.rrw_function) {
388                        ret = new TCreateFunctionStmt(vendor);
389                        gnewsqlstatementtype = ret.sqlstatementtype;
390                    }
391                }
392                break;
393            }
394
395            case sstselect: {
396                boolean lcisnewsql = true;
397
398                if (state != EFindSqlStateType.stnormal) {
399                    if (lcprevsolidtoken != null) {
400                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
401                            lcisnewsql = false; // subquery
402                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
403                            lcisnewsql = false;
404                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
405                            lcisnewsql = false;
406                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
407                            lcisnewsql = false;
408                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
409                            lcisnewsql = false;
410                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
411                            lcisnewsql = false;
412                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
413                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
414                                lcisnewsql = false;
415                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
416                                lcisnewsql = false;
417                        }
418
419                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
420                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
421                            if (lcpprevsolidtoken != null) {
422                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
423                                    lcisnewsql = false;
424                            }
425                        }
426                    }
427
428                    if (lccurrentsqlstatement != null) {
429                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
430                            lcisnewsql = false;
431                    }
432                }
433
434                if (lcisnewsql)
435                    ret = new TSelectSqlStatement(vendor);
436
437                break;
438            }
439
440            case sstinsert: {
441                boolean lcisnewsql = true;
442                if (state != EFindSqlStateType.stnormal) {
443                    if (lccurrentsqlstatement != null) {
444                        // Future vendor-specific logic
445                    }
446                }
447
448                if (lcisnewsql)
449                    ret = new TInsertSqlStatement(vendor);
450
451                break;
452            }
453
454            case sstupdate: {
455                boolean lcisnewsql = true;
456                if (state != EFindSqlStateType.stnormal) {
457                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
458                    if (lcprevsolidtoken != null) {
459                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
460                            lcisnewsql = false;
461                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
462                            lcisnewsql = false;
463                    }
464
465                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
466                    if (lcnextsolidtoken != null) {
467                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
468                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
469                            if (k == 0) lcisnewsql = false;
470                        }
471                    }
472
473                    if (lccurrentsqlstatement != null) {
474                        // Future vendor-specific logic
475                    }
476                }
477
478                if (lcisnewsql) {
479                    ret = new TUpdateSqlStatement(vendor);
480                    ret.dummytag = 1; // means set clause in update is not found yet
481                }
482                break;
483            }
484
485            case sstdelete: {
486                boolean lcisnewsql = true;
487
488                if (state != EFindSqlStateType.stnormal) {
489                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
490                    if (lcprevsolidtoken != null) {
491                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
492                            lcisnewsql = false;
493                    }
494
495                    if (lccurrentsqlstatement != null) {
496                        // Future vendor-specific logic
497                    }
498                }
499
500                if (lcisnewsql)
501                    ret = new TDeleteSqlStatement(vendor);
502
503                break;
504            }
505
506            case sstmerge:
507                ret = new TMergeSqlStatement(vendor);
508                ret.sqlstatementtype = gnewsqlstatementtype;
509                break;
510
511            case sstoraclecommit:
512            case sstoraclerollback:
513            case sstoraclesavepoint:
514            case sstoraclerevoke:
515            case sstoraclegrant:
516            case sstoracleanalyze:
517            case sstoracletruncate:
518                ret = new TUnknownSqlStatement(vendor);
519                ret.sqlstatementtype = gnewsqlstatementtype;
520                break;
521
522            case sstcreatetable:
523                ret = new TCreateTableSqlStatement(vendor);
524                break;
525
526            case sstoraclecreateview:
527                ret = new TCreateViewSqlStatement(vendor);
528                break;
529
530            case sstcreatematerializedview:
531                ret = new TCreateMaterializedSqlStatement(vendor);
532                break;
533
534            case sstoraclecreateindex:
535                ret = new TCreateIndexSqlStatement(vendor);
536                break;
537
538            case sstoraclecreatedatabase:
539                ret = new TCreateDatabaseSqlStatement(vendor);
540                break;
541
542            case sstoracledroptable:
543                ret = new TDropTableSqlStatement(vendor);
544                break;
545
546            case sstoracledropview:
547                ret = new TDropViewSqlStatement(vendor);
548                break;
549
550            case sstoracledropindex:
551                ret = new TDropIndexSqlStatement(vendor);
552                break;
553
554            case sstaltertable:
555                ret = new TAlterTableStatement(vendor);
556                break;
557
558            case sstoraclealtersession:
559                ret = new TAlterSessionStatement(vendor);
560                break;
561
562            case sstCommentOn:
563                ret = new TCommentOnSqlStmt(vendor);
564                break;
565
566            case sstoraclecreatesequence:
567                ret = new TCreateSequenceStmt(vendor);
568                break;
569
570            // PostgreSQL-specific statement types
571            case sstpostgresqlCreateIndex:
572                ret = new TCreateIndexSqlStatement(vendor);
573                break;
574
575            case sstpostgresqlCreateView:
576                ret = new TCreateViewSqlStatement(vendor);
577                break;
578
579            case sstpostgresqlCreateFunction:
580                ret = new TCreateFunctionStmt(vendor);
581                break;
582
583            case sstcreatetrigger:
584                ret = new TCreateTriggerStmt(vendor);
585                break;
586
587            case sstpostgresqlMove:
588                ret = new TMoveStmt(vendor);
589                break;
590
591            case sstpostgresqlTruncate:
592                ret = new TTruncateStatement(vendor);
593                break;
594
595            case sstpostgresqlExecute:
596                ret = new TExecuteSqlStatement(vendor);
597                break;
598
599            case sstpostgresqlDropTable:
600                ret = new TDropTableSqlStatement(vendor);
601                break;
602
603            case sstPostgresqlBlock:
604                ret = new TCommonBlock(vendor);
605                break;
606
607            case sstVacuum:
608                ret = new TVacuumStmt(vendor);
609                break;
610
611            case sstReindex:
612                ret = new TReindexStmt(vendor);
613                break;
614
615            case sstcreateprocedure:
616                ret = new TCreateProcedureStmt(vendor);
617                break;
618
619            case sstpostgresqlCommit:
620                ret = new TCommitStmt(vendor);
621                break;
622
623            case sstpostgresqlCreateSchema:
624                ret = new TCreateSchemaSqlStatement(vendor);
625                break;
626
627            case sstpostgresqlDropSchema:
628                ret = new TDropSchemaSqlStatement(vendor);
629                break;
630
631            case sstpostgresqlShowSearchPath:
632                ret = new TShowSearchPathStmt(vendor);
633                break;
634
635            case sstpostgresqlCopy:
636                ret = new TCopyStmt(vendor);
637                break;
638
639            case sstcall:
640                ret = new TCallStatement(vendor);
641                break;
642
643            case sstpostgresqlAlterSchema:
644                ret = new TAlterSchemaStmt(vendor);
645                break;
646
647            case sstpostgresqlAlterfunction:
648                ret = new TAlterFunctionStmt(vendor);
649                break;
650
651            case sstStartTransaction:
652                ret = new TStartTransactionStmt(vendor);
653                break;
654
655            case sstpostgresqlComment:
656                ret = new TCommentOnSqlStmt(vendor);
657                break;
658
659            case sstpostgresqlShow:
660                ret = new TShowStmt(vendor);
661                break;
662
663            case sstpostgresqlSetSearchPath:
664            case sstpostgresqlSet:
665                if (state == EFindSqlStateType.stnormal) {
666                    ret = new TSetStmt(vendor);
667                }
668                break;
669
670            case sstpostgresqlDropFunction:
671                ret = new TDropFunctionStmt(vendor);
672                break;
673
674            case sstpostgresqlDropTrigger:
675                ret = new TDropTriggerSqlStatement(vendor);
676                break;
677
678            case sstpostgresqlDropProcedure:
679                ret = new TDropProcedureStmt(vendor);
680                break;
681
682            case sstdropindex:
683                ret = new TDropIndexSqlStatement(vendor);
684                break;
685
686            case sstpostgresqlDropSequence:
687                ret = new TDropSequenceStmt(vendor);
688                break;
689
690            case sstpostgresqlDropView:
691                ret = new TDropViewSqlStatement(vendor);
692                break;
693
694            case sstpostgresqlCreateSequence:
695                ret = new TCreateSequenceStmt(vendor);
696                break;
697
698            case sstpostgresqlAlterSequence:
699                ret = new TAlterSequenceStatement(vendor);
700                break;
701
702            case sstpostgresqlCreateType:
703                ret = new TCreateTypeStmt(vendor);
704                break;
705
706            case sstcreateExtension:
707                ret = new TCreateExtensionStmt(vendor);
708                break;
709
710            case sstpostgresqlCreateForeignTable:
711                ret = new TCreateTableSqlStatement(vendor);
712                break;
713
714            case sstPostgresqlTable:
715                ret = new TPostgresqlTableStmt(vendor);
716                break;
717
718            case sstpostgresqlDropMaterializedView:
719                ret = new TDropMaterializedViewStmt(vendor);
720                break;
721
722            case sstpostgresqlDo: {
723                boolean lcisnewsql = false;
724
725                if (state == EFindSqlStateType.stnormal) {
726                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
727                    if (lcnextsolidtoken != null) {
728                        if (lcnextsolidtoken.tokencode == TBaseType.rrw_postgresql_function_delimiter)
729                            lcisnewsql = true;
730                        else if (lcnextsolidtoken.tokencode == TBaseType.rrw_postgresql_language) {
731                            // DO LANGUAGE plpgsql $$ ... $$
732                            lcisnewsql = true;
733                        }
734                    }
735                }
736
737                if (lcisnewsql)
738                    ret = new TDoExecuteBlockStmt(vendor);
739
740                break;
741            }
742
743            case sstpostgresqlDeclare: {
744                // Distinguish between DECLARE CURSOR (standalone SQL statement) and
745                // PL/pgSQL DECLARE block.
746                // DECLARE name [BINARY] [INSENSITIVE|ASENSITIVE] [[NO] SCROLL] CURSOR ...
747                // If DECLARE is followed by an identifier, then one of CURSOR/BINARY/
748                // INSENSITIVE/ASENSITIVE/NO/SCROLL, it's a cursor declaration.
749                boolean isCursorDecl = false;
750                TSourceToken st = token.nextSolidToken();
751                if (st != null && st.tokencode == TBaseType.ident) {
752                    TSourceToken st2 = st.nextSolidToken();
753                    if (st2 != null) {
754                        String s2 = st2.toString().toUpperCase();
755                        if (s2.equals("CURSOR") || s2.equals("BINARY")
756                                || s2.equals("INSENSITIVE") || s2.equals("ASENSITIVE")
757                                || s2.equals("NO") || s2.equals("SCROLL")) {
758                            isCursorDecl = true;
759                        }
760                    }
761                }
762                if (isCursorDecl) {
763                    ret = new TDeclareCursorStmt(vendor);
764                    gnewsqlstatementtype = ret.sqlstatementtype;
765                    token.tokencode = TBaseType.rrw_postgresql_declare_cursor_stmt;
766                } else {
767                    ret = new TCommonBlock(vendor);
768                    gnewsqlstatementtype = ret.sqlstatementtype;
769                }
770                break;
771            }
772
773            case sstpostgresqlExplain:
774                ret = new TExplainPlan(vendor);
775                gnewsqlstatementtype = ret.sqlstatementtype;
776                break;
777
778            case sstpostgresqlCreateRole:
779                ret = new TCreateRoleStmt(vendor);
780                break;
781
782            case sstpostgresqlAlterRole:
783                ret = new TAlterRoleStmt(vendor);
784                break;
785
786            case sstpostgresqlAlterIndex:
787                ret = new TAlterIndexStmt(vendor);
788                break;
789
790            case sstpostgresqlGrant:
791                ret = new TGrantSqlStatement(vendor);
792                break;
793
794            case sst_returnstmt:
795                ret = new TReturnStmt(vendor);
796                break;
797
798            case sstpostgresqlRevoke:
799                ret = new TRevokeStmt(vendor);
800                break;
801
802            default:
803                ret = new TUnknownSqlStatement(vendor);
804                ret.sqlstatementtype = gnewsqlstatementtype;
805                break;
806        }
807
808        return ret;
809    }
810
811}