/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/* -*-C++-*-
 *****************************************************************************
 *
 * File:         <file>
 * Description:  
 *
 *
 * Created:      7/10/95
 * Language:     C++
 *
 *
 *
 *
 *****************************************************************************
 */

#include "Platform.h"


#include <stdio.h>
#include <stdlib.h>

#include "exp_stdh.h"
#include "exp_clause_derived.h"
#include "exp_math_func.h"
#include "exp_function.h"
#include "ExpBitMuxFunction.h"
#include "ExpSequenceFunction.h"
#include "ExpLOB.h"
#include "wstr.h"

#define GenAssert(p, msg) if (!(p)) { NAAssert(msg, __FILE__ , __LINE__ ); };


///////////////////////////////////////////////////////////
// class ex_clause
///////////////////////////////////////////////////////////
void ex_clause::copyOperands(ex_clause* clause, Space* space)
{
  NABoolean showplan = (clause->getOperand() ?
                          clause->getOperand(0)->showplan() :
                          FALSE);

  Int32 numOperands = ((showplan) ? (2 * clause->getNumOperands()) :
                                   clause->getNumOperands());

  op_ = (AttributesPtr *)(space->allocateAlignedSpace(numOperands *
					sizeof(AttributesPtr)));

  for (Int32 i=0; i < numOperands; i++) {
    Attributes* attrOld = clause->getOperand(i);
    Attributes* attrNew = NULL;
    
    if (attrOld != NULL) {
      Int32 size = attrOld->getClassSize();
      attrNew = (Attributes*) new(space) char[size];
      memcpy((char*)attrNew, (char*)attrOld, size);
    }

    op_[i] = attrNew;
  }

  switch(clause->getType()) {
    case ex_clause::INOUT_TYPE:
    {
      char* temp;
      Lng32 len;
      ex_inout_clause* inout = (ex_inout_clause*)this;

      // Copy strings associated with this class.  The strings being with a
      // a length count of size long, followed by the string itself.  Also,
      // remember that new() will automatically allocated an aligned space, so
      // nothing additional needs to be done here.

      if (inout->getHeading()) {
        len = sizeof(Lng32) + *((Lng32*)inout->getHeading());
        temp = new(space) char[len];
        memcpy(temp, inout->getHeading(), len);
        inout->setHeading(temp);
      }

      if (inout->getName()) {
        len = sizeof(Lng32) + *((Lng32*)inout->getName());
        temp = new(space) char[len];
        memcpy(temp, inout->getName(), len);
        inout->setName(temp);
      }

      if (inout->getTableName()) {
        len = sizeof(Lng32) + *((Lng32*)inout->getTableName());
        temp = new(space) char[len];
        memcpy(temp, inout->getTableName(), len);
        inout->setTableName(temp);
      }

      if (inout->getSchemaName()) {
        len = sizeof(Lng32) + *((Lng32*)inout->getSchemaName());
        temp = new(space) char[len];
        memcpy(temp, inout->getSchemaName(), len);
        inout->setSchemaName(temp);
      }

      if (inout->getCatalogName()) {
        len = sizeof(Lng32) + *((Lng32*)inout->getCatalogName());
        temp = new(space) char[len];
        memcpy(temp, inout->getCatalogName(), len);
        inout->setCatalogName(temp);
      }

      break;
    }

    case ex_clause::FUNCTION_TYPE:
      if (clause->getClassID() == ex_clause::FUNC_RAISE_ERROR_ID) {
        ExpRaiseErrorFunction* func = (ExpRaiseErrorFunction*)this;
        const char* cName = func->getConstraintName();
        const char* tName = func->getTableName();

        // Set contraint name
        if (cName) {
          Int32 len = strlen(cName);
          char* temp = space->allocateAndCopyToAlignedSpace(cName, len, 0);
          func->setConstraintName(temp);
        }

        // Set table name
        if (tName) {
          Int32 len = strlen(tName);
          char* temp = space->allocateAndCopyToAlignedSpace(tName, len, 0);
          func->setTableName(temp);
        }
      }

      break;
  }
}


