001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.oracle.*;
006import gudusoft.gsqlparser.stmt.postgresql.*;
007
008/**
009 * Greenplum SQL command resolver.
010 * Extracted from TSqlCmds monolith for modular architecture.
011 *
012 * @since 3.1.0.9
013 */
014public class TSqlCmdsGreenplum extends AbstractSqlCmds {
015
016    public TSqlCmdsGreenplum() {
017        super(EDbVendor.dbvgreenplum);
018    }
019
020    @Override
021    protected void initializeCommands() {
022        // Commands must be sorted alphabetically
023        // Extracted from TSqlCmds.initgreenplumcmds()
024
025        addCmd(TBaseType.rrw_abort, ESqlStatementType.sstpostgresqlabort);
026        addCmd(TBaseType.rrw_alter, "aggregate", ESqlStatementType.sstpostgresqlAlterAggregate);
027        addCmd(TBaseType.rrw_alter, "conversion", ESqlStatementType.sstpostgresqlAlterConversion);
028        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstpostgresqlalterdatabase);
029        addCmd(TBaseType.rrw_alter, "domain", ESqlStatementType.sstpostgresqlAlterDomain);
030
031        addCmd(TBaseType.rrw_alter, "external", "table", ESqlStatementType.sstgreenplumAlterExternalTable);
032        addCmd(TBaseType.rrw_alter, "filespace", ESqlStatementType.sstgreenplumAlterFilespace);
033
034        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstpostgresqlAlterfunction);
035        addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstpostgresqlAlterGroup);
036        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstpostgresqlAlterIndex);
037        addCmd(TBaseType.rrw_alter, "language", ESqlStatementType.sstpostgresqlAlterLanguage);
038        addCmd(TBaseType.rrw_alter, "operator", "class", ESqlStatementType.sstpostgresqlAlterOperatorClass);
039        addCmd(TBaseType.rrw_alter, "operator", ESqlStatementType.sstpostgresqlAlterOperator);
040        addCmd(TBaseType.rrw_alter, "protocol", ESqlStatementType.sstgreenplumAlterProtocol);
041        addCmd(TBaseType.rrw_alter, "resource", "queue", ESqlStatementType.sstgreenplumAlterResourceQueue);
042        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstpostgresqlAlterRole);
043        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstpostgresqlAlterSchema);
044        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstpostgresqlAlterSequence);
045        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
046        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstpostgresqlAlterTablespace);
047
048        addCmd(TBaseType.rrw_alter, "trigger", ESqlStatementType.sstpostgresqlAlterTrigger);
049
050        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstpostgresqlAlterType);
051        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstpostgresqlAlterUser);
052        addCmd(TBaseType.rrw_greenplum_analyse, ESqlStatementType.sstpostgresqlAnalyze);
053        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstpostgresqlAnalyze);
054
055        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstpostgresqlBegin);
056        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
057
058        addCmd(TBaseType.rrw_checkpoint, ESqlStatementType.sstpostgresqlCheckpoint);
059        addCmd(TBaseType.rrw_close, ESqlStatementType.sstpostgresqlClose);
060
061        addCmd(TBaseType.rrw_greenplum_cluster, ESqlStatementType.sstpostgresqlCluster);
062
063        addCmd(TBaseType.rrw_comment, "on", ESqlStatementType.sstpostgresqlComment);
064
065        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstpostgresqlCommit);
066        addCmd(TBaseType.rrw_greenplum_copy, ESqlStatementType.sstpostgresqlCopy);
067
068        addCmd(TBaseType.rrw_create, "aggregate", ESqlStatementType.sstpostgresqlCreateAggregate);
069        addCmd(TBaseType.rrw_create, "cast", ESqlStatementType.sstpostgresqlCreateCast);
070
071        addCmd(TBaseType.rrw_create, "constraint", "trigger", ESqlStatementType.sstcreatetrigger);
072
073        addCmd(TBaseType.rrw_create, "conversion", ESqlStatementType.sstpostgresqlConversion);
074        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstpostgresqlCreateDatabase);
075        addCmd(TBaseType.rrw_create, "domain", ESqlStatementType.sstpostgresqlCreateDomain);
076        addCmd(TBaseType.rrw_create, "extension", ESqlStatementType.sstcreateExtension);
077
078        addCmd(TBaseType.rrw_create, "external", "web", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
079        addCmd(TBaseType.rrw_create, "external", "web", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
080        addCmd(TBaseType.rrw_create, "external", "web", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
081        addCmd(TBaseType.rrw_create, "external", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
082        addCmd(TBaseType.rrw_create, "external", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
083        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
084        addCmd(TBaseType.rrw_create, "filespace", ESqlStatementType.sstgreenplumCreateFilespace);
085
086        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstpostgresqlCreateFunction);
087
088        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
089        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
090        addCmd(TBaseType.rrw_create, "global", "unlocked", "table", ESqlStatementType.sstcreatetable);
091
092        addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstpostgresqlCreateGroup);
093
094        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstpostgresqlCreateIndex);
095        addCmd(TBaseType.rrw_create, "language", ESqlStatementType.sstpostgresqlCreateLanguage);
096
097        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
098        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
099        addCmd(TBaseType.rrw_create, "local", "unlocked", "table", ESqlStatementType.sstcreatetable);
100
101        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstpostgresqlCreateMaterializedView);
102
103        addCmd(TBaseType.rrw_create, "operator", ESqlStatementType.sstpostgresqlCreateOperator);
104
105        addCmd(TBaseType.rrw_create, "or", "replace", "trusted", "language", ESqlStatementType.sstpostgresqlCreateFunction);
106        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
107        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
108        addCmd(TBaseType.rrw_create, "or", "replace", "role ", ESqlStatementType.sstpostgresqlCreateRole);
109        addCmd(TBaseType.rrw_create, "or", "replace", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
110        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstpostgresqlCreateFunction);
111        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstpostgresqlCreateView);
112
113        addCmd(TBaseType.rrw_create, "readable", "external", "web", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
114        addCmd(TBaseType.rrw_create, "readable", "external", "web", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
115        addCmd(TBaseType.rrw_create, "readable", "external", "web", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
116        addCmd(TBaseType.rrw_create, "readable", "external", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
117        addCmd(TBaseType.rrw_create, "readable", "external", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
118        addCmd(TBaseType.rrw_create, "readable", "external", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
119
120        addCmd(TBaseType.rrw_create, "resource", "queue", ESqlStatementType.sstgreenplumCreateResourceQueue);
121
122        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstpostgresqlCreateRole);
123        addCmd(TBaseType.rrw_create, "rule", ESqlStatementType.sstpostgresqlCreateRule);
124
125        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstpostgresqlCreateSchema);
126
127        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
128
129        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
130
131        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstpostgresqlCreateTablespace);
132
133        addCmd(TBaseType.rrw_create, "temporary", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
134        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
135        addCmd(TBaseType.rrw_create, "temporary", "view", ESqlStatementType.sstpostgresqlCreateView);
136        addCmd(TBaseType.rrw_create, "temp", "sequence", ESqlStatementType.sstpostgresqlCreateSequence);
137        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
138        addCmd(TBaseType.rrw_create, "temp", "view", ESqlStatementType.sstpostgresqlCreateView);
139
140        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
141
142        addCmd(TBaseType.rrw_create, "trusted", "language", ESqlStatementType.sstpostgresqlCreateLanguage);
143
144        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstpostgresqlCreateType);
145
146        addCmd(TBaseType.rrw_create, "unlocked", "table", ESqlStatementType.sstcreatetable);
147
148        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstpostgresqlCreateUser);
149
150        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstpostgresqlCreateView);
151
152        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstpostgresqlCreateIndex);
153
154        addCmd(TBaseType.rrw_create, "writable", "external", "web", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
155        addCmd(TBaseType.rrw_create, "writable", "external", "web", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
156        addCmd(TBaseType.rrw_create, "writable", "external", "web", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
157        addCmd(TBaseType.rrw_create, "writable", "external", "temporary", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
158        addCmd(TBaseType.rrw_create, "writable", "external", "temp", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
159        addCmd(TBaseType.rrw_create, "writable", "external", "table", ESqlStatementType.sstgreenplumCreateExternalTable);
160
161        addCmd(TBaseType.rrw_deallocate, ESqlStatementType.sstpostgresqlDeallocate);
162
163        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstpostgresqlDeclare);
164
165        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
166
167        addCmd(TBaseType.rrw_do, ESqlStatementType.sstpostgresqlDo);
168
169        addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstpostgresqlDropAggregate);
170
171        addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstpostgresqlDropCast);
172
173        addCmd(TBaseType.rrw_drop, "conversion", ESqlStatementType.sstpostgresqlDropConversion);
174
175        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstpostgresqlDropDatabase);
176
177        addCmd(TBaseType.rrw_drop, "domain", ESqlStatementType.sstpostgresqlDropDomain);
178
179        addCmd(TBaseType.rrw_drop, "external", "web", "table", ESqlStatementType.sstgreenplumDropExternalTable);
180        addCmd(TBaseType.rrw_drop, "external", "table", ESqlStatementType.sstgreenplumDropExternalTable);
181
182        addCmd(TBaseType.rrw_drop, "filespace", ESqlStatementType.sstgreenplumDropFilespace);
183
184        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstpostgresqlDropFunction);
185
186        addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstpostgresqlDropGroup);
187
188        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
189
190        addCmd(TBaseType.rrw_drop, "language", ESqlStatementType.sstpostgresqlDropLanguage);
191
192        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstpostgresqlDropMaterializedView);
193
194        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstpostgresqlDropOperator);
195
196        addCmd(TBaseType.rrw_drop, "owned", ESqlStatementType.sstpostgresqlDropOwned);
197
198        addCmd(TBaseType.rrw_drop, "procedural", "language", ESqlStatementType.sstpostgresqlDropLanguage);
199
200        addCmd(TBaseType.rrw_drop, "resource", "queue", ESqlStatementType.sstgreenplumDropResourceQueue);
201
202        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstpostgresqlDropRole);
203        addCmd(TBaseType.rrw_drop, "rule", ESqlStatementType.sstpostgresqlDropRule);
204        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstpostgresqlDropSchema);
205        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstpostgresqlDropSequence);
206        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstpostgresqlDropTable);
207        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstpostgresqlDropTablespace);
208
209        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstpostgresqlDropTrigger);
210        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstpostgresqlDropType);
211        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstpostgresqlDropUser);
212        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstpostgresqlDropView);
213
214        addCmd(TBaseType.rrw_end, ESqlStatementType.sstpostgresqlEnd);
215
216        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstpostgresqlExecute);
217
218        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstpostgresqlExplain);
219
220        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstFetchFrom);
221
222        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstpostgresqlGrant);
223
224        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
225
226        addCmd(TBaseType.rrw_load, ESqlStatementType.sstpostgresqlLoad);
227
228        addCmd(TBaseType.rrw_lock, ESqlStatementType.sstpostgresqlLock);
229
230        addCmd(TBaseType.rrw_move, ESqlStatementType.sstpostgresqlMove);
231
232        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstpostgresqlPrepare);
233
234        addCmd(TBaseType.rrw_greenplum_reassign, "owned", ESqlStatementType.sstpostgresqlReassignOwned);
235
236        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
237
238        addCmd(TBaseType.rrw_greenplum_reindex, ESqlStatementType.sstpostgresqlReindex);
239
240        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstpostgresqlReleaseSavepoint);
241        addCmd(TBaseType.rrw_release, ESqlStatementType.sstpostgresqlReleaseSavepoint);
242
243        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstpostgresqlReset);
244
245        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstpostgresqlRevoke);
246
247        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstpostgresqlRollback);
248
249        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstpostgresqlSavepoint);
250
251        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
252
253        addCmd(TBaseType.rrw_set, "session", "characteristics", "as", "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
254        addCmd(TBaseType.rrw_set, "session", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
255        addCmd(TBaseType.rrw_set, "session", "role", ESqlStatementType.sstpostgresqlSetRole);
256        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
257        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstpostgresqlSetTransaction);
258        addCmd(TBaseType.rrw_set, "local", "role", ESqlStatementType.sstpostgresqlSetRole);
259        addCmd(TBaseType.rrw_set, "local", "session", "authorization", ESqlStatementType.sstpostgresqlSetSessionAuthorization);
260        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstpostgresqlSetRole);
261        addCmd(TBaseType.rrw_set, ESqlStatementType.sstpostgresqlSet);
262
263        addCmd(TBaseType.rrw_show, ESqlStatementType.sstgreenplumShow);
264
265        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstgreenplumStartTransaction);
266
267        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
268
269        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
270
271        addCmd(TBaseType.rrw_greenplum_vacuum, ESqlStatementType.sstgreenplumVacuum);
272        addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues);
273    }
274
275    @Override
276    protected String getToken1Str(int token1) {
277        // Greenplum vendor-specific token mappings
278        switch (token1) {
279            case TBaseType.rrw_greenplum_cluster:
280                return "cluster";
281            case TBaseType.rrw_greenplum_copy:
282                return "copy";
283            case TBaseType.rrw_greenplum_reassign:
284                return "reassign";
285            case TBaseType.rrw_greenplum_reindex:
286                return "reindex";
287            case TBaseType.rrw_greenplum_vacuum:
288                return "vacuum";
289            case TBaseType.rrw_greenplum_analyse:
290                return "analyse";
291            default:
292                return null;
293        }
294    }
295
296    @Override
297    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
298        TCustomSqlStatement ret = null;
299
300        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
301
302        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
303                || (pcst.tokencode == TBaseType.cmtslashstar)
304                || (pcst.tokencode == TBaseType.lexspace)
305                || (pcst.tokencode == TBaseType.lexnewline)
306                || (pcst.tokentype == ETokenType.ttsemicolon)) {
307            return null;
308        }
309
310        int lcpos = pcst.posinlist;
311        TSourceTokenList lcsourcetokenlist = pcst.container;
312        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
313
314        //subquery after semicolon or at first line
315        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) { // (
316            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
317            if (k > 0) {
318                ret = new TSelectSqlStatement(this.vendor);
319            }
320
321            return ret;
322        }
323
324        //cte
325        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
326            ret = findcte(pcst);
327            if ((ret != null)) return ret;
328        }
329
330        gnewsqlstatementtype = getStatementTypeForToken(pcst);
331
332        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
333        switch (gnewsqlstatementtype) {    //
334            case sstinvalid: {
335                ret = null;
336
337                if (pstate == EFindSqlStateType.stnormal) {
338                    if (pcst.tokencode == TBaseType.label_begin) {
339                        ret = new TCommonBlock(this.vendor);
340                        gnewsqlstatementtype = ret.sqlstatementtype;
341                    } else if (pcst.tokencode == TBaseType.rrw_declare) {
342                        ret = new TCommonBlock(this.vendor);
343                        gnewsqlstatementtype = ret.sqlstatementtype;
344                    } else if (pcst.tokencode == TBaseType.rrw_begin) {
345                        ret = new TCommonBlock(this.vendor);
346                        gnewsqlstatementtype = ret.sqlstatementtype;
347                    } else if (pcst.tokencode == TBaseType.rrw_procedure) {
348                        ret = new TPlsqlCreateProcedure(this.vendor);
349                        gnewsqlstatementtype = ret.sqlstatementtype;
350                    } else if (pcst.tokencode == TBaseType.rrw_function) {
351                        ret = new TPlsqlCreateFunction(this.vendor);
352                        gnewsqlstatementtype = ret.sqlstatementtype;
353                    } else if (pcst.tokencode == TBaseType.rrw_package) {
354                        ret = new TPlsqlCreatePackage(this.vendor);
355                        gnewsqlstatementtype = ret.sqlstatementtype;
356                    }
357                }
358                break;
359            }
360            case sstselect: {
361                boolean lcisnewsql = true;
362
363                if (pstate != EFindSqlStateType.stnormal) {
364                    if ((lcprevsolidtoken != null)) {
365                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
366                            lcisnewsql = false; //subquery
367                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
368                            lcisnewsql = false;
369                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
370                            lcisnewsql = false;
371                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
372                            lcisnewsql = false;
373                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
374                            lcisnewsql = false;
375                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
376                            lcisnewsql = false;
377                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
378                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
379                                lcisnewsql = false;
380                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
381                                lcisnewsql = false;
382                        }
383
384                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
385                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
386                            if ((lcpprevsolidtoken != null)) {
387                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
388                                    lcisnewsql = false;
389                            }
390                        }
391
392                    }
393
394
395                    if ((lccurrentsqlstatement != null)) {
396                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
397                            lcisnewsql = false;
398                    }
399
400                }
401
402                if (lcisnewsql)
403                    ret = new TSelectSqlStatement(this.vendor);
404
405                break;
406            }
407            case sstinsert: {
408                boolean lcisnewsql = true;
409                if (pstate != EFindSqlStateType.stnormal) {
410                    if ((lccurrentsqlstatement != null)) {
411
412                    }
413                }
414
415                if (lcisnewsql)
416                    ret = new TInsertSqlStatement(this.vendor);
417
418                break;
419            }
420            case sstupdate: {
421                boolean lcisnewsql = true;
422                if (pstate != EFindSqlStateType.stnormal) {
423                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
424                    if ((lcprevsolidtoken != null)) { //
425                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
426                            lcisnewsql = false;
427                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
428                            lcisnewsql = false;
429                    }
430
431                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
432                    if ((lcnextsolidtoken != null)) {
433                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
434                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
435                            if (k == 0) lcisnewsql = false;
436                        }
437                    }
438
439
440                    if ((lccurrentsqlstatement != null)) {
441                    }
442                }
443
444                if (lcisnewsql) {
445                    ret = new TUpdateSqlStatement(this.vendor);
446                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
447                }
448                break;
449            }
450            case sstdelete: {
451                boolean lcisnewsql = true;
452
453                if (pstate != EFindSqlStateType.stnormal) {
454                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
455                    if ((lcprevsolidtoken != null)) {
456                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
457                            lcisnewsql = false;
458                    }
459
460                    if ((lccurrentsqlstatement != null)) {
461                    }
462                }
463
464                if (lcisnewsql)
465                    ret = new TDeleteSqlStatement(this.vendor);
466
467                break;
468            }
469            case sstmerge: {
470                ret = new TMergeSqlStatement(this.vendor);
471                ret.sqlstatementtype = gnewsqlstatementtype;
472                break;
473            }
474            case sstoraclecommit: {
475                ret = new TUnknownSqlStatement(this.vendor);
476                ret.sqlstatementtype = gnewsqlstatementtype;
477                break;
478            }
479            case sstoraclerollback: {
480                ret = new TUnknownSqlStatement(this.vendor);
481                ret.sqlstatementtype = gnewsqlstatementtype;
482                break;
483            }
484            case sstoraclesavepoint: {
485                ret = new TUnknownSqlStatement(this.vendor);
486                ret.sqlstatementtype = gnewsqlstatementtype;
487                break;
488            }
489            case sstoraclerevoke: {
490                ret = new TUnknownSqlStatement(this.vendor);
491                ret.sqlstatementtype = gnewsqlstatementtype;
492                break;
493            }
494            case sstoraclegrant: {
495                ret = new TUnknownSqlStatement(this.vendor);
496                ret.sqlstatementtype = gnewsqlstatementtype;
497                break;
498            }
499            case sstoracleanalyze: {
500                ret = new TUnknownSqlStatement(this.vendor);
501                ret.sqlstatementtype = gnewsqlstatementtype;
502                break;
503            }
504            case sstoracletruncate: {
505                ret = new TUnknownSqlStatement(this.vendor);
506                ret.sqlstatementtype = gnewsqlstatementtype;
507                break;
508            }
509            case sstcreatetable:
510            case sstgreenplumCreateExternalTable: {
511                ret = new TCreateTableSqlStatement(this.vendor);
512                break;
513            }
514            case sstoraclecreateview: {
515                ret = new TCreateViewSqlStatement(this.vendor);
516                break;
517            }
518            case sstcreatematerializedview: {
519                ret = new TCreateMaterializedSqlStatement(this.vendor);
520                break;
521            }
522            case sstoraclecreateindex: {
523                ret = new TCreateIndexSqlStatement(this.vendor);
524                break;
525            }
526            case sstoraclecreatedatabase: {
527                ret = new TCreateDatabaseSqlStatement(this.vendor);
528                break;
529            }
530            case sstoracledroptable: {
531                ret = new TDropTableSqlStatement(this.vendor);
532                break;
533            }
534            case sstoracledropview: {
535                ret = new TDropViewSqlStatement(this.vendor);
536                break;
537            }
538            case sstoracledropindex: {
539                ret = new TDropIndexSqlStatement(this.vendor);
540                break;
541            }
542            case sstaltertable: {
543                ret = new TAlterTableStatement(this.vendor);
544                break;
545            }
546            case sstoraclealtersession: {
547                ret = new TAlterSessionStatement(this.vendor);
548                break;
549            }
550            case sstplsql_createprocedure: {
551                ret = new TPlsqlCreateProcedure(this.vendor);
552                ret.sqlstatementtype = gnewsqlstatementtype;
553                break;
554            }
555            case sstplsql_createfunction: {
556                ret = new TPlsqlCreateFunction(this.vendor);
557                ret.sqlstatementtype = gnewsqlstatementtype;
558                break;
559            }
560            case sstplsql_createpackage: {
561                ret = new TPlsqlCreatePackage(this.vendor);
562                ret.sqlstatementtype = gnewsqlstatementtype;
563                break;
564            }
565            case sstplsql_createtrigger: {
566                ret = new TPlsqlCreateTrigger(this.vendor);
567                ret.sqlstatementtype = gnewsqlstatementtype;
568                break;
569            }
570            case sstplsql_execimmestmt: {
571                ret = new TExecImmeStmt(this.vendor);
572                break;
573            }
574            case sstoraclecreatepackagebody: {
575                ret = new TPlsqlCreatePackage(this.vendor);
576                ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
577                break;
578            }
579            case sstplsql_createtype_placeholder: {
580                ret = new TPlsqlCreateType_Placeholder(this.vendor);
581                ret.sqlstatementtype = gnewsqlstatementtype;
582                break;
583            }
584            case sstplsql_createtypebody: {
585                ret = new TPlsqlCreateTypeBody(this.vendor);
586                ret.sqlstatementtype = gnewsqlstatementtype;
587                break;
588            }
589            case sstCommentOn: {
590                ret = new TCommentOnSqlStmt(this.vendor);
591                break;
592            }
593            case sstoraclecreatesequence: {
594                ret = new TCreateSequenceStmt(this.vendor);
595                break;
596            }
597            case sstoraclecreatesynonym: {
598                ret = new TCreateSynonymStmt(this.vendor);
599                break;
600            }
601            case sstoraclecreatedirectory: {
602                ret = new TOracleCreateDirectoryStmt(this.vendor);
603                break;
604            }
605            case sstpostgresqlCreateIndex:
606                ret = new TCreateIndexSqlStatement(this.vendor);
607                break;
608            case sstpostgresqlCreateView:
609                ret = new TCreateViewSqlStatement(this.vendor);
610                break;
611            case sstpostgresqlCreateFunction:
612                ret = new TCreateFunctionStmt(this.vendor);
613                break;
614            case sstcreatetrigger:
615                ret = new TCreateTriggerStmt(this.vendor);
616                break;
617            case sstpostgresqlMove:
618                ret = new TMoveStmt(EDbVendor.dbvgreenplum);
619                break;
620            case sstpostgresqlTruncate:
621                ret = new TTruncateStatement(EDbVendor.dbvgreenplum);
622                break;
623            case sstpostgresqlExecute:
624                ret = new TExecuteSqlStatement(EDbVendor.dbvgreenplum);
625                break;
626            case sstValues:
627                ret = new TSelectSqlStatement(EDbVendor.dbvgreenplum);
628                break;
629            case sstpostgresqlDeclare: {
630                boolean lcisnewsql = true;
631
632                TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 2, false);
633                if ((lcnextsolidtoken != null)) {
634                    if (lcnextsolidtoken.tokencode == TBaseType.rrw_greenplum_CURSOR) {
635                        lcisnewsql = false;
636                    }
637                }
638
639
640                if (lcisnewsql)
641                    ret = new TCommonBlock(this.vendor);
642                else {
643                    ret = new TUnknownSqlStatement(this.vendor);
644                }
645                ret.sqlstatementtype = gnewsqlstatementtype;
646
647                break;
648            }
649            case sstpostgresqlSet:
650                ret = new TSetStmt(this.vendor);
651                break;
652            case sstcreateExtension:
653                ret = new TCreateExtensionStmt(this.vendor);
654                break;
655            case sstcall:
656                ret = new TCallStatement(this.vendor);
657                break;
658            case sstpostgresqlCreateSchema:
659                ret = new TCreateSchemaSqlStatement(this.vendor);
660                break;
661            case sstpostgresqlDo: {
662                boolean lcisnewsql = false;
663
664                if (pstate == EFindSqlStateType.stnormal) {
665                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
666                    if ((lcnextsolidtoken != null)) {
667                        if (lcnextsolidtoken.tokencode == TBaseType.rrw_greenplum_function_delimiter)
668                            lcisnewsql = true;
669                    }
670                }
671
672                if (lcisnewsql)
673                    ret = new TDoExecuteBlockStmt(this.vendor);
674
675                break;
676            }
677            case sstpostgresqlComment:
678                ret = new TCommentOnSqlStmt(this.vendor);
679                break;
680            default: {
681                ret = new TUnknownSqlStatement(this.vendor);
682                ret.sqlstatementtype = gnewsqlstatementtype;
683                break;
684            }
685        }    // case
686
687        return ret;
688    }
689}