You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by an...@apache.org on 2017/12/13 19:02:33 UTC
[11/12] incubator-trafodion git commit: JIRA TRAFODION-2834
Streamline supported xn access modes
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 <an...@esgyn.com>
Authored: Sat Dec 9 21:18:13 2017 +0000
Committer: Anoop Sharma <an...@esgyn.com>
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