ex_clause::ex_clause(clause_type type, 
		     OperatorTypeEnum oper_type,
		     short num_operands, 
		     Attributes ** op,
		     Space * space) 
  : NAVersionedObject(type), nextClause_(NULL), op_(NULL)
{
  clauseType_  = type;
  operType_    = oper_type;
  numOperands_ = num_operands;
  pciLink_     = NULL;
  nextClause_  = (ExClausePtr)NULL;
  flags_       = 0;
  //  instruction_   = -1;
  instrArrayIndex_ = -1;

  str_pad(fillers_, sizeof(fillers_), '\0');

  // Further qualify these types...
  //
  if ((type == ex_clause::FUNCTION_TYPE) ||
      (type == ex_clause::LIKE_TYPE) ||
      (type == ex_clause::MATH_FUNCTION_TYPE) ||
      (type == ex_clause::AGGREGATE_TYPE))
    {
      switch (oper_type)
	{
	case ITM_LIKE: 
	  setClassID(LIKE_CLAUSE_CHAR_ID);
	  break;
	case ITM_LIKE_DOUBLEBYTE: 
	  setClassID(LIKE_CLAUSE_DOUBLEBYTE_ID);
	  break;
        case ITM_REGEXP:
          setClassID(REGEXP_CLAUSE_CHAR_ID);
          break;
	case ITM_ASCII: 
	case ITM_CODE_VALUE: 
	case ITM_UNICODE_CODE_VALUE: 
	case ITM_NCHAR_MP_CODE_VALUE: 
	  setClassID(FUNC_ASCII_ID);
	  break;
	case ITM_CHAR:
	case ITM_NCHAR_MP_CHAR:
	case ITM_UNICODE_CHAR:
	  setClassID(FUNC_CHAR_ID);
	  break;
	case ITM_CHAR_LENGTH:
	  setClassID(FUNC_CHAR_LEN_ID);
	  break;
	case ITM_CHAR_LENGTH_DOUBLEBYTE:
	  setClassID(FUNC_CHAR_LEN_DOUBLEBYTE_ID);
	  break;
	case ITM_CONVERTFROMHEX:
	case ITM_CONVERTTOHEX:
	  setClassID(FUNC_CVT_HEX_ID);
	  break;
	case ITM_OCTET_LENGTH:
	  setClassID(FUNC_OCT_LEN_ID);
	  break;
	case ITM_POSITION:
	  setClassID(FUNC_POSITION_ID);
	  break;
	case ITM_POSITION_DOUBLEBYTE:
	  setClassID(FUNC_POSITION_DOUBLEBYTE_ID);
	  break;
	case ITM_SPLIT_PART:
	  setClassID(FUNC_SPLIT_PART_ID);
	  break;
	case ITM_CONCAT:
	  setClassID(FUNC_CONCAT_ID);
	  break;
	case ITM_REPEAT:
	  setClassID(FUNC_REPEAT_ID);
	  break;
	case ITM_REPLACE:
	  setClassID(FUNC_REPLACE_ID);
	  break;
	case ITM_SUBSTR:
	  setClassID(FUNC_SUBSTR_ID);
	  break;
	case ITM_SUBSTR_DOUBLEBYTE:
	  setClassID(FUNC_SUBSTR_DOUBLEBYTE_ID);
	  break;
	case ITM_TRIM:
	  setClassID(FUNC_TRIM_ID);
	  break;
	case ITM_TRANSLATE:
	  setClassID(FUNC_TRANSLATE_ID);
	  break;
	case ITM_TRIM_DOUBLEBYTE:
	  setClassID(FUNC_TRIM_DOUBLEBYTE_ID);
	  break;
	case ITM_LOWER:
	  setClassID(FUNC_LOWER_ID);
	  break;
	case ITM_UPPER:
	  setClassID(FUNC_UPPER_ID);
	  break;
	case ITM_UPPER_UNICODE:
	  setClassID(FUNC_UPPER_UNICODE_ID);
	  break;
	case ITM_LOWER_UNICODE:
	  setClassID(FUNC_LOWER_UNICODE_ID);
	  break;
	case ITM_UNIX_TIMESTAMP:
	  setClassID(FUNC_UNIX_TIMESTAMP_ID);
	  break;
	case ITM_SLEEP:
	  setClassID(FUNC_SLEEP_ID);
	  break;
	case ITM_CURRENT_TIMESTAMP:
	  setClassID(FUNC_CURRENT_TIMESTAMP_ID);
	  break;
	case ITM_CURRENT_TIMESTAMP_RUNNING:
	  setClassID(FUNC_CURRENT_TIMESTAMP_ID);
	  break;
	case ITM_COMP_ENCODE:
	case ITM_COMP_DECODE:
	  setClassID(FUNC_ENCODE_ID);
	  break;
	case ITM_EXPLODE_VARCHAR:
	  setClassID(FUNC_EXPLODE_VARCHAR_ID);
	  break;
	case ITM_HASH:
	  setClassID(FUNC_HASH_ID);
	  break;
	case ITM_HIVE_HASH:
	  setClassID(FUNC_HIVEHASH_ID);
	  break;
	case ITM_HASHCOMB:
	  setClassID(FUNC_HASHCOMB_ID);
	  break;
	case ITM_HIVE_HASHCOMB:
	  setClassID(FUNC_HIVEHASHCOMB_ID);
	  break;
	case ITM_HDPHASH:
	  setClassID(FUNC_HDPHASH_ID);
	  break;
	case ITM_HDPHASHCOMB:
	  setClassID(FUNC_HDPHASHCOMB_ID);
	  break;
	case ITM_BITMUX:
	  setClassID(FUNC_BITMUX_ID);
	  break;
	case ITM_REPLACE_NULL:
	  setClassID(FUNC_REPLACE_NULL_ID);
	  break;
	case ITM_MOD:
	  setClassID(FUNC_MOD_ID);
	  break;
	case ITM_MASK_SET:
	case ITM_MASK_CLEAR:
	  setClassID(FUNC_MASK_ID);
	  break;
	case ITM_SHIFT_RIGHT:
	case ITM_SHIFT_LEFT:
	  setClassID(FUNC_SHIFT_ID);
	  break;
	case ITM_ABS:
	  setClassID(FUNC_ABS_ID);
	  break;
	case ITM_RETURN_TRUE:
	case ITM_RETURN_FALSE:
	case ITM_RETURN_NULL:
	  setClassID(FUNC_BOOL_ID);
	  break;
	case ITM_CONVERTTIMESTAMP:
	  setClassID(FUNC_CONVERTTIMESTAMP_ID);
	  break;
	case ITM_DATEFORMAT:
	  setClassID(FUNC_DATEFORMAT_ID);
	  break;
	case ITM_DAYOFWEEK:
	  setClassID(FUNC_DAYOFWEEK_ID);
	  break;
	case ITM_EXTRACT:
	case ITM_EXTRACT_ODBC:
	  setClassID(FUNC_EXTRACT_ID);
	  break;
	case ITM_JULIANTIMESTAMP:
	  setClassID(FUNC_JULIANTIMESTAMP_ID);
	  break;
	case ITM_EXEC_COUNT:
	  setClassID(FUNC_EXEC_COUNT_ID);
	  break;
	case ITM_CURR_TRANSID:
	  setClassID(FUNC_CURR_TRANSID_ID);
	  break;
        case ITM_SHA1:
          setClassID(FUNC_SHA1_ID);
          break;
        case ITM_SHA2_224:
        case ITM_SHA2_256:
        case ITM_SHA2_384:
        case ITM_SHA2_512:
          setClassID(FUNC_SHA2_ID);
          break;
        case ITM_MD5:
          setClassID(FUNC_MD5_ID);
          break; 
        case ITM_CRC32:
          setClassID(FUNC_CRC32_ID);
          break; 
	case ITM_ISIPV4:
	case ITM_ISIPV6:
	  setClassID(FUNC_ISIP_ID);
	  break;
        case ITM_INET_ATON:
          setClassID(FUNC_INETATON_ID);
          break;
        case ITM_INET_NTOA:
          setClassID(FUNC_INETNTOA_ID);
          break;
	case ITM_USER:
	case ITM_USERID:
	case ITM_AUTHTYPE:
	case ITM_AUTHNAME:
	  setClassID(FUNC_USER_ID);
	  break;
	case ITM_CURRENT_USER:
	case ITM_SESSION_USER:
	  setClassID(FUNC_ANSI_USER_ID);
	  break;
	case ITM_VARIANCE:
	  setClassID(FUNC_VARIANCE_ID);
	  break;
	case ITM_STDDEV:
	  setClassID(FUNC_STDDEV_ID);
	  break;
	case ITM_RAISE_ERROR:
	  setClassID(FUNC_RAISE_ERROR_ID);
	  break;
	case ITM_RANDOMNUM:
	  setClassID(FUNC_RANDOMNUM_ID);
	  break;
	case ITM_RAND_SELECTION:
	  setClassID(FUNC_RAND_SELECTION_ID);
	  break;
	case ITM_PROGDISTRIB:
	  setClassID(FUNC_PROGDISTRIB_ID);
	  break;
	case ITM_PROGDISTRIBKEY:
	  setClassID(FUNC_PROGDISTKEY_ID);
	  break;
	case ITM_PAGROUP:
	  setClassID(FUNC_PAGROUP_ID);
	  break;
	case ITM_HASH2_DISTRIB:
	  setClassID(FUNC_HASH2_DISTRIB_ID);
	  break;
	case ITM_UNPACKCOL:
	  setClassID(FUNC_UNPACKCOL_ID);
	  break;
	case ITM_PACK_FUNC:
	  setClassID(FUNC_PACK_ID);
	  break;
	case ITM_ROWSETARRAY_SCAN:
	  setClassID(FUNC_ROWSETARRAY_SCAN_ID);
	  break;
	case ITM_ROWSETARRAY_ROWID:
	  setClassID(FUNC_ROWSETARRAY_ROW_ID);
	  break;
	case ITM_ROWSETARRAY_INTO:
	  setClassID(FUNC_ROWSETARRAY_INTO_ID);
	  break;
	case ITM_RANGE_LOOKUP:
	  setClassID(FUNC_RANGE_LOOKUP_ID);
	  break;
	case ITM_OFFSET:
	  setClassID(FUNC_OFFSET_ID);
	  break;
	case ITM_DEGREES:
	case ITM_PI:
	case ITM_RADIANS:
	case ITM_ROUND:
	case ITM_SCALE_TRUNC:
	case ITM_ACOS:
	case ITM_ASIN:
	case ITM_ATAN:
	case ITM_ATAN2:
	case ITM_CEIL:
	case ITM_COS:
	case ITM_COSH:
	case ITM_EXP:
	case ITM_FLOOR:
	case ITM_LOG:
	case ITM_LOG10:
	case ITM_LOG2:
	case ITM_SIN:
	case ITM_SINH:
	case ITM_SQRT:
	case ITM_TAN:
	case ITM_TANH:
	case ITM_EXPONENT:
	case ITM_POWER:
	  setClassID(FUNC_MATH_ID);
	  break;
	case ITM_BITAND:
	case ITM_BITOR:
	case ITM_BITXOR:
	case ITM_BITNOT:
	case ITM_BITEXTRACT:
	case ITM_CONVERTTOBITS:
	  setClassID(FUNC_BIT_OPER_ID);
	  break;
	case ITM_ONE_ROW:
	  setClassID(AGGR_ONE_ROW_ID);
	  break;
	case ITM_ANY_TRUE_MAX:
	  setClassID(AGGR_ANY_TRUE_MAX_ID);
	  break;
	case ITM_AGGR_MIN_MAX:
	  setClassID(AGGR_MIN_MAX_ID);
	  break;
	case ITM_AGGR_GROUPING_FUNC:
	  setClassID(AGGR_GROUPING_ID);
	  break;
	case ITM_CURRENTEPOCH:
	case ITM_VSBBROWTYPE:
	case ITM_VSBBROWCOUNT:
	  setClassID(FUNC_GENERICUPDATEOUTPUT_ID);
	  break;
	case ITM_INTERNALTIMESTAMP:
	  setClassID(FUNC_INTERNALTIMESTAMP_ID);
	  break;
	case ITM_UNIQUE_EXECUTE_ID:
	  setClassID(FUNC_UNIQUE_EXECUTE_ID_ID);
	  break;
	case ITM_GET_TRIGGERS_STATUS:
	  setClassID(FUNC_GET_TRIGGERS_STATUS_ID);
	  break;
	case ITM_GET_BIT_VALUE_AT:
	  setClassID(FUNC_GET_BIT_VALUE_AT_ID);
	  break;
	case ITM_IS_BITWISE_AND_TRUE:
	  setClassID(FUNC_IS_BITWISE_AND_TRUE);
	  break;
	case ITM_NULLIFZERO:
	  setClassID(FUNC_NULLIFZERO);
	  break;
	case ITM_NVL:
	  setClassID(FUNC_NVL);
	  break;
        case ITM_JSONOBJECTFIELDTEXT:
	  setClassID(FUNC_JSON_ID);
	  break;
	case ITM_QUERYID_EXTRACT:
	  setClassID(FUNC_QUERYID_EXTRACT);
	  break;
	case ITM_UNIQUE_ID:
	case ITM_UNIQUE_SHORT_ID:
	  setClassID(FUNC_UNIQUE_ID);
	  break;
	case ITM_ROWNUM:
	  setClassID(FUNC_ROWNUM);
	  break;
	case ITM_HBASE_COLUMN_LOOKUP:
	  setClassID(FUNC_HBASE_COLUMN_LOOKUP);
	  break;
	case ITM_HBASE_COLUMNS_DISPLAY:
	  setClassID(FUNC_HBASE_COLUMNS_DISPLAY);
	  break;
	case ITM_HBASE_COLUMN_CREATE:
	  setClassID(FUNC_HBASE_COLUMN_CREATE);
	  break;
	case ITM_TOKENSTR:
	  setClassID(FUNC_TOKENSTR_ID);
	  break;
	case ITM_REVERSE:
	  setClassID(FUNC_REVERSE_ID);
	  break;
	case ITM_CAST_TYPE:
	  setClassID(FUNC_CAST_TYPE);
	  break;
	case ITM_SEQUENCE_VALUE:
	  setClassID(FUNC_SEQUENCE_VALUE);
	  break;
	case ITM_PIVOT_GROUP:
	  setClassID(FUNC_PIVOT_GROUP);
	  break;
	case ITM_HEADER:
	  setClassID(FUNC_HEADER);
	  break;
	case ITM_HBASE_TIMESTAMP:
	  setClassID(FUNC_HBASE_TIMESTAMP);
	  break;
	case ITM_HBASE_VERSION:
	  setClassID(FUNC_HBASE_VERSION);
	  break;
	case ITM_SOUNDEX:
	  setClassID(FUNC_SOUNDEX_ID);
	  break;
        case ITM_AES_ENCRYPT:
          setClassID(FUNC_AES_ENCRYPT);
          break;
        case ITM_AES_DECRYPT:
          setClassID(FUNC_AES_DECRYPT);
          break;
	default:
	  GenAssert(0, "ex_clause: Unknown Class ID.");
	  break;
	}
    }
  else if (type == ex_clause::LOB_TYPE)
    {
      switch (oper_type)
	{
	case ITM_LOBINSERT:
	  setClassID(LOB_INSERT);
	  break;
	case ITM_LOBSELECT:
	  setClassID(LOB_SELECT);
	  break;
	case ITM_LOBDELETE:
	  setClassID(LOB_DELETE);
	  break;
	case ITM_LOBUPDATE:
	  setClassID(LOB_UPDATE);
	  break;
	case ITM_LOBCONVERT:
	  setClassID(LOB_CONVERT);
	  break;
	case ITM_LOBCONVERTHANDLE:
	  setClassID(LOB_CONVERTHANDLE);
	  break;
	case ITM_SUBSTR:
	  setClassID(LOB_FUNC_SUBSTR);
	  break;
	default:
	  GenAssert(0, "ex_clause: Unknown Class ID.");
	  break;
	}
    }

  clauseNum_ = 0;
  numberBranchTargets_ = 0;

  /* Make sure that all operands have valid values for atp, atp_index
     and offset.                                                      */
  if (op) {

    short numOperands = (op[0]->showplan() ? num_operands*2 : num_operands);

    if (space)
      
      op_ = (AttributesPtr *)(space->allocateAlignedSpace(numOperands *
							sizeof(AttributesPtr)));
	
    else
      //      op_ = (AttributesPtr *)(new char[numOperands * sizeof(AttributesPtr)]);
      GenAssert(0, "Internal Error: must pass the space pointer.");

      
    Lng32 i = 0;
    Attributes *attr = NULL;
    for (i=0; i<num_operands;i++) {
      if (! op[i])
        continue;

      if ((op[i]->getAtp() < 0) ||
	  (op[i]->getAtpIndex() < 0) ||
	  (op[i]->getTupleFormat() == ExpTupleDesc::UNINITIALIZED_FORMAT))
	GenAssert(0, "Internal Error: Operand attributes are not valid.");

      if (space)
	attr = op[i]->newCopy(space);
      else
	//	op_[i] = op[i]->newCopy();
	GenAssert(0, "Internal Error: must pass the space pointer.");
  
      attr->setAtp(op[i]->getAtp());
      attr->setAtpIndex(op[i]->getAtpIndex());
      attr->setOffset(op[i]->getOffset());
      attr->setRelOffset(op[i]->getRelOffset());
      attr->setVoaOffset(op[i]->getVoaOffset());
      attr->setNullBitIndex(op[i]->getNullBitIndex());
      attr->setNextFieldIndex(op[i]->getNextFieldIndex());
      attr->setTupleFormat(op[i]->getTupleFormat());
      attr->setDefaultFieldNum(op[i]->getDefaultFieldNum());

      if (attr->getNullFlag()) {
	if(i == 0) flags_ |= ANY_OUTPUT_NULLABLE;
	else flags_ |= ANY_INPUT_NULLABLE;
      }
      op_[i] = attr;
    }

    if (op_[0]->showplan())
      {
	for (i = num_operands; i < numOperands; i++)
	  {
	    if (space)
	      op_[i] = op[i]->newCopy(space);
	    else
	      op_[i] = op[i]->newCopy();
	  }
      }
  }
  else
    op_ = 0;
};


