JIRA TRAFODION-2834 Streamline supported xn access modes traf DTM only supports 'read committed access' for selects and 'set transaction ' stmts. With this checkin, only those 2 options will be allowed. All other access options will return an error. Read uncommitted access will be treated as read committed.
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/6dd81240 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/6dd81240 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/6dd81240 Branch: refs/heads/master Commit: 6dd81240697f689ce26b93021d17d4f602044c77 Parents: 0282c85 Author: Anoop Sharma <[email protected]> Authored: Sat Dec 9 21:18:13 2017 +0000 Committer: Anoop Sharma <[email protected]> Committed: Sat Dec 9 21:18:13 2017 +0000 ---------------------------------------------------------------------- .../jdbc_type2/samples/TransactionMode.java | 2 +- core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp | 20 +- core/sql/bin/SqlciErrors.txt | 4 +- core/sql/comexe/ComQueue.h | 2 +- core/sql/common/ComTransInfo.cpp | 24 +- core/sql/common/ComTransInfo.h | 212 +- core/sql/generator/GenExplain.cpp | 30 +- core/sql/generator/GenPreCode.cpp | 4 +- core/sql/generator/GenRelMisc.cpp | 2 +- core/sql/generator/GenRelScan.cpp | 2 +- core/sql/optimizer/BindRelExpr.cpp | 42 +- core/sql/optimizer/Inlining.cpp | 6 +- core/sql/optimizer/NormRelExpr.cpp | 4 +- core/sql/optimizer/RelCache.cpp | 2 +- core/sql/optimizer/RelExpr.cpp | 4 +- core/sql/optimizer/RelMisc.h | 2 +- core/sql/parser/ParKeyWords.cpp | 2 - core/sql/parser/SqlParserAux.cpp | 16 +- core/sql/parser/SqlParserAux.h | 2 +- core/sql/parser/sqlparser.y | 144 +- core/sql/parser/ulexer.cpp | 34 +- core/sql/regress/compGeneral/EXPECTED001.SB | 30 +- core/sql/regress/compGeneral/EXPECTEDTOK | 46 + core/sql/regress/compGeneral/EXPECTEDTOK2 | 6 +- core/sql/regress/compGeneral/TEST001 | 12 +- core/sql/regress/core/EXPECTED020.SB | 2 +- core/sql/regress/core/EXPECTED037.SB | 22 +- core/sql/regress/core/TEST020 | 2 +- core/sql/regress/hive/EXPECTED030 | 621 +- core/sql/regress/hive/EXPECTED040 | 2527 +++ core/sql/regress/qat/eqatdml01 | 230 +- core/sql/regress/qat/eqatdml02 | 386 +- core/sql/regress/qat/eqatdml03 | 124 +- core/sql/regress/qat/eqatdml04 | 384 +- core/sql/regress/qat/eqatdml05 | 14344 ++++++++--------- core/sql/regress/qat/eqatdml06 | 1352 +- core/sql/regress/qat/eqatdml07 | 1930 +-- core/sql/regress/qat/eqatdml08 | 50 +- core/sql/regress/qat/eqatdml09 | 54 +- core/sql/regress/qat/eqatdml10 | 3026 ++-- core/sql/regress/qat/eqatdml11 | 3026 ++-- core/sql/regress/qat/eqatdml14 | 256 +- core/sql/regress/qat/qatdml01 | 34 +- core/sql/regress/qat/qatdml02 | 34 +- core/sql/regress/qat/qatdml03 | 28 +- core/sql/regress/qat/qatdml04 | 58 +- core/sql/regress/qat/qatdml05 | 78 +- core/sql/regress/qat/qatdml06 | 76 +- core/sql/regress/qat/qatdml07 | 42 +- core/sql/regress/qat/qatdml08 | 50 +- core/sql/regress/qat/qatdml09 | 50 +- core/sql/regress/qat/qatdml10 | 66 +- core/sql/regress/qat/qatdml11 | 66 +- core/sql/regress/qat/qatdml14 | 76 +- core/sql/regress/seabase/EXPECTED011 | 12 +- core/sql/regress/seabase/FILTER034 | 33 + core/sql/regress/seabase/TEST025 | 1 + core/sql/regress/tools/runregr_privs1.ksh | 6 +- core/sql/regress/tools/runregr_privs2.ksh | 6 +- core/sql/sqlcomp/CmpSeabaseDDLindex.cpp | 2 +- core/sql/ustat/hs_globals.cpp | 2 +- 61 files changed, 16276 insertions(+), 13434 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/conn/jdbc_type2/samples/TransactionMode.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbc_type2/samples/TransactionMode.java b/core/conn/jdbc_type2/samples/TransactionMode.java index 152145f..905582c 100644 --- a/core/conn/jdbc_type2/samples/TransactionMode.java +++ b/core/conn/jdbc_type2/samples/TransactionMode.java @@ -227,7 +227,7 @@ public class TransactionMode // Perform the query within an internally managed jdbcMx transaction // or no transaction when in 'external' transactionMode case 0: - query ="select * from " + table + " for browse access"; + query ="select * from " + table + " for read uncommitted access"; System.out.println(PROLOG + "Executing - '" + query + "'"); rs = stmt.executeQuery(query); break; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp ---------------------------------------------------------------------- diff --git a/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp b/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp index 95459a1..a0aaf26 100644 --- a/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp +++ b/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp @@ -5621,7 +5621,7 @@ bool InsertControls(char* sqlString, odbc_SQLSvc_ExecDirect_exc_ *exception_) else if (strnicmp(ControlType,"PLANINSCQS",10) == 0) { ControlQuery[0] = '\0'; - sprintf(ControlQuery,"SELECT STATEMENT_NAME FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS WHERE STATEMENT_NAME = UPSHIFT('%s') AND CONTROL_TYPE = 2 FOR BROWSE ACCESS", StatementName); + sprintf(ControlQuery,"SELECT STATEMENT_NAME FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS WHERE STATEMENT_NAME = UPSHIFT('%s') AND CONTROL_TYPE = 2 FOR READ UNCOMMITTED ACCESS", StatementName); iqqcode = QryControlSrvrStmt->ExecDirect(NULL, ControlQuery, EXTERNAL_STMT, TYPE_SELECT, SQL_ASYNC_ENABLE_OFF, 0); if (iqqcode == SQL_ERROR) { @@ -5840,7 +5840,7 @@ bool LoadControls(char* sqlString, bool genOrexc, char* genRequestError, odbc_SQ ResetControls(ResetQuery); ControlQuery[0] = '\0'; - sprintf(ControlQuery,"SELECT CONTROL_TEXT FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS where STATEMENT_NAME = UPSHIFT('%s') and CONTROL_TYPE = 1 FOR BROWSE ACCESS", StatementName); + sprintf(ControlQuery,"SELECT CONTROL_TEXT FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS where STATEMENT_NAME = UPSHIFT('%s') and CONTROL_TYPE = 1 FOR READ UNCOMMITTED ACCESS", StatementName); iqqcode = QryControlSrvrStmt->ExecDirect(NULL, ControlQuery, EXTERNAL_STMT, TYPE_SELECT, SQL_ASYNC_ENABLE_OFF, 0); if (iqqcode != SQL_SUCCESS) { @@ -5939,7 +5939,7 @@ bool LoadControls(char* sqlString, bool genOrexc, char* genRequestError, odbc_SQ } ControlQuery[0] = '\0'; - sprintf(ControlQuery,"SELECT CONTROL_TEXT FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS where STATEMENT_NAME = UPSHIFT('%s') and CONTROL_TYPE = 2 ORDER BY CONTROL_SEQUENCE FOR BROWSE ACCESS", StatementName); + sprintf(ControlQuery,"SELECT CONTROL_TEXT FROM NEO.PUBLIC_ACCESS_SCHEMA.MXCS_STATEMENT_CONTROLS where STATEMENT_NAME = UPSHIFT('%s') and CONTROL_TYPE = 2 ORDER BY CONTROL_SEQUENCE FOR READ UNCOMMITTED ACCESS", StatementName); iqqcode = QryControlSrvrStmt->ExecDirect(NULL, ControlQuery, EXTERNAL_STMT, TYPE_SELECT, SQL_ASYNC_ENABLE_OFF, 0); if (iqqcode != SQL_SUCCESS) { @@ -6833,25 +6833,25 @@ bool ChkWSvcCommands(char* wsname, int& retcode, long type) switch (type) { case CHECK_SERVICE: - sprintf(ControlQuery,"select service_id from NEO.NWMS_SCHEMA.SERVICES where service_name = \'%s\' for browse access", wsname); + sprintf(ControlQuery,"select service_id from NEO.NWMS_SCHEMA.SERVICES where service_name = \'%s\' for read uncommitted access", wsname); break; case CHECK_SERVICEMAX: - sprintf(ControlQuery,"select MAX(service_id) from NEO.NWMS_SCHEMA.SERVICES for browse access"); + sprintf(ControlQuery,"select MAX(service_id) from NEO.NWMS_SCHEMA.SERVICES for read uncommitted access"); break; case CHECK_SERVICEPRTY: - sprintf(ControlQuery,"select service_priority from NEO.NWMS_SCHEMA.SERVICES where service_name = \'%s\' for browse access", wsname); + sprintf(ControlQuery,"select service_priority from NEO.NWMS_SCHEMA.SERVICES where service_name = \'%s\' for read uncommitted access", wsname); break; // case CHECK_MAXQUERIES_TOTAL: -// sprintf(ControlQuery,"select cast(sum(cast(limit_value as integer)) as integer) from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type in (0,1) for browse access"); +// sprintf(ControlQuery,"select cast(sum(cast(limit_value as integer)) as integer) from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type in (0,1) for read uncommitted access"); // break; case CHECK_MAXQUERIES_OTHERS: - sprintf(ControlQuery,"select cast(sum(cast(limit_value as integer)) as integer) from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type in (0,1) and service_id <> %s for browse access", service_id); + sprintf(ControlQuery,"select cast(sum(cast(limit_value as integer)) as integer) from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type in (0,1) and service_id <> %s for read uncommitted access", service_id); break; case CHECK_QUERIES_WAITING: - sprintf(ControlQuery,"select limit_value from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type = 1 and service_id = %s for browse access", service_id); + sprintf(ControlQuery,"select limit_value from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type = 1 and service_id = %s for read uncommitted access", service_id); break; case CHECK_QUERIES_EXECUTING: - sprintf(ControlQuery,"select limit_value from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type = 0 and service_id = %s for browse access", service_id); + sprintf(ControlQuery,"select limit_value from NEO.NWMS_SCHEMA.THRESHOLDS where threshold_type = 0 and service_id = %s for read uncommitted access", service_id); break; default: return false; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/bin/SqlciErrors.txt ---------------------------------------------------------------------- diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt index a6f1dae..4b0389a 100644 --- a/core/sql/bin/SqlciErrors.txt +++ b/core/sql/bin/SqlciErrors.txt @@ -514,8 +514,8 @@ 1716 ZZZZZ 99999 BEGINNER MINOR DBADMIN Number of declared formal parameters with SQL parameter style cannot exceed 32. 1717 ZZZZZ 99999 BEGINNER MINOR DBADMIN Encountered an error while processing a routine definition. Pass through input value with BINARY type cannot be empty. 1718 ZZZZZ 99999 BEGINNER MINOR DBADMIN Encountered an error while processing a routine definition. File '$0~string0' is empty. A pass through input value with BINARY type cannot be empty. - - +1719 ZZZZZ 99999 BEGINNER MINOR DBADMIN Access Type '$0~string0' is not supported. +1720 ZZZZZ 99999 BEGINNER MINOR DBADMIN Isolation Level '$0~string0' is not supported. 1999 ZZZZZ 99999 UUUUUUUU UUUUU UUUUUUU Last Catalog Manager error 2000 ZZZZZ 99999 UUUUUUUU UUUUU UUUUUUU Error messages for compiler main, IPC, and DEFAULTS table; assertions for optimizer. 2001 ZZZZZ 99999 ADVANCED MAJOR DIALOUT Error or warning $0~Int0 occurred while opening or reading from DEFAULTS table $1~TableName. Using $2~String0 values. http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/comexe/ComQueue.h ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComQueue.h b/core/sql/comexe/ComQueue.h index e110b49..7659a1b 100644 --- a/core/sql/comexe/ComQueue.h +++ b/core/sql/comexe/ComQueue.h @@ -324,7 +324,7 @@ public: void remove(void * entry); -// To remove the last rrturned entry via getNext() in case of global scan +// To remove the last returned entry via getNext() in case of global scan // of hash queue void remove(); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/common/ComTransInfo.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/ComTransInfo.cpp b/core/sql/common/ComTransInfo.cpp index 81f1ce9..5ad9afc 100644 --- a/core/sql/common/ComTransInfo.cpp +++ b/core/sql/common/ComTransInfo.cpp @@ -49,9 +49,9 @@ short DP2LockFlags::transactionNeeded() return (getConsistencyLevel() == READ_UNCOMMITTED) ? 0 : -1; } -void StmtLevelAccessOptions::updateAccessOptions(AccessType at, LockMode lm) +void StmtLevelAccessOptions::updateAccessOptions(TransMode::AccessType at, LockMode lm) { - if (at != ACCESS_TYPE_NOT_SPECIFIED_) + if (at != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) if (accessType_ < at) accessType_ = at; @@ -66,12 +66,12 @@ DP2LockFlags StmtLevelAccessOptions::getDP2LockFlags() switch (accessType_) { - case BROWSE_: + case TransMode::READ_UNCOMMITTED_ACCESS_: flags.setConsistencyLevel(DP2LockFlags::READ_UNCOMMITTED); break; - case ACCESS_TYPE_NOT_SPECIFIED_: - case CLEAN_: + case TransMode::ACCESS_TYPE_NOT_SPECIFIED_: + case TransMode::READ_COMMITTED_ACCESS_: flags.setConsistencyLevel(DP2LockFlags::READ_COMMITTED); // QSTUFF // make sure table scans for embedded deletes or updates @@ -82,11 +82,7 @@ DP2LockFlags StmtLevelAccessOptions::getDP2LockFlags() break; - case STABLE_: - flags.setConsistencyLevel(DP2LockFlags::STABLE); - break; - - case REPEATABLE_: + case TransMode::REPEATABLE_READ_ACCESS_: flags.setConsistencyLevel(DP2LockFlags::SERIALIZABLE); break; @@ -99,7 +95,7 @@ DP2LockFlags StmtLevelAccessOptions::getDP2LockFlags() // while this could be argued either way the advantages for // efficient subscriptions outweight any short commings. - case SKIP_CONFLICT_: + case TransMode::SKIP_CONFLICT_ACCESS_: flags.setConsistencyLevel(DP2LockFlags::READ_COMMITTED); flags.setSkipLockedRows(); // makes sure scans for embedded updates or deletes cause @@ -317,16 +313,16 @@ void verifyUpdatableTrans(StmtLevelAccessOptions * sAxOpt, TransMode::IsolationLevel isolationLevelForUpdate, Lng32 &errCodeA, Lng32 &errCodeB) { - if (sAxOpt && sAxOpt->accessType() == BROWSE_) + if (sAxOpt && sAxOpt->accessType() == TransMode::READ_UNCOMMITTED_ACCESS_) errCodeA = -3140; else if (((! sAxOpt) || - (sAxOpt->accessType() == ACCESS_TYPE_NOT_SPECIFIED_)) && + (sAxOpt->accessType() == TransMode::ACCESS_TYPE_NOT_SPECIFIED_)) && (tm->isolationLevel() == TransMode::READ_UNCOMMITTED_) && ((isolationLevelForUpdate == TransMode::IL_NOT_SPECIFIED_) || (isolationLevelForUpdate == TransMode::READ_UNCOMMITTED_))) errCodeA = -3140; else if (((! sAxOpt) || - (sAxOpt->accessType() == ACCESS_TYPE_NOT_SPECIFIED_)) && + (sAxOpt->accessType() == TransMode::ACCESS_TYPE_NOT_SPECIFIED_)) && (tm->accessMode() != TransMode::READ_WRITE_) && ((isolationLevelForUpdate == TransMode::IL_NOT_SPECIFIED_) || (isolationLevelForUpdate == TransMode::READ_UNCOMMITTED_) || http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/common/ComTransInfo.h ---------------------------------------------------------------------- diff --git a/core/sql/common/ComTransInfo.h b/core/sql/common/ComTransInfo.h index 9498f39..36af463 100644 --- a/core/sql/common/ComTransInfo.h +++ b/core/sql/common/ComTransInfo.h @@ -51,52 +51,6 @@ enum TransStmtType SET_TRANSACTION_ }; - -enum AccessType - { - // These values are mirrored by enum TransMode::IsolationLevel, - // which requires that the values NEVER CHANGE - // and that they form an ORDERED SEQUENCE. - // - // There are gaps here to allow later addition of intervening lock consistency - // values, e.g. CLEAN and STABLE, preserving the ORDERED SEQUENCE. - // These values kind-of sort-of match enum DP2LockFlags::ConsistencyLevel. - // - // We define the values here only because this enum appears first in the file. - // - BROWSE_ = 00, - - // QSTUFF - // when propagating access options a higher/stronger access type - // is overwriting a lower/weaker access type. For now we assume - // that skip conflict is between browse and stable, thus when - // somebody requires stable, repeatable or serializable access this will - // overwrite the skip conflict access type and skip conflict will not - // be able to overwrite repeatable and serializable. - - // note:: the whole treatment of access types is questionable as sql/mx does - // not really have stable access but only read committed which is not correctly - // reflected here and one also must distinguish between skip conflict in an - // update statement where one must always lock selected rows exclusively - // which is currently only done with a hack in the binder. Skip conflict in - // that context is to repeatable read as it does not lock a range but only - // the records accessed thus allows now records to be inserted in the ranges - // scanned. - - SKIP_CONFLICT_ = 05, - - // since stable really means read committed that looks like a questionable hack - // QSTUFF - - CLEAN_ = 10, - STABLE_ = 11, - REPEATABLE_ = 20, - SERIALIZABLE_placeholder_ = 30, // does not exist in SQL/MP - ACCESS_TYPE_NOT_SPECIFIED_ = -1 - - -}; - // PROTECTED_ mode allows read operation against the table but prevents // writes to it. Currently used with lock table operation only. @@ -229,85 +183,20 @@ private: }; -//////////////////////////////////////////////////////////////// -// These are the access options that are specified in a SQL -// statements (FOR BROWSE ACCESS, IN SHARE MODE, etc). -// This is a Tandem extension. Do HELP from sql/mp sqlci or -// look at sql/mp manual or SQL/ARK Language spec -// for details on these options. If these are specified in a -// query, they override any options specified via a SET -// TRANSACTION statement. -//////////////////////////////////////////////////////////////// -class StmtLevelAccessOptions -{ - - -public: - StmtLevelAccessOptions(AccessType at = ACCESS_TYPE_NOT_SPECIFIED_, - LockMode lm = LOCK_MODE_NOT_SPECIFIED_) - : accessType_(at), lockMode_(lm) - // QSTUFF - ,updateOrDelete_ (FALSE) - // QSTUFF - ,scanLockForIM_(FALSE) - {} - - NABoolean operator==(const StmtLevelAccessOptions &o) const - { return accessType_ == o.accessType_ && lockMode_ == o.lockMode_; } - - AccessType& accessType() { return accessType_; } - AccessType accessType() const { return accessType_; } - LockMode& lockMode() { return lockMode_; } - - NABoolean userSpecified() - { - return (accessType_ != ACCESS_TYPE_NOT_SPECIFIED_ || - lockMode_ != LOCK_MODE_NOT_SPECIFIED_); - } - - void updateAccessOptions(AccessType at, LockMode lm = LOCK_MODE_NOT_SPECIFIED_); - - // based on the current access options, return the corresponding DP2LockFlags - DP2LockFlags getDP2LockFlags(); - - // QSTUFF - void setUpdateOrDelete (NABoolean u) { updateOrDelete_ = u; }; - NABoolean isUpdateOrDelete() { return updateOrDelete_; }; - // QSTUFF - - void setScanLockForIM(NABoolean u) { scanLockForIM_ = u; }; - NABoolean scanLockForIM(){ return scanLockForIM_; }; - -private: - AccessType accessType_; - LockMode lockMode_; - // QSTUFF - NABoolean updateOrDelete_; - // QSTUFF - - //------------------------------------------------------------------------- - // This option attribute is set for all scans that are on the left side of - // an TSJ "for write" when there is an update or delete and Index Maintenance. - // This is needed by the executor to ensure that selected rows are - // appropriately locked, even if scanned from an index, to protect against - // index corruption. The attribute is propagated to ComTdbDp2SubsOper and - // ComTdbDp2UniqueOper and used during execution to ask DP2 for serializable - // locks. - // - // This is to address genesis solution 10-040802-8483, and also addresses - // solution 10-031111-1215. The original fix for 10-040802-8483 caused - // deadlocks in "refresh MVGROUP" to get error 73 when - // MV_REFRESH_MAX_PARALLELISM > 1 (see solution 10-070322-3467), so it has - // been modified to limit the scan nodes that will use serializable locking - // to those nodes on the left side of the TSJforWrite. - //------------------------------------------------------------------------- - NABoolean scanLockForIM_; -}; - class TransMode : public NAVersionedObject { public: + enum AccessType + { + READ_UNCOMMITTED_ACCESS_ = 00, + SKIP_CONFLICT_ACCESS_ = 05, + READ_COMMITTED_ACCESS_ = 10, + REPEATABLE_READ_ACCESS_ = 20, + SERIALIZABLE_ACCESS_ = 30, + ACCESS_TYPE_NOT_SPECIFIED_ = -1 + }; + // These values get stored in generated code, so MUST NOT BE CHANGED. // The values must form a logical sequence -- see the xxCompatible() // code below, and StmtLevelAccessOptions::updateAccessOptions. @@ -315,17 +204,18 @@ public: // Enum TransMode::IsolationLevel maps to enum AccessType. // The static funcs that follow do this mapping, in both directions. // + enum IsolationLevel { - READ_UNCOMMITTED_ = BROWSE_, - READ_COMMITTED_ = CLEAN_, - REPEATABLE_READ_ = REPEATABLE_, - SERIALIZABLE_ = SERIALIZABLE_placeholder_, + READ_UNCOMMITTED_ = READ_UNCOMMITTED_ACCESS_, + READ_COMMITTED_ = READ_COMMITTED_ACCESS_, + REPEATABLE_READ_ = REPEATABLE_READ_ACCESS_, + SERIALIZABLE_ = SERIALIZABLE_ACCESS_, IL_NOT_SPECIFIED_ = ACCESS_TYPE_NOT_SPECIFIED_ }; static AccessType ILtoAT(IsolationLevel il) - { return (il == SERIALIZABLE_) ? REPEATABLE_ : (AccessType)il; } + { return (il == SERIALIZABLE_) ? REPEATABLE_READ_ACCESS_ : (AccessType)il; } static IsolationLevel ATtoIL(AccessType at) { return (IsolationLevel)at; } @@ -551,6 +441,76 @@ private: UInt32 multiCommitSize_; // 20-23 }; +//////////////////////////////////////////////////////////////// +// These are the access options that are specified in a SQL +// statements (FOR BROWSE ACCESS, IN SHARE MODE, etc). +// This is a Tandem extension. Do HELP from sql/mp sqlci or +// look at sql/mp manual or SQL/ARK Language spec +// for details on these options. If these are specified in a +// query, they override any options specified via a SET +// TRANSACTION statement. +//////////////////////////////////////////////////////////////// +class StmtLevelAccessOptions +{ +public: + StmtLevelAccessOptions(TransMode::AccessType at = TransMode::ACCESS_TYPE_NOT_SPECIFIED_, + LockMode lm = LOCK_MODE_NOT_SPECIFIED_) + : accessType_(at), lockMode_(lm) + ,updateOrDelete_ (FALSE) + ,scanLockForIM_(FALSE) + {} + + NABoolean operator==(const StmtLevelAccessOptions &o) const + { return accessType_ == o.accessType_ && lockMode_ == o.lockMode_; } + + TransMode::AccessType& accessType() { return accessType_; } + TransMode::AccessType accessType() const { return accessType_; } + LockMode& lockMode() { return lockMode_; } + + NABoolean userSpecified() + { + return (accessType_ != TransMode::ACCESS_TYPE_NOT_SPECIFIED_ || + lockMode_ != LOCK_MODE_NOT_SPECIFIED_); + } + + void updateAccessOptions(TransMode::AccessType at, + LockMode lm = LOCK_MODE_NOT_SPECIFIED_); + + // based on the current access options, return the corresponding DP2LockFlags + DP2LockFlags getDP2LockFlags(); + + // QSTUFF + void setUpdateOrDelete (NABoolean u) { updateOrDelete_ = u; }; + NABoolean isUpdateOrDelete() { return updateOrDelete_; }; + // QSTUFF + + void setScanLockForIM(NABoolean u) { scanLockForIM_ = u; }; + NABoolean scanLockForIM(){ return scanLockForIM_; }; + +private: + TransMode::AccessType accessType_; + LockMode lockMode_; + NABoolean updateOrDelete_; + + //------------------------------------------------------------------------- + // This option attribute is set for all scans that are on the left side of + // an TSJ "for write" when there is an update or delete and Index Maintenance. + // This is needed by the executor to ensure that selected rows are + // appropriately locked, even if scanned from an index, to protect against + // index corruption. The attribute is propagated to ComTdbDp2SubsOper and + // ComTdbDp2UniqueOper and used during execution to ask DP2 for serializable + // locks. + // + // This is to address genesis solution 10-040802-8483, and also addresses + // solution 10-031111-1215. The original fix for 10-040802-8483 caused + // deadlocks in "refresh MVGROUP" to get error 73 when + // MV_REFRESH_MAX_PARALLELISM > 1 (see solution 10-070322-3467), so it has + // been modified to limit the scan nodes that will use serializable locking + // to those nodes on the left side of the TSJforWrite. + //------------------------------------------------------------------------- + NABoolean scanLockForIM_; +}; + // verify that statement-level access and session-level setting are OK. // set errCodeA/errCodeB to 0/0 if all OK, else to -3140/-3141. void verifyUpdatableTrans(StmtLevelAccessOptions * sAxOpt, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/generator/GenExplain.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenExplain.cpp b/core/sql/generator/GenExplain.cpp index 17a8c7a..4707dc8 100644 --- a/core/sql/generator/GenExplain.cpp +++ b/core/sql/generator/GenExplain.cpp @@ -553,22 +553,20 @@ FileScan::addSpecificExplainInfo(ExplainTupleMaster *explainTuple, description += "access_mode: "; switch(accessOptions().accessType()) { - case BROWSE_: description += "read uncommitted "; - break; - case SKIP_CONFLICT_: description += "skip conflict "; - break; - case CLEAN_: description += "read committed "; - break; - case STABLE_: description += "stable "; - break; - case REPEATABLE_: description += "serializable "; - break; - case SERIALIZABLE_placeholder_: description += "mx serializable "; - break; - case ACCESS_TYPE_NOT_SPECIFIED_: description += "not specified, defaulted to read committed "; - break; - default: description += "unknown "; - break; + case TransMode::READ_UNCOMMITTED_ACCESS_: description += "read uncommitted "; + break; + case TransMode::SKIP_CONFLICT_ACCESS_: description += "skip conflict "; + break; + case TransMode::READ_COMMITTED_ACCESS_: description += "read committed "; + break; + case TransMode::REPEATABLE_READ_ACCESS_: description += "repeatable read "; + break; + case TransMode::SERIALIZABLE_: description += "serializable "; + break; + case TransMode::ACCESS_TYPE_NOT_SPECIFIED_: description += "not specified, defaulted to read committed "; + break; + default: description += "unknown "; + break; }; // now get columns_retrieved http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/generator/GenPreCode.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenPreCode.cpp b/core/sql/generator/GenPreCode.cpp index 40baf03..c016cd5 100644 --- a/core/sql/generator/GenPreCode.cpp +++ b/core/sql/generator/GenPreCode.cpp @@ -1854,7 +1854,7 @@ RelExpr * RelRoot::preCodeGen(Generator * generator, doMaxOneRowOpt = FALSE; if ((s->getGroupAttr()->isStream()) || - (s->accessOptions().accessType() == SKIP_CONFLICT_)) + (s->accessOptions().accessType() == TransMode::SKIP_CONFLICT_ACCESS_)) { //doMaxOneInputRowOpt = FALSE; //doMaxOneRowOpt = FALSE; @@ -4236,7 +4236,7 @@ RelExpr * GenericUpdate::preCodeGen(Generator * generator, generator->setUpdErrorOnError(FALSE); } - if ((accessOptions().accessType() == SKIP_CONFLICT_) || + if ((accessOptions().accessType() == TransMode::SKIP_CONFLICT_ACCESS_) || (getGroupAttr()->isStream()) || (newRecBeforeExprArray().entries() > 0)) // set on rollback { http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/generator/GenRelMisc.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenRelMisc.cpp b/core/sql/generator/GenRelMisc.cpp index db46831..160ff0f 100644 --- a/core/sql/generator/GenRelMisc.cpp +++ b/core/sql/generator/GenRelMisc.cpp @@ -785,7 +785,7 @@ short RelRoot::codeGen(Generator * generator) TransMode * transMode = new(space) TransMode(); transMode->updateTransMode(generator->getTransMode()); // - if (accessOptions().accessType() != ACCESS_TYPE_NOT_SPECIFIED_) + if (accessOptions().accessType() != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) { // "FOR xxx ACCESS" becomes an IsolationLevel, and both IL and AccessMode // are set in the transMode http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/generator/GenRelScan.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenRelScan.cpp b/core/sql/generator/GenRelScan.cpp index 913ec60..013651b 100644 --- a/core/sql/generator/GenRelScan.cpp +++ b/core/sql/generator/GenRelScan.cpp @@ -3272,7 +3272,7 @@ short HbaseAccess::codeGen(Generator * generator) if ((accessOptions().userSpecified()) && // (accessOptions().getDP2LockFlags().getConsistencyLevel() == DP2LockFlags::READ_UNCOMMITTED)) - (accessOptions().accessType() == BROWSE_)) + (accessOptions().accessType() == TransMode::READ_UNCOMMITTED_ACCESS_)) { hbasescan_tdb->setReadUncommittedScan(TRUE); } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/BindRelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/BindRelExpr.cpp b/core/sql/optimizer/BindRelExpr.cpp index bb40e55..536746e 100644 --- a/core/sql/optimizer/BindRelExpr.cpp +++ b/core/sql/optimizer/BindRelExpr.cpp @@ -994,6 +994,9 @@ void castComputedColumnsToAnsiTypes(BindWA *bindWA, RETDesc *rd, ValueIdList &compExpr) { + if (! rd) + return; + const ColumnDescList &cols = *rd->getColumnList(); CollIndex i = cols.entries(); CMPASSERT(i == compExpr.entries()); @@ -2168,7 +2171,7 @@ RelExpr *BindWA::bindView(const CorrName &viewName, // or ignore any accessOpts from the view, for a consistent access model. if ((CmpCommon::getDefault(ALLOW_ISOLATION_LEVEL_IN_CREATE_VIEW) == DF_OFF) || - (viewRoot->accessOptions().accessType() == ACCESS_TYPE_NOT_SPECIFIED_)) + (viewRoot->accessOptions().accessType() == TransMode::ACCESS_TYPE_NOT_SPECIFIED_)) { // if cqd is set and view options were explicitely specified, // then do not overwrite it with accessOptions. @@ -2549,7 +2552,7 @@ RETDesc *RelExpr::getRETDesc() const { if (RETDesc_) return RETDesc_; - if (getArity() == 1) + if ((getArity() == 1) && (child(0))) return child(0)->getRETDesc(); else return NULL; @@ -5802,7 +5805,7 @@ RelExpr *RelRoot::bindNode(BindWA *bindWA) if (isTrueRoot()) { - if (child(0)->getGroupAttr()->isEmbeddedUpdateOrDelete()) { + if (child(0) && child(0)->getGroupAttr()->isEmbeddedUpdateOrDelete()) { // Olt optimization is now supported for embedded updates/deletes (pub/sub // thingy) for now. oltOptInfo().setOltOpt(TRUE); @@ -5901,8 +5904,10 @@ RelExpr *RelRoot::bindNode(BindWA *bindWA) if (isEmptySelectList()) setRETDesc(new (bindWA->wHeap()) RETDesc(bindWA)); else { - setRETDesc(child(0)->getRETDesc()); - getRETDesc()->getValueIdList(compExpr()); + if (child(0)) { + setRETDesc(child(0)->getRETDesc()); + getRETDesc()->getValueIdList(compExpr()); + } } } else { @@ -6011,6 +6016,7 @@ RelExpr *RelRoot::bindNode(BindWA *bindWA) // # columns, we make that check in the CallSP::bindNode, so ignore it // for now. if (isTrueRoot() && + (child(0)) && (child(0)->getOperatorType() != REL_CALLSP && (child(0)->getOperatorType() != REL_COMPOUND_STMT && (child(0)->getOperatorType() != REL_TUPLE && @@ -6686,9 +6692,9 @@ RelExpr *RelRoot::bindNode(BindWA *bindWA) if (bindWA->getHoldableType() == SQLCLIDEV_ANSI_HOLDABLE) { - if (accessOptions().accessType() != ACCESS_TYPE_NOT_SPECIFIED_) + if (accessOptions().accessType() != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) { - if (accessOptions().accessType() == REPEATABLE_) + if (accessOptions().accessType() == TransMode::REPEATABLE_READ_ACCESS_) { *CmpCommon::diags() << DgSqlCode(-4381); bindWA->setErrStatus(); @@ -6698,7 +6704,7 @@ RelExpr *RelRoot::bindNode(BindWA *bindWA) else { TransMode::IsolationLevel il=CmpCommon::transMode()->getIsolationLevel(); - if (CmpCommon::transMode()->ILtoAT(il) == REPEATABLE_ ) + if (CmpCommon::transMode()->ILtoAT(il) == TransMode::REPEATABLE_READ_ACCESS_) { *CmpCommon::diags() << DgSqlCode(-4381); bindWA->setErrStatus(); @@ -8220,18 +8226,18 @@ RelExpr *Scan::bindNode(BindWA *bindWA) // See Halloween handling code in GenericUpdate::bindNode if (accessOptions().userSpecified()) { - if ( accessOptions().accessType() == REPEATABLE_ || - accessOptions().accessType() == STABLE_ || - accessOptions().accessType() == BROWSE_ + if ( accessOptions().accessType() == TransMode::REPEATABLE_READ_ACCESS_ || + accessOptions().accessType() == TransMode::READ_COMMITTED_ACCESS_ || + accessOptions().accessType() == TransMode::READ_UNCOMMITTED_ACCESS_ ) { naTable->setRefsIncompatibleDP2Halloween(); } } else { TransMode::IsolationLevel il = CmpCommon::transMode()->getIsolationLevel(); - if((CmpCommon::transMode()->ILtoAT(il) == REPEATABLE_ ) || - (CmpCommon::transMode()->ILtoAT(il) == STABLE_ ) || - (CmpCommon::transMode()->ILtoAT(il) == BROWSE_ )) { + if((CmpCommon::transMode()->ILtoAT(il) == TransMode::REPEATABLE_READ_ACCESS_ ) || + (CmpCommon::transMode()->ILtoAT(il) == TransMode::READ_COMMITTED_ACCESS_ ) || + (CmpCommon::transMode()->ILtoAT(il) == TransMode::READ_UNCOMMITTED_ACCESS_ )) { naTable->setRefsIncompatibleDP2Halloween(); } } @@ -13534,9 +13540,9 @@ RelExpr * GenericUpdate::bindNode(BindWA *bindWA) // Now check the transaction isolation level, which can override // the access mode. Note that il was initialized above for the // check for an updatable trans, i.e., errors 3140 and 3141. - if((CmpCommon::transMode()->ILtoAT(il) == REPEATABLE_ ) || - (CmpCommon::transMode()->ILtoAT(il) == STABLE_ ) || - (CmpCommon::transMode()->ILtoAT(il) == BROWSE_ )) + if((CmpCommon::transMode()->ILtoAT(il) == TransMode::REPEATABLE_READ_ACCESS_ ) || + (CmpCommon::transMode()->ILtoAT(il) == TransMode::READ_COMMITTED_ACCESS_ ) || + (CmpCommon::transMode()->ILtoAT(il) == TransMode::READ_UNCOMMITTED_ACCESS_ )) cannotUseDP2Locks = TRUE; // Save the result with this GenericUpdate object. It will be @@ -13749,7 +13755,7 @@ NABoolean GenericUpdate::checkForMergeRestrictions(BindWA *bindWA) return TRUE; } - if ((accessOptions().accessType() == SKIP_CONFLICT_) || + if ((accessOptions().accessType() == TransMode::SKIP_CONFLICT_ACCESS_) || (getGroupAttr()->isStream()) || (newRecBeforeExprArray().entries() > 0)) // set on rollback { http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/Inlining.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/Inlining.cpp b/core/sql/optimizer/Inlining.cpp index 41b5e8e..a3c096a 100644 --- a/core/sql/optimizer/Inlining.cpp +++ b/core/sql/optimizer/Inlining.cpp @@ -2576,7 +2576,7 @@ RelExpr* GenericUpdate::createRISubtree(BindWA *bindWA, ItemExpr *newScanPredicate = parser.getItemExprTree ((char *)scanPredicateTxt.data()); newScan->addSelPredTree(newScanPredicate); - ((Scan *)newScan)->accessOptions().accessType() = REPEATABLE_; + ((Scan *)newScan)->accessOptions().accessType() = TransMode::REPEATABLE_READ_ACCESS_; // Do not collect STOI info for security checks. newScan->getInliningInfo().setFlags(II_AvoidSecurityChecks); @@ -2670,7 +2670,7 @@ RelExpr* GenericUpdate::createRISubtree(BindWA *bindWA, // Create the Root Node. RelExpr *newRoot = new (heap) RelRoot(newGrby, - REPEATABLE_, + TransMode::REPEATABLE_READ_ACCESS_, SHARE_); ((RelRoot *)newRoot)->setEmptySelectList(); @@ -2711,7 +2711,7 @@ RelExpr* GenericUpdate::inlineRI (BindWA *bindWA, if (riSubtree->getOperatorType() != REL_ROOT) { riSubtree = new (heap) RelRoot(riSubtree, - REPEATABLE_, + TransMode::REPEATABLE_READ_ACCESS_, SHARE_); ((RelRoot *)riSubtree)->setEmptySelectList(); } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/NormRelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/NormRelExpr.cpp b/core/sql/optimizer/NormRelExpr.cpp index 6a4dc4f..781ecc9 100644 --- a/core/sql/optimizer/NormRelExpr.cpp +++ b/core/sql/optimizer/NormRelExpr.cpp @@ -7001,7 +7001,7 @@ NABoolean RelRoot::isUpdatableBasic(NABoolean isView, if (scan->getOperatorType() != REL_SCAN) return FALSE; - if (scan->accessOptions().accessType() == BROWSE_) // "read-only table" + if (scan->accessOptions().accessType() == TransMode::READ_UNCOMMITTED_ACCESS_) // "read-only table" return FALSE; TransMode::IsolationLevel il; @@ -7013,7 +7013,7 @@ NABoolean RelRoot::isUpdatableBasic(NABoolean isView, ActiveSchemaDB()->getDefaults().getIsolationLevel (il, CmpCommon::getDefault(ISOLATION_LEVEL_FOR_UPDATES)); - if (scan->accessOptions().accessType() == ACCESS_TYPE_NOT_SPECIFIED_ && + if (scan->accessOptions().accessType() == TransMode::ACCESS_TYPE_NOT_SPECIFIED_ && il == TransMode::READ_UNCOMMITTED_) return FALSE; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/RelCache.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelCache.cpp b/core/sql/optimizer/RelCache.cpp index 2496f65..b3ee6da 100644 --- a/core/sql/optimizer/RelCache.cpp +++ b/core/sql/optimizer/RelCache.cpp @@ -1007,7 +1007,7 @@ void RelRoot::generateCacheKey(CacheWA &cwa) const tmode.updateTransMode(CmpCommon::transMode()); StmtLevelAccessOptions &opts = ((RelRoot*)this)->accessOptions(); - if (opts.accessType() != ACCESS_TYPE_NOT_SPECIFIED_) { + if (opts.accessType() != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) { tmode.updateAccessModeFromIsolationLevel (TransMode::ATtoIL(opts.accessType())); tmode.setStmtLevelAccessOptions(); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/RelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelExpr.cpp b/core/sql/optimizer/RelExpr.cpp index 3ae230d..5a841c7 100644 --- a/core/sql/optimizer/RelExpr.cpp +++ b/core/sql/optimizer/RelExpr.cpp @@ -10800,13 +10800,13 @@ RelRoot::RelRoot(RelExpr *input, firstNRowsParam_(NULL), flags_(0) { - accessOptions().accessType() = ACCESS_TYPE_NOT_SPECIFIED_; + accessOptions().accessType() = TransMode::ACCESS_TYPE_NOT_SPECIFIED_; accessOptions().lockMode() = LOCK_MODE_NOT_SPECIFIED_; isCIFOn_ = FALSE; } RelRoot::RelRoot(RelExpr *input, - AccessType at, + TransMode::AccessType at, LockMode lm, OperatorTypeEnum otype, ItemExpr *compExpr, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/optimizer/RelMisc.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelMisc.h b/core/sql/optimizer/RelMisc.h index 99513c6..d25d21a 100644 --- a/core/sql/optimizer/RelMisc.h +++ b/core/sql/optimizer/RelMisc.h @@ -143,7 +143,7 @@ public: CollHeap *oHeap = CmpCommon::statementHeap()); RelRoot(RelExpr *child, - AccessType at, + TransMode::AccessType at, LockMode lm, OperatorTypeEnum otype = REL_ROOT, ItemExpr *compExpr = NULL, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/parser/ParKeyWords.cpp ---------------------------------------------------------------------- diff --git a/core/sql/parser/ParKeyWords.cpp b/core/sql/parser/ParKeyWords.cpp index 2186dd4..f604c23 100644 --- a/core/sql/parser/ParKeyWords.cpp +++ b/core/sql/parser/ParKeyWords.cpp @@ -143,7 +143,6 @@ ParKeyWord ParKeyWords::keyWords_[] = { ParKeyWord("BOTH", TOK_BOTH, ANS_|RESWORD_|MPWORD_), ParKeyWord("BREADTH", IDENTIFIER, POTANS_|RESWORD_), ParKeyWord("BRIEF", TOK_BRIEF, NONRESTOKEN_), - ParKeyWord("BROWSE", TOK_BROWSE, FIRST_|SECOND_|NONRESTOKEN_), ParKeyWord("BT", TOK_BT, NONRESTOKEN_), ParKeyWord("BUFFER", TOK_BUFFER, NONRESTOKEN_), ParKeyWord("BUFFERED", TOK_BUFFERED, NONRESTOKEN_), @@ -1043,7 +1042,6 @@ ParKeyWord ParKeyWords::keyWords_[] = { ParKeyWord("SQL_VARCHAR", TOK_VARCHAR, COMPAQ_|RESWORD_), ParKeyWord("SQL_WARNING", TOK_SQL_WARNING, NONRESTOKEN_), ParKeyWord("SQRT", TOK_SQRT, NONRESTOKEN_), - ParKeyWord("STABLE", TOK_STABLE, FIRST_|SECOND_|NONRESTOKEN_), ParKeyWord("START", TOK_START, COMPAQ_|NONRESWORD_), // used in nist618 test ParKeyWord("STATE", TOK_STATE, COMPAQ_|NONRESWORD_), http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/parser/SqlParserAux.cpp ---------------------------------------------------------------------- diff --git a/core/sql/parser/SqlParserAux.cpp b/core/sql/parser/SqlParserAux.cpp index 7ef5295..c73d78d 100644 --- a/core/sql/parser/SqlParserAux.cpp +++ b/core/sql/parser/SqlParserAux.cpp @@ -556,12 +556,12 @@ void ForUpdateSpec::finalizeUpdatability(RelExpr *top) NABoolean finalizeAccessOptions(RelExpr *top, - AccessType at, + TransMode::AccessType at, LockMode lm) { if (top->getOperatorType() == REL_TUPLE || top->getOperatorType() == REL_TUPLE_LIST) { - return (at == ACCESS_TYPE_NOT_SPECIFIED_ && lm == LOCK_MODE_NOT_SPECIFIED_); + return (at == TransMode::ACCESS_TYPE_NOT_SPECIFIED_ && lm == LockMode::LOCK_MODE_NOT_SPECIFIED_); } // In case of an INSERT VALUES statement, this is a Tuple node. @@ -571,8 +571,8 @@ NABoolean finalizeAccessOptions(RelExpr *top, RelRoot *treeTop = (RelRoot *)top; - if (at != ACCESS_TYPE_NOT_SPECIFIED_) { - if (treeTop->accessOptions().accessType() != ACCESS_TYPE_NOT_SPECIFIED_) { + if (at != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) { + if (treeTop->accessOptions().accessType() != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) { *SqlParser_Diags << DgSqlCode(-3196); // Access type cannot be specified more than once. return FALSE; // error @@ -580,8 +580,8 @@ NABoolean finalizeAccessOptions(RelExpr *top, treeTop->accessOptions().accessType() = at; } - if (lm != LOCK_MODE_NOT_SPECIFIED_) { - if (treeTop->accessOptions().lockMode() != LOCK_MODE_NOT_SPECIFIED_) { + if (lm != LockMode::LOCK_MODE_NOT_SPECIFIED_) { + if (treeTop->accessOptions().lockMode() != LockMode::LOCK_MODE_NOT_SPECIFIED_) { *SqlParser_Diags << DgSqlCode(-3197); // Lock mode cannot be specified more than once. return FALSE; // error @@ -2685,8 +2685,8 @@ RelExpr * processReturningClause(RelExpr * re, UInt32 returningType) RelRoot * root = new (PARSERHEAP()) RelRoot(insert, - ACCESS_TYPE_NOT_SPECIFIED_, - LOCK_MODE_NOT_SPECIFIED_, + TransMode::ACCESS_TYPE_NOT_SPECIFIED_, + LockMode::LOCK_MODE_NOT_SPECIFIED_, REL_ROOT, cr); if ((insert->child(0)) && http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/parser/SqlParserAux.h ---------------------------------------------------------------------- diff --git a/core/sql/parser/SqlParserAux.h b/core/sql/parser/SqlParserAux.h index 7c27ca8..fddfec3 100644 --- a/core/sql/parser/SqlParserAux.h +++ b/core/sql/parser/SqlParserAux.h @@ -221,7 +221,7 @@ private: NABoolean finalizeAccessOptions(RelExpr *top, - AccessType at = ACCESS_TYPE_NOT_SPECIFIED_, + TransMode::AccessType at = TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LockMode lm = LOCK_MODE_NOT_SPECIFIED_); // The purpose of this function is to return a pointer to a HostVar object. http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/parser/sqlparser.y ---------------------------------------------------------------------- diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y index 9e16c20..e0c310e 100755 --- a/core/sql/parser/sqlparser.y +++ b/core/sql/parser/sqlparser.y @@ -487,8 +487,6 @@ static void enableMakeQuotedStringISO88591Mechanism() %token <tokval> TOK_BLOB %token <tokval> TOK_BLOCKS %token <tokval> TOK_BOTH -%token <tokval> TOK_BROWSE /* Tandem extension */ -%token <tokval> TOK_BROWSE_ACCESS /* Tandem extension */ %token <tokval> TOK_BOOLEAN %token <tokval> TOK_BY %token <tokval> TOK_BYTEINT /* TD extension that HP wants to ignore */ @@ -1077,8 +1075,6 @@ static void enableMakeQuotedStringISO88591Mechanism() %token <tokval> TOK_SORT /* Tandem extension non-reserved word */ %token <tokval> TOK_SORT_KEY %token <tokval> TOK_SP_RESULT_SET -%token <tokval> TOK_STABLE /* Tandem extension */ -%token <tokval> TOK_STABLE_ACCESS /* Tandem extension */ %token <tokval> TOK_STATUS %token <tokval> TOK_STDDEV /* Tandem extension */ %token <tokval> TOK_STOP /* Tandem extension */ @@ -1589,7 +1585,7 @@ static void enableMakeQuotedStringISO88591Mechanism() StringvalWithCharSet stringval_with_charset; action *actn_ptr; - AccessType accesstype; + TransMode::AccessType accesstype; ComAnsiNameSpace nameSpaceEnum; ComColumnOrdering columnOrderingEnum; ComCreateViewBehavior createViewBehaviorEnum; @@ -6485,7 +6481,7 @@ table_reference : table_name_and_hint RelRoot * root = new (PARSERHEAP()) RelRoot($3, - ACCESS_TYPE_NOT_SPECIFIED_, + TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT); @@ -6520,7 +6516,7 @@ table_reference : table_name_and_hint RelRoot * root = new (PARSERHEAP()) RelRoot($3, - ACCESS_TYPE_NOT_SPECIFIED_, + TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT); $$ = new (PARSERHEAP()) @@ -6635,7 +6631,7 @@ table_reference : table_name_and_hint NAString id("x"); RelRoot * root = new (PARSERHEAP()) RelRoot(t, - ACCESS_TYPE_NOT_SPECIFIED_, + TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT); @@ -6711,7 +6707,7 @@ upd_stmt_w_acc_type_and_as_clause : '(' update_statement_searched access_type ') new(PARSERHEAP()) RelRoot($2,REL_ROOT,colRef); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE); @@ -6745,7 +6741,7 @@ upd_stmt_w_acc_type_and_as_clause_col_list : '(' update_statement_searched acces new(PARSERHEAP()) RelRoot($2,REL_ROOT,colRef); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE); @@ -6775,7 +6771,7 @@ upd_stmt_w_acc_type_rtn_list_and_as_clause : '(' update_statement_searched acces new(PARSERHEAP()) RelRoot($2,REL_ROOT,$4); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE); @@ -6803,7 +6799,7 @@ upd_stmt_w_acc_type_rtn_list_and_as_clause_col_list : '(' update_statement_sear RelRoot *update = new(PARSERHEAP()) RelRoot($2,REL_ROOT,$4); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE); @@ -6841,7 +6837,7 @@ del_stmt_w_acc_type_and_as_clause : '(' delete_statement access_type ')' as_clau RelRoot *update = new(PARSERHEAP()) RelRoot($2,REL_ROOT); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; // If firstN rows flag is set, then this statement is considered an MTS delete @@ -6881,7 +6877,7 @@ del_stmt_w_acc_type_and_as_clause_col_list : '(' delete_statement access_type ' RelRoot *update = new(PARSERHEAP()) RelRoot($2,REL_ROOT); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; // If firstN rows flag is set, then this statement is considered an MTS delete @@ -6922,7 +6918,7 @@ del_stmt_w_acc_type_rtn_list_and_as_clause : '(' delete_statement access_type re RelRoot *update = new(PARSERHEAP()) RelRoot($2,REL_ROOT,$4); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; // If firstN rows flag is set, then this statement is considered an MTS delete @@ -6963,7 +6959,7 @@ del_stmt_w_acc_type_rtn_list_and_as_clause_col_list : '(' delete_statement acce RelRoot *update = new(PARSERHEAP()) RelRoot($2,REL_ROOT, $4); - if ($3 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) update->accessOptions().accessType() = $3; // If firstN rows flag is set, then this statement is considered an MTS delete @@ -8212,7 +8208,7 @@ primary : '(' value_expression ')' RelExpr * root_child = getTableExpressionRelExpr(from_clause, where_clause, NULL, NULL, NULL, NULL, NULL); RelRoot *root = new (PARSERHEAP()) - RelRoot(root_child, ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT, select_list); + RelRoot(root_child, TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT, select_list); RelRoot * root1 = finalize(root); $$ = new (PARSERHEAP()) RowSubquery(root1); } @@ -13726,46 +13722,68 @@ query_select_list : select_list /* type accesstype */ -// "[FOR] BROWSE ACCESS" and "[FOR] STABLE ACCESS" are supported for -// compatibility with SQL/MP. -// "[FOR] CLEAN ACCESS" was removed from here because it was never -// part of SQL/MP, and "CLEAN" is not an Ansi keyword. -access_type : TOK_BROWSE_ACCESS {$$ = BROWSE_;} - | TOK_STABLE_ACCESS +access_type: + TOK_REPEATABLE_READ TOK_ACCESS { - $$ = STABLE_; -#ifdef _DEBUG - if (getenv("NO_TEST_STABLE")) - $$ = CLEAN_; -#endif - } - | TOK_REPEATABLE_ACCESS {$$ = REPEATABLE_;} - | TOK_REPEATABLE_READ TOK_ACCESS {$$ = REPEATABLE_;} - | TOK_SERIALIZABLE_ACCESS {$$ = REPEATABLE_;} + *SqlParser_Diags << DgSqlCode(-1719) + << DgString0("REPEATABLE READ"); + YYERROR; + + $$ = TransMode::REPEATABLE_READ_ACCESS_; + } + | TOK_SERIALIZABLE_ACCESS + { + *SqlParser_Diags << DgSqlCode(-1719) + << DgString0("SERIALIZABLE"); + YYERROR; - | TOK_FOR_BROWSE TOK_ACCESS {$$ = BROWSE_;} - | TOK_FOR_STABLE TOK_ACCESS + $$ = TransMode::REPEATABLE_READ_ACCESS_; + } + | TOK_FOR_REPEATABLE TOK_READ TOK_ACCESS { - $$ = STABLE_; -#ifdef _DEBUG - if (getenv("NO_TEST_STABLE")) - $$ = CLEAN_; -#endif - } - | TOK_FOR_REPEATABLE TOK_ACCESS {$$ = REPEATABLE_;} - | TOK_FOR_REPEATABLE TOK_READ TOK_ACCESS {$$ = REPEATABLE_;} - | TOK_FOR_SERIALIZABLE TOK_ACCESS {$$ = REPEATABLE_;} + *SqlParser_Diags << DgSqlCode(-1719) + << DgString0("REPEATABLE READ"); + YYERROR; - | TOK_READ TOK_UNCOMMITTED TOK_ACCESS {$$ = BROWSE_;} - | TOK_READ TOK_COMMITTED TOK_ACCESS {$$ = CLEAN_;} - | TOK_FOR_READ TOK_UNCOMMITTED TOK_ACCESS {$$ = BROWSE_;} - | TOK_FOR_READ TOK_COMMITTED TOK_ACCESS {$$ = CLEAN_;} + $$ = TransMode::REPEATABLE_READ_ACCESS_; + } + | TOK_FOR_SERIALIZABLE TOK_ACCESS + { + *SqlParser_Diags << DgSqlCode(-1719) + << DgString0("SERIALIZABLE"); + YYERROR; - | TOK_FOR_SKIP TOK_CONFLICT TOK_ACCESS {$$ = SKIP_CONFLICT_;} - | TOK_SKIP_CONFLICT_ACCESS {$$ = SKIP_CONFLICT_;} + $$ = TransMode::REPEATABLE_READ_ACCESS_; + } + | TOK_READ TOK_UNCOMMITTED TOK_ACCESS + { + $$ = TransMode::READ_COMMITTED_ACCESS_; + } + | TOK_READ TOK_COMMITTED TOK_ACCESS + { + $$ = TransMode::READ_COMMITTED_ACCESS_; + } + | TOK_FOR_READ TOK_UNCOMMITTED TOK_ACCESS + { + $$ = TransMode::READ_COMMITTED_ACCESS_; + } + | TOK_FOR_READ TOK_COMMITTED TOK_ACCESS + { + $$ = TransMode::READ_COMMITTED_ACCESS_; + } + | TOK_FOR_SKIP TOK_CONFLICT TOK_ACCESS + { + $$ = TransMode::SKIP_CONFLICT_ACCESS_; + } + | TOK_SKIP_CONFLICT_ACCESS + { + $$ = TransMode::SKIP_CONFLICT_ACCESS_; + } | /* empty */ - {$$ = ACCESS_TYPE_NOT_SPECIFIED_;} + { + $$ = TransMode::ACCESS_TYPE_NOT_SPECIFIED_; + } /* The following production is an "okay" way to do things @@ -14135,8 +14153,22 @@ isolation_level : TOK_ISOLATION TOK_LEVEL isolation_level_enum isolation_level_enum : TOK_READ TOK_UNCOMMITTED { $$ = TransMode::READ_UNCOMMITTED_; } | TOK_READ TOK_COMMITTED { $$ = TransMode::READ_COMMITTED_; } - | TOK_REPEATABLE_READ { $$ = TransMode::REPEATABLE_READ_; } - | TOK_SERIALIZABLE { $$ = TransMode::SERIALIZABLE_; } + | TOK_REPEATABLE_READ + { + *SqlParser_Diags << DgSqlCode(-1720) + << DgString0("REPEATABLE READ"); + YYERROR; + + $$ = TransMode::REPEATABLE_READ_; + } + | TOK_SERIALIZABLE + { + *SqlParser_Diags << DgSqlCode(-1720) + << DgString0("SERIALIZABLE"); + YYERROR; + + $$ = TransMode::SERIALIZABLE_; + } transaction_access_mode : transaction_access { @@ -14797,7 +14829,7 @@ dml_query : query_expression order_by_clause access_type #ifndef NDEBUG // To test packing. char* env = getenv("PACKING_FACTOR"); if ($2 == NULL && // no ORDER BY specified - $3 == ACCESS_TYPE_NOT_SPECIFIED_ && + $3 == TransMode::ACCESS_TYPE_NOT_SPECIFIED_ && $4 == LOCK_MODE_NOT_SPECIFIED_ && env && atol(env) > 0) { @@ -28776,14 +28808,14 @@ triggered_after_action: empty // Empty or any option not listed below { $$ = finalize($1, FALSE); RelRoot * treeTopPtr = (RelRoot *)$$; - if ($2 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($2 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) treeTopPtr->accessOptions().accessType() = $2; } | delete_statement access_type { $$ = finalize($1, FALSE); RelRoot * treeTopPtr = (RelRoot *)$$; - if ($2 != ACCESS_TYPE_NOT_SPECIFIED_) + if ($2 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_) treeTopPtr->accessOptions().accessType() = $2; } | signal_statement @@ -33299,9 +33331,7 @@ nonreserved_word : TOK_ABORT | TOK_AREA | TOK_AUTOABORT | TOK_AUTOMATIC // MV - | TOK_BROWSE | TOK_REPEATABLE - | TOK_STABLE | TOK_SERIALIZABLE // | TOK_ANSIVARCHAR //->nonreserved_datatype | TOK_ALL_DDL http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/parser/ulexer.cpp ---------------------------------------------------------------------- diff --git a/core/sql/parser/ulexer.cpp b/core/sql/parser/ulexer.cpp index 65bb59c..8fc8df4 100644 --- a/core/sql/parser/ulexer.cpp +++ b/core/sql/parser/ulexer.cpp @@ -2911,28 +2911,22 @@ Int32 yyULexer::yylex(YYSTYPE *lvalp) // retract to end of kwd1. retractToMark(end1); return anSQLMXKeyword(keyWordEntry1->getTokenCode(), lvalp); - case TOK_BROWSE: case TOK_MAXRUNTIME: case TOK_REPEATABLE: case TOK_SERIALIZABLE: - case TOK_STABLE: case TOK_SKIP: // QSTUFF // un-null-terminate 1st kwd *end1 = holdChar1; doBeforeAction(); // FOR <kwd2> is a compound kwd return aCompoundKeyword - (keyWordEntry2->getTokenCode() == TOK_BROWSE - ? TOK_FOR_BROWSE - : (keyWordEntry2->getTokenCode() == TOK_REPEATABLE - ? TOK_FOR_REPEATABLE - : (keyWordEntry2->getTokenCode() == TOK_STABLE - ? TOK_FOR_STABLE - : (keyWordEntry2->getTokenCode() == TOK_SKIP - ? TOK_FOR_SKIP // QSTUFF - : (keyWordEntry2->getTokenCode() == TOK_SERIALIZABLE - ? TOK_FOR_SERIALIZABLE : TOK_FOR_MAXRUNTIME)))), lvalp); - + (keyWordEntry2->getTokenCode() == TOK_REPEATABLE + ? TOK_FOR_REPEATABLE + : (keyWordEntry2->getTokenCode() == TOK_SKIP + ? TOK_FOR_SKIP // QSTUFF + : (keyWordEntry2->getTokenCode() == TOK_SERIALIZABLE + ? TOK_FOR_SERIALIZABLE : TOK_FOR_MAXRUNTIME)), lvalp); + case TOK_READ: // un-null-terminate 1st kwd *end1 = holdChar1; @@ -2976,13 +2970,6 @@ Int32 yyULexer::yylex(YYSTYPE *lvalp) } } break; - case TOK_BROWSE: - return eitherCompoundOrSimpleKeyword - (keyWordEntry2->getTokenCode() == TOK_ACCESS, - TOK_BROWSE_ACCESS, - keyWordEntry1->getTokenCode(), - end1, holdChar1, lvalp); - break; case TOK_INITIALIZE: if (keyWordEntry2->getTokenCode() == TOK_MAINTAIN) return eitherCompoundOrSimpleKeyword @@ -3106,13 +3093,6 @@ Int32 yyULexer::yylex(YYSTYPE *lvalp) keyWordEntry1->getTokenCode(), end1, holdChar1, lvalp); break; - case TOK_STABLE: - return eitherCompoundOrSimpleKeyword - (keyWordEntry2->getTokenCode() == TOK_ACCESS, - TOK_STABLE_ACCESS, - keyWordEntry1->getTokenCode(), - end1, holdChar1, lvalp); - break; case TOK_SKIP: // QSTUFF if (keyWordEntry2->getTokenCode() == TOK_CONFLICT){ // un-null-terminate 1st kwd http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/compGeneral/EXPECTED001.SB ---------------------------------------------------------------------- diff --git a/core/sql/regress/compGeneral/EXPECTED001.SB b/core/sql/regress/compGeneral/EXPECTED001.SB index cc2a48c..3d24807 100644 --- a/core/sql/regress/compGeneral/EXPECTED001.SB +++ b/core/sql/regress/compGeneral/EXPECTED001.SB @@ -131,7 +131,7 @@ DNO ENO ENAME SALARY DNAME +> intersect +>select eno, ename, dno from t022; -ENO ENAME DNO +ENO ENAME DNO ----------- -------------------- ----------- 2 Jones 33 @@ -153,7 +153,7 @@ ENO ENAME DNO +> intersect +>select eno, ename, dno from t022 where dno <50; -ENO ENAME DNO +ENO ENAME DNO ----------- -------------------- ----------- 2 Jones 33 @@ -161,7 +161,7 @@ ENO ENAME DNO --- 2 row(s) selected. >> ->>select * from t021 +>>select * from t021 +> intersect +>select * from t022; @@ -170,14 +170,14 @@ ENO ENAME DNO *** ERROR[8822] The statement was not prepared. >> ->>select * from +>>select * from +>( +>select eno, ename, dno from t021 +> intersect +>select eno, ename, dno from t022 +>) ; -ENO ENAME DNO +ENO ENAME DNO ----------- -------------------- ----------- 2 Jones 33 @@ -187,7 +187,7 @@ ENO ENAME DNO --- 3 row(s) selected. >>select eno, ename, dno from t021 except select * from t022; -ENO ENAME DNO +ENO ENAME DNO ----------- -------------------- ----------- 1 Smith 33 @@ -211,30 +211,30 @@ ENO ENAME DNO DNO DNAME (EXPR) ----------- -------------------- --------------------- - 55 Production 1000.00 33 Sales 5000.00 44 Marketing 4000.00 + 55 Production 1000.00 --- 3 row(s) selected. >> >>-- modify the statistics such that the pushed down groupby wins >>select dno,dname,sum(salary) +>from t01emp rows10000 natural join t01dept rows1000 -+>group by dno,dname for browse access; ++>group by dno,dname; DNO DNAME (EXPR) ----------- -------------------- --------------------- - 55 Production 1000.00 33 Sales 5000.00 44 Marketing 4000.00 + 55 Production 1000.00 --- 3 row(s) selected. >> >>-- set showshape off; >> >>-- exchange join and groupby and add count(*) > 0 clause to the groupby ->>select distinct t01dept.* from t01emp,t01dept for browse access; +>>select distinct t01dept.* from t01emp,t01dept; DNO DNAME DREGION ----------- -------------------- ----------- @@ -252,7 +252,7 @@ DNO DNAME DREGION >> >>select dno,dname,sum(salary), max(dregion) +>from t01emp rows10000 natural join t01dept rows1000 -+>group by dno,dname for browse access; ++>group by dno,dname; DNO DNAME (EXPR) (EXPR) ----------- -------------------- --------------------- ----------- @@ -271,7 +271,7 @@ DNO DNAME (EXPR) (EXPR) +>from (select eno + dregion, dno, dname, salary +> from t01emp rows10000 natural join t01dept rows1000) +> as t("eno + dregion",dno,dname,salary) -+>group by "eno + dregion",dno,dname for browse access; ++>group by "eno + dregion",dno,dname; eno + dregion DNO DNAME SAL -------------------- ----------- -------------------- --------------------- @@ -287,7 +287,7 @@ eno + dregion DNO DNAME SAL >> >>select dname,sum(salary), max(dregion) +>from t01emp rows10000 natural join t01dept rows1000 -+>group by dname for browse access; ++>group by dname; DNAME (EXPR) (EXPR) -------------------- --------------------- ----------- @@ -4435,7 +4435,7 @@ Smith 2000.00 +> join t01emp rows15e4 on rows14e4.eno = rows15e4.eno +> join t01emp rows16e4 on rows15e4.eno = rows16e4.eno +>group by rows12e4.eno,rows13e4.eno,rows14e4.eno,rows15e4.eno,rows16e4.eno -+>for browse access; ++>; (EXPR) ENO ENO ENO ENO ENO -------------------- ----------- ----------- ----------- ----------- ----------- @@ -4855,7 +4855,7 @@ LC RC OP OPERATOR OPT DESCRIPTION CARD *** WARNING[6020] Due to query complexity, the query plan generated might be sub-optimal. Consider simplifying the query. -*** WARNING[2053] Optimizer pass two assertion failure (hasEnoughMemory) in file ../optimizer/opt.cpp at line 7063. Attempting to recover and produce a plan. +*** WARNING[2053] Optimizer pass two assertion failure (hasEnoughMemory) in file ../optimizer/opt.cpp at line 6974. Attempting to recover and produce a plan. --- SQL command prepared. >> http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/compGeneral/EXPECTEDTOK ---------------------------------------------------------------------- diff --git a/core/sql/regress/compGeneral/EXPECTEDTOK b/core/sql/regress/compGeneral/EXPECTEDTOK new file mode 100644 index 0000000..b39dd41 --- /dev/null +++ b/core/sql/regress/compGeneral/EXPECTEDTOK @@ -0,0 +1,46 @@ +sqlparser.y: warning: 73 shift/reduce conflicts [-Wconflicts-sr] +sqlparser.y: warning: 12 reduce/reduce conflicts [-Wconflicts-rr] + +nnnn conflicts: 1 shift/reduce nnnn olap_sequence_function: set_function_specification . TOK_OVER '(' opt_olap_part_clause opt_olap_order_clause ')' +nnnn conflicts: 1 shift/reduce nnnn value_expression: value_expression_sans_collate . collation_option +nnnn conflicts: 8 shift/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 shift/reduce nnnn sql_statement: TOK_BEGIN . TOK_DECLARE TOK_SECTION +nnnn conflicts: 9 shift/reduce nnnn row_subquery: '(' row_subquery . ')' +nnnn conflicts: 1 reduce/reduce nnnn row_subquery: rel_subquery . +nnnn conflicts: 1 reduce/reduce nnnn transaction_statement: TOK_BEGIN . +nnnn conflicts: 1 shift/reduce nnnn show_statement: TOK_SHOWCONTROL showcontrol_type . optional_control_identifier optional_comma_match_clause +nnnn conflicts: 1 shift/reduce nnnn extended_label_name: TOK_INDEX . label_name +nnnn conflicts: 1 shift/reduce nnnn table_as_stream_any: table_as_stream . +nnnn conflicts: 1 shift/reduce nnnn row_subquery: '(' row_subquery . ')' +nnnn conflicts: 1 shift/reduce nnnn input_hostvar_expression: HOSTVAR . +nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . +nnnn conflicts: 2 shift/reduce nnnn value_expression_list_comma: value_expression . ',' value_expression +nnnn conflicts: 1 shift/reduce nnnn value_expression_list_comma: value_expression . ',' value_expression +nnnn conflicts: 1 shift/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 shift/reduce nnnn control_statement: TOK_CONTROL TOK_QUERY TOK_SHAPE . query_shape_options query_shape_control +nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_PROCEDURES . +nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_FUNCTIONS . +nnnn conflicts: 1 shift/reduce nnnn drop_catalog_statement: TOK_DROP TOK_CATALOG . catalog_name extension_drop_behavior +nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_TABLE_MAPPING TOK_FUNCTIONS . +nnnn conflicts: 13 shift/reduce nnnn query_spec_body: query_select_list table_expression . access_type optional_lock_mode +nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . +nnnn conflicts: 1 shift/reduce nnnn query_shape_control: shape_identifier . +nnnn conflicts: 2 shift/reduce, 1 reduce/reduce nnnn query_exp_for_cursor: query_expression . for_update_spec +nnnn conflicts: 13 shift/reduce nnnn query_spec_body: query_select_list into_clause table_expression . access_type optional_lock_mode +nnnn conflicts: 1 shift/reduce nnnn query_spec_body: query_select_list table_expression access_type . optional_lock_mode +nnnn conflicts: 1 shift/reduce nnnn mv_definition: create_mv_keywords ddl_qualified_name optional_view_column_list refresh_type . create_mv_attribute_table_lists mv_initialization_clause optional_query_rewrite optional_create_mv_file_options optional_in_memory_clause as_token query_expression +nnnn conflicts: 1 shift/reduce nnnn table_name_and_hint: table_name . optimizer_hint hbase_access_options +nnnn conflicts: 1 shift/reduce nnnn table_reference: table_as_procedure . +nnnn conflicts: 1 shift/reduce nnnn table_reference: table_as_stream_any . +nnnn conflicts: 1 shift/reduce nnnn table_reference: table_as_tmudf_function . +nnnn conflicts: 1 shift/reduce nnnn table_reference: rel_subquery . +nnnn conflicts: 1 shift/reduce nnnn query_spec_body: query_select_list into_clause table_expression access_type . optional_lock_mode +nnnn conflicts: 1 shift/reduce nnnn file_attribute_clause: file_attribute_keyword file_attribute_list . +nnnn conflicts: 1 shift/reduce nnnn id_group: '(' identifier . ')' TOK_TO identifier +nnnn conflicts: 1 reduce/reduce nnnn table_reference: '(' Front_Of_Insert . Rest_Of_insert_statement ')' as_clause +nnnn conflicts: 1 shift/reduce nnnn transpose_list: transpose_set . +nnnn conflicts: 1 shift/reduce nnnn salt_by_clause: TOK_SALT TOK_USING NUMERIC_LITERAL_EXACT_NO_SCALE TOK_PARTITIONS . optional_salt_num_regions optional_salt_column_list +nnnn conflicts: 1 shift/reduce nnnn pipeline_clause: TOK_PIPELINE '(' pipeline_mv_name_list ')' . pipeline_def_list http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/compGeneral/EXPECTEDTOK2 ---------------------------------------------------------------------- diff --git a/core/sql/regress/compGeneral/EXPECTEDTOK2 b/core/sql/regress/compGeneral/EXPECTEDTOK2 index 80c5e22..87d8497 100644 --- a/core/sql/regress/compGeneral/EXPECTEDTOK2 +++ b/core/sql/regress/compGeneral/EXPECTEDTOK2 @@ -1,4 +1,4 @@ -sqlparser.y: warning: 72 shift/reduce conflicts [-Wconflicts-sr] +sqlparser.y: warning: 62 shift/reduce conflicts [-Wconflicts-sr] sqlparser.y: warning: 12 reduce/reduce conflicts [-Wconflicts-rr] nnnn conflicts: 1 shift/reduce nnnn olap_sequence_function: set_function_specification . TOK_OVER '(' opt_olap_part_clause opt_olap_order_clause ')' @@ -22,14 +22,14 @@ nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_PROCEDURES . nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_FUNCTIONS . nnnn conflicts: 1 shift/reduce nnnn drop_catalog_statement: TOK_DROP TOK_CATALOG . catalog_name extension_drop_behavior nnnn conflicts: 1 reduce/reduce nnnn procedure_or_function: TOK_TABLE_MAPPING TOK_FUNCTIONS . -nnnn conflicts: 13 shift/reduce nnnn query_spec_body: query_select_list table_expression . access_type optional_lock_mode +nnnn conflicts: 8 shift/reduce nnnn query_spec_body: query_select_list table_expression . access_type optional_lock_mode nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . nnnn conflicts: 1 reduce/reduce nnnn primary: row_subquery . nnnn conflicts: 1 shift/reduce nnnn query_shape_control: shape_identifier . nnnn conflicts: 2 shift/reduce, 1 reduce/reduce nnnn query_exp_for_cursor: query_expression . for_update_spec -nnnn conflicts: 13 shift/reduce nnnn query_spec_body: query_select_list into_clause table_expression . access_type optional_lock_mode +nnnn conflicts: 8 shift/reduce nnnn query_spec_body: query_select_list into_clause table_expression . access_type optional_lock_mode nnnn conflicts: 1 shift/reduce nnnn query_spec_body: query_select_list table_expression access_type . optional_lock_mode nnnn conflicts: 1 shift/reduce nnnn mv_definition: create_mv_keywords ddl_qualified_name optional_view_column_list refresh_type . create_mv_attribute_table_lists mv_initialization_clause optional_query_rewrite optional_create_mv_file_options optional_in_memory_clause as_token query_expression nnnn conflicts: 1 shift/reduce nnnn table_name_and_hint: table_name . optimizer_hint hbase_access_options http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/compGeneral/TEST001 ---------------------------------------------------------------------- diff --git a/core/sql/regress/compGeneral/TEST001 b/core/sql/regress/compGeneral/TEST001 index d8f33ca..4dece52 100755 --- a/core/sql/regress/compGeneral/TEST001 +++ b/core/sql/regress/compGeneral/TEST001 @@ -162,12 +162,12 @@ group by dno,dname; -- modify the statistics such that the pushed down groupby wins select dno,dname,sum(salary) from t01emp rows10000 natural join t01dept rows1000 -group by dno,dname for browse access; +group by dno,dname; -- set showshape off; -- exchange join and groupby and add count(*) > 0 clause to the groupby -select distinct t01dept.* from t01emp,t01dept for browse access; +select distinct t01dept.* from t01emp,t01dept; -- won't push down, aggregate function references both tables -- (later, add a rewrite rule for groupby that eliminates max(region)) @@ -176,7 +176,7 @@ select distinct t01dept.* from t01emp,t01dept for browse access; select dno,dname,sum(salary), max(dregion) from t01emp rows10000 natural join t01dept rows1000 -group by dno,dname for browse access; +group by dno,dname; -- can't push down, groupby column "eno + dregion" references both tables @@ -186,13 +186,13 @@ select "eno + dregion",dno,dname,sum(salary) as sal from (select eno + dregion, dno, dname, salary from t01emp rows10000 natural join t01dept rows1000) as t("eno + dregion",dno,dname,salary) -group by "eno + dregion",dno,dname for browse access; +group by "eno + dregion",dno,dname; -- can't push down, groupby columns don't cover t01dept.key select dname,sum(salary), max(dregion) from t01emp rows10000 natural join t01dept rows1000 -group by dname for browse access; +group by dname; -- set showshape off; @@ -225,7 +225,7 @@ from t01emp t1 join t01emp rows12e4 on t1.eno <> rows12e4.eno join t01emp rows15e4 on rows14e4.eno = rows15e4.eno join t01emp rows16e4 on rows15e4.eno = rows16e4.eno group by rows12e4.eno,rows13e4.eno,rows14e4.eno,rows15e4.eno,rows16e4.eno -for browse access; +; -- set showshape off; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/core/EXPECTED020.SB ---------------------------------------------------------------------- diff --git a/core/sql/regress/core/EXPECTED020.SB b/core/sql/regress/core/EXPECTED020.SB index 41440e0..61689a3 100644 --- a/core/sql/regress/core/EXPECTED020.SB +++ b/core/sql/regress/core/EXPECTED020.SB @@ -640,7 +640,7 @@ TRAFODION_SCAN >>-- work. >>#ifMX >>explain options 'f' select * from TAB1 where col1 < 15 -+> for serializable access; ++> for read committed access; LC RC OP OPERATOR OPT DESCRIPTION CARD ---- ---- ---- -------------------- -------- -------------------- --------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/core/EXPECTED037.SB ---------------------------------------------------------------------- diff --git a/core/sql/regress/core/EXPECTED037.SB b/core/sql/regress/core/EXPECTED037.SB index af2239b..c5c1e28 100755 --- a/core/sql/regress/core/EXPECTED037.SB +++ b/core/sql/regress/core/EXPECTED037.SB @@ -75,7 +75,7 @@ >>invoke table_name; -- Definition of Trafodion table TRAFODION.SCH.TABLE_NAME --- Definition current Tue Jul 19 01:27:42 2016 +-- Definition current Thu Dec 7 05:50:27 2017 ( SYSKEY LARGEINT NO DEFAULT NOT NULL NOT DROPPABLE @@ -224,7 +224,7 @@ >>invoke system_name; -- Definition of Trafodion table TRAFODION.SCH.SYSTEM_NAME --- Definition current Tue Jul 19 01:27:44 2016 +-- Definition current Thu Dec 7 05:50:32 2017 ( SYSKEY LARGEINT NO DEFAULT NOT NULL NOT DROPPABLE @@ -2860,7 +2860,7 @@ SELECT TRAILING TRAILING from (values(0)) TRAILING(TRAILING); *** ERROR[15001] A syntax error occurred at or before: SELECT UNIQUE UNIQUE from (values(0)) UNIQUE(UNIQUE); - ^ (13 characters from start of SQL statement) + ^ (20 characters from start of SQL statement) *** ERROR[8822] The statement was not prepared. @@ -2870,7 +2870,7 @@ SELECT UNIQUE UNIQUE from (values(0)) UNIQUE(UNIQUE); *** ERROR[15001] A syntax error occurred at or before: SELECT UPDATE UPDATE from (values(0)) UPDATE(UPDATE); - ^ (13 characters from start of SQL statement) + ^ (20 characters from start of SQL statement) *** ERROR[8822] The statement was not prepared. @@ -4383,12 +4383,7 @@ SELECT DUAL DUAL from (values(0)) DUAL(DUAL); >>-- Expect SYNTAX error - A matching pair >>prepare s1 from SELECT BROWSE ACCESS from (values(0)) ACCESS(BROWSE); -*** ERROR[15001] A syntax error occurred at or before: -SELECT BROWSE ACCESS from (values(0)) ACCESS(BROWSE); - ^ (20 characters from start of SQL statement) - -*** ERROR[8822] The statement was not prepared. - +--- SQL command prepared. >> >>-- Expect success >>prepare s1 from SELECT BROWSE BROWSE from (values(0)) BROWSE(BROWSE); @@ -4763,12 +4758,7 @@ SELECT SKIP CONFLICT from (values(0)) CONFLICT(SKIP); >>-- Expect SYNTAX error - A matching pair >>prepare s1 from SELECT STABLE ACCESS from (values(0)) ACCESS(STABLE); -*** ERROR[15001] A syntax error occurred at or before: -SELECT STABLE ACCESS from (values(0)) ACCESS(STABLE); - ^ (20 characters from start of SQL statement) - -*** ERROR[8822] The statement was not prepared. - +--- SQL command prepared. >> >>-- Expect success >>prepare s1 from SELECT STABLE BROWSE from (values(0)) BROWSE(STABLE); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/6dd81240/core/sql/regress/core/TEST020 ---------------------------------------------------------------------- diff --git a/core/sql/regress/core/TEST020 b/core/sql/regress/core/TEST020 index 20c5388..82937b8 100755 --- a/core/sql/regress/core/TEST020 +++ b/core/sql/regress/core/TEST020 @@ -411,7 +411,7 @@ operator -- work. #ifMX explain options 'f' select * from TAB1 where col1 < 15 - for serializable access; + for read committed access; #ifMX --QUERY 20
