001package gudusoft.gsqlparser.sqlcmds; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.*; 005import gudusoft.gsqlparser.stmt.informix.*; 006import gudusoft.gsqlparser.stmt.mssql.TMssqlRollback; 007import gudusoft.gsqlparser.stmt.oracle.*; 008 009/** 010 * Informix SQL command resolver. 011 * Contains all Informix-specific SQL command recognition logic. 012 * 013 * @since 3.1.0.9 014 */ 015public class TSqlCmdsInformix extends AbstractSqlCmds { 016 017 // Temporary field for statement type during issql processing 018 private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid; 019 020 public TSqlCmdsInformix() { 021 super(EDbVendor.dbvinformix); 022 } 023 024 @Override 025 protected String getToken1Str(int token1) { 026 // Informix vendor-specific reserved words (tokens > TBaseType.rrw_abort) 027 switch (token1) { 028 case TBaseType.rrw_informix_unload: 029 return "unload"; 030 case TBaseType.rrw_informix_whenever: 031 return "whenever"; 032 case TBaseType.rrw_informix_put: 033 return "put"; 034 case TBaseType.rrw_informix_output: 035 return "output"; 036 case TBaseType.rrw_informix_info: 037 return "info"; 038 case TBaseType.rrw_informix_connect_to: 039 return "connect"; 040 default: 041 return null; 042 } 043 } 044 045 @Override 046 protected void initializeCommands() { 047 // Informix commands must be sorted alphabetically by token1 048 // cmd must be sort alphabetically 049 addCmd(TBaseType.rrw_allocate, "collection", ESqlStatementType.sstinformixAllocateCollection); 050 addCmd(TBaseType.rrw_allocate, "descriptor", ESqlStatementType.sstinformixAllocateDescriptor); 051 addCmd(TBaseType.rrw_alter, "access_method", ESqlStatementType.sstinformixAlterAccess_Method); 052 addCmd(TBaseType.rrw_alter, "fragment", ESqlStatementType.sstinformixAlterFragment); 053 addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstinformixAlterFunction); 054 addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstinformixAlterIndex); 055 addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstinformixAlterProcedure); 056 addCmd(TBaseType.rrw_alter, "routine", ESqlStatementType.sstinformixAlterRoutine); 057 addCmd(TBaseType.rrw_alter, "security", "label", "component", ESqlStatementType.sstinformixAlterSecurityLabelComponent); 058 addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstinformixAlterSequence); 059 addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstinformixAlterTable); 060 addCmd(TBaseType.rrw_alter, "trusted", "context", ESqlStatementType.sstinformixAlterTrustedContext); 061 addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstinformixAlterUser); 062 addCmd(TBaseType.rrw_begin, ESqlStatementType.sstinformixBegin); 063 addCmd(TBaseType.rrw_close, "database", ESqlStatementType.sstinformixCloseDatabase); 064 addCmd(TBaseType.rrw_close, ESqlStatementType.sstinformixClose); 065 addCmd(TBaseType.rrw_commit, ESqlStatementType.sstinformixCommit); 066 addCmd(TBaseType.rrw_informix_connect_to, ESqlStatementType.sstinformixConnect); 067 addCmd(TBaseType.rrw_create, "access_method", ESqlStatementType.sstinformixCreateAccess_Method); 068 addCmd(TBaseType.rrw_create, "aggregate", ESqlStatementType.sstinformixCreateAggregate); 069 addCmd(TBaseType.rrw_create, "cast", ESqlStatementType.sstinformixCreateCast); 070 addCmd(TBaseType.rrw_create, "explicit", "cast", ESqlStatementType.sstinformixCreateCast); 071 addCmd(TBaseType.rrw_create, "implicit", "cast", ESqlStatementType.sstinformixCreateCast); 072 addCmd(TBaseType.rrw_create, "cluster", "index", ESqlStatementType.sstinformixCreateIndex); 073 addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstinformixCreateDatabase); 074 addCmd(TBaseType.rrw_create, "dba", "function", ESqlStatementType.sstinformixCreateFunction); 075 addCmd(TBaseType.rrw_create, "dba", "procedure", ESqlStatementType.sstinformixCreateProcedure); 076 addCmd(TBaseType.rrw_create, "default", "user", ESqlStatementType.sstinformixCreateDefaultUser); 077 addCmd(TBaseType.rrw_create, "distinct", "cluster", "index", ESqlStatementType.sstinformixCreateIndex); 078 addCmd(TBaseType.rrw_create, "distinct", "index", ESqlStatementType.sstinformixCreateIndex); 079 addCmd(TBaseType.rrw_create, "distinct", "type", ESqlStatementType.sstinformixCreateDistinctType); 080 addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstinformixCreateExternalTable); 081 addCmd(TBaseType.rrw_create, "function", "from", ESqlStatementType.sstinformixCreateFunctionFrom); 082 addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstinformixCreateFunction); 083 addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstinformixCreateIndex); 084 addCmd(TBaseType.rrw_create, "opaque", "type", ESqlStatementType.sstinformixCreateOpaqueType); 085 addCmd(TBaseType.rrw_create, "opclass", ESqlStatementType.sstinformixCreateOpclass); 086 addCmd(TBaseType.rrw_create, "private", "synonym", ESqlStatementType.sstinformixCreateSynonym); 087 addCmd(TBaseType.rrw_create, "procedure", "from", ESqlStatementType.sstinformixCreateProcedureFrom); 088 addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstinformixCreateProcedure); 089 addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstinformixCreateSynonym); 090 addCmd(TBaseType.rrw_create, "raw", "table", ESqlStatementType.sstcreatetable); 091 addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstinformixCreateRole); 092 addCmd(TBaseType.rrw_create, "routine", "from", ESqlStatementType.sstinformixCreateRoutineFrom); 093 addCmd(TBaseType.rrw_create, "row", "type", ESqlStatementType.sstinformixCreateRowType); 094 addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstinformixCreateSchema); 095 addCmd(TBaseType.rrw_create, "security", "label", "component", ESqlStatementType.sstinformixCreateSecurityLabelComponent); 096 addCmd(TBaseType.rrw_create, "security", "label", ESqlStatementType.sstinformixCreateSecurityLabel); 097 addCmd(TBaseType.rrw_create, "security", "policy", ESqlStatementType.sstinformixCreateSecurityPolicy); 098 addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstinformixCreateSequence); 099 addCmd(TBaseType.rrw_create, "standard", "table", ESqlStatementType.sstcreatetable); 100 addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstinformixCreateSynonym); 101 addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable); 102 addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstinformixCreateTempTable); 103 addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger); 104 addCmd(TBaseType.rrw_create, "trusted", "context", ESqlStatementType.sstinformixCreateTrustedContext); 105 addCmd(TBaseType.rrw_create, "unique", "cluster", "index", ESqlStatementType.sstinformixCreateIndex); 106 addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstinformixCreateIndex); 107 addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstinformixCreateUser); 108 addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstinformixCreateView); 109 addCmd(TBaseType.rrw_create, "xadatasource", "type", ESqlStatementType.sstinformixCreateXaDatasourceType); 110 addCmd(TBaseType.rrw_create, "xadatasource", ESqlStatementType.sstinformixCreateXaDatasource); 111 //addCmd(TBaseType.rrw_database, ESqlStatementType.sstinformixDatabase); 112 addCmd(TBaseType.rrw_deallocate, "collection", ESqlStatementType.sstinformixDeallocateCollection); 113 addCmd(TBaseType.rrw_deallocate, "descriptor", ESqlStatementType.sstinformixDeallocateDescriptor); 114 addCmd(TBaseType.rrw_deallocate, "row", ESqlStatementType.sstinformixDeallocateRow); 115 addCmd(TBaseType.rrw_declare, ESqlStatementType.sstinformixDeclare); 116 addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete); 117 addCmd(TBaseType.rrw_describe, "input", ESqlStatementType.sstinformixDescribeInput); 118 addCmd(TBaseType.rrw_describe, ESqlStatementType.sstinformixDescribe); 119 addCmd(TBaseType.rrw_disconnect, ESqlStatementType.sstinformixDisconnect); 120 addCmd(TBaseType.rrw_drop, "access_method", ESqlStatementType.sstinformixDropAccess_Method); 121 addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstinformixDropAggregate); 122 addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstinformixDropCast); 123 addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase); 124 addCmd(TBaseType.rrw_drop, "specific", "function", ESqlStatementType.sstinformixDropFunction); 125 addCmd(TBaseType.rrw_drop, "specific", "procedure", ESqlStatementType.sstinformixDropProcedure); 126 addCmd(TBaseType.rrw_drop, "specific", "routine", ESqlStatementType.sstinformixDropRoutine); 127 addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstinformixDropFunction); 128 addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstinformixDropIndex); 129 addCmd(TBaseType.rrw_drop, "opclass", ESqlStatementType.sstinformixDropOpclass); 130 addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstinformixDropProcedure); 131 addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstinformixDropRole); 132 addCmd(TBaseType.rrw_drop, "routine", ESqlStatementType.sstinformixDropRoutine); 133 addCmd(TBaseType.rrw_drop, "row", "type", ESqlStatementType.sstinformixDropRowType); 134 addCmd(TBaseType.rrw_drop, "security", ESqlStatementType.sstinformixDropSecurity); 135 addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstinformixDropSequence); 136 addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstinformixDropSynonym); 137 addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstinformixDropTable); 138 addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstinformixDropTrigger); 139 addCmd(TBaseType.rrw_drop, "trusted", "context", ESqlStatementType.sstinformixDropTrustedContext); 140 addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstinformixDropType); 141 addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstinformixDropUser); 142 addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstinformixDropView); 143 addCmd(TBaseType.rrw_drop, "xadatasource", "type", ESqlStatementType.sstinformixDropXaDatasourceType); 144 addCmd(TBaseType.rrw_drop, "xadatasource", ESqlStatementType.sstinformixDropXaDatasource); 145 addCmd(TBaseType.rrw_exec, ESqlStatementType.sstinformixExecute); 146 addCmd(TBaseType.rrw_execute, "function", ESqlStatementType.sstinformixExecuteFunction); 147 addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstinformixExecuteImmediate); 148 addCmd(TBaseType.rrw_execute, "procedure", ESqlStatementType.sstinformixExecuteProcedure); 149 addCmd(TBaseType.rrw_execute, ESqlStatementType.sstinformixExecute); 150 addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstinformixFetch); 151 addCmd(TBaseType.rrw_flush, ESqlStatementType.sstinformixFlush); 152 addCmd(TBaseType.rrw_free, ESqlStatementType.sstinformixFree); 153 addCmd(TBaseType.rrw_get, "descriptor", ESqlStatementType.sstinformixGetDescriptor); 154 addCmd(TBaseType.rrw_get, "diagnostics", ESqlStatementType.sstinformixGetDiagnostics); 155 addCmd(TBaseType.rrw_grant, "fragment", ESqlStatementType.sstinformixGrantFragment); 156 addCmd(TBaseType.rrw_grant, ESqlStatementType.sstinformixGrant); 157 addCmd(TBaseType.rrw_informix_info, ESqlStatementType.sstinformixInfo); 158 addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert); 159 addCmd(TBaseType.rrw_load, ESqlStatementType.sstinformixLoad); 160 addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstinformixLockTable); 161 addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge); 162 addCmd(TBaseType.rrw_open, ESqlStatementType.sstinformixOpen); 163 addCmd(TBaseType.rrw_informix_output, ESqlStatementType.sstinformixOutput); 164 addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstinformixPrepare); 165 addCmd(TBaseType.rrw_informix_put, ESqlStatementType.sstinformixPut); 166 addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstinformixReleaseSavepoint); 167 addCmd(TBaseType.rrw_rename, "column", ESqlStatementType.sstinformixRenameColumn); 168 addCmd(TBaseType.rrw_rename, "database", ESqlStatementType.sstinformixRenameDatabase); 169 addCmd(TBaseType.rrw_rename, "index", ESqlStatementType.sstinformixRenameIndex); 170 addCmd(TBaseType.rrw_rename, "security", ESqlStatementType.sstinformixRenameSecurity); 171 addCmd(TBaseType.rrw_rename, "sequence", ESqlStatementType.sstinformixRenameSequence); 172 addCmd(TBaseType.rrw_rename, "table", ESqlStatementType.sstinformixRenameTable); 173 addCmd(TBaseType.rrw_rename, "trusted", "context", ESqlStatementType.sstinformixRenameTrustedContext); 174 addCmd(TBaseType.rrw_rename, "user", ESqlStatementType.sstinformixRenameUser); 175 addCmd(TBaseType.rrw_revoke, "fragment", ESqlStatementType.sstinformixRevokeFragment); 176 addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstinformixRevoke); 177 addCmd(TBaseType.rrw_rollback, "work", ESqlStatementType.sstinformixRollbackWork); 178 addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstinformixRollbackWork); 179 addCmd(TBaseType.rrw_save, "external", "directives", ESqlStatementType.sstinformixSaveExternalDirectives); 180 addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstinformixSavepoint); 181 addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect); 182 addCmd(TBaseType.rrw_set, "autofree", ESqlStatementType.sstinformixSetAutofree); 183 addCmd(TBaseType.rrw_set, "collation", ESqlStatementType.sstinformixSetCollation); 184 addCmd(TBaseType.rrw_set, "connection", ESqlStatementType.sstinformixSetConnection); 185 addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstinformixSetConstraints); 186 addCmd(TBaseType.rrw_set, "database", "object", ESqlStatementType.sstinformixSetDatabaseObject); 187 addCmd(TBaseType.rrw_set, "dataskip", ESqlStatementType.sstinformixSetDataskip); 188 addCmd(TBaseType.rrw_set, "debug", "file", ESqlStatementType.sstinformixSetDebugFile); 189 addCmd(TBaseType.rrw_set, "defferred_prepare", ESqlStatementType.sstinformixSetDeferred_Prepare); 190 // the registration above misspells the option; the real Informix 191 // keyword is DEFERRED_PREPARE 192 addCmd(TBaseType.rrw_set, "deferred_prepare", ESqlStatementType.sstinformixSetDeferred_Prepare); 193 addCmd(TBaseType.rrw_set, "descriptor", ESqlStatementType.sstinformixSetDescriptor); 194 addCmd(TBaseType.rrw_set, "encryption", "password", ESqlStatementType.sstinformixSetEncryptionPassword); 195 addCmd(TBaseType.rrw_set, "environment", ESqlStatementType.sstinformixSetEnvironment); 196 addCmd(TBaseType.rrw_set, "explain", ESqlStatementType.sstinformixSetExplain); 197 addCmd(TBaseType.rrw_set, "indexes", ESqlStatementType.sstinformixSetIndexes); 198 addCmd(TBaseType.rrw_set, "isolation", ESqlStatementType.sstinformixSetIsolation); 199 addCmd(TBaseType.rrw_set, "lock", "mode", ESqlStatementType.sstinformixSetLockMode); 200 addCmd(TBaseType.rrw_set, "log", ESqlStatementType.sstinformixSetLog); 201 addCmd(TBaseType.rrw_set, "optimization", ESqlStatementType.sstinformixSetOptimization); 202 addCmd(TBaseType.rrw_set, "pdqpriority", ESqlStatementType.sstinformixSetPDQPriority); 203 addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstinformixSetRole); 204 addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstinformixSetSessionAuthorization); 205 addCmd(TBaseType.rrw_set, "statement", "cache", ESqlStatementType.sstinformixSetStatementCache); 206 addCmd(TBaseType.rrw_set, "transaction", "mode", ESqlStatementType.sstinformixSetTransactionMode); 207 addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstinformixSetTransaction); 208 addCmd(TBaseType.rrw_set, "triggers", ESqlStatementType.sstinformixSetTriggers); 209 addCmd(TBaseType.rrw_set, "user", "password", ESqlStatementType.sstinformixSetUserPassword); 210 addCmd(TBaseType.rrw_start, "violations", "table", ESqlStatementType.sstinformixStartViolationsTable); 211 addCmd(TBaseType.rrw_stop, "violations", "table", ESqlStatementType.sstinformixStopViolationsTable); 212 addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate); 213 addCmd(TBaseType.rrw_informix_unload, ESqlStatementType.sstinformixUnload); 214 addCmd(TBaseType.rrw_unlock, "table", ESqlStatementType.sstinformixUnlockTable); 215 addCmd(TBaseType.rrw_update, "statistics", ESqlStatementType.sstinformixUpdateStatistics); 216 addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate); 217 addCmd(TBaseType.rrw_informix_whenever, ESqlStatementType.sstinformixWhenever); 218 } 219 220 @Override 221 public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) { 222 TCustomSqlStatement ret = null; 223 224 gnewsqlstatementtype = ESqlStatementType.sstinvalid; 225 226 if ((pcst.tokencode == TBaseType.cmtdoublehyphen) 227 || (pcst.tokencode == TBaseType.cmtslashstar) 228 || (pcst.tokencode == TBaseType.lexspace) 229 || (pcst.tokencode == TBaseType.lexnewline) 230 || (pcst.tokentype == ETokenType.ttsemicolon)) { 231 return null; 232 } 233 234 int lcpos = pcst.posinlist; 235 TSourceTokenList lcsourcetokenlist = pcst.container; 236 TCustomSqlStatement lccurrentsqlstatement = psqlstatement; 237 238 //subquery after semicolon or at first line 239 if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) { // ( 240 int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "("); 241 if (k > 0) { 242 ret = new TSelectSqlStatement(this.vendor); 243 } 244 245 return ret; 246 } 247 248 //cte 249 if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) { 250 ret = findcte(pcst); 251 if ((ret != null)) return ret; 252 } 253 254 // REVOKE and LOCK lead words carry no matching raw token constant on 255 // the Informix lexer path, so match them by text (statement start only). 256 if ((pstate == EFindSqlStateType.stnormal) && pcst.issolidtoken()) { 257 String lcLeadWord = pcst.toString(); 258 // non-identifier-compare: raw keyword text, not a DB object name 259 if (lcLeadWord.equalsIgnoreCase("REVOKE")) { 260 TSourceToken lcNext = pcst.nextSolidToken(); 261 TCustomSqlStatement lcRet = new TUnknownSqlStatement(this.vendor); 262 if ((lcNext != null) && lcNext.toString().equalsIgnoreCase("FRAGMENT")) { // non-identifier-compare: keyword text 263 lcRet.sqlstatementtype = ESqlStatementType.sstinformixRevokeFragment; 264 } else { 265 lcRet.sqlstatementtype = ESqlStatementType.sstinformixRevoke; 266 } 267 return lcRet; 268 } else if (lcLeadWord.equalsIgnoreCase("LOCK")) { // non-identifier-compare: keyword text 269 TSourceToken lcNext = pcst.nextSolidToken(); 270 if ((lcNext != null) && lcNext.toString().equalsIgnoreCase("TABLE")) { // non-identifier-compare: keyword text 271 TCustomSqlStatement lcRet = new TUnknownSqlStatement(this.vendor); 272 lcRet.sqlstatementtype = ESqlStatementType.sstinformixLockTable; 273 return lcRet; 274 } 275 } 276 } 277 278 gnewsqlstatementtype = getStatementTypeForToken(pcst); 279 280 TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 281 switch (gnewsqlstatementtype) { // 282 case sstinvalid: { 283 ret = null; 284 285 if (pstate == EFindSqlStateType.stnormal) { 286 if (pcst.tokencode == TBaseType.label_begin) { 287 ret = new TCommonBlock(this.vendor); 288 gnewsqlstatementtype = ret.sqlstatementtype; 289 } else if (pcst.tokencode == TBaseType.rrw_declare) { 290 ret = new TCommonBlock(this.vendor); 291 gnewsqlstatementtype = ret.sqlstatementtype; 292 } else if (pcst.tokencode == TBaseType.rrw_begin) { 293 ret = new TCommonBlock(this.vendor); 294 gnewsqlstatementtype = ret.sqlstatementtype; 295 } else if (pcst.tokencode == TBaseType.rrw_procedure) { 296 ret = new TPlsqlCreateProcedure(this.vendor); 297 gnewsqlstatementtype = ret.sqlstatementtype; 298 } else if (pcst.tokencode == TBaseType.rrw_function) { 299 ret = new TPlsqlCreateFunction(this.vendor); 300 gnewsqlstatementtype = ret.sqlstatementtype; 301 } else if (pcst.tokencode == TBaseType.rrw_package) { 302 ret = new TPlsqlCreatePackage(this.vendor); 303 gnewsqlstatementtype = ret.sqlstatementtype; 304 } 305 } 306 break; 307 } 308 case sstselect: { 309 boolean lcisnewsql = true; 310 311 if (pstate != EFindSqlStateType.stnormal) { 312 if ((lcprevsolidtoken != null)) { 313 if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis) 314 lcisnewsql = false; //subqery 315 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union) 316 lcisnewsql = false; 317 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect) 318 lcisnewsql = false; 319 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus) 320 lcisnewsql = false; 321 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except) 322 lcisnewsql = false; 323 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return) 324 lcisnewsql = false; 325 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) { 326 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable) 327 lcisnewsql = false; 328 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview) 329 lcisnewsql = false; 330 } 331 332 if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) { 333 TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist); 334 if ((lcpprevsolidtoken != null)) { 335 if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union) 336 lcisnewsql = false; 337 } 338 } 339 340 } 341 342 343 if ((lccurrentsqlstatement != null)) { 344 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert) 345 lcisnewsql = false; 346 } 347 348 } 349 350 if (lcisnewsql) 351 ret = new TSelectSqlStatement(this.vendor); 352 353 break; 354 } 355 case sstinsert: { 356 boolean lcisnewsql = true; 357 if (pstate != EFindSqlStateType.stnormal) { 358 if ((lccurrentsqlstatement != null)) { 359 // merge 360 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) { 361 if (lcprevsolidtoken != null) { 362 if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) { 363 lcisnewsql = false; 364 } 365 } 366 } 367 368 } 369 } 370 371 if (lcisnewsql) 372 ret = new TInsertSqlStatement(this.vendor); 373 374 break; 375 } 376 case sstupdate: { 377 boolean lcisnewsql = true; 378 if (pstate != EFindSqlStateType.stnormal) { 379 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 380 if ((lcprevsolidtoken != null)) { // 381 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 382 lcisnewsql = false; 383 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for) 384 lcisnewsql = false; 385 } 386 387 TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false); 388 if ((lcnextsolidtoken != null)) { 389 if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) { 390 int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "("); 391 if (k == 0) lcisnewsql = false; 392 } 393 } 394 395 396 if ((lccurrentsqlstatement != null)) { 397 // merge 398 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) { 399 if (lcprevsolidtoken != null) { 400 if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) { 401 lcisnewsql = false; 402 } 403 } 404 } 405 } 406 } 407 408 if (lcisnewsql) { 409 ret = new TUpdateSqlStatement(this.vendor); 410 ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement 411 } 412 break; 413 } 414 case sstdelete: { 415 boolean lcisnewsql = true; 416 417 if (pstate != EFindSqlStateType.stnormal) { 418 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 419 if ((lcprevsolidtoken != null)) { 420 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 421 lcisnewsql = false; 422 } 423 424 if ((lccurrentsqlstatement != null)) { 425 // merge 426 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) { 427 if (lcprevsolidtoken != null) { 428 if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) { 429 lcisnewsql = false; 430 } 431 } 432 } 433 } 434 } 435 436 if (lcisnewsql) 437 ret = new TDeleteSqlStatement(this.vendor); 438 439 break; 440 } 441 case sstmerge: { 442 ret = new TMergeSqlStatement(this.vendor); 443 ret.sqlstatementtype = gnewsqlstatementtype; 444 break; 445 } 446 case sstinformixCommit: { 447 ret = new TUnknownSqlStatement(this.vendor); 448 ret.sqlstatementtype = gnewsqlstatementtype; 449 break; 450 } 451 case sstinformixSavepoint: { 452 ret = new TUnknownSqlStatement(this.vendor); 453 ret.sqlstatementtype = gnewsqlstatementtype; 454 break; 455 } 456 case sstinformixRevoke: { 457 ret = new TUnknownSqlStatement(this.vendor); 458 ret.sqlstatementtype = gnewsqlstatementtype; 459 break; 460 } 461 case sstinformixGrant: { 462 ret = new TUnknownSqlStatement(this.vendor); 463 ret.sqlstatementtype = gnewsqlstatementtype; 464 break; 465 } 466 case sstTruncate: { 467 ret = new TTruncateStatement(this.vendor); 468 ret.sqlstatementtype = gnewsqlstatementtype; 469 break; 470 } 471 case sstcreatetable: 472 case sstinformixCreateTempTable: { 473 ret = new TCreateTableSqlStatement(this.vendor); 474 break; 475 } 476 case sstinformixCreateView: { 477 ret = new TCreateViewSqlStatement(this.vendor); 478 break; 479 } 480 case sstinformixCreateIndex: { 481 ret = new TCreateIndexSqlStatement(this.vendor); 482 break; 483 } 484 case sstinformixCreateDatabase: { 485 ret = new TCreateDatabaseSqlStatement(this.vendor); 486 break; 487 } 488 case sstinformixDropTable: { 489 ret = new TDropTableSqlStatement(this.vendor); 490 break; 491 } 492 case sstinformixDropView: { 493 ret = new TDropViewSqlStatement(this.vendor); 494 break; 495 } 496 case sstinformixDropIndex: { 497 ret = new TDropIndexSqlStatement(this.vendor); 498 break; 499 } 500 case sstinformixDropRowType: { 501 ret = new TInformixDropRowTypeStmt(this.vendor); 502 break; 503 } 504 case sstinformixDropSequence: { 505 ret = new TDropSequenceStmt(this.vendor); 506 break; 507 } 508 case sstinformixDropSynonym: { 509 ret = new TDropSynonymStmt(this.vendor); 510 break; 511 } 512 case sstinformixAlterTable: { 513 ret = new TAlterTableStatement(this.vendor); 514 break; 515 } 516 case sstinformixCreateProcedure: { 517 ret = new TInformixCreateProcedure(this.vendor); 518 ret.sqlstatementtype = gnewsqlstatementtype; 519 break; 520 } 521 case sstinformixCreateFunction: { 522 ret = new TInformixCreateFunction(this.vendor); 523 ret.sqlstatementtype = gnewsqlstatementtype; 524 break; 525 } 526 case sstcreatetrigger: { 527 ret = new TCreateTriggerStmt(this.vendor); 528 break; 529 } 530 case sstinformixExecuteImmediate: { 531 ret = new TInformixExecuteImmediate(this.vendor); 532 break; 533 } 534 case sstinformixCreateSequence: 535 case sstinformixAlterSequence: { 536 ret = new TCreateSequenceStmt(this.vendor); 537 break; 538 } 539 case sstinformixCreateSynonym: { 540 ret = new TCreateSynonymStmt(this.vendor); 541 break; 542 } 543 case sstinformixExecuteFunction: { 544 ret = new TInformixExecuteFunction(this.vendor); 545 break; 546 } 547 case sstinformixExecuteProcedure: { 548 ret = new TInformixExecuteProcedure(this.vendor); 549 break; 550 } 551 case sstinformixCreateRowType: { 552 ret = new TInformixCreateRowTypeStmt(this.vendor); 553 break; 554 } 555 case sstinformixPut: 556 case sstinformixInfo: { 557 ret = null; 558 559 if (pstate == EFindSqlStateType.stnormal) { 560 ret = new TUnknownSqlStatement(this.vendor); 561 ret.sqlstatementtype = gnewsqlstatementtype; 562 } 563 break; 564 } 565 case sstinformixAlterIndex: { 566 ret = new TAlterIndexStmt(this.vendor); 567 break; 568 } 569 case sstinformixRenameColumn: 570 case sstinformixRenameTable: 571 case sstinformixRenameSequence: 572 case sstinformixRenameIndex: { 573 ret = new TRenameStmt(this.vendor); 574 break; 575 } 576 case sstdropdatabase: 577 ret = new TDropDatabaseStmt(this.vendor); 578 break; 579 case sstinformixRollbackWork: { 580 ret = new TMssqlRollback(this.vendor); 581 break; 582 } 583 default: { 584 ret = new TUnknownSqlStatement(this.vendor); 585 ret.sqlstatementtype = gnewsqlstatementtype; 586 break; 587 } 588 } // case 589 590 return ret; 591 } 592}