ex_clause::~ex_clause()
{
}

// -----------------------------------------------------------------------
// This method returns the virtual function table pointer for an object
// with the given class ID; used by NAVersionedObject::driveUnpack().
// -----------------------------------------------------------------------
char *ex_clause::findVTblPtr(short classID)
{
  char *vtblPtr;
  switch (classID)
    {
    case ex_clause::COMP_TYPE:
      GetVTblPtr(vtblPtr, ex_comp_clause);
      break;
    case ex_clause::CONV_TYPE:
      GetVTblPtr(vtblPtr, ex_conv_clause);
      break;
    case ex_clause::UN_LOGIC_TYPE:
      GetVTblPtr(vtblPtr, ex_unlogic_clause);
      break;
    case ex_clause::ARITH_TYPE:
      GetVTblPtr(vtblPtr, ex_arith_clause);
      break;
    case ex_clause::ARITH_SUM_TYPE:
      GetVTblPtr(vtblPtr, ex_arith_sum_clause);
      break;
    case ex_clause::ARITH_COUNT_TYPE:
      GetVTblPtr(vtblPtr, ex_arith_count_clause);
      break;
    case ex_clause::LIKE_CLAUSE_CHAR_ID:
      GetVTblPtr(vtblPtr, ex_like_clause_char);
      break;
    case ex_clause::LIKE_CLAUSE_DOUBLEBYTE_ID:
      GetVTblPtr(vtblPtr, ex_like_clause_doublebyte);
      break;
    case ex_clause::REGEXP_CLAUSE_CHAR_ID:
            GetVTblPtr(vtblPtr, ExRegexpClauseChar);
      break;
    case ex_clause::FUNC_ASCII_ID:
      GetVTblPtr(vtblPtr, ExFunctionAscii);
      break;
    case ex_clause::FUNC_CHAR_ID:
      GetVTblPtr(vtblPtr, ExFunctionChar);
      break;
    case ex_clause::FUNC_CHAR_LEN_ID:
      GetVTblPtr(vtblPtr, ex_function_char_length);
      break;
    case ex_clause::FUNC_CHAR_LEN_DOUBLEBYTE_ID:
      GetVTblPtr(vtblPtr, ex_function_char_length_doublebyte);
      break;
    case ex_clause::FUNC_CVT_HEX_ID:
      GetVTblPtr(vtblPtr, ExFunctionConvertHex);
      break;
    case ex_clause::FUNC_OCT_LEN_ID:
      GetVTblPtr(vtblPtr, ex_function_oct_length);
      break;
    case ex_clause::FUNC_POSITION_ID:
      GetVTblPtr(vtblPtr, ex_function_position);
      break;
    case ex_clause::FUNC_POSITION_DOUBLEBYTE_ID:
      GetVTblPtr(vtblPtr, ex_function_position_doublebyte);
      break;
    case ex_clause::FUNC_SPLIT_PART_ID:
      GetVTblPtr(vtblPtr, ex_function_split_part);
      break;
    case ex_clause::FUNC_CONCAT_ID:
      GetVTblPtr(vtblPtr, ex_function_concat);
      break;
    case ex_clause::FUNC_REPEAT_ID:
      GetVTblPtr(vtblPtr, ExFunctionRepeat);
      break;
    case ex_clause::FUNC_REPLACE_ID:
      GetVTblPtr(vtblPtr, ExFunctionReplace);
      break;
    case ex_clause::FUNC_SUBSTR_ID:
      GetVTblPtr(vtblPtr, ex_function_substring);
      break;
    // 12/23/97: added for unicode
    case ex_clause::FUNC_SUBSTR_DOUBLEBYTE_ID:
      GetVTblPtr(vtblPtr, ex_function_substring_doublebyte);
      break;
    case ex_clause::FUNC_TRIM_ID:
      GetVTblPtr(vtblPtr, ex_function_trim_char);
      break;
    case ex_clause::FUNC_TRANSLATE_ID:
      GetVTblPtr(vtblPtr, ex_function_translate);
      break;
    // 12/29/97: added for unicode
    case ex_clause::FUNC_TRIM_DOUBLEBYTE_ID:
      GetVTblPtr(vtblPtr, ex_function_trim_doublebyte);
      break;
    case ex_clause::FUNC_LOWER_ID:
      GetVTblPtr(vtblPtr, ex_function_lower);
      break;
    case ex_clause::FUNC_UPPER_ID:
      GetVTblPtr(vtblPtr, ex_function_upper);
      break;
    // 12/17/97: added for unicode UPPER()
    case ex_clause::FUNC_UPPER_UNICODE_ID:
      GetVTblPtr(vtblPtr, ex_function_upper_unicode);
      break;
    // 12/17/97: added for unicode LOWER()
    case ex_clause::FUNC_LOWER_UNICODE_ID:
      GetVTblPtr(vtblPtr, ex_function_lower_unicode);
      break;
    case ex_clause::FUNC_SLEEP_ID:
      GetVTblPtr(vtblPtr, ex_function_sleep);
      break;
    case ex_clause::FUNC_UNIX_TIMESTAMP_ID:
      GetVTblPtr(vtblPtr, ex_function_unixtime);
      break;
    case ex_clause::FUNC_CURRENT_TIMESTAMP_ID:
      GetVTblPtr(vtblPtr, ex_function_current);
      break;
    case ex_clause::FUNC_INTERNALTIMESTAMP_ID:
      GetVTblPtr(vtblPtr, ExFunctionInternalTimestamp);
      break;
    case ex_clause::FUNC_GENERICUPDATEOUTPUT_ID:
      GetVTblPtr(vtblPtr, ExFunctionGenericUpdateOutput);
      break;
    case ex_clause::FUNC_UNIQUE_EXECUTE_ID_ID:
      GetVTblPtr(vtblPtr, ex_function_unique_execute_id);
      break;
    case ex_clause::FUNC_GET_TRIGGERS_STATUS_ID:
      GetVTblPtr(vtblPtr, ex_function_get_triggers_status);
      break;
    case ex_clause::FUNC_GET_BIT_VALUE_AT_ID:
      GetVTblPtr(vtblPtr, ex_function_get_bit_value_at);
      break;
    case ex_clause::FUNC_IS_BITWISE_AND_TRUE:
      GetVTblPtr(vtblPtr, ex_function_is_bitwise_and_true);
      break;
    case ex_clause::FUNC_ENCODE_ID:
      GetVTblPtr(vtblPtr, ex_function_encode);
      break;
    case ex_clause::FUNC_EXPLODE_VARCHAR_ID:
      GetVTblPtr(vtblPtr, ex_function_explode_varchar);
      break;
    case ex_clause::FUNC_HASH_ID:
      GetVTblPtr(vtblPtr, ex_function_hash);
      break;
    case ex_clause::FUNC_HASHCOMB_ID:
      GetVTblPtr(vtblPtr, ExHashComb);
      break;
    case ex_clause::FUNC_HDPHASH_ID:
      GetVTblPtr(vtblPtr, ExHDPHash);
      break;
    case ex_clause::FUNC_HDPHASHCOMB_ID:
      GetVTblPtr(vtblPtr, ExHDPHashComb);
      break;
    case ex_clause::FUNC_BITMUX_ID:
      GetVTblPtr(vtblPtr, ExpBitMuxFunction);
      break;
    case ex_clause::FUNC_REPLACE_NULL_ID:
      GetVTblPtr(vtblPtr, ex_function_replace_null);
      break;
    case ex_clause::FUNC_MOD_ID:
      GetVTblPtr(vtblPtr, ex_function_mod);
      break;
    case ex_clause::FUNC_MASK_ID:
      GetVTblPtr(vtblPtr, ex_function_mask);
      break;
    case ex_clause::FUNC_SHIFT_ID:
      GetVTblPtr(vtblPtr, ExFunctionShift);
      break;
    case ex_clause::FUNC_ABS_ID:
      GetVTblPtr(vtblPtr, ex_function_abs);
      break;
    case ex_clause::FUNC_BOOL_ID:
      GetVTblPtr(vtblPtr, ex_function_bool);
      break;
    case ex_clause::FUNC_CONVERTTIMESTAMP_ID:
      GetVTblPtr(vtblPtr, ex_function_converttimestamp);
      break;
    case ex_clause::FUNC_DATEFORMAT_ID:
      GetVTblPtr(vtblPtr, ex_function_dateformat);
      break;
    case ex_clause::FUNC_DAYOFWEEK_ID:
      GetVTblPtr(vtblPtr, ex_function_dayofweek);
      break;
    case ex_clause::FUNC_EXTRACT_ID:
      GetVTblPtr(vtblPtr, ex_function_extract);
      break;
    case ex_clause::FUNC_JULIANTIMESTAMP_ID:
      GetVTblPtr(vtblPtr, ex_function_juliantimestamp);
      break;
    case ex_clause::FUNC_EXEC_COUNT_ID:
      GetVTblPtr(vtblPtr, ex_function_exec_count);
      break;
    case ex_clause::FUNC_CURR_TRANSID_ID:
      GetVTblPtr(vtblPtr, ex_function_curr_transid);
      break;
    case ex_clause::FUNC_USER_ID:
      GetVTblPtr(vtblPtr, ex_function_user);
      break;
    case ex_clause::FUNC_ANSI_USER_ID:
      GetVTblPtr(vtblPtr, ex_function_ansi_user);
      break;
    case ex_clause::FUNC_VARIANCE_ID:
      GetVTblPtr(vtblPtr, ExFunctionSVariance);
      break;
    case ex_clause::FUNC_STDDEV_ID:
      GetVTblPtr(vtblPtr, ExFunctionSStddev);
      break;
    case ex_clause::FUNC_RAISE_ERROR_ID:
      GetVTblPtr(vtblPtr, ExpRaiseErrorFunction);
      break;
    case ex_clause::FUNC_RANDOMNUM_ID:
      GetVTblPtr(vtblPtr, ExFunctionRandomNum);
      break;
    case ex_clause::FUNC_RAND_SELECTION_ID:
      GetVTblPtr(vtblPtr, ExFunctionRandomSelection);
      break;
    case ex_clause::FUNC_PROGDISTRIB_ID:
      GetVTblPtr(vtblPtr, ExProgDistrib);
      break;
    case ex_clause::FUNC_PROGDISTKEY_ID:
      GetVTblPtr(vtblPtr, ExProgDistribKey);
      break;
    case ex_clause::FUNC_PAGROUP_ID:
      GetVTblPtr(vtblPtr, ExPAGroup);
      break;
    case ex_clause::FUNC_HASH2_DISTRIB_ID:
      GetVTblPtr(vtblPtr, ExHash2Distrib);
      break;
    case ex_clause::FUNC_HEADER:
      GetVTblPtr(vtblPtr, ExHeaderClause);
      break;
    case ex_clause::FUNC_UNPACKCOL_ID:
      GetVTblPtr(vtblPtr, ExUnPackCol);
      break;
    case ex_clause::FUNC_PACK_ID:
      GetVTblPtr(vtblPtr, ExFunctionPack);
      break;
    case ex_clause::FUNC_RANGE_LOOKUP_ID:
      GetVTblPtr(vtblPtr, ExFunctionRangeLookup);
      break;
    case ex_clause::FUNC_OFFSET_ID:
      GetVTblPtr(vtblPtr, ExpSequenceFunction);
      break;
    case ex_clause::FUNCTION_TYPE:
      GetVTblPtr(vtblPtr, ex_function_clause);
      break;
    case ex_clause::FUNC_MATH_ID:
      GetVTblPtr(vtblPtr, ExFunctionMath);
      break;
    case ex_clause::FUNC_BIT_OPER_ID:
      GetVTblPtr(vtblPtr, ExFunctionBitOper);
      break;
    case ex_clause::BOOL_RESULT_TYPE:
      GetVTblPtr(vtblPtr, bool_result_clause);
      break;
    case ex_clause::BOOL_TYPE:
      GetVTblPtr(vtblPtr, ex_bool_clause);
      break;
    case ex_clause::BRANCH_TYPE:
      GetVTblPtr(vtblPtr, ex_branch_clause);
      break;
    case ex_clause::INOUT_TYPE:
      GetVTblPtr(vtblPtr, ex_inout_clause);
      break;
    case ex_clause::NOOP_TYPE:
      GetVTblPtr(vtblPtr, ex_noop_clause);
      break;
    case ex_clause::AGGR_ONE_ROW_ID:
      GetVTblPtr(vtblPtr, ex_aggr_one_row_clause);
      break;
    case ex_clause::AGGR_ANY_TRUE_MAX_ID:
      GetVTblPtr(vtblPtr, ex_aggr_any_true_max_clause);
      break;
    case ex_clause::AGGR_MIN_MAX_ID:
      GetVTblPtr(vtblPtr, ex_aggr_min_max_clause);
      break;
    case ex_clause::AGGR_GROUPING_ID:
      GetVTblPtr(vtblPtr, ExFunctionGrouping);
      break;
    case ex_clause::AGGREGATE_TYPE:
      GetVTblPtr(vtblPtr, ex_aggregate_clause);
      break;
    case ex_clause::FUNC_ROWSETARRAY_SCAN_ID:
      GetVTblPtr(vtblPtr, ExRowsetArrayScan)
      break;
    case ex_clause::FUNC_ROWSETARRAY_ROW_ID:
      GetVTblPtr(vtblPtr, ExRowsetArrayRowid);
      break;
    case ex_clause::FUNC_ROWSETARRAY_INTO_ID:
      GetVTblPtr(vtblPtr, ExRowsetArrayInto);
      break;
    case ex_clause::FUNC_NULLIFZERO:
      GetVTblPtr(vtblPtr, ex_function_nullifzero);
      break;
    case ex_clause::FUNC_NVL:
      GetVTblPtr(vtblPtr, ex_function_nvl);
      break;
    case ex_clause::FUNC_JSON_ID:
      GetVTblPtr(vtblPtr, ex_function_json_object_field_text);
      break;
    case ex_clause::FUNC_QUERYID_EXTRACT:
      GetVTblPtr(vtblPtr, ex_function_queryid_extract);
      break;
    case ex_clause::FUNC_TOKENSTR_ID:
      GetVTblPtr(vtblPtr, ExFunctionTokenStr);
      break;
    case ex_clause::FUNC_REVERSE_ID:
      GetVTblPtr(vtblPtr, ExFunctionReverseStr);
      break;
    case ex_clause::LOB_INSERT:
      GetVTblPtr(vtblPtr, ExpLOBinsert);
      break;
    case ex_clause::LOB_SELECT:
      GetVTblPtr(vtblPtr, ExpLOBselect);
      break;
    case ex_clause::LOB_DELETE:
      GetVTblPtr(vtblPtr, ExpLOBdelete);
      break;
    case ex_clause::LOB_UPDATE:
      GetVTblPtr(vtblPtr, ExpLOBupdate);
      break;
    case ex_clause::LOB_CONVERT:
      GetVTblPtr(vtblPtr, ExpLOBconvert);
      break;
    case ex_clause::LOB_CONVERTHANDLE:
      GetVTblPtr(vtblPtr, ExpLOBconvertHandle);
      break;
    case ex_clause::LOB_FUNC_SUBSTR:
      GetVTblPtr(vtblPtr, ExpLOBfuncSubstring);
      break;
    case ex_clause::FUNC_HIVEHASH_ID:
      GetVTblPtr(vtblPtr, ex_function_hivehash);
      break;
    case ex_clause::FUNC_HIVEHASHCOMB_ID:
      GetVTblPtr(vtblPtr, ExHiveHashComb);
      break;
    case ex_clause::FUNC_UNIQUE_ID:
      GetVTblPtr(vtblPtr, ExFunctionUniqueId);
      break;
    case ex_clause::FUNC_ROWNUM:
      GetVTblPtr(vtblPtr, ExFunctionRowNum);
      break;
    case ex_clause::FUNC_HBASE_COLUMN_LOOKUP:
      GetVTblPtr(vtblPtr, ExFunctionHbaseColumnLookup);
      break;
    case ex_clause::FUNC_HBASE_COLUMNS_DISPLAY:
      GetVTblPtr(vtblPtr, ExFunctionHbaseColumnsDisplay);
      break;
    case ex_clause::FUNC_HBASE_COLUMN_CREATE:
      GetVTblPtr(vtblPtr, ExFunctionHbaseColumnCreate);
      break;
    case ex_clause::FUNC_CAST_TYPE:
      GetVTblPtr(vtblPtr, ExFunctionCastType);
      break;
    case ex_clause::FUNC_SEQUENCE_VALUE:
      GetVTblPtr(vtblPtr, ExFunctionSequenceValue);
      break;
    case ex_clause::FUNC_PIVOT_GROUP:
      GetVTblPtr(vtblPtr, ex_pivot_group_clause);
      break;
    case ex_clause::FUNC_HBASE_TIMESTAMP:
      GetVTblPtr(vtblPtr, ExFunctionHbaseTimestamp);
      break;
    case ex_clause::FUNC_HBASE_VERSION:
      GetVTblPtr(vtblPtr, ExFunctionHbaseVersion);
      break;
    case ex_clause::FUNC_SHA1_ID:
      GetVTblPtr(vtblPtr, ExFunctionSha);
      break;
    case ex_clause::FUNC_SHA2_ID:
      GetVTblPtr(vtblPtr, ExFunctionSha2);
      break;
    case ex_clause::FUNC_MD5_ID:
      GetVTblPtr(vtblPtr, ExFunctionMd5);
      break;
    case ex_clause::FUNC_CRC32_ID:
      GetVTblPtr(vtblPtr, ExFunctionCrc32);
      break;
    case ex_clause::FUNC_ISIP_ID:
      GetVTblPtr(vtblPtr, ExFunctionIsIP);
      break;
    case ex_clause::FUNC_INETATON_ID:
      GetVTblPtr(vtblPtr, ExFunctionInetAton);
      break;
    case ex_clause::FUNC_INETNTOA_ID:
      GetVTblPtr(vtblPtr, ExFunctionInetNtoa);
      break;
    case ex_clause::FUNC_SOUNDEX_ID:
      GetVTblPtr(vtblPtr, ExFunctionSoundex);
      break;
    case ex_clause::FUNC_AES_ENCRYPT:
      GetVTblPtr(vtblPtr, ExFunctionAESEncrypt);
      break;
    case ex_clause::FUNC_AES_DECRYPT:
      GetVTblPtr(vtblPtr, ExFunctionAESDecrypt);
      break;
     default:
      GetVTblPtr(vtblPtr, ex_clause);
      break;
    }
  return vtblPtr;
}


