You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by su...@apache.org on 2016/03/03 15:59:49 UTC

[5/8] incubator-trafodion git commit: JIRA TRAFODION-1798 (ddl xns) and few other fixes, details below.

JIRA TRAFODION-1798 (ddl xns) and few other fixes, details below.

-- support for sql part of ddl xns. Section 1 of JIRA TRAFODION-1798
-- cqd ddl_transactions to enable or disable ddl xns.
   Default is currently off. Once it is tested, it will be turned on.
   Dev regressions are run with cqd set to ON
-- get stmts run with read committed to get changes in current xns
-- support for where preds with get stmts
-- scan to pass in transid even if running with read uncommitted access.
   This enables rows modified in current xn to be returned.
-- cleanup no longer return multiple duplicate error messages if
   objects id is not found.
-- cleanup no longer includes internallay created schemas (_HV_ , _HB_)
   during cleanup operations.
-- Correct error msg was not getting returned if an invalid index
   existed in table and the same index was created again.
-- init traf, drop md views was giving an error if views didnt exist.
   That has been fixed.
-- regressions with -diff option now show original file timestamps
   instead of the timestamp when the diff command was run.


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/cd9f7a1a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/cd9f7a1a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/cd9f7a1a

Branch: refs/heads/master
Commit: cd9f7a1ae65ac4aca485fb30b98daf8a1ccce885
Parents: fabfc80
Author: Cloud User <an...@apache.org>
Authored: Mon Feb 29 05:39:02 2016 +0000
Committer: Cloud User <an...@apache.org>
Committed: Mon Feb 29 05:39:02 2016 +0000

----------------------------------------------------------------------
 .../transactional/TransactionManager.java       |  22 +-
 .../transactional/TransactionalScanner.java     |  14 +-
 .../java/org/trafodion/dtm/HBaseTxClient.java   |  14 +-
 core/sql/arkcmp/CmpContext.cpp                  |  12 +-
 core/sql/arkcmp/CmpContext.h                    |  18 +
 core/sql/arkcmp/CmpStatement.cpp                |  19 +-
 core/sql/arkcmp/CmpStatement.h                  |   1 +
 core/sql/bin/SqlciErrors.txt                    |   1 +
 core/sql/cli/Context.cpp                        | 106 +++-
 core/sql/cli/Context.h                          |  13 +-
 core/sql/cli/ExSqlComp.cpp                      |   5 +
 core/sql/comexe/CmpMessage.h                    |  23 +
 core/sql/common/ComSmallDefs.h                  |   9 +
 core/sql/common/DateTimeType.cpp                |   3 +-
 core/sql/executor/ExExeUtil.h                   |   1 +
 core/sql/executor/ExExeUtilGet.cpp              |  55 +-
 core/sql/executor/HBaseClient_JNI.cpp           |  16 +-
 core/sql/executor/HBaseClient_JNI.h             |   4 +-
 core/sql/executor/ex_ddl.cpp                    |   2 +
 core/sql/executor/ex_transaction.cpp            | 270 ++++-----
 core/sql/executor/ex_transaction.h              |   2 +-
 core/sql/exp/ExpHbaseInterface.cpp              |  26 +-
 core/sql/exp/ExpHbaseInterface.h                |   4 +-
 core/sql/generator/GenRelExeUtil.cpp            |  31 +-
 core/sql/generator/GenRelMisc.cpp               |  13 +-
 core/sql/optimizer/NARoutine.cpp                |   2 +-
 core/sql/optimizer/NARoutineDB.h                |   4 +-
 core/sql/optimizer/NATable.cpp                  |  38 +-
 core/sql/optimizer/NATable.h                    |  10 +-
 core/sql/optimizer/RelExeUtil.cpp               | 155 +++---
 core/sql/optimizer/RelExeUtil.h                 |  30 +-
 core/sql/parser/SqlParserAux.cpp                |   2 +-
 core/sql/parser/StmtDDLAlter.cpp                |  11 +
 core/sql/parser/StmtDDLNode.cpp                 |  14 +
 core/sql/parser/StmtDDLNode.h                   |  15 +-
 core/sql/regress/core/DIFF116.KNOWN.SB          |  21 +
 core/sql/regress/core/EXPECTED056.SB            |  49 +-
 core/sql/regress/core/EXPECTED116               | 542 +++++++++++--------
 core/sql/regress/core/TEST056                   |   5 +-
 core/sql/regress/core/TEST116                   | 123 +++--
 core/sql/regress/executor/EXPECTED013.SB        |  27 +-
 core/sql/regress/executor/EXPECTED140           |  40 +-
 core/sql/regress/fullstack2/EXPECTED062         |   3 +
 core/sql/regress/fullstack2/EXPECTED062.RELEASE |   3 +
 core/sql/regress/seabase/EXPECTED010            | 460 +++++++++-------
 core/sql/regress/seabase/EXPECTED011            |  19 +-
 core/sql/regress/seabase/EXPECTED016            |  35 +-
 core/sql/regress/tools/runregr_catman1.ksh      |   3 +-
 core/sql/regress/tools/runregr_charsets.ksh     |   3 +-
 core/sql/regress/tools/runregr_compGeneral.ksh  |   3 +-
 core/sql/regress/tools/runregr_core.ksh         |   3 +-
 core/sql/regress/tools/runregr_executor.ksh     |   3 +-
 core/sql/regress/tools/runregr_fullstack2.ksh   |   3 +-
 core/sql/regress/tools/runregr_hive.ksh         |   4 +-
 core/sql/regress/tools/runregr_privs1.ksh       |   3 +-
 core/sql/regress/tools/runregr_privs2.ksh       |   3 +-
 core/sql/regress/tools/runregr_qat.ksh          |   3 +-
 core/sql/regress/tools/runregr_seabase.ksh      |   4 +-
 core/sql/regress/tools/runregr_udr.ksh          |   9 +-
 core/sql/regress/tools/sbdefs                   |   1 +
 core/sql/sqlcomp/CmpDescribe.cpp                |   6 +-
 core/sql/sqlcomp/CmpSeabaseDDL.h                |  37 +-
 core/sql/sqlcomp/CmpSeabaseDDLcleanup.cpp       |  42 +-
 core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp        | 250 ++++++---
 core/sql/sqlcomp/CmpSeabaseDDLindex.cpp         |  98 +++-
 core/sql/sqlcomp/CmpSeabaseDDLrepos.cpp         |   2 +-
 core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp       |   8 +-
 core/sql/sqlcomp/CmpSeabaseDDLschema.cpp        |  26 +-
 core/sql/sqlcomp/CmpSeabaseDDLtable.cpp         | 419 ++++++++------
 core/sql/sqlcomp/CmpSeabaseDDLupgrade.cpp       |  14 +-
 core/sql/sqlcomp/CmpSeabaseDDLupgrade.h         |   6 +-
 core/sql/sqlcomp/CmpSeabaseDDLview.cpp          |  30 +-
 .../java/org/trafodion/sql/HBaseClient.java     |  37 +-
 73 files changed, 2095 insertions(+), 1217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionManager.java
