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", "role ", ESqlStatementType.sstpostgresqlCreateRole);
132        addCmd(TBaseType.rrw_create, "or", "replace", "rule ", ESqlStatementType.sstpostgresqlCreateRule);
133        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
134        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
135        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstcreatetrigger);
136        addCmd(TBaseType.rrw_create, "or", "replace", "trusted", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
137        addCmd(TBaseType.rrw_create, "or", "replace", "trusted", "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
138        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstpostgresqlCreateView);
139        addCmd(TBaseType.rrw_create, "policy", ESqlStatementType.sstpostgresqlCreatePolicy);
140        addCmd(TBaseType.rrw_create, "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
141        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
142        addCmd(TBaseType.rrw_create, "publication", ESqlStatementType.sstpostgresqlCreatePublication);
143        addCmd(TBaseType.rrw_create, "recursive", "view", ESqlStatementType.sstpostgresqlCreateView);
144        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstpostgresqlCreateRole);
145        addCmd(TBaseType.rrw_create, "rule", ESqlStatementType.sstpostgresqlCreateRule);
146        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstpostgresqlCreateSchema);
147        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
148        addCmd(TBaseType.rrw_create, "server", ESqlStatementType.sstpostgresqlCreateServer);
149        addCmd(TBaseType.rrw_create, "statistics", ESqlStatementType.sstpostgresqlCreateStatistics);
150        addCmd(TBaseType.rrw_create, "subscription", ESqlStatementType.sstpostgresqlCreateSubscription);
151        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
152        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstpostgresqlCreateTablespace);
153        addCmd(TBaseType.rrw_create, "temp", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
154        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
155        addCmd(TBaseType.rrw_create, "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
156        addCmd(TBaseType.rrw_create, "temporary", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
157        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
158        addCmd(TBaseType.rrw_create, "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
159        addCmd(TBaseType.rrw_create, "text", "search", "configuration", ESqlStatementType.sstpostgresqlCreateTextSearchConfiguration);
160        addCmd(TBaseType.rrw_create, "text", "search", "dictionary", ESqlStatementType.sstpostgresqlCreateTextSearchDictionary);
161        addCmd(TBaseType.rrw_create, "text", "search", "parser", ESqlStatementType.sstpostgresqlCreateTextSearchParser);
162        addCmd(TBaseType.rrw_create, "text", "search", "template", ESqlStatementType.sstpostgresqlCreateTextSearchTemplate);
163        addCmd(TBaseType.rrw_create, "transform", ESqlStatementType.sstpostgresqlCreateTransform);
164        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
165        addCmd(TBaseType.rrw_create, "trusted", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
166        addCmd(TBaseType.rrw_create, "trusted", "procedural", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
167        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstpostgresqlCreateType);
168        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstpostgresqlCreateIndex);
169        addCmd(TBaseType.rrw_create, "unlocked", "table", ESqlStatementType.sstcreatetable);
170        addCmd(TBaseType.rrw_create, "unlogged", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
171        addCmd(TBaseType.rrw_create, "unlogged", "table", ESqlStatementType.sstcreatetable);
172        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstpostgresqlCreateUser);
173        addCmd(TBaseType.rrw_create, "user", "mapping", ESqlStatementType.sstpostgresqlCreateUserMapping);
174        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstpostgresqlCreateView);
175
176        // DEALLOCATE, DECLARE, DELETE
177        addCmd(TBaseType.rrw_deallocate, ESqlStatementType.sstpostgresqlDeallocate);
178        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstpostgresqlDeclare);
179        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
180
181        // DISCARD, DO
182        addCmd(TBaseType.rrw_postgresql_discard, ESqlStatementType.sstpostgresqlDiscard);
183        addCmd(TBaseType.rrw_do, ESqlStatementType.sstpostgresqlDo);
184
185        // DROP commands
186        addCmd(TBaseType.rrw_drop, "access", "method", ESqlStatementType.sstpostgresqlDropAccessMethod);
187        addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstpostgresqlDropAggregate);
188        addCmd(TBaseType.rrw_drop, "assertion", ESqlStatementType.sstpostgresqlDropAssertion);
189        addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstpostgresqlDropCast);
190        addCmd(TBaseType.rrw_drop, "collation", ESqlStatementType.sstpostgresqlDropCollation);
191        addCmd(TBaseType.rrw_drop, "conversion", ESqlStatementType.sstpostgresqlDropConversion);
192        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstpostgresqlDropDatabase);
193        addCmd(TBaseType.rrw_drop, "domain", ESqlStatementType.sstpostgresqlDropDomain);
194        addCmd(TBaseType.rrw_drop, "event", "trigger", ESqlStatementType.sstpostgresqlDropEventTrigger);
195        addCmd(TBaseType.rrw_drop, "extension", ESqlStatementType.sstpostgresqlDropExtension);
196        addCmd(TBaseType.rrw_drop, "external", "table", ESqlStatementType.sstpostgresqlDropTable);
197        addCmd(TBaseType.rrw_drop, "foreign", "data", "wrapper", ESqlStatementType.sstpostgresqlDropForeignDataWrapper);
198        addCmd(TBaseType.rrw_drop, "foreign", "table", ESqlStatementType.sstpostgresqlDropForeignTable);
199        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstpostgresqlDropFunction);
200        addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstpostgresqlDropGroup);
201        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
202        addCmd(TBaseType.rrw_drop, "language", ESqlStatementType.sstpostgresqlDropLanguage);
203        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstpostgresqlDropMaterializedView);
204        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstpostgresqlDropOperator);
205        addCmd(TBaseType.rrw_drop, "operator", "class", ESqlStatementType.sstpostgresqlDropOperatorClass);
206        addCmd(TBaseType.rrw_drop, "operator", "family ", ESqlStatementType.sstpostgresqlDropOperatorFamily);
207        addCmd(TBaseType.rrw_drop, "owned", ESqlStatementType.sstpostgresqlDropOwned);
208        addCmd(TBaseType.rrw_drop, "policy", ESqlStatementType.sstpostgresqlDropPolicy);
209        addCmd(TBaseType.rrw_drop, "procedural", "language", ESqlStatementType.sstpostgresqlDropLanguage);
210        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstpostgresqlDropProcedure);
211        addCmd(TBaseType.rrw_drop, "publication", ESqlStatementType.sstpostgresqlDropPublication);
212        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstpostgresqlDropRole);
213        addCmd(TBaseType.rrw_drop, "routine", ESqlStatementType.sstpostgresqlDropRoutine);
214        addCmd(TBaseType.rrw_drop, "rule", ESqlStatementType.sstpostgresqlDropRule);
215        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstpostgresqlDropSchema);
216        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstpostgresqlDropSequence);
217        addCmd(TBaseType.rrw_drop, "server", ESqlStatementType.sstpostgresqlDropServer);
218        addCmd(TBaseType.rrw_drop, "statistics", ESqlStatementType.sstpostgresqlDropStatistics);
219        addCmd(TBaseType.rrw_drop, "subscription", ESqlStatementType.sstpostgresqlDropSubscription);
220        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstpostgresqlDropTable);
221        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstpostgresqlDropTablespace);
222        addCmd(TBaseType.rrw_drop, "text", "search", "configuration", ESqlStatementType.sstpostgresqlDropTextSearchConfiguration);
223        addCmd(TBaseType.rrw_drop, "text", "search", "dictionary", ESqlStatementType.sstpostgresqlDropTextSearchDictionary);
224        addCmd(TBaseType.rrw_drop, "text", "search", "parser", ESqlStatementType.sstpostgresqlDropTextSearchParser);
225        addCmd(TBaseType.rrw_drop, "text", "search", "template", ESqlStatementType.sstpostgresqlDropTextSearchTemplate);
226        addCmd(TBaseType.rrw_drop, "transform", ESqlStatementType.sstpostgresqlDropTransform);
227        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstpostgresqlDropTrigger);
228        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstpostgresqlDropType);
229        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstpostgresqlDropUser);
230        addCmd(TBaseType.rrw_drop, "user", "mapping", ESqlStatementType.sstpostgresqlDropUserMapping);
231        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstpostgresqlDropView);
232
233        // END, EXECUTE, EXPLAIN
234        addCmd(TBaseType.rrw_end, ESqlStatementType.sstpostgresqlEnd);
235        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstpostgresqlExecute);
236        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstpostgresqlExplain);
237
238        // FETCH, GRANT
239        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstFetchFrom);
240        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstpostgresqlGrant);
241
242        // IMPORT
243        addCmd(TBaseType.rrw_postgresql_import, "foreign", "schema", ESqlStatementType.sstPostgresqlImport);
244
245        // INSERT
246        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
247
248        // LISTEN, LOAD, LOCK
249        addCmd(TBaseType.rrw_postgresql_listen, ESqlStatementType.sstpostgresqlListen);
250        addCmd(TBaseType.rrw_load, ESqlStatementType.sstpostgresqlLoad);
251        addCmd(TBaseType.rrw_lock, ESqlStatementType.sstpostgresqlLock);
252
253        // MERGE, MOVE
254        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
255        addCmd(TBaseType.rrw_move, ESqlStatementType.sstpostgresqlMove);
256
257        // NOTIFY
258        addCmd(TBaseType.rrw_postgresql_notify, ESqlStatementType.sstpostgresqlNotify);
259
260        // PL/pgSQL block
261        addCmd(TBaseType.rrw_plpgsql_function_delimiter, ESqlStatementType.sstPostgresqlBlock);
262
263        // PREPARE
264        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstpostgresqlPrepare);
265        addCmd(TBaseType.rrw_prepare, "transaction", ESqlStatementType.sstpostgresqlPrepareTransaction);
266
267        // REASSIGN, REFRESH, REINDEX
268        addCmd(TBaseType.rrw_postgresql_reassign, "owned", ESqlStatementType.sstpostgresqlReassignOwned);
269        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
270        addCmd(TBaseType.rrw_postgresql_reindex, ESqlStatementType.sstReindex);
271
272        // RELEASE, RESET, REVOKE
273        addCmd(TBaseType.rrw_release, ESqlStatementType.sstpostgresqlReleaseSavepoint);
274        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstpostgresqlReleaseSavepoint);
275        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstpostgresqlReset);
276        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstpostgresqlRevoke);
277
278        // ROLLBACK
279        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstpostgresqlRollback);
280        addCmd(TBaseType.rrw_rollback, "prepared", ESqlStatementType.sstpostgresqlRollbackPrepared);
281        addCmd(TBaseType.rrw_rollback, "to", "savepoint", ESqlStatementType.sstpostgresqlRollbackToSavepoint);
282
283        // SAVEPOINT
284        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstpostgresqlSavepoint);
285
286        // SECURITY LABEL
287        addCmd(TBaseType.rrw_postgresql_security, "label", ESqlStatementType.sstpostgresqlSecurityLabel);
288
289        // SELECT
290        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
291
292        // SET commands
293        addCmd(TBaseType.rrw_set, ESqlStatementType.sstpostgresqlSet);
294        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstpostgresqlSetConstraints);
295        addCmd(TBaseType.rrw_set, "local", "role", ESqlStatementType.sstpostgresqlSetRole);
296        addCmd(TBaseType.rrw_set, "local", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
297        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstpostgresqlSetRole);
298        addCmd(TBaseType.rrw_set, "search_path", ESqlStatementType.sstpostgresqlSetSearchPath);
299        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
300        addCmd(TBaseType.rrw_set, "session", "characteristics", "as", "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
301        addCmd(TBaseType.rrw_set, "session", "role", ESqlStatementType.sstpostgresqlSetRole);
302        addCmd(TBaseType.rrw_set, "session", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
303        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
304
305        // SHOW
306        addCmd(TBaseType.rrw_show, ESqlStatementType.sstpostgresqlShow);
307        addCmd(TBaseType.rrw_show, "search_path", ESqlStatementType.sstpostgresqlShowSearchPath);
308
309        // START, TABLE, TRUNCATE
310        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction);
311        addCmd(TBaseType.rrw_table, ESqlStatementType.sstPostgresqlTable);
312        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
313
314        // UNLISTEN, UPDATE
315        addCmd(TBaseType.rrw_postgresql_unlisten, ESqlStatementType.sstpostgresqlUnlisten);
316        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
317
318        // VACUUM, VALUES
319        addCmd(TBaseType.rrw_postgresql_vacuum, ESqlStatementType.sstVacuum);
320        addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues);
321    }
322
323
324    @Override
325    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
326        TCustomSqlStatement ret = null;
327
328        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
329
330        // Skip comments, whitespace, and semicolons
331        if ((token.tokencode == TBaseType.cmtdoublehyphen)
332                || (token.tokencode == TBaseType.cmtslashstar)
333                || (token.tokencode == TBaseType.lexspace)
334                || (token.tokencode == TBaseType.lexnewline)
335                || (token.tokentype == ETokenType.ttsemicolon)) {
336            return null;
337        }
338
339        int lcpos = token.posinlist;
340        TSourceTokenList lcsourcetokenlist = token.container;
341        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
342
343        // Subquery after semicolon or at first line
344        if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) { // (
345            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
346            if (k > 0) {
347                ret = new TSelectSqlStatement(vendor);
348            }
349            return ret;
350        }
351
352        // CTE detection
353        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
354            ret = findcte(token);
355            if (ret != null) return ret;
356        }
357
358        gnewsqlstatementtype = getStatementTypeForToken(token);
359
360        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
361
362        switch (gnewsqlstatementtype) {
363            case sstinvalid: {
364                ret = null;
365
366                if (state == EFindSqlStateType.stnormal) {
367                    if (token.tokencode == TBaseType.label_begin) {
368                        ret = new TCommonBlock(vendor);
369                        gnewsqlstatementtype = ret.sqlstatementtype;
370                    } else if (token.tokencode == TBaseType.rrw_declare) {
371                        ret = new TCommonBlock(vendor);
372                        gnewsqlstatementtype = ret.sqlstatementtype;
373                    } else if (token.tokencode == TBaseType.rrw_begin) {
374                        ret = new TCommonBlock(vendor);
375                        gnewsqlstatementtype = ret.sqlstatementtype;
376                    } else if (token.tokencode == TBaseType.rrw_procedure) {
377                        ret = new TCreateProcedureStmt(vendor);
378                        gnewsqlstatementtype = ret.sqlstatementtype;
379                    } else if (token.tokencode == TBaseType.rrw_function) {
380                        ret = new TCreateFunctionStmt(vendor);
381                        gnewsqlstatementtype = ret.sqlstatementtype;
382                    }
383                }
384                break;
385            }
386
387            case sstselect: {
388                boolean lcisnewsql = true;
389
390                if (state != EFindSqlStateType.stnormal) {
391                    if (lcprevsolidtoken != null) {
392                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
393                            lcisnewsql = false; // subquery
394                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
395                            lcisnewsql = false;
396                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
397                            lcisnewsql = false;
398                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
399                            lcisnewsql = false;
400                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
401                            lcisnewsql = false;
402                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
403                            lcisnewsql = false;
404                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
405                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
406                                lcisnewsql = false;
407                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
408                                lcisnewsql = false;
409                        }
410
411                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
412                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
413                            if (lcpprevsolidtoken != null) {
414                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
415                                    lcisnewsql = false;
416                            }
417                        }
418                    }
419
420                    if (lccurrentsqlstatement != null) {
421                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
422                            lcisnewsql = false;
423                    }
424                }
425
426                if (lcisnewsql)
427                    ret = new TSelectSqlStatement(vendor);
428
429                break;
430            }
431
432            case sstinsert: {
433                boolean lcisnewsql = true;
434                if (state != EFindSqlStateType.stnormal) {
435                    if (lccurrentsqlstatement != null) {
436                        // Future vendor-specific logic
437                    }
438                }
439
440                if (lcisnewsql)
441                    ret = new TInsertSqlStatement(vendor);
442
443                break;
444            }
445
446            case sstupdate: {
447                boolean lcisnewsql = true;
448                if (state != EFindSqlStateType.stnormal) {
449                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
450                    if (lcprevsolidtoken != null) {
451                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
452                            lcisnewsql = false;
453                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
454                            lcisnewsql = false;
455                    }
456
457                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
458                    if (lcnextsolidtoken != null) {
459                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
460                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
461                            if (k == 0) lcisnewsql = false;
462                        }
463                    }
464
465                    if (lccurrentsqlstatement != null) {
466                        // Future vendor-specific logic
467                    }
468                }
469
470                if (lcisnewsql) {
471                    ret = new TUpdateSqlStatement(vendor);
472                    ret.dummytag = 1; // means set clause in update is not found yet
473                }
474                break;
475            }
476
477            case sstdelete: {
478                boolean lcisnewsql = true;
479
480                if (state != EFindSqlStateType.stnormal) {
481                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
482                    if (lcprevsolidtoken != null) {
483                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
484                            lcisnewsql = false;
485                    }
486
487                    if (lccurrentsqlstatement != null) {
488                        // Future vendor-specific logic
489                    }
490                }
491
492                if (lcisnewsql)
493                    ret = new TDeleteSqlStatement(vendor);
494
495                break;
496            }
497
498            case sstmerge:
499                ret = new TMergeSqlStatement(vendor);
500                ret.sqlstatementtype = gnewsqlstatementtype;
501                break;
502
503            case sstoraclecommit:
504            case sstoraclerollback:
505            case sstoraclesavepoint:
506            case sstoraclerevoke:
507            case sstoraclegrant:
508            case sstoracleanalyze:
509            case sstoracletruncate:
510                ret = new TUnknownSqlStatement(vendor);
511                ret.sqlstatementtype = gnewsqlstatementtype;
512                break;
513
514            case sstcreatetable:
515                ret = new TCreateTableSqlStatement(vendor);
516                break;
517
518            case sstoraclecreateview:
519                ret = new TCreateViewSqlStatement(vendor);
520                break;
521
522            case sstcreatematerializedview:
523                ret = new TCreateMaterializedSqlStatement(vendor);
524                break;
525
526            case sstoraclecreateindex:
527                ret = new TCreateIndexSqlStatement(vendor);
528                break;
529
530            case sstoraclecreatedatabase:
531                ret = new TCreateDatabaseSqlStatement(vendor);
532                break;
533
534            case sstoracledroptable:
535                ret = new TDropTableSqlStatement(vendor);
536                break;
537
538            case sstoracledropview:
539                ret = new TDropViewSqlStatement(vendor);
540                break;
541
542            case sstoracledropindex:
543                ret = new TDropIndexSqlStatement(vendor);
544                break;
545
546            case sstaltertable:
547                ret = new TAlterTableStatement(vendor);
548                break;
549
550            case sstoraclealtersession:
551                ret = new TAlterSessionStatement(vendor);
552                break;
553
554            case sstCommentOn:
555                ret = new TCommentOnSqlStmt(vendor);
556                break;
557
558            case sstoraclecreatesequence:
559                ret = new TCreateSequenceStmt(vendor);
560                break;
561
562            // PostgreSQL-specific statement types
563            case sstpostgresqlCreateIndex:
564                ret = new TCreateIndexSqlStatement(vendor);
565                break;
566
567            case sstpostgresqlCreateView:
568                ret = new TCreateViewSqlStatement(vendor);
569                break;
570
571            case sstpostgresqlCreateFunction:
572                ret = new TCreateFunctionStmt(vendor);
573                break;
574
575            case sstcreatetrigger:
576                ret = new TCreateTriggerStmt(vendor);
577                break;
578
579            case sstpostgresqlMove:
580                ret = new TMoveStmt(vendor);
581                break;
582
583            case sstpostgresqlTruncate:
584                ret = new TTruncateStatement(vendor);
585                break;
586
587            case sstpostgresqlExecute:
588                ret = new TExecuteSqlStatement(vendor);
589                break;
590
591            case sstpostgresqlDropTable:
592                ret = new TDropTableSqlStatement(vendor);
593                break;
594
595            case sstPostgresqlBlock:
596                ret = new TCommonBlock(vendor);
597                break;
598
599            case sstVacuum:
600                ret = new TVacuumStmt(vendor);
601                break;
602
603            case sstReindex:
604                ret = new TReindexStmt(vendor);
605                break;
606
607            case sstcreateprocedure:
608                ret = new TCreateProcedureStmt(vendor);
609                break;
610
611            case sstpostgresqlCommit:
612                ret = new TCommitStmt(vendor);
613                break;
614
615            case sstpostgresqlCreateSchema:
616                ret = new TCreateSchemaSqlStatement(vendor);
617                break;
618
619            case sstpostgresqlDropSchema:
620                ret = new TDropSchemaSqlStatement(vendor);
621                break;
622
623            case sstpostgresqlShowSearchPath:
624                ret = new TShowSearchPathStmt(vendor);
625                break;
626
627            case sstpostgresqlCopy:
628                ret = new TCopyStmt(vendor);
629                break;
630
631            case sstcall:
632                ret = new TCallStatement(vendor);
633                break;
634
635            case sstpostgresqlAlterSchema:
636                ret = new TAlterSchemaStmt(vendor);
637                break;
638
639            case sstpostgresqlAlterfunction:
640                ret = new TAlterFunctionStmt(vendor);
641                break;
642
643            case sstStartTransaction:
644                ret = new TStartTransactionStmt(vendor);
645                break;
646
647            case sstpostgresqlComment:
648                ret = new TCommentOnSqlStmt(vendor);
649                break;
650
651            case sstpostgresqlShow:
652                ret = new TShowStmt(vendor);
653                break;
654
655            case sstpostgresqlSetSearchPath:
656            case sstpostgresqlSet:
657                ret = new TSetStmt(vendor);
658                break;
659
660            case sstpostgresqlDropFunction:
661                ret = new TDropFunctionStmt(vendor);
662                break;
663
664            case sstpostgresqlDropTrigger:
665                ret = new TDropTriggerSqlStatement(vendor);
666                break;
667
668            case sstpostgresqlDropProcedure:
669                ret = new TDropProcedureStmt(vendor);
670                break;
671
672            case sstdropindex:
673                ret = new TDropIndexSqlStatement(vendor);
674                break;
675
676            case sstpostgresqlDropSequence:
677                ret = new TDropSequenceStmt(vendor);
678                break;
679
680            case sstpostgresqlDropView:
681                ret = new TDropViewSqlStatement(vendor);
682                break;
683
684            case sstpostgresqlCreateSequence:
685                ret = new TCreateSequenceStmt(vendor);
686                break;
687
688            case sstpostgresqlCreateType:
689                ret = new TCreateTypeStmt(vendor);
690                break;
691
692            case sstcreateExtension:
693                ret = new TCreateExtensionStmt(vendor);
694                break;
695
696            case sstPostgresqlTable:
697                ret = new TPostgresqlTableStmt(vendor);
698                break;
699
700            case sstpostgresqlDropMaterializedView:
701                ret = new TDropMaterializedViewStmt(vendor);
702                break;
703
704            case sstpostgresqlDo: {
705                boolean lcisnewsql = false;
706
707                if (state == EFindSqlStateType.stnormal) {
708                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
709                    if (lcnextsolidtoken != null) {
710                        if (lcnextsolidtoken.tokencode == TBaseType.rrw_postgresql_function_delimiter)
711                            lcisnewsql = true;
712                    }
713                }
714
715                if (lcisnewsql)
716                    ret = new TDoExecuteBlockStmt(vendor);
717
718                break;
719            }
720
721            case sstpostgresqlDeclare:
722                ret = new TCommonBlock(vendor);
723                gnewsqlstatementtype = ret.sqlstatementtype;
724                break;
725
726            case sstpostgresqlExplain:
727                ret = new TExplainPlan(vendor);
728                gnewsqlstatementtype = ret.sqlstatementtype;
729                break;
730
731            case sstpostgresqlCreateRole:
732                ret = new TCreateRoleStmt(vendor);
733                break;
734
735            case sstpostgresqlAlterRole:
736                ret = new TAlterRoleStmt(vendor);
737                break;
738
739            case sstpostgresqlAlterIndex:
740                ret = new TAlterIndexStmt(vendor);
741                break;
742
743            default:
744                ret = new TUnknownSqlStatement(vendor);
745                ret.sqlstatementtype = gnewsqlstatementtype;
746                break;
747        }
748
749        return ret;
750    }
751
752}