ex_expr::exp_return_type ex_clause::processNulls(char *null_data[],
						 CollHeap *heap,
						 ComDiagsArea **diagsArea)
{
  
  for (short i = 1; i < getNumOperands(); i++)
    {
      // if value is missing, then it is a null value.
      // Move it to result and return. 
      if ((getOperand(i)->getNullFlag()) &&    // nullable
	  (! null_data[i]))                    // missing value 
	{
	  // This test is only needed in derived ex_conv_clause::processNulls;
	  // (! get_operand(0)->getNullFlag()) should be impossible here.
	  //
	  // if (! get_operand(0)->getNullFlag()) // target not nullable
	  //   {
	  //     // Attempt to put NULL into a column with a
	  //     // NOT NULL NONDROPPABLE constraint.
	  //     // ## Need to supply name of constraint and name of table here.
	  //     ExRaiseSqlError(heap, diagsArea, EXE_TABLE_CHECK_CONSTRAINT);
	  //     return ex_expr::EXPR_ERROR;
	  //   }

	  // move null value to result.
          ExpTupleDesc::setNullValue( null_data[0],
                                      getOperand(0)->getNullBitIndex(),
                                      getOperand(0)->getTupleFormat() );
	  return ex_expr::EXPR_NULL;
	}
    }
  
  // move 0 to the null bytes of result
  if (getOperand(0)->getNullFlag())
    {
      ExpTupleDesc::clearNullValue( null_data[0],
                                    getOperand(0)->getNullBitIndex(),
                                    getOperand(0)->getTupleFormat() );
    }
  
  return ex_expr::EXPR_OK;
}

Long ex_clause::packClause(void * space, Lng32 /*size*/)
{
  if (op_) {
    if (op_[0]->showplan()) {
      for (Lng32 i=numOperands_; i < 2 * numOperands_; i++)
        op_[i].pack(space);
    }
    for (Lng32 i=0; i < numOperands_; i++) 
      op_[i].pack(space);
  }
  op_.packShallow(space);
  return NAVersionedObject::pack(space);
}

Long ex_clause::pack(void * space)
{
  return packClause(space, sizeof(ex_clause));
}