----------------------------------------------------------------------
diff --git a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionManager.java b/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionManager.java
index 5b52aef..b6afc5c 100644
--- a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionManager.java
+++ b/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionManager.java
@@ -1854,6 +1854,12 @@ public class TransactionManager {
         //requests is recorded, then those tables need to disabled as part of prepare.
         if(transactionState.hasDDLTx())
         {
+            if (LOG.isTraceEnabled()) LOG.trace("prepareCommit process DDL operations, txid: " + transactionState.getTransactionId());
+
+            //since DDL is involved, mark this prepare allReadOnly as false.
+            //There are cases such as initialize drop, that only has DDL operations. 
+             allReadOnly = false;
+
             //if tables were created, then nothing else needs to be done.
             //if tables were recorded dropped, then they need to be disabled.
             //Disabled tables will ultimately be deleted in commit phase.
@@ -2127,6 +2133,10 @@ public class TransactionManager {
                 //return; //Do not return here. This thread should continue servicing DDL operations.
             }
 
+            if (LOG.isDebugEnabled()) LOG.debug("doCommit() [" + transactionState.getTransactionId()
+                              + "] performing commit DDL");
+
+
             try{
                 doCommitDDL(transactionState);
 
@@ -2139,6 +2149,8 @@ public class TransactionManager {
 
     public void doCommitDDL(final TransactionState transactionState) throws UnsuccessfulDDLException
     {
+      
+        if (LOG.isTraceEnabled()) LOG.trace("doCommitDDL  ENTRY [" + transactionState.getTransactionId() + "]"); 
 
         //if tables were created, then nothing else needs to be done.
         //if tables were recorded dropped, then they need to be physically dropped.
@@ -2265,6 +2277,9 @@ public class TransactionManager {
             }
         }
     }while (retryCount < RETRY_ATTEMPTS && retry == true);
+
+    if (LOG.isTraceEnabled()) LOG.trace("doCommitDDL  EXIT [" + transactionState.getTransactionId() + "]");
+
 }
 
 
@@ -2981,8 +2996,8 @@ public class TransactionManager {
         }
         catch (TableNotEnabledException e) {
             //If table is not enabled, no need to throw exception. Continue.
-            if (LOG.isTraceEnabled()) LOG.trace("deleteTable , TableNotEnabledException. This could be a expected exception.  Step: disableTable, TxId: " +
-                transactionState.getTransactionId() + "TableName" + tblName + "Exception: " + e);
+            //if (LOG.isTraceEnabled()) LOG.trace("deleteTable , TableNotEnabledException. This is a expected exception.  Step: disableTable, TxId: " +
+            //    transactionState.getTransactionId() + "TableName" + tblName + "Exception: " + e);
         }
         catch (Exception e) {
             LOG.error("deleteTable Exception TxId: " + transactionState.getTransactionId() + "TableName" + tblName + "Exception: " + e);
@@ -3042,7 +3057,8 @@ public class TransactionManager {
             hbadmin.disableTable(tblName);
         }
         catch (Exception e) {
-            LOG.error("disableTable Exception TxId: " + transactionState.getTransactionId() + "TableName" + tblName + "Exception: " + e);
+            //LOG.error("disableTable Exception TxId: " + transactionState.getTransactionId() + "TableName" + tblName + "Exception: " + e);
+            //Let the caller handle this exception since table being disabled could be redundant many times.
             throw e;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionalScanner.java
----------------------------------------------------------------------
diff --git a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionalScanner.java b/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionalScanner.java
index 379b1b0..529b221 100755
--- a/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionalScanner.java
+++ b/core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TransactionalScanner.java
@@ -51,7 +51,7 @@ import org.apache.hadoop.hbase.util.Bytes;
 
 import com.google.protobuf.ServiceException;
 import com.google.protobuf.ByteString;
-
+import org.apache.commons.codec.binary.Hex;
 
 /*
  *   Transaction Scanner
@@ -171,19 +171,21 @@ public class TransactionalScanner extends AbstractClientScanner {
                 return false;
             }
             else
-                this.currentBeginKey = TransactionManager.binaryIncrementPos(this.currentEndKey,1);
+                //this.currentBeginKey = TransactionManager.binaryIncrementPos(this.currentEndKey,1);
+                  this.currentBeginKey = this.currentEndKey;
         }
         else {
             // First call to nextScanner
             this.currentBeginKey = this.scan.getStartRow();
         }
 
-        this.currentRegion = ttable.getRegionLocation(this.currentBeginKey).getRegionInfo();
+        this.currentRegion = ttable.getRegionLocation(this.currentBeginKey, false).getRegionInfo();
         this.currentEndKey = this.currentRegion.getEndKey();
 
-        if(LOG.isTraceEnabled()) LOG.trace("Region Info: " + currentRegion.getRegionNameAsString());
-        if(this.currentEndKey != HConstants.EMPTY_END_ROW)
-            this.currentEndKey = TransactionManager.binaryIncrementPos(currentRegion.getEndKey(), -1);
+        if(LOG.isTraceEnabled()) LOG.trace("nextScanner() txID: " + ts.getTransactionId() + " Region Info: " + currentRegion.getRegionNameAsString()+ 
+                         "currentBeginKey: " + Hex.encodeHexString(this.currentBeginKey) + "currentEndKey: " + Hex.encodeHexString(this.currentEndKey));
+        //if(this.currentEndKey != HConstants.EMPTY_END_ROW)
+        //   this.currentEndKey = TransactionManager.binaryIncrementPos(currentRegion.getEndKey(), -1);
 
         this.closed = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sqf/src/seatrans/tm/hbasetmlib2/src/main/java/org/trafodion/dtm/HBaseTxClient.java
----------------------------------------------------------------------
diff --git a/core/sqf/src/seatrans/tm/hbasetmlib2/src/main/java/org/trafodion/dtm/HBaseTxClient.java b/core/sqf/src/seatrans/tm/hbasetmlib2/src/main/java/org/trafodion/dtm/HBaseTxClient.java
index 22513cd..9275eeb 100644
--- a/core/sqf/src/seatrans/tm/hbasetmlib2/src/main/java/org/trafodion/dtm/HBaseTxClient.java
+++ b/core/sqf/src/seatrans/tm/hbasetmlib2/src/main/java/org/trafodion/dtm/HBaseTxClient.java
@@ -885,8 +885,18 @@ public class HBaseTxClient {
           return 0;
        }
        int participants = ts.getParticipantCount() - ts.getRegionsToIgnoreCount();
-       if (LOG.isTraceEnabled()) LOG.trace("Exit participatingRegions , txid: [" + transactionId + "] " + participants + " participants");
-       return (ts.getParticipantCount() - ts.getRegionsToIgnoreCount());
+       if (LOG.isTraceEnabled()) LOG.trace("Exit participatingRegions , txid: [" + transactionId + "] " + participants + " participants" +
+                                            "hasDDL Operation: " + ts.hasDDLTx());
+    
+       //In some scenarios, it is possible only DDL operation is performed
+       //within a transaction, example initialize trafodion, drop; In this
+       //scenario, region participation is zero. For the prepareCommit to
+       //continue to doCommit, there needs to be atleast one participant.
+       if(participants == 0 && ts.hasDDLTx())
+           participants++;
+
+       //return (ts.getParticipantCount() - ts.getRegionsToIgnoreCount());
+       return participants;
    }
 
    public long addControlPoint() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/arkcmp/CmpContext.cpp
----------------------------------------------------------------------
diff --git a/core/sql/arkcmp/CmpContext.cpp b/core/sql/arkcmp/CmpContext.cpp
index 0ed31c3..55dd5fd 100644
--- a/core/sql/arkcmp/CmpContext.cpp
+++ b/core/sql/arkcmp/CmpContext.cpp
@@ -906,7 +906,17 @@ CmpContext::compileDirect(char *data, UInt32 data_len, CollHeap *outHeap,
         break;
       } // end of case (CmpMessageObj::SET_TRANS)
 
-      case (CmpMessageObj::INTERNALSP_REQUEST) :
+       case (CmpMessageObj::DDL_NATABLE_INVALIDATE) :
+      {
+        cmpStatement = new CTXTHEAP CmpStatement(this);
+        CmpMessageDDLNATableInvalidate ddlInvalidateStmt(data, data_len, CTXTHEAP);
+        Assign_SqlParser_Flags(parserFlags);
+        rs = cmpStatement->process(ddlInvalidateStmt);
+        copyData = TRUE;
+        break;
+      } // end of case (CmpMessageObj::DDL_NATABLE_INVALIDATE)
+
+     case (CmpMessageObj::INTERNALSP_REQUEST) :
       { 
         //request is from ExStoredProcTcb::work(), 
         cmpStatement = new CTXTHEAP CmpStatementISP(this);

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/arkcmp/CmpContext.h
----------------------------------------------------------------------
diff --git a/core/sql/arkcmp/CmpContext.h b/core/sql/arkcmp/CmpContext.h
index d2dc339..2ef7133 100644
--- a/core/sql/arkcmp/CmpContext.h
+++ b/core/sql/arkcmp/CmpContext.h
@@ -467,6 +467,18 @@ public :
   void addRoutineHandle(Int32 rh)
                                  { routineHandles_.insert(rh); }
 
+  // Used to keep track of objects that were part of ddl operations within
+  // a transactional begin/commit(rollback) session.
+  // Used at commit time for NATable cache invalidation.
+  struct DDLObjInfo
+  {
+    NAString ddlObjName;
+    ComQiScope qiScope;
+    ComObjectType ot;
+  };
+
+  NAList<DDLObjInfo>& ddlObjsList() { return ddlObjs_; }
+
 // MV
 private:
 // Adding support for multi threaded requestor (multi transactions) handling
@@ -481,6 +493,7 @@ private:
   void swithcContext();
   CmpStatementISP* getISPStatement(Int64 id);
 // MV
+
 private:
 
   CmpContext(const CmpContext &);
@@ -621,6 +634,11 @@ private:
   // CmpSeabaseDDL::sendAllControlsAndFlags(), so that we don't send
   // them again, see that method for more info.
   Int32 allControlCount_;
+
+  // Used to keep track of objects that were part of ddl operations within
+  // a transactional begin/commit(rollback) session.
+  // Used at commit time for NATable cache invalidation.
+  NAList<DDLObjInfo> ddlObjs_;
   
 }; // end of CmpContext 
 #pragma warn(1506)  // warning elimination 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/arkcmp/CmpStatement.cpp
----------------------------------------------------------------------
diff --git a/core/sql/arkcmp/CmpStatement.cpp b/core/sql/arkcmp/CmpStatement.cpp
index b407d6a..377c33d 100644
--- a/core/sql/arkcmp/CmpStatement.cpp
+++ b/core/sql/arkcmp/CmpStatement.cpp
@@ -1097,7 +1097,8 @@ CmpStatement::process(const CmpMessageDDLwithStatus &statement)
     {
       CmpSeabaseMDupgrade cmpMDU(heap_);
       
-      if (cmpMDU.executeSeabaseMDupgrade(dws,
+      NABoolean ddlXns = (CmpCommon::getDefault(DDL_TRANSACTIONS) == DF_ON);
+      if (cmpMDU.executeSeabaseMDupgrade(dws, ddlXns,
                                          currCatName, currSchName))
         return CmpStatement_ERROR;
     }
@@ -1237,6 +1238,18 @@ CmpStatement::process (const CmpMessageSetTrans& statement)
 }
 
 CmpStatement::ReturnStatus
+CmpStatement::process (const CmpMessageDDLNATableInvalidate& statement)
+{
+  CmpSeabaseDDL cmpSBD(heap_);
+  if (cmpSBD.ddlInvalidateNATables())
+    {
+      return CmpStatement_ERROR;
+    }
+
+  return CmpStatement_SUCCESS;
+}
+
+CmpStatement::ReturnStatus
 CmpStatement::process(const CmpMessageDatabaseUser &statement)
 {
   NABoolean doDebug = FALSE;
@@ -1349,6 +1362,10 @@ CmpStatement::process (const CmpMessageObj& request)
 	ret = process(*(CmpMessageSetTrans*)(&request));
 	break;
 
+      case (CmpMessageObj::DDL_NATABLE_INVALIDATE) :
+	ret = process(*(CmpMessageDDLNATableInvalidate*)(&request));
+	break;
+
       case (CmpMessageObj::DATABASE_USER) :
 	ret = process(*(CmpMessageDatabaseUser*)(&request));
 	break;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/arkcmp/CmpStatement.h
----------------------------------------------------------------------
diff --git a/core/sql/arkcmp/CmpStatement.h b/core/sql/arkcmp/CmpStatement.h
index 78a79ca..bc0660c 100644
--- a/core/sql/arkcmp/CmpStatement.h
+++ b/core/sql/arkcmp/CmpStatement.h
@@ -95,6 +95,7 @@ public:
   ReturnStatus process(const CmpMessageDescribe&);
   ReturnStatus process(const CmpMessageUpdateHist&);
   ReturnStatus process(const CmpMessageSetTrans&);
+  ReturnStatus process(const CmpMessageDDLNATableInvalidate&);
   ReturnStatus process(const CmpMessageDatabaseUser&);
   ReturnStatus process(const CmpMessageEndSession&);
   ReturnStatus process(const CmpMessageDDLwithStatus&);

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/bin/SqlciErrors.txt
----------------------------------------------------------------------
diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt
index 163c677..084a4fd 100644
--- a/core/sql/bin/SqlciErrors.txt
+++ b/core/sql/bin/SqlciErrors.txt
@@ -407,6 +407,7 @@
 1428 ZZZZZ 99999 BEGINNER MINOR DBADMIN Metadata definitions could not be created and preloaded in global MDdescInfo struct. Make sure that metadata table definition syntax is correct.
 1429 ZZZZZ 99999 BEGINNER MINOR DBADMIN Inserts into _ROW_ format external hbase tables can only use the VALUES clause and must use the column_create function to create values.
 1430 3F000 99999 BEGINNER MAJOR DBADMIN A schema name that starts and ends with an "_"(underscore) is reserved for internal usage. It cannot be used to create a user schema.
+1431 ZZZZZ 99999 BEGINNER MINOR DBADMIN Object $0~String0 exists in HBase. This could be due to a concurrent transactional ddl operation in progress on this table.
 1500 ZZZZZ 99999 ADVANCED CRTCL DIALOUT The CATSYS - CAT_REFERENCES system schema relationship for catalog $0~CatalogName might be corrupt.
 1501 ZZZZZ 99999 UUUUUUUU UUUUU UUUUUUU --- unused as of 5/7/12 ---
 1502 ZZZZZ 99999 ADVANCED CRTCL DIALOUT The OBJECTS - REPLICAS definition schema relationship for $0~String0 $1~TableName might be corrupt.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/cli/Context.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/Context.cpp b/core/sql/cli/Context.cpp
index e50818e..a0288f7 100644
--- a/core/sql/cli/Context.cpp
+++ b/core/sql/cli/Context.cpp
@@ -173,11 +173,10 @@ ContextCli::ContextCli(CliGlobals *cliGlobals)
     lobGlobals_(NULL),
     seqGen_(NULL),
     dropInProgress_(FALSE),
-#ifdef NA_CMPDLL
     isEmbeddedArkcmpInitialized_(FALSE),
-    embeddedArkcmpContext_(NULL)
-#endif // NA_CMPDLL
-    , numCliCalls_(0)
+    embeddedArkcmpContext_(NULL),
+    ddlStmtsExecuted_(FALSE)
+   , numCliCalls_(0)
    , jniErrorStr_(&exHeap_)
    , hbaseClientJNI_(NULL)
    , hiveClientJNI_(NULL)
@@ -4176,6 +4175,105 @@ void ContextCli::closeAllTables()
 {
 }
 
+// this method is used to send a transaction operation specific message
+// to arkcmp by executor.
+// Based on that, arkcmp takes certain actions.
+// Called from executor/ex_transaction.cpp.
+// Note: most of the code in this method has been moved from ex_transaction.cpp
+ExSqlComp::ReturnStatus ContextCli::sendXnMsgToArkcmp
+(char * data, Lng32 dataSize, 
+ Lng32 xnMsgType, ComDiagsArea* &diagsArea)
+{
+  // send the set trans request to arkcmp so compiler can
+  // set this trans mode in its memory. This is done so any
+  // statement compiled after this could be compiled with the
+  // current trans mode.
+  ExSqlComp *cmp = NULL;
+  ExSqlComp::ReturnStatus cmpStatus ;
+  // the dummyReply is moved up because otherwise the 
+  // compiler would complain about
+  // initialization of variables afer goto statements.
+  
+  char* dummyReply = NULL;
+  ULng32 dummyLength;
+  ContextCli *currCtxt = this;
+  Int32 cmpRet = 0;
+
+  // If use embedded compiler, send the settings to it
+  if (currCtxt->getSessionDefaults()->callEmbeddedArkcmp() &&
+      currCtxt->isEmbeddedArkcmpInitialized() &&  
+      (CmpCommon::context()) &&
+      (CmpCommon::context()->getRecursionLevel() == 0))
+    {
+      NAHeap *arkcmpHeap = currCtxt->exHeap();
+      
+      cmpRet = CmpCommon::context()->compileDirect(
+           data, dataSize,
+           arkcmpHeap,
+           SQLCHARSETCODE_UTF8,
+           CmpMessageObj::MessageTypeEnum(xnMsgType),
+           dummyReply, dummyLength,
+           currCtxt->getSqlParserFlags(),
+           NULL, 0);
+      if (cmpRet != 0)
+        {
+          char emsText[120];
+          str_sprintf(emsText,
+                      "Set transaction mode to embedded arkcmp failed, return code %d",
+                      cmpRet);
+          SQLMXLoggingArea::logExecRtInfo(__FILE__, __LINE__, emsText, 0);
+          diagsArea = CmpCommon::diags();
+        }
+      
+      if (dummyReply != NULL)
+        {
+          arkcmpHeap->deallocateMemory((void*)dummyReply);
+          dummyReply = NULL;
+        }
+    }
+
+  if (!currCtxt->getSessionDefaults()->callEmbeddedArkcmp()  || 
+      (currCtxt->getSessionDefaults()->callEmbeddedArkcmp() && 
+       ((cmpRet != 0) || 
+        (CmpCommon::context()->getRecursionLevel() > 0) ||
+        currCtxt->getArkcmp()->getServer())
+       )
+      )
+    {
+      for (short i = 0; i < currCtxt->getNumArkcmps();i++)
+        {
+          cmp = currCtxt->getArkcmp(i);
+          cmpStatus = cmp->sendRequest(CmpMessageObj::MessageTypeEnum(xnMsgType),
+                                       data, dataSize,
+                                       TRUE, NULL,
+                                       SQLCHARSETCODE_UTF8,
+                                       TRUE /*resend, if needed*/
+                                       );
+          
+          if (cmpStatus != ExSqlComp::SUCCESS) {
+            diagsArea = cmp->getDiags();
+            // If its an error don't proceed further.
+            if (cmpStatus == ExSqlComp::ERROR)
+              return cmpStatus;
+          }
+	  
+          cmpStatus = cmp->getReply(dummyReply, dummyLength);
+          cmp->getHeap()->deallocateMemory((void*)dummyReply);
+          if (cmpStatus != ExSqlComp::SUCCESS) {
+            diagsArea = cmp->getDiags();
+            //Don't proceed if its an error.
+            if (cmpStatus == ExSqlComp::ERROR)
+              return cmpStatus;
+          }
+	  
+          if (cmp->status() != ExSqlComp::FETCHED)
+            diagsArea = cmp->getDiags();
+        } // for
+    }
+  
+  return ExSqlComp::SUCCESS;
+}
+
 Lng32 ContextCli::setSecInvalidKeys(
            /* IN */    Int32 numSiKeys,
            /* IN */    SQL_QIKEY siKeys[])

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/cli/Context.h
----------------------------------------------------------------------
diff --git a/core/sql/cli/Context.h b/core/sql/cli/Context.h
index 2b1c6b5..ba556c0 100644
--- a/core/sql/cli/Context.h
+++ b/core/sql/cli/Context.h
@@ -59,6 +59,7 @@
 #ifdef NA_CMPDLL
 #include "CmpCommon.h"
 #endif // NA_CMPDLL