Lng32 ex_clause::unpackClause(void *base, void * reallocator)
{
  if (op_) {
    if (op_.unpackShallow(base)) return -1;
    for (Lng32 i=0; i < numOperands_; i++) {
      if (op_[i].unpack(base, reallocator)) return -1;
    }
    if (op_[0]->showplan()) {
	  for (Lng32 i=numOperands_; i < 2 * numOperands_; i++) {
        if (op_[i].unpack(base, reallocator)) return -1;
      }
    }
  }
  return NAVersionedObject::unpack(base, reallocator);
}

Lng32 ex_clause::unpack(void *base, void * reallocator)
{
  return unpackClause(base, reallocator);
}

const char * getOperTypeEnumAsString(Int16 /*OperatorTypeEnum*/ ote)
{
  switch (ote)
    {
    // Note, this list is arranged in the same order as the types
    // appear in common/OperTypeEnum.h, please keep the same order
    // when adding new types
    case ITM_AND: return "ITM_AND";
    case ITM_OR: return "ITM_OR";

    // unary logic operators
    case ITM_NOT: return "ITM_NOT";
    case ITM_IS_TRUE: return "ITM_IS_TRUE";
    case ITM_IS_FALSE: return "ITM_IS_FALSE";
    case ITM_IS_NULL: return "ITM_IS_NULL";
    case ITM_IS_NOT_NULL: return "ITM_IS_NOT_NULL";
    case ITM_IS_UNKNOWN: return "ITM_IS_UNKNOWN";
    case ITM_IS_NOT_UNKNOWN: return "ITM_IS_NOT_UNKNOWN";

    // binary comparison operators
    case ITM_EQUAL: return "ITM_EQUAL";
    case ITM_NOT_EQUAL: return "ITM_NOT_EQUAL";
    case ITM_LESS: return "ITM_LESS";
    case ITM_LESS_EQ: return "ITM_LESS_EQ";
    case ITM_GREATER: return "ITM_GREATER";
    case ITM_GREATER_EQ: return "ITM_GREATER_EQ";

    // unary arithmetic operators
    case ITM_NEGATE: return "ITM_NEGATE";
    case ITM_INVERSE: return "ITM_INVERSE";
    // binary arithmetic operators
    case ITM_PLUS: return "ITM_PLUS";
    case ITM_MINUS: return "ITM_MINUS";
    case ITM_TIMES: return "ITM_TIMES";
    case ITM_DIVIDE: return "ITM_DIVIDE";
    case ITM_EXPONENT: return "ITM_EXPONENT";

    // aggregate functions
    case ITM_AVG: return "ITM_AVG";
    case ITM_MAX: return "ITM_MAX";
    case ITM_MIN: return "ITM_MIN";
    case ITM_MAX_ORDERED: return "ITM_MAX_ORDERED";
    case ITM_MIN_ORDERED: return "ITM_MIN_ORDERED";
    case ITM_SUM: return "ITM_SUM";
    case ITM_COUNT: return "ITM_COUNT";
    case ITM_COUNT_NONULL: return "ITM_COUNT_NONULL";
    case ITM_STDDEV: return "ITM_STDDEV";
    case ITM_VARIANCE: return "ITM_VARIANCE";
    case ITM_BASECOL: return "ITM_BASECOL";

    case ITM_ONE_ROW: return "ITM_ONE_ROW";
    case ITM_ONEROW: return "ITM_ONEROW";
    case ITM_ONE_TRUE: return "ITM_ONE_TRUE";
    case ITM_ANY_TRUE: return "ITM_ANY_TRUE";
    case ITM_ANY_TRUE_MAX: return "ITM_ANY_TRUE_MAX";
    case ITM_MAX_INCL_NULL: return "ITM_MAX_INCL_NULL";

    case ITM_PIVOT_GROUP: return "ITM_PIVOT_GROUP";

    case ITM_AGGR_MIN_MAX: return "ITM_AGGR_MIN_MAX";
    case ITM_AGGR_GROUPING_FUNC: return "ITM_AGGR_GROUPING_FUNC";

    // custom functions
    case ITM_USER_DEF_FUNCTION: return "ITM_USER_DEF_FUNCTION";
    case ITM_BETWEEN: return "ITM_BETWEEN";
    case ITM_LIKE: return "ITM_LIKE";
    case ITM_REGEXP: return "ITM_REGEXP";
    case ITM_UNIX_TIMESTAMP: return "ITM_UNIX_TIMESTAMP";
    case ITM_SLEEP: return "ITM_SLEEP";
    case ITM_CURRENT_TIMESTAMP: return "ITM_CURRENT_TIMESTAMP";
    case ITM_CURRENT_USER: return "ITM_CURRENT_USER";
    case ITM_SESSION_USER: return "ITM_SESSION_USER";
    case ITM_USER: return "ITM_USER";
    case ITM_AUTHNAME: return "ITM_AUTHNAME";
    case ITM_AUTHTYPE: return "ITM_AUTHTYPE";

    case ITM_BOOL_RESULT: return "ITM_BOOL_RESULT";
    case ITM_NO_OP: return "ITM_NO_OP";

    case ITM_CASE: return "ITM_CASE";
    case ITM_IF_THEN_ELSE: return "ITM_IF_THEN_ELSE";
    case ITM_RETURN_TRUE: return "ITM_RETURN_TRUE";
    case ITM_RETURN_FALSE: return "ITM_RETURN_FALSE";
    case ITM_RETURN_NULL: return "ITM_RETURN_NULL";
    case ITM_COMP_ENCODE: return "ITM_COMP_ENCODE";
    case ITM_COMP_DECODE: return "ITM_COMP_DECODE";
    case ITM_HASH: return "ITM_HASH";
    case ITM_REPLACE_NULL: return "ITM_REPLACE_NULL";
    case ITM_PACK_FUNC: return "ITM_PACK_FUNC";
    case ITM_BITMUX: return "ITM_BITMUX";
    case ITM_OVERLAPS: return "ITM_OVERLAPS";
    case ITM_RAISE_ERROR: return "ITM_RAISE_ERROR";

    case ITM_USERID: return "ITM_USERID";

    // sequence functions
    case ITM_DIFF1            : return "ITM_DIFF1";
    case ITM_DIFF2            : return "ITM_DIFF2";
    case ITM_LAST_NOT_NULL    : return "ITM_LAST_NOT_NULL";
    case ITM_MOVING_COUNT     : return "ITM_MOVING_COUNT";
    case ITM_MOVING_SUM       : return "ITM_MOVING_SUM";
    case ITM_MOVING_AVG       : return "ITM_MOVING_AVG";
    case ITM_MOVING_MAX       : return "ITM_MOVING_MAX";
    case ITM_MOVING_MIN       : return "ITM_MOVING_MIN";
    case ITM_MOVING_SDEV      : return "ITM_MOVING_SDEV";
    case ITM_MOVING_VARIANCE  : return "ITM_MOVING_VARIANCE";
    case ITM_OFFSET           : return "ITM_OFFSET";
    case ITM_RUNNING_COUNT    : return "ITM_RUNNING_COUNT";
    case ITM_ROWS_SINCE       : return "ITM_ROWS_SINCE";
    case ITM_RUNNING_SUM      : return "ITM_RUNNING_SUM";
    case ITM_RUNNING_AVG      : return "ITM_RUNNING_AVG";
    case ITM_RUNNING_MAX      : return "ITM_RUNNING_MAX";
    case ITM_RUNNING_MIN      : return "ITM_RUNNING_MIN";
    case ITM_RUNNING_SDEV     : return "ITM_RUNNING_SDEV";
    case ITM_RUNNING_VARIANCE : return "ITM_RUNNING_VARIANCE";
    case ITM_THIS             : return "ITM_THIS";
    case ITM_NOT_THIS         : return "ITM_NOT_THIS";

    // flow control
    case ITM_DO_WHILE         : return "ITM_DO_WHILE";
    case ITM_BLOCK            : return "ITM_BLOCK";
    case ITM_WHILE            : return "ITM_WHILE";

    // scalar min/max

    case ITM_SCALAR_MIN       : return "ITM_SCALAR_MIN";
    case ITM_SCALAR_MAX       : return "ITM_SCALAR_MAX";

    case ITM_CURRENT_TIMESTAMP_RUNNING: return "ITM_CURRENT_TIMESTAMP_RUNNING";

    // numeric functions
    case ITM_ABS: return "ITM_ABS";
    case ITM_CEIL: return "ITM_CEIL";
    case ITM_COS: return "ITM_COS";
    case ITM_COSH: return "ITM_COSH";
    case ITM_FLOOR: return "ITM_FLOOR";
    case ITM_LOG: return "ITM_LOG";
    case ITM_LOG10: return "ITM_LOG10";
    case ITM_LOG2: return "ITM_LOG2";
    case ITM_MOD: return "ITM_MOD";
    case ITM_POWER: return "ITM_POWER";
    case ITM_ROUND: return "ITM_ROUND";
    case ITM_SIGN: return "ITM_SIGN";
    case ITM_SIN: return "ITM_SIN";
    case ITM_SINH: return "ITM_SINH";
    case ITM_SQRT: return "ITM_SQRT";
    case ITM_TAN: return "ITM_TAN";
    case ITM_TANH: return "ITM_TANH";
    case ITM_ROUND_ROBIN: return "ITM_ROUND_ROBIN";
    case ITM_ACOS: return "ITM_ACOS";
    case ITM_ASIN: return "ITM_ASIN";
    case ITM_ATAN: return "ITM_ATAN";
    case ITM_ATAN2: return "ITM_ATAN2";
    case ITM_DEGREES: return "ITM_DEGREES";
    case ITM_EXP: return "ITM_EXP";
    case ITM_PI: return "ITM_PI";
    case ITM_RADIANS: return "ITM_RADIANS";
    case ITM_SCALE_TRUNC: return "ITM_SCALE_TRUNC";
    case ITM_MASK_CLEAR: return "ITM_MASK_CLEAR";
    case ITM_MASK_SET: return "ITM_MASK_SET";
    case ITM_SHIFT_RIGHT: return "ITM_SHIFT_RIGHT";
    case ITM_SHIFT_LEFT: return "ITM_SHIFT_LEFT";
    case ITM_BITAND: return "ITM_BITAND";
    case ITM_BITOR: return "ITM_BITOR";
    case ITM_BITXOR: return "ITM_BITXOR";
    case ITM_BITNOT: return "ITM_BITNOT";
    case ITM_BITEXTRACT: return "ITM_BITEXTRACT";

    // string functions
    case ITM_TRUNC: return "ITM_TRUNC";
    case ITM_ASCII: return "ITM_ASCII";
    case ITM_CODE_VALUE: return "ITM_CODE_VALUE";
    case ITM_POSITION: return "ITM_POSITION";
    case ITM_CHAR_LENGTH: return "ITM_CHAR_LENGTH";
    case ITM_INSERT_STR: return "ITM_INSERT_STR";
    case ITM_OCTET_LENGTH: return "ITM_OCTET_LENGTH";
    case ITM_LOWER: return "ITM_LOWER";
    case ITM_LPAD: return "ITM_LPAD";
    case ITM_LTRIM: return "ITM_LTRIM";
    case ITM_REPLACE: return "ITM_REPLACE";
    case ITM_RPAD: return "ITM_RPAD";
    case ITM_RTRIM: return "ITM_RTRIM";
    case ITM_SOUNDEX: return "ITM_SOUNDEX";
    case ITM_SUBSTR: return "ITM_SUBSTR";
    case ITM_TRIM: return "ITM_TRIM";
    case ITM_UPPER: return "ITM_UPPER";
    case ITM_CHAR: return "ITM_CHAR";
    case ITM_CONCAT: return "ITM_CONCAT";
    case ITM_UNPACKCOL: return "ITM_UNPACKCOL";
    case ITM_EXPLODE_VARCHAR: return "ITM_EXPLODE_VARCHAR";
    case ITM_REPEAT: return "ITM_REPEAT";
    case ITM_RIGHT: return "ITM_RIGHT";
    case ITM_CONVERTTOBITS: return "ITM_CONVERTTOBITS";
    case ITM_CONVERTTOHEX: return "ITM_CONVERTTOHEX";
    case ITM_CONVERTFROMHEX: return "ITM_CONVERTFROMHEX";
    case ITM_TOKENSTR: return "ITM_TOKENSTR";
    case ITM_REVERSE: return "ITM_REVERSE";

    // UNICODE/DOUBLEBYTE charsets built-in functions
    case ITM_SUBSTR_DOUBLEBYTE: return "ITM_SUBSTR_DOUBLEBYTE";
    case ITM_TRIM_DOUBLEBYTE: return "ITM_TRIM_DOUBLEBYTE";
    case ITM_CHAR_LENGTH_DOUBLEBYTE: return "ITM_CHAR_LENGTH_DOUBLEBYTE";
    case ITM_POSITION_DOUBLEBYTE: return "ITM_POSITION_DOUBLEBYTE";
    case ITM_LIKE_DOUBLEBYTE: return "ITM_LIKE_DOUBLEBYTE";
    case ITM_UPPER_UNICODE: return "ITM_UPPER_UNICODE";
    case ITM_LOWER_UNICODE: return "ITM_LOWER_UNICODE";
    case ITM_REPEAT_UNICODE: return "ITM_REPEAT_UNICODE";
    case ITM_REPLACE_UNICODE: return "ITM_REPLACE_UNICODE";
    case ITM_UNICODE_CODE_VALUE: return "ITM_UNICODE_CODE_VALUE";
    case ITM_NCHAR_MP_CODE_VALUE: return "ITM_NCHAR_MP_CODE_VALUE";
    // translate function
    case ITM_TRANSLATE: return "ITM_TRANSLATE";

    case ITM_UNICODE_CHAR: return "ITM_UNICODE_CHAR";
    case ITM_NCHAR_MP_CHAR: return "ITM_NCHAR_MP_CHAR";

    // RowSet expression functions
    case ITM_ROWSETARRAY_SCAN: return "ITM_ROWSETARRAY_SCAN";
    case ITM_ROWSETARRAY_ROWID: return "ITM_ROWSETARRAY_ROWID";
    case ITM_ROWSETARRAY_INTO : return "ITM_ROWSETARRAY_INTO";

    case ITM_LEFT: return "ITM_LEFT";
    case ITM_SPACE: return "ITM_SPACE";
    case ITM_ODBC_LENGTH: return "ITM_ODBC_LENGTH";

    // datetime functions
    case ITM_CONVERTTIMESTAMP: return "ITM_CONVERTTIMESTAMP";
    case ITM_DATEFORMAT: return "ITM_DATEFORMAT";
    case ITM_DAYOFWEEK: return "ITM_DAYOFWEEK";
    case ITM_EXTRACT: return "ITM_EXTRACT";
    case ITM_INITCAP: return "ITM_INITCAP";
    case ITM_JULIANTIMESTAMP: return "ITM_JULIANTIMESTAMP";
    case ITM_EXTRACT_ODBC: return "ITM_EXTRACT_ODBC";
    case ITM_DAYNAME: return "ITM_DAYNAME";
    case ITM_MONTHNAME: return "ITM_MONTHNAME";
    case ITM_QUARTER: return "ITM_QUARTER";
    case ITM_WEEK: return "ITM_WEEK";
    case ITM_DAYOFYEAR: return "ITM_DAYOFYEAR";
    case ITM_FIRSTDAYOFYEAR: return "ITM_FIRSTDAYOFYEAR";
    case ITM_INTERNALTIMESTAMP: return "ITM_INTERNALTIMESTAMP";
    // misc. functions
    case ITM_NARROW: return "ITM_NARROW";
    case ITM_INTERVAL: return "ITM_INTERVAL";
    case ITM_INSTANTIATE_NULL: return "ITM_INSTANTIATE_NULL";
    case ITM_INCREMENT: return "ITM_INCREMENT";
    case ITM_DECREMENT: return "ITM_DECREMENT";
    case ITM_GREATER_OR_GE: return "ITM_GREATER_OR_GE";
    case ITM_LESS_OR_LE: return "ITM_LESS_OR_LE";
    case ITM_RANGE_LOOKUP: return "ITM_RANGE_LOOKUP";
    case ITM_DECODE: return "ITM_DECODE";
    case ITM_HDPHASHCOMB: return "ITM_HDPHASHCOMB";
    case ITM_RANDOMNUM: return "ITM_RANDOMNUM";
    case ITM_PROGDISTRIB: return "ITM_PROGDISTRIB";
    case ITM_HASHCOMB: return "ITM_HASHCOMB";
    case ITM_HDPHASH: return "ITM_HDPHASH";
    case ITM_EXEC_COUNT: return "ITM_EXEC_COUNT";
    case ITM_CURR_TRANSID: return "ITM_CURR_TRANSID";
    case ITM_NOTCOVERED: return "ITM_NOTCOVERED";
    case ITM_BALANCE: return "ITM_BALANCE";
    case ITM_RAND_SELECTION: return "ITM_RAND_SELECTION";
    case ITM_PROGDISTRIBKEY: return "ITM_PROGDISTRIBKEY";
    case ITM_PAGROUP: return "ITM_PAGROUP";
    case ITM_HASH2_DISTRIB: return "ITM_HASH2_DISTRIB";

    case ITM_HEADER: return "ITM_HEADER";

    case ITM_LOBINSERT: return "ITM_LOBINSERT";
    case ITM_LOBSELECT: return "ITM_LOBSELECT";
    case ITM_LOBDELETE: return "ITM_LOBDELETE";
    case ITM_LOBUPDATE: return "ITM_LOBUPDATE";
    case ITM_LOBCONVERT: return "ITM_LOBCONVERT";
    case ITM_LOBCONVERTHANDLE: return "ITM_LOBCONVERTHANDLE";

    case ITM_UNIQUE_EXECUTE_ID: return "ITM_UNIQUE_EXECUTE_ID";
    case ITM_GET_TRIGGERS_STATUS: return "ITM_GET_TRIGGERS_STATUS";
    case ITM_GET_BIT_VALUE_AT: return "ITM_GET_BIT_VALUE_AT";
    case ITM_CURRENTEPOCH: return "ITM_CURRENTEPOCH";
    case ITM_VSBBROWTYPE: return "ITM_VSBBROWTYPE";
    case ITM_VSBBROWCOUNT: return "ITM_VSBBROWCOUNT";
    case ITM_IS_BITWISE_AND_TRUE: return "ITM_IS_BITWISE_AND_TRUE";

    case ITM_NULLIFZERO: return "ITM_NULLIFZERO";
    case ITM_NVL: return "ITM_NVL";

    case ITM_JSONOBJECTFIELDTEXT: return "ITM_JSONOBJECTFIELDTEXT";

    // subqueries
    case ITM_ROW_SUBQUERY: return "ITM_ROW_SUBQUERY";
    case ITM_IN_SUBQUERY: return "ITM_IN_SUBQUERY";
    case ITM_IN: return "ITM_IN";
    case ITM_EXISTS: return "ITM_EXISTS";
    case ITM_NOT_EXISTS: return "ITM_NOT_EXISTS";
    case ITM_EQUAL_ALL: return "ITM_EQUAL_ALL";
    case ITM_EQUAL_ANY: return "ITM_EQUAL_ANY";
    case ITM_NOT_EQUAL_ALL: return "ITM_NOT_EQUAL_ALL";
    case ITM_NOT_EQUAL_ANY: return "ITM_NOT_EQUAL_ANY";
    case ITM_LESS_ALL: return "ITM_LESS_ALL";
    case ITM_LESS_ANY: return "ITM_LESS_ANY";
    case ITM_GREATER_ALL: return "ITM_GREATER_ALL";
    case ITM_GREATER_ANY: return "ITM_GREATER_ANY";
    case ITM_LESS_EQ_ALL: return "ITM_LESS_EQ_ALL";
    case ITM_LESS_EQ_ANY: return "ITM_LESS_EQ_ANY";
    case ITM_GREATER_EQ_ALL: return "ITM_GREATER_EQ_ALL";
    case ITM_GREATER_EQ_ANY: return "ITM_GREATER_EQ_ANY";

    case ITM_WILDCARD_EQ_NE: return "ITM_WILDCARD_EQ_NE";

    // renaming, conversion, assignment
    case ITM_RENAME_COL: return "ITM_RENAME_COL";
    case ITM_CONVERT: return "ITM_CONVERT";
    case ITM_CAST: return "ITM_CAST";
    case ITM_ASSIGN: return "ITM_ASSIGN";

    // convert an NA-type to an item expression
    case ITM_NATYPE: return "ITM_NATYPE";

    // do a cast but adjust target length based
    // on operand (used by ODBC)
    case ITM_CAST_CONVERT: return "ITM_CAST_CONVERT";

    case ITM_CAST_TYPE: return "ITM_CAST_TYPE";

    // for OperatorType::match() of ItemExpr::origOpType()
    case ITM_ANY_AGGREGATE: return "ITM_ANY_AGGREGATE";

    // to match Cast, Cast_Convert, Instantiate_Null, Narrow
    case ITM_ANY_CAST: return "ITM_ANY_CAST";

    // item expressions describing constraints
    case ITM_CHECK_CONSTRAINT: return "ITM_CHECK_CONSTRAINT";
    case ITM_CARD_CONSTRAINT: return "ITM_CARD_CONSTRAINT";
    case ITM_UNIQUE_CONSTRAINT: return "ITM_UNIQUE_CONSTRAINT";
    case ITM_REF_CONSTRAINT: return "ITM_REF_CONSTRAINT";
    case ITM_UNIQUE_OPT_CONSTRAINT: return "ITM_UNIQUE_OPT_CONSTRAINT";
    case ITM_FUNC_DEPEND_CONSTRAINT: return "ITM_FUNC_DEPEND_CONSTRAINT";

    // list of item expressions
    case ITM_ITEM_LIST: return "ITM_ITEM_LIST";

    // leaf nodes of item expressions
    case ITM_CONSTANT: return "ITM_CONSTANT";
    case ITM_REFERENCE: return "ITM_REFERENCE";
    case ITM_BASECOLUMN: return "ITM_BASECOLUMN";
    case ITM_INDEXCOLUMN: return "ITM_INDEXCOLUMN";
    case ITM_HOSTVAR: return "ITM_HOSTVAR";
    case ITM_DYN_PARAM: return "ITM_DYN_PARAM";
    case ITM_SEL_INDEX: return "ITM_SEL_INDEX";
    case ITM_VALUEIDREF: return "ITM_VALUEIDREF";
    case ITM_VALUEIDUNION: return "ITM_VALUEIDUNION";
    case ITM_VEG: return "ITM_VEG";
    case ITM_VEG_PREDICATE: return "ITM_VEG_PREDICATE";
    case ITM_VEG_REFERENCE: return "ITM_VEG_REFERENCE";
    case ITM_DEFAULT_SPECIFICATION: return "ITM_DEFAULT_SPECIFICATION";
    case ITM_SAMPLE_VALUE: return "ITM_SAMPLE_VALUE";
    case ITM_CACHE_PARAM: return "ITM_CACHE_PARAM";

    // Item expressions for transactions
    case ITM_SET_TRANS_ISOLATION_LEVEL: return "ITM_SET_TRANS_ISOLATION_LEVEL";
    case ITM_SET_TRANS_ACCESS_MODE: return "ITM_SET_TRANS_ACCESS_MODE";
    case ITM_SET_TRANS_DIAGS: return "ITM_SET_TRANS_DIAGS";
    case ITM_SET_TRANS_ROLLBACK_MODE: return "ITM_SET_TRANS_ROLLBACK_MODE";
    case ITM_SET_TRANS_AUTOABORT_INTERVAL: return "ITM_SET_TRANS_AUTOABORT_INTERVAL";
    case ITM_SET_TRANS_MULTI_COMMIT: return "ITM_SET_TRANS_MULTI_COMMIT";

    case ITM_LAST_ITEM_OP: return "ITM_LAST_ITEM_OP";
    case ITM_UNIQUE_ID: return "ITM_UNIQUE_ID";
    case ITM_UNIQUE_SHORT_ID: return "ITM_UNIQUE_SHORT_ID";
    case ITM_ROWNUM: return "ITM_ROWNUM";
    case ITM_HBASE_COLUMN_LOOKUP: return "ITM_HBASE_COLUMN_LOOKUP";
    case ITM_HBASE_COLUMNS_DISPLAY: return "ITM_HBASE_COLUMNS_DISPLAY";
    case ITM_HBASE_COLUMN_CREATE: return "ITM_HBASE_COLUMN_CREATE";
    case ITM_HBASE_TIMESTAMP: return "ITM_HBASE_TIMESTAMP";
    case ITM_HBASE_VERSION: return "ITM_HBASE_VERSION";

    case ITM_SEQUENCE_VALUE: return "ITM_SEQUENCE_VALUE";

    // Note, this list is arranged in the same order as the types
    // appear in common/OperTypeEnum.h, please keep the same order
    // when adding new types
    default: 
      {
	cout << "OperatorType must be added to getOperTypeEnumAsString()"
	     << ote << endl;
	return "Add To getOperTypeEnumAsString()";
      }
    }
}

char * exClauseGetText(OperatorTypeEnum ote)
{
  char * itmText = (char *)getOperTypeEnumAsString(ote);
  
  // strip the ITM_ prefix
  if ((str_len(itmText) > 4) && (str_cmp(itmText, "ITM_", 4) == 0))
    return &itmText[4];
  else
    return itmText;
} // exClausegetText()

void ex_clause::displayContents(Space * space, const char * displayStr,
				Int32 clauseNum, char * constsArea)
{
  return displayContents(space, displayStr, clauseNum, constsArea, 0);
}

void ex_clause::displayContents(Space * space, const char * displayStr,
				Int32 clauseNum, char * constsArea, 
                                UInt32 clauseFlags,
                                Int16 instruction,
                                const char * instrText)
{
  char buf[100];
  if (displayStr)
    {
      str_sprintf(buf, "  Clause #%d: %s", clauseNum, displayStr); 
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }

  str_sprintf(buf, "    OperatorTypeEnum = %s(%d), NumOperands = %d",
	  getOperTypeEnumAsString(operType_), operType_, numOperands_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    ex_clause::flags_ = %x ",flags_ );
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  if (displayStr)
    {
      str_sprintf(buf, "    %s::flags_ = %x ", displayStr, clauseFlags);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }

  if (noPCodeAvailable())
    {
      str_sprintf(buf, "    PCODE  = not supported ");
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }
  else
    {
      str_sprintf(buf, "    PCODE  = supported ");
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }

  if (instruction >= 0)
    {
      if (instrText)
        str_sprintf(buf, "    instruction: %s(%d), instrArrayIndex_: %d", 
                    instrText, instruction, instrArrayIndex_);
      else
        str_sprintf(buf, "    instruction: UNKNOWN(%d), instrArrayIndex_: %d", 
                    instruction, instrArrayIndex_);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }
  
  if (numOperands_ == 0)
    return;

  if (numOperands_ > 0)
  {
   NABoolean showplan = getOperand(0)->showplan();

   for (Int32 i = 0; i < numOperands_; i++)
   {
   getOperand(i)->displayContents(space, i,
                                   constsArea,
                                   (showplan 
                                   ? getOperand(i+numOperands_) 
                                   : NULL));
   str_sprintf(buf, "\n");
   space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
  }
 }
}

/////////////////////////////////////////////////////////

// Derived clauses
/////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
// class ex_arith_clause
///////////////////////////////////////////////////////////
ex_arith_clause::ex_arith_clause(OperatorTypeEnum oper_type,
				 Attributes ** attr,
				 Space * space,
				 short arithRoundingMode,
				 NABoolean divToDownscale) 
     : ex_clause (ex_clause::ARITH_TYPE, oper_type, 
                  (oper_type == ITM_NEGATE ? 2 : 3), attr, space),
       flags_(0)
{
  setAugmentedAssignOperation(TRUE);
  arithRoundingMode_ = (char)arithRoundingMode;


  if (divToDownscale)
    setDivToDownscale(TRUE);

  if (attr)
    setInstruction();
}


ExRegexpClauseChar::ExRegexpClauseChar(OperatorTypeEnum oper_type, 
			    short num_operands,
			    Attributes ** attr,
			    Space * space)
: ExRegexpClauseBase(oper_type, num_operands,attr,space)
{
}

ex_arith_clause::ex_arith_clause(clause_type type,
                                 OperatorTypeEnum oper_type,
                                 Attributes ** attr,
                                 Space * space)
                                 : ex_clause(type, oper_type, 3, attr, space),
				   arithRoundingMode_(0),
				   flags_(0)
 
{
  setAugmentedAssignOperation(TRUE);
  setInstruction(); 
}

ex_arith_sum_clause::ex_arith_sum_clause(OperatorTypeEnum oper_type,
					 Attributes ** attr,
					 Space * space)
           : ex_arith_clause (ex_clause::ARITH_SUM_TYPE, oper_type, attr, 
			      space)
{
}

ex_arith_count_clause::ex_arith_count_clause(OperatorTypeEnum oper_type,
					     Attributes ** attr,
					     Space * space)
           : ex_arith_clause (ex_clause::ARITH_COUNT_TYPE, oper_type, attr, 
			      space)
{
}

///////////////////////////////////////////////////////////
// class ex_comp_clause
///////////////////////////////////////////////////////////
ex_comp_clause::ex_comp_clause(OperatorTypeEnum oper_type,
			       Attributes ** attr,
			       Space * space,
			       ULng32 flags)
     : ex_clause (ex_clause::COMP_TYPE, oper_type, 3, attr, space),
       flags_(0),
       rollupColumnNum_(-1)
{
  if(flags) 
    setSpecialNulls();
  setInstruction();
}
 
///////////////////////////////////////////////////////////
// class ex_conv_clause
///////////////////////////////////////////////////////////
ex_conv_clause::ex_conv_clause(OperatorTypeEnum oper_type,
			       Attributes ** attr,
			       Space * space,
			       short num_operands, NABoolean checkTruncErr,
                               NABoolean reverseDataErrorConversionFlag,
                               NABoolean noStringTruncWarnings,
                               NABoolean convertToNullWhenErrorFlag)
     : ex_clause (ex_clause::CONV_TYPE, oper_type, num_operands, attr, space),
       lastVOAoffset_(0),
       lastVcIndicatorLength_(0),
       lastNullIndicatorLength_(0),
       computedLength_(0),
       alignment_(0),
       flags_(0)
{
  if (oper_type == ITM_NARROW)
    // Narrow reports conversion errors via a variable instead of a
    // SQL diagnostic -- so in this case we want to handle NULLs ourselves 
    setProcessNulls();   
  if (checkTruncErr)
    setCheckTruncationFlag();

  if (reverseDataErrorConversionFlag)
    flags_ |= REVERSE_DATA_ERROR_CONVERSION_FLAG;

  if (noStringTruncWarnings)
    setNoTruncationWarningsFlag();
  
  if (convertToNullWhenErrorFlag)
    flags_ |= CONV_TO_NULL_WHEN_ERROR;

  setInstruction(); 
}

///////////////////////////////////////////////////////////
// class ex_inout_clause
///////////////////////////////////////////////////////////
ex_inout_clause::ex_inout_clause(OperatorTypeEnum oper_type, 
				 Attributes ** attr, Space * space)
     : ex_clause (ex_clause::INOUT_TYPE, oper_type, 1, attr, space)
{
  name = 0;
  heading_ = 0;
  //  convHVClause_ = 0;
  flags_ = 0;
}

///////////////////////////////////////////////////////////
// class bool_result_clause
///////////////////////////////////////////////////////////
bool_result_clause::bool_result_clause(OperatorTypeEnum oper_type, 
				       Attributes ** attr,
				       Space * space)
     : ex_clause (ex_clause::BOOL_RESULT_TYPE, oper_type, 1, attr, space)
{
}

///////////////////////////////////////////////////////////
// class ex_branch_clause
///////////////////////////////////////////////////////////
ex_branch_clause::ex_branch_clause(OperatorTypeEnum oper_type,
				   Attributes ** attr, Space * space)
     : ex_clause (ex_clause::BRANCH_TYPE, oper_type, 2, attr, space),
       saved_next_clause(NULL),
       branch_clause(NULL)
{
}

ex_branch_clause::ex_branch_clause(OperatorTypeEnum oper_type,
				   Space * space)
     : ex_clause (ex_clause::BRANCH_TYPE, oper_type, 0, NULL, space),
       saved_next_clause(NULL),
       branch_clause(NULL)
{
}

///////////////////////////////////////////////////////////
// class ex_bool_clause
///////////////////////////////////////////////////////////
ex_bool_clause::ex_bool_clause(OperatorTypeEnum oper_type,
			       Attributes ** attr,
			       Space * space)
     : ex_clause (ex_clause::BOOL_TYPE, oper_type, 3, attr, space)
{
}

///////////////////////////////////////////////////////////
// class ex_unlogic_clause
///////////////////////////////////////////////////////////
ex_unlogic_clause::ex_unlogic_clause(OperatorTypeEnum oper_type, 
				     Attributes ** attr,
				     Space * space)
     : ex_clause (ex_clause::UN_LOGIC_TYPE, oper_type, 2, attr, space)
{
}

///////////////////////////////////////////////////////////
// class ex_aggregate_clause
///////////////////////////////////////////////////////////
ex_aggregate_clause::ex_aggregate_clause(OperatorTypeEnum oper_type,
					 short num_operands,
					 Attributes ** attr,
					 Space * space)
: ex_clause (ex_clause::AGGREGATE_TYPE, oper_type, num_operands, attr, space)
{
}

///////////////////////////////////////////////////////////
// class ex_noop_clause
///////////////////////////////////////////////////////////
ex_noop_clause::ex_noop_clause()
     : ex_clause (ex_clause::NOOP_TYPE, ITM_CONVERT, 0, 0, 0)
{
}

/////////////////////////////////////////////////////////
// class ex_function_clause
/////////////////////////////////////////////////////////
ex_function_clause::ex_function_clause(OperatorTypeEnum oper_type,
				       short num_operands,
				       Attributes ** attr,
				       Space * space)
     : ex_clause (ex_clause::FUNCTION_TYPE, oper_type, num_operands, attr,
		  space),
       origFunctionOperType_(oper_type)
{
  setDerivedFunction(FALSE);
}
  
/////////////////////////////////////////////////////////
// class ex_like_clause_char
/////////////////////////////////////////////////////////
ex_like_clause_char::ex_like_clause_char(OperatorTypeEnum oper_type,
                               short num_operands,
                               Attributes ** attr,
                               Space * space)
: ex_like_clause_base (oper_type, num_operands, attr, space)
{
}

ex_like_clause_doublebyte::ex_like_clause_doublebyte(OperatorTypeEnum oper_type,
                               short num_operands,
                               Attributes ** attr,
                               Space * space)
: ex_like_clause_base (oper_type, num_operands, attr, space)
{
}

/////////////////////////////////////////////////////////////
// Methods to display Contents
/////////////////////////////////////////////////////////////
void ex_aggr_one_row_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_aggr_one_row_clause", clauseNum, constsArea);
}