+#include "ExSqlComp.h"
 #include "ExStats.h"
 #include "ExpSeqGen.h"
 #include "ssmpipc.h"
@@ -209,6 +210,10 @@ public:
   LmRoutine *findTrustedRoutine(CollIndex ix);
   void putTrustedRoutine(CollIndex ix);
 
+  ExSqlComp::ReturnStatus sendXnMsgToArkcmp
+  (char * data, Lng32 dataSize, 
+   Lng32 xnMsgType, ComDiagsArea* &diagsArea);
+    
 private:
 
   // The heap where executor 'stuff' will be allocated from.
@@ -472,6 +477,10 @@ private:
   bool cbServerInUse_;
   NABoolean dropInProgress_;
 
+  // set to true if ddl stmts are issued.
+  // Reset at begin and commit Xn. Used to do NATable invalidation
+  // for ddl stmts issued within a transaction.
+  NABoolean ddlStmtsExecuted_;
 
   //   
   //
@@ -835,7 +844,9 @@ SQLCLI_LIB_FUNC
 
   ExTransaction * getTransaction()	{ return transaction_; }
 
-Lng32 setAuthID(
+  NABoolean &ddlStmtsExecuted() { return ddlStmtsExecuted_; }
+
+  Lng32 setAuthID(
    const char * externalUsername,
    const char * databaseUsername,
    const char * authToken,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/cli/ExSqlComp.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/ExSqlComp.cpp b/core/sql/cli/ExSqlComp.cpp
index 43d9902..2d132b6 100644
--- a/core/sql/cli/ExSqlComp.cpp
+++ b/core/sql/cli/ExSqlComp.cpp
@@ -1280,6 +1280,11 @@ ExSqlComp::ReturnStatus ExSqlComp::sendRequest (Operator op,
 	CmpMessageSetTrans(input_data,(CmpMsgBufLenType)size,h_);
       break;
       
+    case EXSQLCOMP::DDL_NATABLE_INVALIDATE :
+      request = new(h_) 
+	CmpMessageDDLNATableInvalidate(input_data,(CmpMsgBufLenType)size,h_);
+      break;
+      
     case EXSQLCOMP::DATABASE_USER :
       request = new(h_) 
 	CmpMessageDatabaseUser(input_data,(CmpMsgBufLenType)size,h_);

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/comexe/CmpMessage.h
----------------------------------------------------------------------
diff --git a/core/sql/comexe/CmpMessage.h b/core/sql/comexe/CmpMessage.h
index fded9f7..5e284f3 100644
--- a/core/sql/comexe/CmpMessage.h
+++ b/core/sql/comexe/CmpMessage.h
@@ -87,6 +87,7 @@ public:
       DDL = PROCESSDDL,	// synonyms
       UPDATE_HIST_STAT,
       SET_TRANS,
+      DDL_NATABLE_INVALIDATE,
       INTERNALSP_REQUEST,
       INTERNALSP_GETNEXT,
       ENVS_REFRESH,
@@ -1016,6 +1017,28 @@ private:
 }; // end of CmpMessageSetTrans
 
 // -----------------------------------------------------------------------
+// The DDL NATABLE INVALIDATION command
+// This command is send from executor to arkcmp at the end of a 
+// transaction. On receiving it, arkcmp invalidates NATable for ddl objects 
+// that were part of that transaction. They are then reloaded when that
+// object is accessed.
+// -----------------------------------------------------------------------
+
+class CmpMessageDDLNATableInvalidate : public CmpMessageRequest 
+{
+public:
+  CmpMessageDDLNATableInvalidate(char* stmt=NULL,CmpMsgBufLenType size=0,CollHeap* h=0):
+  CmpMessageRequest(DDL_NATABLE_INVALIDATE, stmt,size,h)
+    { };
+
+  virtual ~CmpMessageDDLNATableInvalidate() {};
+   
+private:
+  CmpMessageDDLNATableInvalidate& operator=(const CmpMessageDDLNATableInvalidate&);
+  CmpMessageDDLNATableInvalidate(const CmpMessageDDLNATableInvalidate&);
+}; // end of CmpMessageDDLNATableInvalidate
+
+// -----------------------------------------------------------------------
 // Database user ID
 // -----------------------------------------------------------------------
 class CmpMessageDatabaseUser : public CmpMessageRequest 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/common/ComSmallDefs.h
----------------------------------------------------------------------
diff --git a/core/sql/common/ComSmallDefs.h b/core/sql/common/ComSmallDefs.h
index 1c888fb..b257cc2 100644
--- a/core/sql/common/ComSmallDefs.h
+++ b/core/sql/common/ComSmallDefs.h
@@ -1847,6 +1847,15 @@ enum ComAuthenticationType{
 #define COM_DBS_FAIL_LIT       "F"
 #define COM_DBS_YES_LIT        "Y"
 #define COM_DBS_NO_LIT         "N"
+
+// used with removeNATable for QI support
+enum ComQiScope 
+  {
+    REMOVE_FROM_ALL_USERS = 100,
+    REMOVE_MINE_ONLY
+  };
+
+
 //
 // (Maximum) size of TEXT.TEXT metadata column in bytes (for NSK) or NAWchars (for SeaQuest)
 //

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/common/DateTimeType.cpp
----------------------------------------------------------------------
diff --git a/core/sql/common/DateTimeType.cpp b/core/sql/common/DateTimeType.cpp
index 771811c..dca78cd 100644
--- a/core/sql/common/DateTimeType.cpp
+++ b/core/sql/common/DateTimeType.cpp
@@ -172,8 +172,6 @@ NABoolean DatetimeType::isEncodingNeeded() const
 
 NABoolean DatetimeType::operator==(const NAType& other) const
 {
-  DatetimeType &otherDT = (DatetimeType&)other;
-
   return NAType::operator==(other) &&
     getStartField()	  == ((DatetimeType&) other).getStartField() &&
     getEndField()	  == ((DatetimeType&) other).getEndField() &&
@@ -1415,6 +1413,7 @@ DatetimeValue::DatetimeValue
 , startField_(startField)
 , endField_  (endField)
 {
+  fractionPrecision = 0;
   if (useOldConstructor)
     {
       oldConstructor(strValue, startField, endField, fractionPrecision);

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/ExExeUtil.h
----------------------------------------------------------------------
diff --git a/core/sql/executor/ExExeUtil.h b/core/sql/executor/ExExeUtil.h
index 627e10f..83cd817 100755
--- a/core/sql/executor/ExExeUtil.h
+++ b/core/sql/executor/ExExeUtil.h
@@ -2416,6 +2416,7 @@ protected:
     FETCH_ALL_ROWS_IN_SCHEMA_,
     DISPLAY_HEADING_,
     PROCESS_NEXT_ROW_,
+    EVAL_EXPR_,
     RETURN_ROW_,
     ENABLE_CQS_,
     GET_USING_VIEWS_,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/ExExeUtilGet.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/ExExeUtilGet.cpp b/core/sql/executor/ExExeUtilGet.cpp
index 34ccc75..ae71016 100644
--- a/core/sql/executor/ExExeUtilGet.cpp
+++ b/core/sql/executor/ExExeUtilGet.cpp
@@ -159,7 +159,6 @@ static const QueryString getUsersForRoleQuery[] =
   {"   from %s.\"%s\".%s RU "},
   {" where (RU.grantor_ID != -2) and "},
   {"       (RU.role_name='%s') "},
-  {" for read uncommitted access "},
   {" order by 1"},
   {" ; "}
 };
@@ -171,7 +170,6 @@ static const QueryString getRolesForUserQuery[] =
   {"   from %s.\"%s\".%s RU "},
   {" where (RU.grantor_ID != -2) and "},
   {"       (RU.grantee_name='%s') "},
-  {" for read uncommitted access "},
   {" order by 1 "},
   {" ; "}
 };
@@ -180,7 +178,6 @@ static const QueryString getComponents[] =
 {
   {" select translate(rtrim(component_name) using ucs2toutf8)  "},
   {"   from %s.\"%s\".%s "},
-  {" for read uncommitted access "},
   {" order by component_name "},
   {" ; "}
 };
@@ -193,7 +190,6 @@ static const QueryString getComponentOperations[] =
   {"    %s.\"%s\".%s o "},
   {" where (c.component_uid=o.component_uid) and "},
   {"       (c.component_name='%s')  "},
-  {" for read uncommitted access "},
   {" order by 1 "},
   {" ; "}
 };
@@ -214,7 +210,6 @@ static const QueryString getComponentPrivilegesForUser[] =
   {"          %s.\"%s\".%s ru "},
   {"          where ru.grantee_name = '%s')))"},
   {" order by 1 " },
-  {" for read uncommitted access "},
   {" ; " }
 };
 
@@ -227,7 +222,6 @@ static const QueryString getTrafTablesInSchemaQuery[] =
   {"  where catalog_name = '%s' and "},
   {"        schema_name = '%s'  and "},
   {"        object_type = 'BT'  "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -239,7 +233,6 @@ static const QueryString getTrafIndexesInSchemaQuery[] =
   {"  where catalog_name = '%s' and "},
   {"        schema_name = '%s'  and "},
   {"        object_type = 'IX'  "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -268,7 +261,6 @@ static const QueryString getTrafProceduresInSchemaQuery[] =
   {"        T.object_type = 'UR'  and "},
   {"        T.object_uid = R.udr_uid  and "},
   {"        R.udr_type = 'P ' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -280,7 +272,6 @@ static const QueryString getTrafLibrariesInSchemaQuery[] =
   {"  where T.catalog_name = '%s' and "},
   {"        T.schema_name = '%s'  and "},
   {"        T.object_type = 'LB' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -294,7 +285,6 @@ static const QueryString getTrafFunctionsInSchemaQuery[] =
   {"        T.object_type = 'UR'  and "},
   {"        T.object_uid = R.udr_uid  and "},
   {"        R.udr_type = 'F ' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -308,7 +298,6 @@ static const QueryString getTrafTableFunctionsInSchemaQuery[] =
   {"        T.object_type = 'UR'  and "},
   {"        T.object_uid = R.udr_uid  and "},
   {"        R.udr_type = 'T ' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -323,7 +312,6 @@ static const QueryString getTrafProceduresForLibraryQuery[] =
   {"      where T1.object_type = 'LB' and T1.catalog_name = '%s' and "},
   {"            T1.schema_name = '%s' and T1.object_name = '%s') and "},
   {"      %s  "}, // fot udr_type: procedure, function, or table_mapping fn.
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -335,7 +323,6 @@ static const QueryString getTrafSequencesInSchemaQuery[] =
   {"  where catalog_name = '%s' and "},
   {"        schema_name = '%s'  and "},
   {"        object_type = 'SG' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -346,7 +333,6 @@ static const QueryString getTrafSequencesInCatalogQuery[] =
   {"   %s.\"%s\".%s "},
   {"  where catalog_name = '%s' and "},
   {"        object_type = 'SG' "},
-  {"  for read uncommitted access "},
   {"  order by 1 "},
   {"  ; "}
 };
@@ -358,7 +344,6 @@ static const QueryString getTrafViewsInCatalogQuery[] =
   {"   %s.\"%s\".%s,  %s.\"%s\".%s "},
   {"  where view_uid = object_uid and "},
   {"            catalog_name = '%s' "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -370,7 +355,6 @@ static const QueryString getTrafViewsInSchemaQuery[] =
   {"  where view_uid = object_uid and "},
   {"             catalog_name = '%s' and "},
   {"             schema_name = '%s' "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -385,7 +369,6 @@ static const QueryString getTrafObjectsInViewQuery[] =
   {"                   T2.schema_name = '%s' and "},
   {"                   T2.object_name = '%s' ) "},
   {"     and VU.used_object_uid = T.object_uid "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -415,7 +398,6 @@ static const QueryString getTrafSchemasInCatalogQuery[] =
   {"   from %s.\"%s\".%s "},
   {"  where catalog_name = '%s' "},
   {"        and (object_type = 'PS' or object_type = 'SS') "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -427,7 +409,6 @@ static const QueryString getTrafSchemasForAuthIDQuery[] =
   {"        %s.\"%s\".%s A "},
   {"  where (T.object_type = 'PS' or T.object_type = 'SS') and "},
   {"         A.auth_db_name = '%s' and T.object_owner = A.auth_id  "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -437,7 +418,6 @@ static const QueryString getTrafUsers[] =
   {" select distinct auth_db_name "},
   {"   from %s.\"%s\".%s "},
   {"  where auth_type = '%s' "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -448,7 +428,6 @@ static const QueryString getTrafRoles[] =
   {"   from %s.\"%s\".%s "},
   {"  where auth_type = 'R' "},
   {" union select * from (values ('PUBLIC')) "},
-  {"  for read uncommitted access "},
   {" order by 1 "},
   {"  ; "}
 };
@@ -1238,7 +1217,6 @@ Lng32 ExExeUtilGetMetadataInfoTcb::setupPrivilegesTypeForUserQuery()
          " O.object_uid  = SP.table_uid AND "
          " SP.grantee    = U.user_id AND "
          " SP.grantor   != -2 "
-   " FOR READ UNCOMMITTED ACCESS "
    " ; "
   };
 
@@ -1269,7 +1247,6 @@ Lng32 ExExeUtilGetMetadataInfoTcb::setupPrivilegesTypeForUserQuery()
          " O.object_uid = TP.table_uid AND"
          " TP.grantee   = U.user_id AND"
          " TP.grantor  != -2"
-   " FOR READ UNCOMMITTED ACCESS"
    " ; "
   };
 
@@ -1364,7 +1341,6 @@ Lng32 ExExeUtilGetMetadataInfoTcb::setupObjectTypeForUserQuery()
          " O.OBJECT_TYPE  = '%s' AND"
          " O.OBJECT_OWNER = U.USER_ID"
          " %s"
-   " FOR READ UNCOMMITTED ACCESS"
    " ; "
   };
 
@@ -1511,7 +1487,7 @@ Int32 ExExeUtilGetMetadataInfoTcb::setupAuthIDInfo(const char *authName,
            " where auth_id = (select role_id from "
            "                    hp_system_catalog.hp_security_schema.roles "
            "                   where role_name = '%s') "
-           " for read uncommitted access; ",
+           " ; ",
         authName, authName);
       break;
 
@@ -1521,7 +1497,7 @@ Int32 ExExeUtilGetMetadataInfoTcb::setupAuthIDInfo(const char *authName,
            " where auth_id = (select user_id from "
            "                    hp_system_catalog.hp_security_schema.users "
            "                   where user_name = '%s') "
-           " for read uncommitted access; ",
+           " ; ",
         authName, authName);
       break;
      
@@ -1533,8 +1509,8 @@ Int32 ExExeUtilGetMetadataInfoTcb::setupAuthIDInfo(const char *authName,
            "                   where user_name = '%s') "
            "    or  auth_id = (select role_id from "
            "                    hp_system_catalog.hp_security_schema.roles "
-           "                   where role_name = '%s')) "
-           " for read uncommitted access; ",
+              "                   where role_name = '%s')) "
+           " ; ",
         authName, authName);
       break;
   }
@@ -3118,7 +3094,7 @@ short ExExeUtilGetHbaseObjectsTcb::work()
 
             if (getMItdb().allObjs())
               {
-                step_ = RETURN_ROW_;
+                step_ = EVAL_EXPR_;
                 break;
               }
 
@@ -3153,19 +3129,19 @@ short ExExeUtilGetHbaseObjectsTcb::work()
             if ((getMItdb().externalObjs()) &&
                 (externalObj))
               {
-                step_ = RETURN_ROW_;
+                step_ = EVAL_EXPR_;
                 break;
               }
             else if ((getMItdb().systemObjs()) &&
                 (sysObj))
               {
-                step_ = RETURN_ROW_;
+                step_ = EVAL_EXPR_;
                 break;
               }
             else if ((getMItdb().userObjs()) &&
                      ((NOT sysObj) && (NOT externalObj)))
              {
-                step_ = RETURN_ROW_;
+                step_ = EVAL_EXPR_;
                 break;
               }
  
@@ -3173,6 +3149,21 @@ short ExExeUtilGetHbaseObjectsTcb::work()
           }
           break;
 
+        case EVAL_EXPR_:
+          {
+            exprRetCode = evalScanExpr(hbaseName_, strlen(hbaseName_));
+	    if (exprRetCode == ex_expr::EXPR_FALSE)
+	      {
+		// row does not pass the scan expression,
+		// move to the next row.
+		step_ = PROCESS_NEXT_ROW_;
+		break;
+	      }
+            
+            step_ = RETURN_ROW_;
+          }
+          break;
+
         case RETURN_ROW_:
           {
 	    if (qparent_.up->isFull())

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/HBaseClient_JNI.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/HBaseClient_JNI.cpp b/core/sql/executor/HBaseClient_JNI.cpp
index 3ff3e1f..5dc8547 100644
--- a/core/sql/executor/HBaseClient_JNI.cpp
+++ b/core/sql/executor/HBaseClient_JNI.cpp
@@ -446,7 +446,7 @@ HBC_RetCode HBaseClient_JNI::init()
     JavaMethods_[JM_DROP       ].jm_name      = "drop";
     JavaMethods_[JM_DROP       ].jm_signature = "(Ljava/lang/String;J)Z";
     JavaMethods_[JM_DROP_ALL       ].jm_name      = "dropAll";
-    JavaMethods_[JM_DROP_ALL       ].jm_signature = "(Ljava/lang/String;)Z";
+    JavaMethods_[JM_DROP_ALL       ].jm_signature = "(Ljava/lang/String;J)Z";
     JavaMethods_[JM_LIST_ALL       ].jm_name      = "listAll";
     JavaMethods_[JM_LIST_ALL       ].jm_signature = "(Ljava/lang/String;)Lorg/trafodion/sql/ByteArrayList;";
     JavaMethods_[JM_GET_REGION_STATS       ].jm_name      = "getRegionStats";
@@ -454,7 +454,7 @@ HBC_RetCode HBaseClient_JNI::init()
     JavaMethods_[JM_COPY       ].jm_name      = "copy";
     JavaMethods_[JM_COPY       ].jm_signature = "(Ljava/lang/String;Ljava/lang/String;)Z";
     JavaMethods_[JM_EXISTS     ].jm_name      = "exists";
-    JavaMethods_[JM_EXISTS     ].jm_signature = "(Ljava/lang/String;)Z";
+    JavaMethods_[JM_EXISTS     ].jm_signature = "(Ljava/lang/String;J)Z";
     JavaMethods_[JM_GRANT      ].jm_name      = "grant";
     JavaMethods_[JM_GRANT      ].jm_signature = "([B[B[Ljava/lang/Object;)Z";
     JavaMethods_[JM_REVOKE     ].jm_name      = "revoke";
@@ -1359,7 +1359,7 @@ HBC_RetCode HBaseClient_JNI::drop(const char* fileName, JNIEnv* jenv, Int64 tran
 //////////////////////////////////////////////////////////////////////////////
 // 
 //////////////////////////////////////////////////////////////////////////////
-HBC_RetCode HBaseClient_JNI::dropAll(const char* pattern, bool async)
+HBC_RetCode HBaseClient_JNI::dropAll(const char* pattern, bool async, Int64 transID)
 {
   QRLogger::log(CAT_SQL_HBASE, LL_DEBUG, "HBaseClient_JNI::dropAll(%s) called.", pattern);
 
@@ -1383,9 +1383,11 @@ HBC_RetCode HBaseClient_JNI::dropAll(const char* pattern, bool async)
     return HBC_ERROR_DROP_PARAM;
   }
 
+  jlong j_tid = transID;  
+
   // boolean drop(java.lang.String);
   tsRecentJMFromJNI = JavaMethods_[JM_DROP_ALL].jm_full_name;
-  jboolean jresult = jenv_->CallBooleanMethod(javaObj_, JavaMethods_[JM_DROP_ALL].methodID, js_pattern);
+  jboolean jresult = jenv_->CallBooleanMethod(javaObj_, JavaMethods_[JM_DROP_ALL].methodID, js_pattern, j_tid);
 
   jenv_->DeleteLocalRef(js_pattern);  
 
@@ -1579,7 +1581,7 @@ HBC_RetCode HBaseClient_JNI::copy(const char* currTblName, const char* oldTblNam
 //////////////////////////////////////////////////////////////////////////////
 // 
 //////////////////////////////////////////////////////////////////////////////
-HBC_RetCode HBaseClient_JNI::exists(const char* fileName)
+HBC_RetCode HBaseClient_JNI::exists(const char* fileName, Int64 transID)
 {
   QRLogger::log(CAT_SQL_HBASE, LL_DEBUG, "HBaseClient_JNI::exists(%s) called.", fileName);
   if (jenv_ == NULL)
@@ -1598,9 +1600,11 @@ HBC_RetCode HBaseClient_JNI::exists(const char* fileName)
     return HBC_ERROR_EXISTS_PARAM;
   }
 
+  jlong j_tid = transID;  
+
   // boolean exists(java.lang.String);
   tsRecentJMFromJNI = JavaMethods_[JM_EXISTS].jm_full_name;
-  jboolean jresult = jenv_->CallBooleanMethod(javaObj_, JavaMethods_[JM_EXISTS].methodID, js_fileName);
+  jboolean jresult = jenv_->CallBooleanMethod(javaObj_, JavaMethods_[JM_EXISTS].methodID, js_fileName, j_tid);
 
   jenv_->DeleteLocalRef(js_fileName);  
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/HBaseClient_JNI.h
----------------------------------------------------------------------
diff --git a/core/sql/executor/HBaseClient_JNI.h b/core/sql/executor/HBaseClient_JNI.h
index d015ec2..3f13f8a 100644
--- a/core/sql/executor/HBaseClient_JNI.h
+++ b/core/sql/executor/HBaseClient_JNI.h
@@ -510,13 +510,13 @@ public:
   HBC_RetCode registerTruncateOnAbort(const char* fileName, Int64 transID);
   HBC_RetCode drop(const char* fileName, bool async, Int64 transID);
   HBC_RetCode drop(const char* fileName, JNIEnv* jenv, Int64 transID); // thread specific
-  HBC_RetCode dropAll(const char* pattern, bool async);
+  HBC_RetCode dropAll(const char* pattern, bool async, Int64 transID);
   HBC_RetCode copy(const char* currTblName, const char* oldTblName);
   ByteArrayList* listAll(const char* pattern);
   ByteArrayList* getRegionStats(const char* tblName);
   static HBC_RetCode flushAllTablesStatic();
   HBC_RetCode flushAllTables();
-  HBC_RetCode exists(const char* fileName);
+  HBC_RetCode exists(const char* fileName, Int64 transID);
   HBC_RetCode grant(const Text& user, const Text& tableName, const TextVec& actionCodes); 
   HBC_RetCode revoke(const Text& user, const Text& tableName, const TextVec& actionCodes);
   HBC_RetCode estimateRowCount(const char* tblName, Int32 partialRowSize,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/ex_ddl.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/ex_ddl.cpp b/core/sql/executor/ex_ddl.cpp
index b175985..1c60814 100644
--- a/core/sql/executor/ex_ddl.cpp
+++ b/core/sql/executor/ex_ddl.cpp
@@ -412,6 +412,8 @@ short ExDDLTcb::work()
       if (ddlTdb().workCriDesc_)
 	workAtp_->release();
 
+      currContext->ddlStmtsExecuted() = TRUE;
+       
     } // while 
   return WORK_OK;
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/ex_transaction.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/ex_transaction.cpp b/core/sql/executor/ex_transaction.cpp
index 1e8deda..107f1f7 100644
--- a/core/sql/executor/ex_transaction.cpp
+++ b/core/sql/executor/ex_transaction.cpp
@@ -506,7 +506,7 @@ short ExTransaction::rollbackStatement()
 
 
 //This method does nowaited rollback transaction.
-short ExTransaction::rollbackTransaction()
+short ExTransaction::rollbackTransaction(NABoolean isWaited)
 {
   dp2Xns_ = FALSE;
 
@@ -518,7 +518,8 @@ short ExTransaction::rollbackTransaction()
 	transDiagsArea_ = NULL;
       }
       ExRaiseSqlError(heap_, &transDiagsArea_,
-		      EXE_ROLLBACK_TRANSACTION_ERROR, &errorCond_);
+                      (isWaited ? EXE_ROLLBACK_TRANSACTION_WAITED_ERROR :
+                       EXE_ROLLBACK_TRANSACTION_ERROR), &errorCond_);
       return -1;
     }
 
@@ -542,6 +543,8 @@ short ExTransaction::rollbackTransaction()
       return -1;
     }
 
+  if (isWaited)
+    waitForRollbackCompletion(transid_);
 
   if ((NOT volatileSchemaExists_) &&
      cliGlob_->currContext()->volatileSchemaCreated())
@@ -556,52 +559,7 @@ short ExTransaction::rollbackTransaction()
 
 short ExTransaction::rollbackTransactionWaited()
 {
-  dp2Xns_ = FALSE;
-
-  if (! xnInProgress())
-    {
-      if (transDiagsArea_)
-      {
-	transDiagsArea_->decrRefCount();
-	transDiagsArea_ = NULL;
-      }
-      ExRaiseSqlError(heap_, &transDiagsArea_,
-		      EXE_ROLLBACK_TRANSACTION_WAITED_ERROR, &errorCond_);
-      return -1;
-    }
-
-  if (! exeStartedXn_)
-    {
-      if (transDiagsArea_)
-      {
-	transDiagsArea_->decrRefCount();
-	transDiagsArea_ = NULL;
-      }
-      ExRaiseSqlError(heap_, &transDiagsArea_,
-		      EXE_CANT_COMMIT_OR_ROLLBACK, &errorCond_);
-      return -1;
-    }
-
-  Int32 rc = ABORTTRANSACTION();
-  if (rc != 0 && rc != FENOTRANSID)
-    {
-      createDiagsArea (EXE_ROLLBACK_WAITED_ERROR_TRANS_SUBSYS, rc,
-		       "TMF");
-      genLinuxCorefile("Issue trying to rollback a transaction");
-      return -1;
-    }
-  
-  waitForRollbackCompletion(transid_);
-
-  if ((NOT volatileSchemaExists_) &&
-     cliGlob_->currContext()->volatileSchemaCreated())
-    {
-       cliGlob_->currContext()->resetVolatileSchemaState();
-    }
-
-  resetXnState();
-
-  return 0;
+  return rollbackTransaction(TRUE);
 }
 
 short ExTransaction::doomTransaction()
@@ -1159,12 +1117,9 @@ ExTransTcb::~ExTransTcb()
   pool_ = 0;
 };
 
-
-
-    //////////////////////////////////////////////////////
+//////////////////////////////////////////////////////
 // work() for ExTransTcb
 //////////////////////////////////////////////////////
-#pragma nowarn(262)   // warning elimination 
 short ExTransTcb::work()
 {
   while (1) {
@@ -1264,6 +1219,25 @@ short ExTransTcb::work()
         rc = ta->commitTransaction(FALSE);
         if (rc != 0)
           handleErrors(pentry_down, ta->getDiagsArea());
+
+        if (cliGlobals->currContext()->ddlStmtsExecuted())
+          {
+            ComDiagsArea * diagsArea = NULL;
+            ExSqlComp::ReturnStatus cmpStatus = 
+              cliGlobals->currContext()->sendXnMsgToArkcmp
+              (NULL, 0,
+               EXSQLCOMP::DDL_NATABLE_INVALIDATE,
+               diagsArea);
+            if (cmpStatus == ExSqlComp::ERROR)
+              {
+                handleErrors(pentry_down, NULL, 
+                             (ExeErrorCode)(-EXE_CANT_COMMIT_OR_ROLLBACK));
+ 
+                return -1;
+              }
+          }
+        
+        cliGlobals->currContext()->ddlStmtsExecuted() = FALSE;
 	      	    
         // if user had specified AUTO COMMIT, turn it back on.
         ta->enableAutoCommit();
@@ -1288,7 +1262,26 @@ short ExTransTcb::work()
         rc = ta->commitTransaction(TRUE);
         if (rc != 0)
           handleErrors(pentry_down, ta->getDiagsArea());
-	      	    
+	      	  
+        if (cliGlobals->currContext()->ddlStmtsExecuted())
+          {
+            ComDiagsArea * diagsArea = NULL;
+            ExSqlComp::ReturnStatus cmpStatus = 
+              cliGlobals->currContext()->sendXnMsgToArkcmp
+              (NULL, 0,
+               EXSQLCOMP::DDL_NATABLE_INVALIDATE,
+               diagsArea);
+            if (cmpStatus == ExSqlComp::ERROR)
+              {
+                handleErrors(pentry_down, NULL, 
+                             (ExeErrorCode)(-EXE_CANT_COMMIT_OR_ROLLBACK));
+ 
+                return -1;
+              }
+          }
+        
+        cliGlobals->currContext()->ddlStmtsExecuted() = FALSE;
+   
         // if user had specified AUTO COMMIT, turn it back on.
         ta->enableAutoCommit();
       }
@@ -1316,11 +1309,29 @@ short ExTransTcb::work()
           // create a diagsArea and return it to the parent.
           handleErrors(pentry_down, ta->getDiagsArea());
 
+        if (cliGlobals->currContext()->ddlStmtsExecuted())
+          {
+            ComDiagsArea * diagsArea = NULL;
+            ExSqlComp::ReturnStatus cmpStatus = 
+              cliGlobals->currContext()->sendXnMsgToArkcmp
+              (NULL, 0,
+               EXSQLCOMP::DDL_NATABLE_INVALIDATE,
+               diagsArea);
+            if (cmpStatus == ExSqlComp::ERROR)
+              {
+                handleErrors(pentry_down, NULL, 
+                             (ExeErrorCode)(-EXE_CANT_COMMIT_OR_ROLLBACK));
+ 
+                return -1;
+              }
+          }
+        
+        cliGlobals->currContext()->ddlStmtsExecuted() = FALSE;
+
         // if user had specified AUTO COMMIT, turn it back on.
         ta->enableAutoCommit();
       }
       break;
-      // LCOV_EXCL_STOP
 
       case ROLLBACK_WAITED_:  {
         if (ta->userEndedExeXn()) {
@@ -1340,6 +1351,25 @@ short ExTransTcb::work()
         if (rc != 0) 
           handleErrors(pentry_down, ta->getDiagsArea());
 	      
+        if (cliGlobals->currContext()->ddlStmtsExecuted())
+          {
+            ComDiagsArea * diagsArea = NULL;
+            ExSqlComp::ReturnStatus cmpStatus = 
+              cliGlobals->currContext()->sendXnMsgToArkcmp
+              (NULL, 0,
+               EXSQLCOMP::DDL_NATABLE_INVALIDATE,
+               diagsArea);
+            if (cmpStatus == ExSqlComp::ERROR)
+              {
+                handleErrors(pentry_down, NULL, 
+                             (ExeErrorCode)(-EXE_CANT_COMMIT_OR_ROLLBACK));
+ 
+                return -1;
+              }
+          }
+        
+        cliGlobals->currContext()->ddlStmtsExecuted() = FALSE;
+
         // if user had specified AUTO COMMIT, turn it back on.
         ta->enableAutoCommit();
       }
@@ -1355,112 +1385,36 @@ short ExTransTcb::work()
 	    break;
 	  }
 
-        // send the set trans request to arkcmp so compiler can
-        // set this trans mode in its memory. This is done so any
-	    // statement compiled after this could be compiled with the
-	    // current trans mode.
-        ExSqlComp *cmp = NULL;
-        ExSqlComp::ReturnStatus cmpStatus ;
-        // the dummyReply is moved up because otherwise the 
-        // compiler would complain about
-        // initialization of variables afer goto statements.
-
-        char* dummyReply = NULL;
-        ULng32 dummyLength;
-	ContextCli *currCtxt = getGlobals()->castToExExeStmtGlobals()->
-            castToExMasterStmtGlobals()->getStatement()->getContext();
-	Int32 cmpRet = 0;
-#ifdef NA_CMPDLL
-        // If use embedded compiler, send the settings to it
-        if (currCtxt->getSessionDefaults()->callEmbeddedArkcmp() &&
-            currCtxt->isEmbeddedArkcmpInitialized() &&  
-	    (CmpCommon::context()) &&
-	    (CmpCommon::context()->getRecursionLevel() == 0))
-          {
-           
-            char * data = (char *)(transTdb().transMode_.getPointer());
-            NAHeap *arkcmpHeap = currCtxt->exHeap();
-
-            cmpRet = CmpCommon::context()->compileDirect(
-                                              data, sizeof(TransMode),
-                                              arkcmpHeap,
-                                              SQLCHARSETCODE_UTF8,
-                                              EXSQLCOMP::SET_TRANS,
-                                              dummyReply, dummyLength,
-                                              currCtxt->getSqlParserFlags(),
-                                              NULL, 0);
-            if (cmpRet != 0)
-              {
-                char emsText[120];
-                str_sprintf(emsText,
-                        "Set transaction mode to embedded arkcmp failed, return code %d",
-                        cmpRet);
-                SQLMXLoggingArea::logExecRtInfo(__FILE__, __LINE__, emsText, 0);
-                handleErrors(pentry_down, CmpCommon::diags());
-              }
-
-            if (dummyReply != NULL)
-              {
-                arkcmpHeap->deallocateMemory((void*)dummyReply);
-                dummyReply = NULL;
-              }
+        char * data = (char *)(transTdb().transMode_.getPointer());
+        ComDiagsArea * diagsArea = NULL;
+        ExSqlComp::ReturnStatus cmpStatus =
+          getGlobals()->castToExExeStmtGlobals()->
+          castToExMasterStmtGlobals()->getStatement()->
+          getContext()->sendXnMsgToArkcmp(data, sizeof(TransMode),
+                                          EXSQLCOMP::SET_TRANS,
+                                          diagsArea);
+        if (cmpStatus == ExSqlComp::ERROR)
+          handleErrors(pentry_down, diagsArea);
+          
+        if (diagAreaSizeExpr()) {
+          // compute the diag area size
+          if (diagAreaSizeExpr()->eval(pentry_down->getAtp(), workAtp_) 
+              == ex_expr::EXPR_ERROR)  {
+            // handle errors
+            handleErrors(pentry_down, pentry_down->getAtp()->getDiagsArea()); 
           }
-#endif // NA_CMPDLL
-	if (!currCtxt->getSessionDefaults()->callEmbeddedArkcmp()  || 
-	    (currCtxt->getSessionDefaults()->callEmbeddedArkcmp() && 
-	     (CmpCommon::context()) &&
-	     ((cmpRet != 0) || 
-	     (CmpCommon::context()->getRecursionLevel() > 0) ||
-	      currCtxt->getArkcmp()->getServer())
-	     )
-	    )
-	  {
-	    for (short i = 0; i < currCtxt->getNumArkcmps();i++)
-	      {
-		cmp = currCtxt->getArkcmp(i);
-		cmpStatus = cmp->sendRequest(EXSQLCOMP::SET_TRANS, 
-					     (char *)(transTdb().transMode_.getPointer()),
-					     sizeof(TransMode),
-					     TRUE, NULL,
-					     SQLCHARSETCODE_UTF8,
-					     TRUE /*resend, if needed*/
-					     );
-
-		if (cmpStatus != ExSqlComp::SUCCESS) {
-		  handleErrors(pentry_down, cmp->getDiags());
-		  // If its an error don't proceed further.
-		  if (cmpStatus == ExSqlComp::ERROR)
-		    break;
-		}
-	    
-		cmpStatus = cmp->getReply(dummyReply, dummyLength);
-		cmp->getHeap()->deallocateMemory((void*)dummyReply);
-		if (cmpStatus != ExSqlComp::SUCCESS) {
-		  handleErrors(pentry_down, cmp->getDiags());
-		  //Don't proceed if its an error.
-		  if (cmpStatus == ExSqlComp::ERROR)
-		    break;
-		}
-	    
-		if (cmp->status() != ExSqlComp::FETCHED)
-		  handleErrors(pentry_down, cmp->getDiags());
-	      } // for
-	  }
-	    if (diagAreaSizeExpr()) {
-	      // compute the diag area size
-	      if (diagAreaSizeExpr()->eval(pentry_down->getAtp(), workAtp_) 
-		  == ex_expr::EXPR_ERROR)  {
-		// handle errors
-		handleErrors(pentry_down, pentry_down->getAtp()->getDiagsArea()); 
-	      }
-	      ta->getTransMode()->diagAreaSize() = *(Lng32 *)(workAtp_->getTupp(
-										transTdb().workCriDesc_->noTuples()-1).getDataPointer());
-	    }
 
-	    if(ta->setTransMode(transTdb().transMode_)) {
-	      handleErrors(pentry_down, ta->getDiagsArea());		
-	      break;
-	    }
+          ta->getTransMode()->diagAreaSize() = 
+            *(Lng32 *)(workAtp_->getTupp
+                       (transTdb().workCriDesc_->noTuples()-1).getDataPointer());
+        }
+        
+        if (cmpStatus != ExSqlComp::ERROR) {
+          if(ta->setTransMode(transTdb().transMode_)) {
+            handleErrors(pentry_down, ta->getDiagsArea());		
+            break;
+          }
+        }
       } 
       break;
 	  

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/executor/ex_transaction.h
----------------------------------------------------------------------
diff --git a/core/sql/executor/ex_transaction.h b/core/sql/executor/ex_transaction.h
index 422c902..702ce91 100644
--- a/core/sql/executor/ex_transaction.h
+++ b/core/sql/executor/ex_transaction.h
@@ -78,7 +78,7 @@ public:
   // only rollbacks if executor started the Xn.
   //////////////////////////////////////////////////////////////
   short rollbackStatement();
-  short rollbackTransaction();
+  short rollbackTransaction(NABoolean isWaited = FALSE);
   short rollbackTransactionWaited();
   short doomTransaction();
   short waitForRollbackCompletion(Int64 transid);

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/exp/ExpHbaseInterface.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpHbaseInterface.cpp b/core/sql/exp/ExpHbaseInterface.cpp
index b58383c..c9a8ea0 100644
--- a/core/sql/exp/ExpHbaseInterface.cpp
+++ b/core/sql/exp/ExpHbaseInterface.cpp
@@ -548,15 +548,22 @@ Lng32 ExpHbaseInterface_JNI::drop(HbaseStr &tblName, NABoolean async, NABoolean
 }
 
 //----------------------------------------------------------------------------
-Lng32 ExpHbaseInterface_JNI::dropAll(const char * pattern, NABoolean async)
+Lng32 ExpHbaseInterface_JNI::dropAll(const char * pattern, NABoolean async, 
+                                     NABoolean noXn)
 {
   if (client_ == NULL)
   {
     if (init(hbs_) != HBASE_ACCESS_SUCCESS)
       return -HBASE_ACCESS_ERROR;
   }
+
+  Int64 transID;
+  if (noXn)
+    transID = 0;
+  else
+    transID = getTransactionIDFromContext();
     
-  retCode_ = client_->dropAll(pattern, async);
+  retCode_ = client_->dropAll(pattern, async, transID);
 
   //close();
   if (retCode_ == HBC_OK)
@@ -607,7 +614,10 @@ Lng32 ExpHbaseInterface_JNI::exists(HbaseStr &tblName)
       return -HBASE_ACCESS_ERROR;
   }
     
-  retCode_ = client_->exists(tblName.val); 
+  Int64 transID;
+  transID = getTransactionIDFromContext();  
+
+  retCode_ = client_->exists(tblName.val, transID); 
   //close();
   if (retCode_ == HBC_OK)
     return -1;   // Found.
@@ -654,11 +664,13 @@ Lng32 ExpHbaseInterface_JNI::scanOpen(
     return HBASE_OPEN_ERROR;
   }
 
+  // if this scan is running under a transaction, pass that
+  // transid even if noXn is set. This will ensure that selected
+  // rows are returned from the transaction cache instead of underlying
+  // storage engine.
   Int64 transID;
-  if (noXn)
-    transID = 0;
-  else
-    transID = getTransactionIDFromContext();
+  transID = getTransactionIDFromContext();  
+
   retCode_ = htc_->startScan(transID, startRow, stopRow, columns, timestamp, 
                              cacheBlocks,
                              smallScanner,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/exp/ExpHbaseInterface.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpHbaseInterface.h b/core/sql/exp/ExpHbaseInterface.h
index 474503c..3b0005d 100644
--- a/core/sql/exp/ExpHbaseInterface.h
+++ b/core/sql/exp/ExpHbaseInterface.h
@@ -130,7 +130,7 @@ class ExpHbaseInterface : public NABasicObject
   virtual Lng32 drop(HbaseStr &tblName, NABoolean async, NABoolean noXn) = 0;
 
   // drops all objects from hbase that match the pattern
-  virtual Lng32 dropAll(const char * pattern, NABoolean async) = 0;
+  virtual Lng32 dropAll(const char * pattern, NABoolean async, NABoolean noXn) = 0;
 
   // retrieve all objects from hbase that match the pattern
   virtual ByteArrayList* listAll(const char * pattern) = 0;
@@ -444,7 +444,7 @@ class ExpHbaseInterface_JNI : public ExpHbaseInterface
   virtual Lng32 registerTruncateOnAbort(HbaseStr &tblName, NABoolean noXn);
 
   virtual Lng32 drop(HbaseStr &tblName, NABoolean async, NABoolean noXn);
-  virtual Lng32 dropAll(const char * pattern, NABoolean async);
+  virtual Lng32 dropAll(const char * pattern, NABoolean async, NABoolean noXn);
 
   virtual ByteArrayList* listAll(const char * pattern);
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/generator/GenRelExeUtil.cpp
----------------------------------------------------------------------
diff --git a/core/sql/generator/GenRelExeUtil.cpp b/core/sql/generator/GenRelExeUtil.cpp
index 2ae7b1e..6c49509 100644
--- a/core/sql/generator/GenRelExeUtil.cpp
+++ b/core/sql/generator/GenRelExeUtil.cpp
@@ -113,8 +113,10 @@ void deleteVirtExplainTableDesc(desc_struct *);
 
 
 short GenericUtilExpr::processOutputRow(Generator * generator,
-                                        const Int32 work_atp, const Int32 output_row_atp_index,
-                                        ex_cri_desc * returnedDesc)
+                                        const Int32 work_atp, 
+                                        const Int32 output_row_atp_index,
+                                        ex_cri_desc * returnedDesc,
+                                        NABoolean noAtpOrIndexChange)
 {
   ExpGenerator * expGen = generator->getExpGenerator();
   Space * space = generator->getSpace();
@@ -155,11 +157,14 @@ short GenericUtilExpr::processOutputRow(Generator * generator,
   // it.
   NADELETEBASIC(attrs, generator->wHeap());
 
-  // The output row will be returned as the last entry of the returned atp.
-  // Change the atp and atpindex of the returned values to indicate that.
-  expGen->assignAtpAndAtpIndex(getVirtualTableDesc()->getColumnList(),
-			       0, returnedDesc->noTuples()-1);
-  
+  if (NOT noAtpOrIndexChange)
+    {
+      // The output row will be returned as the last entry of the returned atp.
+      // Change the atp and atpindex of the returned values to indicate that.
+      expGen->assignAtpAndAtpIndex(getVirtualTableDesc()->getColumnList(),
+                                   0, returnedDesc->noTuples()-1);
+    }
+
   return 0;
 }
                                     
@@ -243,7 +248,10 @@ short ExeUtilProcessVolatileTable::codeGen(Generator * generator)
   if (isHbase_)
     {
       pvt_tdb->setHbaseDDL(TRUE);
-      pvt_tdb->setHbaseDDLNoUserXn(TRUE);
+
+      if ((NOT getExprNode()->castToStmtDDLNode()->ddlXns()) &&
+          (NOT Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL)))
+        pvt_tdb->setHbaseDDLNoUserXn(TRUE);
     }
 
   // no tupps are returned
@@ -1513,7 +1521,7 @@ short ExeUtilGetMetadataInfo::codeGen(Generator * generator)
     }
 
   short rc = processOutputRow(generator, work_atp, exe_util_row_atp_index,
-                              returnedDesc);
+                              returnedDesc, TRUE);
   if (rc)
     {
       return -1;
@@ -1545,6 +1553,11 @@ short ExeUtilGetMetadataInfo::codeGen(Generator * generator)
       expGen->generateExpr(pred->getValueId(),ex_expr::exp_SCAN_PRED,&scanExpr);
     }
   
+  // The output row will be returned as the last entry of the returned atp.
+  // Change the atp and atpindex of the returned values to indicate that.
+  expGen->assignAtpAndAtpIndex(getVirtualTableDesc()->getColumnList(),
+			       0, returnedDesc->noTuples()-1);
+
   struct QueryInfoStruct
   {
     const char * ausStr;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/generator/GenRelMisc.cpp
----------------------------------------------------------------------
diff --git a/core/sql/generator/GenRelMisc.cpp b/core/sql/generator/GenRelMisc.cpp
index 2580eab..bec9e24 100644
--- a/core/sql/generator/GenRelMisc.cpp
+++ b/core/sql/generator/GenRelMisc.cpp
@@ -513,6 +513,17 @@ short DDLExpr::codeGen(Generator * generator)
     {
       if (NOT isHbase_)
 	generator->setTransactionFlag(-1);
+      else if (getExprNode() && 
+               getExprNode()->castToStmtDDLNode()->ddlXns() &&
+               (NOT hbaseDDLNoUserXn_))
+        {
+          // treat like a transactional IUD operation which need to be
+          // aborted in case of an error.
+          generator->setFoundAnUpdate(TRUE);
+	  generator->setUpdAbortOnError(TRUE);
+          
+          generator->setTransactionFlag(-1);
+        }
       else if (NOT hbaseDDLNoUserXn_) 
 	generator->setTransactionFlag(-1);
     }
@@ -2735,7 +2746,7 @@ short RelRoot::codeGen(Generator * generator)
 	{
 	  root_tdb->setUpdErrorOnError(-1);
 	}
-    }
+    } // transactionNeeded
 
   if ((oltOptLean()) &&
       (doOltQryOpt))

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/optimizer/NARoutine.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NARoutine.cpp b/core/sql/optimizer/NARoutine.cpp
index d6f9aa1..c1cb6db 100644
--- a/core/sql/optimizer/NARoutine.cpp
+++ b/core/sql/optimizer/NARoutine.cpp
@@ -857,7 +857,7 @@ void NARoutineDB::free_entries_with_QI_key(Int32 numKeys, SQL_QIKEY* qiKeyArray)
 // in cache.
 // ----------------------------------------------------------------------------
 void NARoutineDB::removeNARoutine(QualifiedName &routineName, 
-                                  QiScope qiScope, 
+                                  ComQiScope qiScope, 
                                   Int64 objUID)
 {
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/optimizer/NARoutineDB.h
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NARoutineDB.h b/core/sql/optimizer/NARoutineDB.h
index c08ed18..3bc6ebe 100644
--- a/core/sql/optimizer/NARoutineDB.h
+++ b/core/sql/optimizer/NARoutineDB.h
@@ -50,7 +50,7 @@ class NARoutineDB : public NAKeyLookup<NARoutineDBKey,NARoutine>
 
 public:
   // This same enum exists in NATableDB, should probably only have one copy
-  enum QiScope { REMOVE_FROM_ALL_USERS = 100, REMOVE_MINE_ONLY };
+  //  enum QiScope { REMOVE_FROM_ALL_USERS = 100, REMOVE_MINE_ONLY };
 
   NARoutineDB(NAMemory *h = 0);
 
@@ -60,7 +60,7 @@ public:
   NABoolean  cachingMetaData();
   void       moveRoutineToDeleteList(NARoutine *cachedNARoutine, const NARoutineDBKey *key);
   void       free_entries_with_QI_key(Int32 numSiKeys, SQL_QIKEY* qiKeyArray);
-  void       removeNARoutine(QualifiedName &routineName, QiScope qiScope, Int64 objUID);
+  void       removeNARoutine(QualifiedName &routineName, ComQiScope qiScope, Int64 objUID);
 
 
   // Defined member functions.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/optimizer/NATable.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NATable.cpp b/core/sql/optimizer/NATable.cpp
index 88036c6..f77467c 100644
--- a/core/sql/optimizer/NATable.cpp
+++ b/core/sql/optimizer/NATable.cpp
@@ -8269,8 +8269,8 @@ NATable * NATableDB::get(CorrName& corrName, BindWA * bindWA,
   return table;
 }
 
-void NATableDB::removeNATable(CorrName &corrName, QiScope qiScope,
-                              ComObjectType ot)
+void NATableDB::removeNATable2(CorrName &corrName, ComQiScope qiScope,
+                               ComObjectType ot)
 {
   const ExtendedQualName* toRemove = &(corrName.getExtendedQualNameObj());
   NAHashDictionaryIterator<ExtendedQualName,NATable> iter(*this); 
@@ -8361,6 +8361,40 @@ void NATableDB::removeNATable(CorrName &corrName, QiScope qiScope,
     }
 }
 
+void NATableDB::removeNATable(CorrName &corrName, ComQiScope qiScope,
+                              ComObjectType ot, 
+                              NABoolean ddlXns, NABoolean atCommit)
+{
+  // if ddl xns are being used, add this name to ddlObjsList and
+  // invalidate NATable in my environment. This will allow subsequent 
+  // operations running in my environemnt under my current transaction 
+  // to access the latest definition.
+  // 
+  // NATable removal for other users will happen at xn commit/rollback time.
+  //
+  // If atCommit is set, then this is being called at commit time.
+  // In that case, do NATable removal processing for all users 
+  // instead of adding to ddlObjsList.
+  //
+  // If ddl xns are not being used, then invalidate NATable cache for
+  // all users.
+  if ((ddlXns) &&
+      (NOT atCommit))
+    {
+      removeNATable2(corrName, ComQiScope::REMOVE_MINE_ONLY, ot);
+
+      CmpContext::DDLObjInfo ddlObj;
+      ddlObj.ddlObjName = corrName.getQualifiedNameAsString();
+      ddlObj.qiScope = qiScope;
+      ddlObj.ot = ot;
+      CmpCommon::context()->ddlObjsList().insert(ddlObj);
+ 
+      return;
+    }
+
+  removeNATable2(corrName, qiScope, ot);
+}
+
 //This method is called at the end of each statement to reset statement
 //specific stuff in the NATable objects in the cache.
 void NATableDB::resetAfterStatement(){

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/cd9f7a1a/core/sql/optimizer/NATable.h
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NATable.h b/core/sql/optimizer/NATable.h
index ec19d14..3f58406 100644
--- a/core/sql/optimizer/NATable.h
+++ b/core/sql/optimizer/NATable.h
@@ -1230,10 +1230,12 @@ public:
   NATable * get(CorrName& corrName, BindWA * bindWA,
                 desc_struct *inTableDescStruct);
 
-  enum QiScope { REMOVE_FROM_ALL_USERS = 100, REMOVE_MINE_ONLY };
-  void removeNATable(CorrName &corrName, QiScope qiScope, 
-                     ComObjectType ot);
-  
+  void removeNATable2(CorrName &corrName, ComQiScope qiScope, 
+                      ComObjectType ot);
+  void removeNATable(CorrName &corrName, ComQiScope qiScope, 
+                     ComObjectType ot, 
+                     NABoolean ddlXns, NABoolean atCommit);
+   
   void RemoveFromNATableCache( NATable * NATablep , UInt32 currIndx );
   static void remove_entries_marked_for_removal();
   static void unmark_entries_marked_for_removal();