void ex_aggr_any_true_max_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_aggr_any_true_max_clause", clauseNum, constsArea);
}
void ex_aggr_min_max_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_aggr_min_max_clause", clauseNum, constsArea);
}

void ex_pivot_group_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_pivot_group_clause", clauseNum, constsArea);
}

void ExFunctionGrouping::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ExFunctionGrouping", clauseNum, constsArea);

  char buf[100];
  str_sprintf(buf, "    rollupGroupIndex_ = %d\n",
              rollupGroupIndex_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
}

void ex_arith_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  setInstruction();

  char buf[100];
  str_sprintf(buf, "  Clause #%d: ex_arith_clause", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  if (arithRoundingMode_ != 0)
    {
      str_sprintf(buf, "    arithRoundingMode_ = %d, divToScale = %d",
		  (short)arithRoundingMode_, (getDivToDownscale() ? 1 : 0));
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }

  ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea, 0,
                             ex_arith_clause::getInstruction(getInstrArrayIndex()),
                             ex_arith_clause::getInstructionStr(getInstrArrayIndex()));
}

void ex_arith_sum_clause::displayContents(Space * space, 
					  const char * /*displayStr*/, 
					  Int32 clauseNum, char * constsArea)
{
  setInstruction();
  ex_clause::displayContents(space, "ex_arith_sum_clause", clauseNum, constsArea);
}

void ex_arith_count_clause::displayContents(Space * space, 
					    const char * /*displayStr*/, 
					    Int32 clauseNum, char * constsArea)
{
  setInstruction();
  ex_clause::displayContents(space, "ex_arith_count_clause", clauseNum, constsArea);
}

void ex_bool_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_bool_clause", clauseNum, constsArea);
}

void bool_result_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "bool_result_clause", clauseNum, constsArea);
}

void ex_branch_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  char buf[100];
  str_sprintf(buf, "  Clause #%d: ex_branch_clause", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    OperatorTypeEnum = %s(%d), NumOperands = %d",
          getOperTypeEnumAsString(getOperType()), getOperType(),
                                  getNumOperands());
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    flags_ = %x ", getAllFlags());
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  if (noPCodeAvailable())
    {
      str_sprintf(buf, "    PCODE  = not supported ");
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }
  else
    {
      str_sprintf(buf, "    PCODE  = supported ");
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }
  str_sprintf(buf, "    branch to = #%d ",branch_clause->clauseNum());
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  if (getNumOperands() == 0)
    return;

  if (getNumOperands() > 0)
  {
   NABoolean showplan = getOperand(0)->showplan();

   for (Int32 i = 0; i < getNumOperands(); i++)
   {
   getOperand(i)->displayContents(space, i,
                                   constsArea,
                                   (showplan
                                   ? getOperand(i+getNumOperands())
                                   : NULL));
   str_sprintf(buf, "\n");
   space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
   }
  }
}

void ex_comp_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  setInstruction();

  char buf[100];
  str_sprintf(buf, "  Clause #%d: ex_comp_clause", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    ex_comp_clause::rollupColumnNum_ = %d", rollupColumnNum_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    ex_comp_clause::flags_ = %x", flags_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea, 
                             0,
                             ex_comp_clause::getInstruction(getInstrArrayIndex()),                             
                             ex_comp_clause::getInstructionStr(getInstrArrayIndex()));

}

void ex_conv_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  setInstruction();
  ex_clause::displayContents(space, "ex_conv_clause", clauseNum, constsArea, 
                             flags_,
                             ex_conv_clause::getInstruction(getInstrArrayIndex()),
                             ex_conv_clause::getInstructionStr(getInstrArrayIndex()));
}

void ex_function_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_function_clause", clauseNum, constsArea);
}
void ex_function_abs::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_function_abs", clauseNum, constsArea);
}

void ExFunctionMath::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ExFunctionMath", clauseNum, constsArea);
}

void ExFunctionBitOper::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ExFunctionBitOper", clauseNum, constsArea);
}
void ex_inout_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_inout_clause", clauseNum, constsArea);
  //  cout << "Name  = " << getName() << endl;
}

void ex_noop_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_noop_clause", clauseNum, constsArea);
}

void ex_unlogic_clause::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_unlogic_clause", clauseNum, constsArea);
}

void ex_like_clause_char::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_like_clause_char", clauseNum, constsArea);
}

void ExRegexpClauseChar::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ExRegexpClauseChar", clauseNum, constsArea);
}

void ex_like_clause_doublebyte::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  ex_clause::displayContents(space, "ex_like_clause_doublebyte", clauseNum, constsArea);
}

void ExFunctionHbaseTimestamp::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  char buf[100];
  str_sprintf(buf, "  Clause #%d: ExFunctionHbaseTimestamp", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    colIndex_ = %d", colIndex_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea);
}

void ExFunctionHbaseVersion::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  char buf[100];
  str_sprintf(buf, "  Clause #%d: ExFunctionHbaseVersion", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    colIndex_ = %d", colIndex_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea);
}

void ex_function_dateformat::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea)
{
  char buf[100];
  str_sprintf(buf, "  Clause #%d: ex_function_dateformat", clauseNum);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  str_sprintf(buf, "    dateformat_ = %d", dateformat_);
  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));

  ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea);
}

// Function to compare two strings. 
Int32 charStringCompareWithPad(char* in_s1, Int32 length1, 
                                          char* in_s2, Int32 length2, 
                                          char space)
{
  unsigned char * s1 = (unsigned char *)in_s1;
  unsigned char * s2 = (unsigned char *)in_s2;

   Lng32 compare_len;
   Int32 compare_code;
   
   if (length1 > length2)
     compare_len = length2;
   else
     compare_len = length1;

   compare_code = str_cmp(in_s1, in_s2, compare_len);
   
   if ((compare_code == 0) && (length1 != length2))
     {
       if (length1 > length2)
         {
   	Int32 j = compare_len;
   	
   	while ((j < length1) && (compare_code == 0))
   	  {
   	    if (s1[j] < space )
   	      compare_code = -1;
   	    else
   	      if (s1[j] > space )
   		compare_code = 1;
   	    j++;
   	  }
         }
       else
         {
   	Int32 j = compare_len;
   	
   	while ((j < length2) && (compare_code == 0))
   	  {
   	    if (s2[j] < space )
   	      compare_code = 1;
   	    else
   	      if (s2[j] > space )
   		compare_code = -1;
   	    j++;
   	  }
         }
    }
     //return 0,1,-1 values, not the positive, 0, negative
     if (compare_code > 0)
       compare_code = 1;
     if (compare_code < 0)
       compare_code = -1;
    return compare_code;
}

Int32 wcharStringCompareWithPad(NAWchar* s1, Int32 length1, 
                                           NAWchar* s2, Int32 length2, 
                                           NAWchar space)
{
  Lng32 compare_len;
  Int32 compare_code;
	
  if (length1 > length2)
    compare_len = length2;
  else
    compare_len = length1;

  compare_code = wc_str_cmp(s1, s2, compare_len);
	
  if ((compare_code == 0) && (length1 != length2))
    {
      if (length1 > length2)
        {
          Int32 j = compare_len;
 	
          while ((j < length1) && (compare_code == 0))
            {
	      if (s1[j] < space )
	        compare_code = -1;
	      else
	        if (s1[j] > space )
	  	  compare_code = 1;
	      j++;
	    }
        }
	else
	{
	  Int32 j = compare_len;
		
	  while ((j < length2) && (compare_code == 0))
	    {
	      if (s2[j] < space )
	        compare_code = 1;
	      else
	        if (s2[j] > space )
	    	  compare_code = -1;
	      j++;
	    }
        }
    }
    //return 0,1,-1 values, not the positive, 0, negative
     if (compare_code > 0)
       compare_code = 1;
     if (compare_code < 0)
       compare_code = -1;
    return compare_code;
}



