/* -*-C++-*- */
/**********************************************************************
// @@@ 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:         SqlParser.y
* Description:  SQL Parser
*
* Created:      4/28/94
* Language:     C++
*
*
*	Is there a parser, much bemus'd in beer,
*	A maudlin poetess, a rhyming peer,
*	A clerk, foredoom'd his father's soul to cross,
*	Who pens a stanza, when he should engross?
*		-- with my apologies to Alexander Pope
*
******************************************************************************
*/

// As of 07/26/01, yacc (bison) reports for this file:
// w:\parser\sqlparser.y contains 56 shift/reduce conflicts and 9 reduce/reduce conflicts.
// As of 02/23/07, yacc (bison) reports for this file:
// w:\parser\sqlparser.y contains 71 shift/reduce conflicts and 12 reduce/reduce conflicts.

// shift/reduce case study: DROP GHOST TABLE
// Before the invention of ghost tables, the second production for drop_table_statement was:
//   drop_table_statement : TOK_DROP TOK_TABLE ddl_qualified_name optional_cleanup
//                            optional_drop_invalidate_dependent_behavior optional_validate optional_logfile
// I wanted to insert an optional TOK_GHOST like this:
//   drop_table_statement : TOK_DROP optional_ghost TOK_TABLE ddl_qualified_name optional_cleanup
//                            optional_drop_invalidate_dependent_behavior optional_validate optional_logfile
//   optional_ghost : empty | TOK_GHOST
// Unfortunately that introduced a shift/reduce conflict. After reading TOK_DROP, if the next 
// token is TOK_TABLE, bison wanted to reduce 
//   optional_ghost -> empty
// but it also wanted to shift TOK_TABLE because DROP TABLE was not enough to distinguish the 
// first two productions for drop_table_statement. So in order to avoid introducing a 
// shift/reduce conflict, the productions have been written like this:
//   drop_table_statement : drop_table_start_tokens ddl_qualified_name optional_cleanup
//                            optional_drop_invalidate_dependent_behavior optional_validate optional_logfile
//   drop_table_start_tokens : TOK_DROP TOK_TABLE | TOK_DROP TOK_GHOST TOK_TABLE
// This solves the problem because bison does not have to reduce after reading TOK_DROP. Rather,
// after reading TOK_DROP TOK_TABLE, it can lookahead at the next token to decide what to do.


#include "Platform.h"				// must be the first #include
//debug yacc
#define YY_LOG_FILE "yylog"
#define YYFPRINTF(stderr, format, args...) {FILE* fp=fopen(YY_LOG_FILE, "a+");fprintf(fp, format, ##args);fclose(fp);}

#define   SQLPARSERGLOBALS__INITIALIZE
#define   SQLPARSERGLOBALS_CONTEXT_AND_DIAGS
#define   SQLPARSERGLOBALS_FLAGS
#define   SQLPARSERGLOBALS_HOSTVARS
#define   SQLPARSERGLOBALS_LEX_AND_PARSE
#define   SQLPARSERGLOBALS_NADEFAULTS
#define   SQLPARSERGLOBALS_NAMES_AND_TOKENS
#include "SqlParserGlobals.h"			// must be the second #include

#define CheckModeSpecial1() if (NOT SqlParser_CurrentParser->modeSpecial1()) { YYERROR; } 

// This define is to restrict some commands to the DB_Transporter.
#define CHECK_DBTRANSPORTER \
  if ((!Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE)) && \
      (CmpCommon::getDefault(IS_DB_TRANSPORTER) != DF_ON)) \
  { \
     yyerror(""); \
     YYERROR; \
  }
                               
#define CheckModeSpecial4 \
  if (CmpCommon::getDefault(MODE_SPECIAL_4) != DF_ON) \
  { \
     yyerror(""); \
     YYERROR; \
  }
                               
#define INCLUDE_UNION
#   include <alloca.h>
#include "ComCextdecs.h"
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <sstream>

using namespace std;

#include "NAAssert.h"	 // required after including a RogueWave file!

#include "CharType.h"
#include "DatetimeType.h"
#include "IntervalType.h"
#include "NumericType.h"
#include "ItemNAType.h"
#include "MiscType.h"
#include "CmpContext.h"

#include "AllElemDDL.h"
#include "AllItemExpr.h"
#include "AllRelExpr.h"
#include "AllStmtDDL.h"
#include "ComAnsiNamePart.h"
#include "ComDiags.h"
#include "ComMPLoc.h"
#include "ComSmallDefs.h"
#include "ComTransInfo.h"
#include "ControlDB.h"
#include "CmpStatement.h"
#include "GroupAttr.h"
#include "HeapLog.h"
#include "HvTypes.h"
#include "ItemExprList.h"
#include "ItemSample.h"
#include "LateBindInfo.h"
#include "NAExit.h"
#include "OperTypeEnum.h"
#include "OptHints.h"
#include "parser.h"
#include "ParserMsg.h"
#include "RelDCL.h"
#include "RelPackedRows.h"
#include "RelSample.h"
#include "RelSequence.h"
#include "SqlciError.h"
#include "sqlcli.h"
#include "SqlParserAux.h"
#include "StmtCompilationMode.h"
#include "StmtDMLSetTransaction.h"

#include "StmtDDLonHiveObjects.h"

// -- triggers
#include "Triggers.h"
#include "ItemNAType.h"

// MV
#include "Refresh.h"
#include "ItemLog.h"
#include "MvLog.h"
#include "StmtDDLCreateMV.h"

#include "StmtNode.h"
#include "wstr.h"
#include "NABoolean.h"
#include "HvRolesAssign.h"

#include "exp_expr.h"
#include "exp_clause_derived.h"
#include "exp_datetime.h"
#include "Analyzer.h"

#include "OptimizerSimulator.h"

#include "ItemFuncUDF.h"

#include "ExpLOBenums.h"

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// The SQL parser auxiliary methods that used to be here had to be moved
// to SqlParserAux.{h,cpp} to work around a c89 (v2.1) internal limit that 
// shows up as 
//    ugen: internal: Assertion failure
//    in source file 'W:\parser\SqlParser.cpp', at source line 22210
//    detected in back end file 'eval.c', at line 4653
// when cross-compiling SQLMX for NSK. So, please add any new SQL parser
// auxiliary methods into SqlParserAux.{h,cpp} instead of here.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

static const UInt32 DEFAULT_STRING_SIZE = 1;

THREAD_P Int32     externalDataTypeCnt_   = 0 ;
THREAD_P NAString *externalDataTypeNames_ = NULL ;
static void beginCallStmtParsing ()
{
  inCallStmt = TRUE;
  currVarIndex = 1;
}
 
static void beginRSProxyStmtParsing ()
{
  inRSProxyStmt = TRUE;
}


// prepare "nameList" with old/new transition names
static void prepareReferencingNames( TableRefList & nameList,
				     StmtDDLCreateTrigger * triggerObject )
{
  if (triggerObject->getOldName()) 	{
    NAString oldTransName(OLDCorr);
    nameList.insert(*new(PARSERHEAP()) 
		    TableRefName(oldTransName, *triggerObject->getOldName()));
  }
  if (triggerObject->getNewName())	{
    NAString newTransName(NEWCorr);
    nameList.insert(*new(PARSERHEAP()) 
		    TableRefName(newTransName, *triggerObject->getNewName()));
  } 
}


//++ Triggers
//
// This routine determines the legal values of the SQLSTATE quoted string that
// appears in a SIGNAL statement:
// * The string must contain 5 alphanumeric charecters (ANSI)
// * The first character must be 'S'. (This is a Tandem Extension, and not ANSI)
//
static NABoolean isInvalidSignalSqlstateValue(NAString *SqlState)
{
        Int32 wasError = FALSE;

        if (SqlState->length() != 5)     // SQLSTATE must be 5 characters long.
                wasError = TRUE;

        for (Int32 i=0; i<5; i++)  // Each character must be alphanumeric.
                if (!isAlNum8859_1(SqlState->data()[i]))
                        wasError = TRUE;

// Begin soln:10-060123-4013
        // We are not seeing any requrement to have an ['S'|'s'] as a prefix
        // to the user defined SQLSTATE in the SIGNAL SQLSTATE option,hence we are
        // removing this restruction.

        //if (SqlState->data()[0]!='S' && SqlState->data()[0]!='s')
        //        wasError = TRUE;
// End soln:10-060123-4013

        return wasError;
}

/*  These globals are used by triggers */
THREAD_P ParTriggerScopeType RowOrTableClause1 = ParTRIG_SCOPE_NONE ;
THREAD_P ParTriggerScopeType RowOrTableClause2 = ParTRIG_SCOPE_NONE ;
THREAD_P NABoolean InsideTriggerDefinition   = FALSE ;
THREAD_P NABoolean CSInsideTriggerDefinition = FALSE ;

//#define YYDEBUG 1			// Turn on debugging, if needed.
//#define YYERROR_VERBOSE 1		// Can be done automatically with
#if YYDEBUG				// the DBG param to GenBison.bat.
  #define dbgprintf(x)  printf(x)
#else
  #define dbgprintf(x)
#endif

//This global is introduced to disallow Subqueries in the If Condition.
THREAD_P NABoolean InIfCondition = FALSE ;

//This global is introduced to disallow non-ISO88591 character string to appear in certain ddl statements.
THREAD_P NABoolean NonISO88591LiteralEncountered = FALSE ;

//This global is introduced to turn unknown charset to ISO88591 charset in ddls.
THREAD_P NABoolean turnUnknownCharSetToISO88591 = FALSE;

THREAD_P NABoolean turnUnknownCharSetToISO88591CurrentValue;

//This global is introduced to apply ISO88591 charset to quoted string
//without charset prefix regardless of the DEFAULT_CHARSET setting.
THREAD_P NABoolean makeQuotedStringISO88591 = FALSE;

// NABoolean makeQuotedStringISO88591CurrentValue = FALSE;

//This global is introduced to disallow hexadecimal string literals to appear in certain statements (e.g. ddl).
THREAD_P NABoolean HexStringLiteralNotAllowed = FALSE;

//This global is introduced to allow empty character length specifier 
//(e.g. varchar) in VARCHAR for ODBC.
THREAD_P NABoolean empty_charlen_specifier_allowed = FALSE;

THREAD_P Int32 NumOfScalars = 0 ;
THREAD_P Int32 NumOfArrays  = 0 ;

//This global is introduced to allow CAST to remember whether
//or not the user specified a CHARACTER SET clause for the target
//[var]char type.
THREAD_P NABoolean cast_target_cs_specified = FALSE ;

THREAD_P NABoolean in_col_defn = FALSE;

// to be moved to ParNameLocList.h
void ParSetTextStartPosForDisplayExplain(ParNameLocList * pNameLocList);
NABoolean ParGetTextStartEndPosForDisplayExplain(
     ParNameLocList * pNameLocList,
     StringPos &start, StringPos&end);

static void restoreInferCharsetState()
{
  turnUnknownCharSetToISO88591 = turnUnknownCharSetToISO88591CurrentValue;
}

static void disableMakeQuotedStringISO88591Mechanism()
{
  // makeQuotedStringISO88591CurrentValue = makeQuotedStringISO88591;
  makeQuotedStringISO88591 = FALSE;
}

static void enableMakeQuotedStringISO88591Mechanism()
{
  // makeQuotedStringISO88591CurrentValue = makeQuotedStringISO88591;
  makeQuotedStringISO88591 = TRUE;
}

// static void restorePreviousMakeQuotedStringISO88591State()
// {
//   makeQuotedStringISO88591 = makeQuotedStringISO88591CurrentValue;
// }

%}
%define api.pure full

%start  starting_production

%token <item>      NON_SQLTEXT_CHARACTER	/* Illegal character scanned */
%token <item>      ARITH_PLACEHOLDER
%token <item>      BOOL_PLACEHOLDER
%token <stringval> DELIMITED_IDENTIFIER
%token <stringval> BACKQUOTED_IDENTIFIER
%token <stringval> CALL_CASED_IDENTIFIER
%token <stringval> GOTO_CASED_IDENTIFIER
%token <stringval> PERFORM_CASED_IDENTIFIER
%token <stringval> HOSTVAR
%token <stringval> IDENTIFIER
%token <stringval> NUMERIC_LITERAL_APPROX
%token <stringval> NUMERIC_LITERAL_EXACT_NO_SCALE
%token <stringval> NUMERIC_LITERAL_EXACT_WITH_SCALE
%token <stringval> PARAMETER
%token <stringval> QUOTED_STRING
%token <stringval> ANY_STRING
%token <stringval> BACKSLASH_SYSTEM_NAME
%token <stringval> SYSTEM_VOLUME_NAME
%token <stringval> TOK_PICTURE
%token <stringval>  TOK_SBYTE_LITERAL		/* Single-byte string */
%token <wstringval> TOK_MBYTE_LITERAL		/* Multi-byte (NCHAR) string */
%token <stringval> SYSTEM_CPU_IDENTIFIER
%token <tokval> '('
%token <tokval> ')'
%token <tokval> '*'
%token <tokval> '+'
%token <tokval> ','
%token <tokval> '-'
%token <tokval> '.'
%token <tokval> '/'
%token <tokval> '<'
%token <tokval> '='
%token <tokval> '>'
%token <tokval> '$'
%token <tokval> ';'

%token <tokval> TOK_TYPE                /* ANSI SQL non-reserved word */
%token <tokval> TOK_TYPE_ANSI           /* ANSI SQL non-reserved word */
%token <tokval> TOK_TYPE_FS             /* ANSI SQL non-reserved word */
%token <tokval> TOK_TYPES
%token <tokval> TOK_DATETIME_CODE       /* Tandem extension non-reserved word */
%token <tokval> TOK_LENGTH              /* ANSI SQL non-reserved word */
%token <tokval> TOK_PRECISION
%token <tokval> TOK_SCALE               /* ANSI SQL non-reserved word */
%token <tokval> TOK_LEADING_PRECISION   /* Tandem extenstion non-reserved word */
%token <tokval> TOK_NULLABLE            /* ANSI SQL non-reserved word */

%token <tokval> TOK_CHARACTER_SET_CATALOG/*ANSI SQL non-reserved word */
%token <tokval> TOK_CHARACTER_SET_SCHEMA/* ANSI SQL non-reserved word */
%token <tokval> TOK_CHARACTER_SET_NAME  /* ANSI SQL non-reserved word */
%token <tokval> TOK_COLLATION
%token <tokval> TOK_COLLATION_CATALOG   /* ANSI SQL non-reserved word */
%token <tokval> TOK_COLLATION_SCHEMA    /* ANSI SQL non-reserved word */
%token <tokval> TOK_COLLATION_NAME      /* ANSI SQL non-reserved word */
%token <tokval> TOK_NAME                /* ANSI SQL non-reserved word */
%token <tokval> TOK_UNNAMED             /* ANSI SQL non-reserved word */
%token <tokval> TOK_INDICATOR_TYPE      /* Tandem extension non-reserved word */
%token <tokval> TOK_INET_ATON           /* MySQL extension non-reserved word */
%token <tokval> TOK_INET_NTOA           /* MySQL extension non-reserved word */
%token <tokval> TOK_VARIABLE_POINTER    /* Tandem extension non-reserved word */
%token <tokval> TOK_INDICATOR_POINTER   /* Tandem extension non-reserved word */
%token <tokval> TOK_RETURNED_LENGTH     /* ANSI SQL non-reserved word */
%token <tokval> TOK_RETURNED_OCTET_LENGTH/*ANSI SQL non-reserved word */
%token <tokval> TOK_VARIABLE_DATA       /* Tandem extension non-reserved word */
%token <tokval> TOK_INDICATOR_DATA      /* Tandem extension non-reserved word */

%token <tokval> TOK_CONDITION_NUMBER    /* ANSI SQL non-reserved word */
%token <tokval> TOK_RETURNED_SQLSTATE   /* ANSI SQL non-reserved word */
%token <tokval> TOK_CLASS_ORIGIN        /* ANSI SQL non-reserved word */
%token <tokval> TOK_SUBCLASS_ORIGIN     /* ANSI SQL non-reserved word */
%token <tokval> TOK_SERVER_NAME         /* ANSI SQL non-reserved word */
%token <tokval> TOK_CONNECTION_NAME     /* ANSI SQL non-reserved word */
%token <tokval> TOK_CONSTRAINT_CATALOG  /* ANSI SQL non-reserved word */ 
%token <tokval> TOK_CONSTRAINT_SCHEMA   /* ANSI SQL non-reserved word */
%token <tokval> TOK_CONSTRAINT_NAME     /* ANSI SQL non-reserved word */
%token <tokval> TOK_TRIGGER_CATALOG     /* ANSI SQL non-reserved word */ 
%token <tokval> TOK_TRIGGER_SCHEMA      /* ANSI SQL non-reserved word */
%token <tokval> TOK_TRIGGER_NAME        /* ANSI SQL non-reserved word */

%token <tokval> TOK_CATALOG_NAME        /* ANSI SQL non-reserved word */
%token <tokval> TOK_SCHEMA_NAME         /* ANSI SQL non-reserved word */
%token <tokval> TOK_TABLE_NAME          /* ANSI SQL non-reserved word */
%token <tokval> TOK_COLUMN_NAME         /* ANSI SQL non-reserved word */
%token <tokval> TOK_CURSOR_NAME         /* ANSI SQL non-reserved word */
%token <tokval> TOK_MESSAGE_TEXT        /* ANSI SQL non-reserved word */
%token <tokval> TOK_MESSAGE_LEN         /* ANSI SQL non-reserved word */
%token <tokval> TOK_MESSAGE_OCTET_LEN   /* ANSI SQL non-reserved word */
%token <tokval> TOK_COLUMN_NUMBER       /* Tandem extension non-reserved word */
%token <tokval> TOK_NATIVE              /* Tandem extension non-reserved word */
%token <tokval> TOK_ROW_NUMBER          /* Tandem extension non-reserved word */
%token <tokval> TOK_SOURCE              /* Tandem extension non-reserved word */
%token <tokval> TOK_SOURCE_FILE         /* Tandem extension non-reserved word */
%token <tokval> TOK_LINE_NUMBER         /* Tandem extension non-reserved word */
%token <tokval> TOK_SUBSYSTEM_ID        /* Tandem extension non-reserved word */
%token <tokval> TOK_ABORT
%token <tokval> TOK_ABS                 /* Tandem extension */
%token <tokval> TOK_ACOS
%token <tokval> TOK_ASIN
%token <tokval> TOK_ATAN
%token <tokval> TOK_ATAN2

%token <tokval> TOK_ACCESS              /* Tandem extension non-reserved word */
%token <tokval> TOK_ACCUMULATED
%token <tokval> TOK_ADD_MONTHS
%token <tokval> TOK_ADMIN               /* ANSI reserved word */
%token <tokval> TOK_AES_ENCRYPT
%token <tokval> TOK_AES_DECRYPT
%token <tokval> TOK_AFTER
%token <tokval> TOK_ALL
%token <tokval> TOK_ALL_DDL
%token <tokval> TOK_ALL_DML
%token <tokval> TOK_ALL_UTILITY
%token <tokval> TOK_ALLOCATE
%token <tokval> TOK_ALLOWED				// MV
%token <tokval> TOK_ALWAYS
%token <tokval> TOK_AND
%token <tokval> TOK_AQR
%token <tokval> TOK_ANSIVARCHAR         /* Tandem extension non-reserved word */
%token <tokval> TOK_ANY
%token <tokval> TOK_APPEND
%token <tokval> TOK_ARE
%token <tokval> TOK_AS
%token <tokval> TOK_ASC
%token <tokval> TOK_ASCII
%token <tokval> TOK_ATOMIC
%token <tokval> TOK_AUDITONREFRESH		// MV
%token <tokval> TOK_AUTOABORT
%token <tokval> TOK_AUTOBEGIN
%token <tokval> TOK_AUTOCOMMIT
%token <tokval> TOK_AUTOMATIC			// MV
%token <tokval> TOK_AVERAGE_STREAM_WAIT         /* Tandem extension non-reserved word */
%token <tokval> TOK_AVG
%token <tokval> TOK_BEFORE

%token <tokval> TOK_BEGIN
%token <tokval> TOK_BEGIN_HINT
%token <tokval> TOK_BT
%token <tokval> TOK_END_HINT
%token <tokval> TOK_BALANCE
%token <tokval> TOK_NOT_BETWEEN
%token <tokval> TOK_BETWEEN
%token <tokval> TOK_BIT
%token <tokval> TOK_BITAND
%token <tokval> TOK_BITOR
%token <tokval> TOK_BITXOR
%token <tokval> TOK_BITNOT
%token <tokval> TOK_BITEXTRACT
%token <tokval> TOK_CONVERTTOBITS
%token <tokval> TOK_BITOR_OPERATOR
%token <tokval> TOK_BLOB
%token <tokval> TOK_BLOCKS
%token <tokval> TOK_BOTH
%token <tokval> TOK_BOOLEAN
%token <tokval> TOK_BY
%token <tokval> TOK_BYTEINT             /* TD extension that HP wants to ignore */
%token <tokval> TOK_C                   /* HP Neo extension non-reserved word */
%token <tokval> TOK_CPP                 /* HP Neo extension non-reserved word */
%token <tokval> TOK_CALL      /* Ansi potential-reserved, AND used by Lexer! */
%token <tokval> TOK_CANCEL
%token <tokval> TOK_CARDINALITY
%token <tokval> TOK_CASE
%token <tokval> TOK_CAST
%token <tokval> TOK_CENTURY
%token <tokval> TOK_TYPECAST
%token <tokval> TOK_CATCHUP	  // MV
%token <tokval> TOK_TRANSLATE
%token <tokval> TOK_CEIL
%token <tokval> TOK_CEILING
%token <tokval> TOK_CHAR
%token <tokval> TOK_CHARS
%token <tokval> TOK_CHR
%token <tokval> TOK_CHARACTER
%token <tokval> TOK_CHARACTERS
%token <tokval> TOK_CHANGED
%token <tokval> TOK_CHANGES // MV 
%token <tokval> TOK_CHAR_LENGTH
%token <tokval> TOK_CLOB
%token <tokval> TOK_CLOSE
%token <tokval> TOK_CLUSTER
%token <tokval> TOK_CLUSTERS
%token <tokval> TOK_CLUSTERING          /* Tandem extension */
%token <tokval> TOK_COALESCE
%token <tokval> TOK_COLLATE
%token <tokval> TOK_COLUMN_CREATE
%token <tokval> TOK_COLUMN_LOOKUP
%token <tokval> TOK_COLUMN_DISPLAY
%token <tokval> TOK_HBASE_TIMESTAMP
%token <tokval> TOK_HBASE_VERSION
%token <tokval> TOK_COMMANDS
%token <tokval> TOK_COMMAND_FUNCTION    /* ANSI SQL non-reserved word */
%token <tokval> TOK_COMMENT
%token <tokval> TOK_COMMIT
%token <tokval> TOK_COMP
%token <tokval> TOK_COMPACT
%token <tokval> TOK_COMPARE
%token <tokval> TOK_COMPLETE
%token <tokval> TOK_COMPRESS            /* TD extension that HP wants to ignore */
%token <tokval> TOK_COMPRESSED
%token <tokval> TOK_CONCAT              /* ODBC extension   */
%token <tokval> TOK_CONCATENATION
%token <tokval> TOK_CONCURRENCY
%token <tokval> TOK_CONCURRENT
%token <tokval> TOK_CONVERT             /* ODBC extentsion  */
%token <tokval> TOK_CONVERTFROMHEX      /* Tandem extentsion  */
%token <tokval> TOK_CONVERTTIMESTAMP    /* Tandem extension */
%token <tokval> TOK_CONVERTTOHEX        /* Tandem extentsion  */
%token <tokval> TOK_CONVERTTOHX_INTN   /* Tandem extentsion  */
%token <tokval> TOK_CONTAINS            /* Tandem extension non-reserved word */
%token <tokval> TOK_CONTINUE
%token <tokval> TOK_CONTROL             /* Tandem extension non-reserved word */
%token <tokval> TOK_CORRESPONDING
%token <tokval> TOK_COS
%token <tokval> TOK_COSH
%token <tokval> TOK_COST
%token <tokval> TOK_COUNT
%token <tokval> TOK_CRC32
%token <tokval> TOK_CQD
%token <tokval> TOK_CROSS
%token <tokval> TOK_CURDATE             /* ODBC extension  */ 
%token <tokval> TOK_CURRENT
%token <tokval> TOK_CURRENT_DATE
%token <tokval> TOK_CURRENT_RUNNING
%token <tokval> TOK_CURRENT_TIME
%token <tokval> TOK_CURRENT_TIMESTAMP
%token <tokval> TOK_CURRENT_TIMESTAMP_RUNNING
%token <tokval> TOK_CURRENT_TIMESTAMP_UTC
%token <tokval> TOK_CURRENT_TIME_UTC
%token <tokval> TOK_CURRENT_USER
%token <tokval> TOK_CURRNT_USR_INTN
%token <tokval> TOK_CURSOR
%token <tokval> TOK_CURTIME             /* ODBC extension  */
%token <tokval> TOK_CACHE
%token <tokval> TOK_CYCLE
%token <tokval> TOK_D                   /* ODBC extension  */
%token <tokval> TOK_DATABASE
%token <tokval> TOK_DATE
%token <tokval> TOK_DATEADD
%token <tokval> TOK_DATE_ADD
%token <tokval> TOK_DATE_SUB
%token <tokval> TOK_DATE_PART
%token <tokval> TOK_DATE_BEFORE_QUOTE
%token <tokval> TOK_DATE_TRUNC
%token <tokval> TOK_DATEDIFF
%token <tokval> TOK_DATEFORMAT          /* Tandem extension */
%token <tokval> TOK_DATETIME            /* Tandem extension non-reserved word */
%token <tokval> TOK_DAY
%token <tokval> TOK_DAYNAME
%token <tokval> TOK_DAYOFWEEK           /* Tandem extension */
%token <tokval> TOK_DAYOFYEAR 
%token <tokval> TOK_DAYOFMONTH          /* ODBC extension  */
%token <tokval> TOK_DEALLOCATE
%token <tokval> TOK_DECIMAL
%token <tokval> TOK_DECLARE
%token <tokval> TOK_DEFAULT
%token <tokval> TOK_DEFAULTS
%token <tokval> TOK_DEFINITION          /* Tandem extension non-reserved word */
%token <tokval> TOK_DEBUG
%token <tokval> TOK_DEGREES
%token <tokval> TOK_DE	
%token <tokval> TOK_DECODE	
%token <tokval> TOK_DELAY				// MV REFRESH
%token <tokval> TOK_DELETE
%token <tokval> TOK_DESC
%token <tokval> TOK_DESCRIBE
%token <tokval> TOK_DESCRIPTOR
%token <tokval> TOK_DELIMITER
%token <tokval> TOK_DETAIL              /* Tandem extension non-reserved word */
%token <tokval> TOK_DETAILS
%token <tokval> TOK_DETERMINISTIC
%token <tokval> TOK_DIAGNOSTICS
%token <tokval> TOK_DISABLE         
%token <tokval> TOK_DIFF1
%token <tokval> TOK_DIFF2
%token <tokval> TOK_DIRECTEDBY      
%token <tokval> TOK_DISPLAY
%token <tokval> TOK_DISTINCT
%token <tokval> TOK_DIVISION            /* HP extension non-reserved word */
%token <tokval> TOK_DO
%token <tokval> TOK_DOT_STAR
%token <tokval> TOK_DOUBLE
%token <tokval> TOK_DOUBLE_IEEE
%token <tokval> TOK_DUPLICATE
%token <tokval> TOK_DYNAMIC
%token <tokval> TOK_DYNAMIC_FUNCTION    /* ANSI SQL non-reserved word */
%token <tokval> TOK_D_RANK             /* Tandem extension non-reserved word */
%token <tokval> TOK_DECADE
%token <tokval> TOK_DOW
%token <tokval> TOK_DOY
%token <tokval> TOK_EACH                
%token <tokval> TOK_EID
%token <tokval> TOK_ELSEIF
%token <tokval> TOK_ELSE
%token <tokval> TOK_ENABLE             
%token <tokval> TOK_END
%token <tokval> TOK_ENCODE_KEY          /* Tandem extension */
%token <tokval> TOK_ENFORCED
%token <tokval> TOK_ENFORCERS
%token <tokval> TOK_ENTERPRISE
%token <tokval> TOK_ERROR
%token <tokval> TOK_ESCAPE
%token <tokval> TOK_ET
%token <tokval> TOK_EUROPEAN            /* Tandem extension non-reserved word */
%token <tokval> TOK_EVERY
%token <tokval> TOK_EXCEPT
%token <tokval> TOK_EXCEPTION
%token <tokval> TOK_EXCEPTIONS
%token <tokval> TOK_EXCEPTION_TABLE
%token <tokval> TOK_EXCHANGE            /* Tandem extension non-reserved word */
%token <tokval> TOK_EXCHANGE_AND_SORT
%token <tokval> TOK_EXCLUSIVE           /* Tandem extension non-reserved word */
%token <tokval> TOK_EXECUTE
%token <tokval> TOK_EXISTING            /* Tandem extension non-reserved word */
%token <tokval> TOK_EXISTS
%token <tokval> TOK_EXIT
%token <tokval> TOK_EXP
%token <tokval> TOK_EXPLAIN
%token <tokval> TOK_EXPONENTIATE
%token <tokval> TOK_EXTEND
%token <tokval> TOK_EXTERNAL
%token <tokval> TOK_EXTRACT
%token <tokval> TOK_EXTRACT_SOURCE
%token <tokval> TOK_EXTRACT_TARGET
%token <tokval> TOK_EPOCH
%token <tokval> TOK_FALSE
%token <tokval> TOK_FAMILY
%token <tokval> TOK_FEATURE_VERSION_INFO   /* Versioning. Non-reserved */
%token <tokval> TOK_FETCH
%token <tokval> TOK_FIRST
%token <tokval> TOK_FIRSTDAYOFYEAR
%token <tokval> TOK_FIRST_FSCODE
%token <tokval> TOK_FLOAT
%token <tokval> TOK_FLOAT_IEEE
%token <tokval> TOK_FLOOR
%token <tokval> TOK_FN                  /* ODBC extension non-reserved word */
%token <tokval> TOK_FOLLOWING
%token <tokval> TOK_FOR
%token <tokval> TOK_FOR_MAXRUNTIME
%token <tokval> TOK_LPAREN_BEFORE_DATATYPE
%token <tokval> TOK_LPAREN_BEFORE_DATE_AND_LPAREN
%token <tokval> TOK_LPAREN_BEFORE_DATE_COMMA_AND_FORMAT
%token <tokval> TOK_LPAREN_BEFORE_FORMAT
%token <tokval> TOK_LPAREN_BEFORE_NAMED
%token <tokval> TOK_FORCE
%token <tokval> TOK_FOR_BROWSE
%token <tokval> TOK_FOR_READ
%token <tokval> TOK_FOR_READ_ONLY
%token <tokval> TOK_FOR_REPEATABLE      /* FOR REPEATABLE */
%token <tokval> TOK_FOR_SERIALIZABLE    /* FOR SERIALIZABLE */
%token <tokval> TOK_FOR_STABLE          /* FOR STABLE */
%token <tokval> TOK_FOUND
%token <tokval> TOK_FRACTION            /* Tandem extension non-reserved word */
%token <tokval> TOK_FROM
%token <tokval> TOK_FULL
%token <tokval> TOK_GENERAL             /* ANSI SQL potential-reserved word */
%token <tokval> TOK_GENERATE
%token <tokval> TOK_GENERATED 
%token <tokval> TOK_GET
%token <tokval> TOK_GLOBAL
%token <tokval> TOK_GO
%token <tokval> TOK_GOTO
%token <tokval> TOK_GREATER_EQUAL
%token <tokval> TOK_GREATEST
%token <tokval> TOK_GROUP
%token <tokval> TOK_GROUP_CONCAT
%token <tokval> TOK_GZIP
%token <tokval> TOK_HAVING
%token <tokval> TOK_HIVE
%token <tokval> TOK_HIVEMD
%token <tokval> TOK_QUALIFY
%token <tokval> TOK_HEADER
%token <tokval> TOK_TRAFODION
%token <tokval> TOK_HBASE
%token <tokval> TOK_HBASE_OPTIONS
%token <tokval> TOK_SERIALIZED
%token <tokval> TOK_HEX                 /* HP Neo extension non-reserved word */
%token <tokval> TOK_HEXADECIMAL         /* HP Neo extension non-reserved word */
%token <tokval> TOK_HIGH_VALUE          /* Tandem extension non-reserved word */
// QSTUFF
%token <tokval> TOK_HOLD                /* standard holdable cursor */
// QSTUFF
%token <tokval> TOK_HOUR
%token <tokval> TOK_HOURS
%token <tokval> TOK_IDENTITY
%token <tokval> TOK_IF
%token <tokval> TOK_IGNORE	// MV
%token <tokval> TOK_IGNORETRIGGERS	// TRIGGERS
%token <tokval> TOK_IGNORE_TRIGGER
%token <tokval> TOK_IMMEDIATE
%token <tokval> TOK_IMMUTABLE
%token <tokval> TOK_IMPLICIT
%token <tokval> TOK_IN
%token <tokval> TOK_INCREMENT
%token <tokval> TOK_INCREMENTAL
%token <tokval> TOK_INOUT
%token <tokval> TOK_INSTR
%token <tokval> TOK_NOT_IN
%token <tokval> TOK_SYS_GUID
%token <tokval> TOK_INCLUSIVE
%token <tokval> TOK_INDICATOR
%token <tokval> TOK_INITIALIZATION // MV 
%token <tokval> TOK_INITIAL
%token <tokval> TOK_INITIALIZED      
%token <tokval> TOK_INGEST
%token <tokval> TOK_INNER
%token <tokval> TOK_INPUT
%token <tokval> TOK_INPUTS               /* HP Neo extension non-reserved word */
%token <tokval> TOK_BUFFERTOLOB
%token <tokval> TOK_EXTERNALTOLOB
%token <tokval> TOK_FILETOLOB
%token <tokval> TOK_FILETOEXTERNAL
%token <tokval> TOK_LOADTOLOB
%token <tokval> TOK_STRINGTOLOB
%token <tokval> TOK_STRINGTOEXTERNAL
%token <tokval> TOK_LOB
%token <tokval> TOK_LOBLENGTH
%token <tokval> TOK_LOBTOBUFFER
%token <tokval> TOK_LOBTOFILE
%token <tokval> TOK_LOBTOSTRING
%token <tokval> TOK_EXTERNALTOSTRING
%token <tokval> TOK_EMPTY_BLOB
%token <tokval> TOK_EMPTY_CLOB
%token <tokval> TOK_INSERT
%token <tokval> TOK_INSERT_ONLY
%token <tokval> TOK_INS
%token <tokval> TOK_ISOLATE              /* Tandem extension non-reserved word */
%token <tokval> TOK_INTEGER
%token <tokval> TOK_INTERNAL // MV REFRESH
%token <tokval> TOK_INTERNAL_EXPR
%token <tokval> TOK_INTERNAL_COLUMN_DEFINITION /*called by internal function*/
%token <tokval> TOK_INTERNALSP  /* Tdm ext., non-res., Internal Stored Procedure "TDMISP" */
%token <tokval> TOK_INTERSECT
%token <tokval> TOK_INTERVAL
%token <tokval> TOK_INTERVALS
%token <tokval> TOK_INTO
%token <tokval> TOK_INVOKE
%token <tokval> TOK_IS
%token <tokval> TOK_ISNULL
%token <tokval> TOK_IUDLOG	// MV REFRESH
%token <tokval> TOK_JAVA                /* Tandem extension non-reserved word */
%token <tokval> TOK_JOIN
%token <tokval> TOK_JSONOBJECTFIELDTEXT
%token <tokval> TOK_JULIANTIMESTAMP     /* Tandem extension */
%token <tokval> TOK_LAG                 /* LAG OLAP Function */
%token <tokval> TOK_LANGUAGE
%token <tokval> TOK_LARGEINT            /* Tandem extension non-reserved word */
%token <tokval> TOK_LASTNOTNULL
%token <tokval> TOK_LAST
%token <tokval> TOK_LAST_DAY
%token <tokval> TOK_LAST_FSCODE
%token <tokval> TOK_LAST_SYSKEY
%token <tokval> TOK_LASTSYSKEY
%token <tokval> TOK_LCASE               /* ODBC extension   */
%token <tokval> TOK_LEAD                /* LEAD OLAP Function */
%token <tokval> TOK_LEADING
%token <tokval> TOK_LEAST
%token <tokval> TOK_LEFT
%token <tokval> TOK_LESS_EQUAL
%token <tokval> TOK_LIBRARY
%token <tokval> TOK_LIBRARIES
%token <tokval> TOK_LIKE
%token <tokval> TOK_LIMIT
%token <tokval> TOK_LOAD
%token <tokval> TOK_LOAD_ID
%token <tokval> TOK_LOCAL
%token <tokval> TOK_LOCATE              /*  ODBC extension  */
%token <tokval> TOK_LOCK                /* Tandem extension */
%token <tokval> TOK_LOCK_ROW
%token <tokval> TOK_LOG
%token <tokval> TOK_LOGGABLE			//++ MV
%token <tokval> TOK_LOGON
%token <tokval> TOK_LZO
%token <tokval> TOK_IUD_LOG_TABLE          
%token <tokval> TOK_RANGE_LOG_TABLE		//++ MV
%token <tokval> TOK_LOG10
%token <tokval> TOK_LOG2
%token <tokval> TOK_LONGWVARCHAR

%token <tokval> TOK_LOW_VALUE           /* Tandem extension non-reserved word */
%token <tokval> TOK_LOWER
%token <tokval> TOK_LPAD
%token <tokval> TOK_LSDECIMAL
%token <tokval> TOK_LTRIM               /*  ODBC extension  */
%token <tokval> TOK_MAINTAIN
%token <tokval> TOK_MANAGEMENT
%token <tokval> TOK_MANUAL				// MV
%token <tokval> TOK_MASTER
%token <tokval> TOK_MATCH
%token <tokval> TOK_MATCHED
%token <tokval> TOK_MATERIALIZED        
%token <tokval> TOK_MAVG                /* Tandem extension non-reserved word */
%token <tokval> TOK_MAX
%token <tokval> TOK_MAXRUNTIME
%token <tokval> TOK_MAXVALUE
%token <tokval> TOK_MCOUNT              /* Tandem extension non-reserved word */
%token <tokval> TOK_MEMORY
%token <tokval> TOK_MERGE
%token <tokval> TOK_METADATA
%token <tokval> TOK_MD5
%token <tokval> TOK_MIN
%token <tokval> TOK_MINIMAL
%token <tokval> TOK_MINUTE
%token <tokval> TOK_MINUTES
%token <tokval> TOK_MINVALUE
%token <tokval> TOK_MIXED				// MV
%token <tokval> TOK_MOD
%token <tokval> TOK_MODIFIES
%token <tokval> TOK_MMAX                /* Tandem extension non-reserved word */
%token <tokval> TOK_MMIN                /* Tandem extension non-reserved word */
%token <tokval> TOK_MODE                /* Tandem extension non-reserved word */
%token <tokval> TOK_MODULE
%token <tokval> TOK_MODULES
%token <tokval> TOK_MONTH
%token <tokval> TOK_MONTHS_BETWEEN 
// %token <tokval> TOK_M -- already defined below
%token <tokval> TOK_MONTHNAME
%token <tokval> TOK_MORE                /* ANSI SQL non-reserved word */
%token <tokval> TOK_MRANK               /* Tandem extension non-reserved word */
%token <tokval> TOK_MSCK
%token <tokval> TOK_MSTDDEV             /* Tandem extension non-reserved word */
%token <tokval> TOK_MSUM                /* Tandem extension non-reserved word */
%token <tokval> TOK_MV                  
%token <tokval>	TOK_MVATTRIBUTE			// MV 
%token <tokval>	TOK_MVATTRIBUTES		// MV 
%token <tokval> TOK_MVS					// MV 
%token <tokval> TOK_MVSTATUS			// MV
%token <tokval> TOK_MV_TABLE            
%token <tokval> TOK_MVARIANCE           /* Tandem extension non-reserved word */
%token <tokval> TOK_MVGROUP			/*  */
%token <tokval> TOK_MVGROUPS
%token <tokval> TOK_MVS_UMD				// MV
%token <tokval> TOK_MVUID               // MV
%token <tokval> TOK_MULTI               /* Long Running */
%token <tokval> TOK_MULTIDELTA			// MV
%token <tokval> TOK_MULTISET
%token <tokval> TOK_NAMED
%token <tokval> TOK_NAMES
%token <tokval> TOK_NAMETYPE            /* Tandem extension non-reserved word */
%token <tokval> TOK_NATIONAL
%token <tokval> TOK_NATURAL
%token <tokval> TOK_NCHAR
%token <tokval> TOK_NECESSARY
%token <tokval> TOK_NEEDED
%token <tokval> TOK_NEW              
%token <tokval> TOK_NEXT
%token <tokval> TOK_NEXT_DAY
%token <tokval> TOK_NODELETE
%token <tokval> TOK_NODES
%token <tokval> TOK_NOT
%token <tokval> TOK_NOT_EQUAL
%token <tokval> TOK_NOW                 /* ODBC extension  */
%token <tokval> TOK_NSK_CODE            /* Tandem extension non-reserved word */
%token <tokval> TOK_NULL
%token <tokval> TOK_NULLIF
%token <tokval> TOK_NULLIFZERO
%token <tokval> TOK_NULL_STRING
%token <tokval> TOK_ZEROIFNULL
%token <tokval> TOK_NUMBER              /* ANSI SQL non-reserved word */
%token <tokval> TOK_NUMERIC
%token <tokval> TOK_NVL  
%token <tokval> TOK_OCTET_LENGTH
%token <tokval> TOK_OF
%token <tokval> TOK_OFFSET              /* Tandem extension non-reserved word */
%token <tokval> TOK_OJ                  /* ODBC extension  */
%token <tokval> TOK_OLD                
%token <tokval> TOK_ON
%token <tokval> TOK_ON_COMMIT           /* TD extension, non-reserved word */
%token <tokval> TOK_ONLY
%token <tokval> TOK_OPEN
%token <tokval> TOK_OR
%token <tokval> TOK_ORDER
%token <tokval> TOK_ORDERED
%token <tokval> TOK_OS_USERID
%token <tokval> TOK_OUT
%token <tokval> TOK_OUTER
%token <tokval> TOK_OUTPUT
%token <tokval> TOK_OVER
%token <tokval> TOK_OVERLAPS
%token <tokval> TOK_OVERRIDE
%token <tokval> TOK_OVERWRITE
%token <tokval> TOK_PAGE
%token <tokval> TOK_PAGES
%token <tokval> TOK_PARAMETER
%token <tokval> TOK_PARENT
%token <tokval> TOK_PARSERFLAGS
%token <tokval> TOK_ENVVAR
%token <tokval> TOK_ENVVARS
%token <tokval> TOK_PARTIAL
%token <tokval> TOK_PATH
%token <tokval> TOK_PERCENT
%token <tokval> TOK_PERFORM
%token <tokval> TOK_PERIODIC
%token <tokval> TOK_PERTABLE
%token <tokval> TOK_PHASE				// MV _REFRESH
%token <tokval> TOK_PI
%token <tokval> TOK_PIVOT
%token <tokval> TOK_PIVOT_GROUP
%token <tokval> TOK_POS
%token <tokval> TOK_POSITION
%token <tokval> TOK_POWER
%token <tokval> TOK_PRECEDING
%token <tokval> TOK_PREFER_FOR_SCAN_KEY
%token <tokval> TOK_PREPARE
%token <tokval> TOK_PRESERVE            /* TD extension that HP wants to ignore */
%token <tokval> TOK_PRIORITY
%token <tokval> TOK_PRIORITY_DELTA
%token <tokval> TOK_PROCEDURE
%token <tokval> TOK_PROCEDURES
%token <tokval> TOK_PROCESS
%token <tokval> TOK_PROGRESS
%token <tokval> TOK_PROTOTYPE           /* Tandem extension */
%token <tokval> TOK_QUERY               /* Tandem extension */
%token <tokval> TOK_QUERY_CACHE
%token <tokval> TOK_HYBRID_QUERY_CACHE
%token <tokval> TOK_HYBRID_QUERY_CACHE_ENTRIES
%token <tokval> TOK_CATMAN_CACHE
%token <tokval> TOK_NATABLE_CACHE
%token <tokval> TOK_NATABLE_CACHE_ENTRIES
%token <tokval> TOK_NAROUTINE_CACHE
%token <tokval> TOK_NAROUTINE_ACTION_CACHE
%token <tokval> TOK_QUERY_CACHE_ENTRIES
%token <tokval> TOK_QUERYID_EXTRACT
%token <tokval> TOK_QUARTER
%token <tokval> TOK_RADIANS
%token <tokval> TOK_RAND
%token <tokval> TOK_RANDOM
%token <tokval> TOK_RATE
%token <tokval> TOK_RAVG                /* Tandem extension non-reserved word */
%token <tokval> TOK_RCOUNT              /* Tandem extension non-reserved word */
%token <tokval> TOK_READ
%token <tokval> TOK_REAL
%token <tokval> TOK_REAL_IEEE
%token <tokval> TOK_RECOMPUTE             
%token <tokval> TOK_RECORD_SEPARATOR
%token <tokval> TOK_SEPARATOR
%token <tokval> TOK_RECOVER
%token <tokval> TOK_RECOVERY
%token <tokval> TOK_RECURSIVE 
%token <tokval> TOK_REFERENCING        
%token <tokval> TOK_REFRESH               
%token <tokval> TOK_RELATED
%token <tokval> TOK_RELATEDNESS        /* Versioning. Non-reserved */
%token <tokval> TOK_RELOAD
%token <tokval> TOK_REMOTE
%token <tokval> TOK_TEMP_TABLE         
%token <tokval> TOK_TEMPORARY
%token <tokval> TOK_REPAIR
%token <tokval> TOK_REPEAT
%token <tokval> TOK_REPEATABLE          /* ANSI SQL non-reserved word */ 
%token <tokval> TOK_REPEATABLE_ACCESS   /* Tandem extension */
%token <tokval> TOK_REPEATABLE_READ
%token <tokval> TOK_REPLACE
%token <tokval> TOK_REPOSITORY
%token <tokval> TOK_REQUEST            
%token <tokval> TOK_REQUIRED            /* Tandem extension non-reserved word */
%token <tokval> TOK_RESET
%token <tokval> TOK_RESTORE
%token <tokval> TOK_RESUME
%token <tokval> TOK_REWRITE              
%token <tokval> TOK_RESULT
%token <tokval> TOK_RETRIES
%token <tokval> TOK_RIGHT
%token <tokval> TOK_RMAX                /* Tandem extension non-reserved word */
%token <tokval> TOK_RMIN                /* Tandem extension non-reserved word */
%token <tokval> TOK_ROLE                /* ANSI SQL non-reserved word */
%token <tokval> TOK_ROLES
%token <tokval> TOK_ROLLBACK
%token <tokval> TOK_ROUND
%token <tokval> TOK_ROW
%token <tokval> TOK_ROW_COUNT           /* ANSI SQL non-reserved word */
%token <tokval> TOK_ROWNUM
%token <tokval> TOK_ROWS_DELETED	// MV _REFRESH
%token <tokval> TOK_ROWS_INSERTED	// MV _REFRESH
%token <tokval> TOK_ROWS_UPDATED	// MV _REFRESH 
%token <tokval> TOK_ROWS_COVERED	// MV AB_REFRESH 
%token <tokval> TOK_NUM_OF_RANGES	// MV AB_REFRESH 
%token <tokval> TOK_RPAD
%token <tokval> TOK_RRANK               /* Tandem extension non-reserved word */
%token <tokval> TOK_RSTDDEV             /* Tandem extension non-reserved word */
%token <tokval> TOK_RSUM                /* Tandem extension non-reserved word */
%token <tokval> TOK_RTRIM               /* ODBC extension  */
%token <tokval> TOK_RVARIANCE           /* Tandem extension non-reserved word */
%token <tokval> TOK_SAMPLE
%token <tokval> TOK_SAMPLE_FIRST
%token <tokval> TOK_SAMPLE_PERIODIC
%token <tokval> TOK_SAMPLE_RANDOM

%token <tokval> TOK_RUN
%token <tokval> TOK_STRING_SEARCH
%token <tokval> TOK_SECOND
%token <tokval> TOK_SECONDS
%token <tokval> TOK_SECTION
%token <tokval> TOK_SELECT
%token <tokval> TOK_SEL
%token <tokval> TOK_SELECTIVITY
%token <tokval> TOK_SEQNUM
%token <tokval> TOK_SEQUENCE            /* Tandem extension non-reserved word */
%token <tokval> TOK_SEQUENCES            
%token <tokval> TOK_SEQUENCE_BY         /* Tandem extension non-reserved word */
%token <tokval> TOK_SESSION
%token <tokval> TOK_SESSIONS
%token <tokval> TOK_SESSION_USER
%token <tokval> TOK_SESSN_USR_INTN
%token <tokval> TOK_SET
%token <tokval> TOK_SETS
%token <tokval> TOK_SG_TABLE
%token <tokval> TOK_SHA
%token <tokval> TOK_SHA1
%token <tokval> TOK_SHA2
%token <tokval> TOK_SHAPE
%token <tokval> TOK_SHARE               /* Tandem extension non-reserved word */
%token <tokval> TOK_SHARED              /* Tandem extension non-reserved word */
%token <tokval> TOK_SUSPEND
%token <tokval> TOK_SHOW
%token <tokval> TOK_SHOWCONTROL         /* Tandem extension     reserved word */
%token <tokval> TOK_SHOWDDL_ROLE
%token <tokval> TOK_SHOWDDL_COMPONENT
%token <tokval> TOK_SHOWDDL_LIBRARY
%token <tokval> TOK_SHOWDDL_SEQUENCE
%token <tokval> TOK_SHOWDDL             /* Tandem extension non-reserved word */
%token <tokval> TOK_SYSDATE
%token <tokval> TOK_SYSTIMESTAMP
%token <tokval> TOK_TARGET
%token <tokval> TOK_SYSTEM
%token <tokval> TOK_SHOWSTATS           /* Tandem extension non-reserved word*/
%token <tokval> TOK_SHOWTRANSACTION     /* Tandem extension non-reserved word*/
%token <tokval> TOK_ARKCMP              /* Tandem extension non-reserved word*/
%token <tokval> TOK_PROMPT              /* Tandem extension non-reserved word*/

%token <tokval> TOK_SHOWPLAN            /* Tandem extension     reserved word */
%token <tokval> TOK_SHOWSET             /* Tandem extension non-reserved word */ 
%token <tokval> TOK_SHOWSHAPE            /* Tandem extension     reserved word */
%token <tokval> TOK_SIGN                /* Tandem extension non-reserved word */
%token <tokval> TOK_SIGNAL
%token <tokval> TOK_SIGNED              /* Tandem extension non-reserved word */
%token <tokval> TOK_SIN
%token <tokval> TOK_SINCE               /* Tandem extension non-reserved word */
%token <tokval> TOK_SINGLEDELTA         // MV 
%token <tokval> TOK_SINH
%token <tokval> TOK_SLACK
%token <tokval> TOK_SPACE
%token <tokval> TOK_SMALLINT
%token <tokval> TOK_SOME
%token <tokval> TOK_SOUNDEX
%token <tokval> TOK_SORT                /* Tandem extension non-reserved word */
%token <tokval> TOK_SORT_KEY
%token <tokval> TOK_SP_RESULT_SET
%token <tokval> TOK_STATUS
%token <tokval> TOK_STDDEV              /* Tandem extension */
%token <tokval> TOK_STOP                /* Tandem extension */
%token <tokval> TOK_SPLIT_PART          /* Trafodion extension*/ 
%token <tokval> TOK_STORED
%token <tokval> TOK_SQL
%token <tokval> TOK_SQL_DOUBLE
%token <tokval> TOK_SQLCODE
%token <tokval> TOK_SQLERROR
%token <tokval> TOK_SQLSTATE
%token <tokval> TOK_SQL_WARNING         /* Tandem extension non-reserved word */
%token <tokval> TOK_SQRT
%token <tokval> TOK_STATEMENT           /* Tandem extension non-reserved word */
%token <tokval> TOK_STATIC              /* Tandem extension non-reserved word */
%token <tokval> TOK_STYLE               /* Tandem extension non-reserved word */
%token <tokval> TOK_SUBSTRING
%token <tokval> TOK_SUM
%token <tokval> TOK_SUMMARY
%token <tokval> TOK_T                   /* ODBC extension  */
%token <tokval> TOK_TABLE
%token <tokval> TOK_TABLES
%token <tokval> TOK_TABLESPACE
%token <tokval> TOK_TAN
%token <tokval> TOK_TANH
%token <tokval> TOK_THEN
%token <tokval> TOK_THIS
%token <tokval> TOK_TIME
%token <tokval> TOK_TIME_BEFORE_QUOTE
%token <tokval> TOK_TIMEOUT             
%token <tokval> TOK_TIMESTAMP
%token <tokval> TOK_TIMESTAMPADD
%token <tokval> TOK_TIMESTAMPDIFF
%token <tokval> TOK_TINYINT
%token <tokval> TOK_TITLE
%token <tokval> TOK_TO
%token <tokval> TOK_TO_CHAR
%token <tokval> TOK_TO_DATE
%token <tokval> TOK_TO_NUMBER
%token <tokval> TOK_TO_TIME
%token <tokval> TOK_TO_TIMESTAMP
%token <tokval> TOK_TOKENSTR
%token <tokval> TOK_TRAILING
%token <tokval> TOK_TRANSACTION
%token <tokval> TOK_TRANSFORM
%token <tokval> TOK_TRANSPOSE           /* Tandem extenstion */
%token <tokval> TOK_TRIGGER             
%token <tokval> TOK_TRIGGERS
%token <tokval> TOK_TRIM
%token <tokval> TOK_TRUE
%token <tokval> TOK_TRUNC
%token <tokval> TOK_TRUNCATE
%token <tokval> TOK_TS                  /* ODBC extension  */
%token <tokval> TOK_UCASE               /* ODBC extension  */
%token <tokval> TOK_CODE_VALUE       /* Tandem extension */
%token <tokval> TOK_UNION
%token <tokval> TOK_UNION_JOIN
%token <tokval> TOK_UNIQUE
%token <tokval> TOK_UNIQUE_ID
%token <tokval> TOK_UUID
%token <tokval> TOK_UNKNOWN
%token <tokval> TOK_UNLOAD
%token <tokval> TOK_SCAN
%token <tokval> TOK_SNAPSHOT
%token <tokval> TOK_SUFFIX
%token <tokval> TOK_UNLOCK              /* Tandem extension */
%token <tokval> TOK_UNSIGNED            /* Tandem extension non-reserved word */
%token <tokval> TOK_UPDATE		
%token <tokval> TOK_UPDATE_STATS
%token <tokval> TOK_UPDATE_LOB		
%token <tokval> TOK_UPD
%token <tokval> TOK_UPGRADE
%token <tokval> TOK_UPPER
%token <tokval> TOK_UPSERT
%token <tokval> TOK_UPPERCASE           /* TD extension that HP maps to UPSHIFT */
%token <tokval> TOK_UPSHIFT             /* Tandem extension */
%token <tokval> TOK_USA                 /* Tandem extension non-reserved word */
%token <tokval> TOK_USAGE
%token <tokval> TOK_USE					// MV _REFRESH
%token <tokval> TOK_USER
%token <tokval> TOK_USERNAMEINTTOEXT
%token <tokval> TOK_USERS
%token <tokval> TOK_USING
%token <tokval> TOK_VALUE
%token <tokval> TOK_VALUES
%token <tokval> TOK_VARBINARY
%token <tokval> TOK_VARCHAR
%token <tokval> TOK_VARIANCE            /* Tandem extension */
%token <tokval> TOK_VARWCHAR
%token <tokval> TOK_VARYING
%token <tokval> TOK_VERSION
%token <tokval> TOK_VERSIONS
%token <tokval> TOK_VPROC
%token <tokval> TOK_VERSION_INFO        /* Versioning. Non-reserved */
%token <tokval> TOK_VOLATILE
%token <tokval> TOK_WAITED
%token <tokval> TOK_WAITEDIO
%token <tokval> TOK_WCHAR
%token <tokval> TOK_WEEK
%token <tokval> TOK_WOM
%token <tokval> TOK_WHEN
%token <tokval> TOK_WHENEVER
%token <tokval> TOK_WHERE
%token <tokval> TOK_WITH
%token <tokval> TOK_SLEEP
%token <tokval> TOK_UUID_SHORT
%token <tokval> TOK_UNIX_TIMESTAMP
// QSTUFF
%token <tokval> TOK_WITHOUT             /* standard holdable cursor */
// QSTUFF
%token <tokval> TOK_WORK
%token <tokval> TOK_WRITE
%token <tokval> TOK_XMLAGG
%token <tokval> TOK_XMLELEMENT
%token <tokval> TOK_YEAR

%token <tokval> TOK_ACTION
%token <tokval> TOK_ADD
%token <tokval> TOK_REMOVE				// MV -RG () Tandem extension	
%token <tokval> TOK_OPENBLOWNAWAY		// Y_TEST
%token <tokval> TOK_REDEFTIME			// _TEST
%token <tokval> TOK_ALTER
%token <tokval> TOK_ALTER_LIBRARY
%token <tokval> TOK_ALTER_MV
%token <tokval> TOK_ALTER_MV_GROUP
%token <tokval> TOK_ALTER_ROUTINE
%token <tokval> TOK_ALTER_ROUTINE_ACTION
%token <tokval> TOK_ALTER_SYNONYM
%token <tokval> TOK_ALTER_TABLE
%token <tokval> TOK_ALTER_TRIGGER
%token <tokval> TOK_ALTER_VIEW
%token <tokval> TOK_ASCENDING           /* Tandem extension */
%token <tokval> TOK_ASSERTION
%token <tokval> TOK_ATTRIBUTE           /* Tandem extension */
%token <tokval> TOK_ATTRIBUTES          /* Tandem extension */
%token <tokval> TOK_AUDIT               /* Tandem extension */
%token <tokval> TOK_AUDITCOMPRESS       /* Tandem extension */
%token <tokval> TOK_AUTHENTICATION
%token <tokval> TOK_AUTHNAME
%token <tokval> TOK_AUTHORIZATION
%token <tokval> TOK_AUTHTYPE
%token <tokval> TOK_BLOCKSIZE           /* Tandem extension */
%token <tokval> TOK_BRIEF               /* Tandem extension */
%token <tokval> TOK_BUFFER
%token <tokval> TOK_BUFFERED            /* Tandem extension */
%token <tokval> TOK_BYTE                /* TD extension that HP maps to CHAR */
%token <tokval> TOK_BYTES               /* Tandem extension */
%token <tokval> TOK_CAPTURE
%token <tokval> TOK_CASCADE
%token <tokval> TOK_CASCADED
%token <tokval> TOK_CATALOG
%token <tokval> TOK_CATALOGS
%token <tokval> TOK_CHECK
%token <tokval> TOK_CLEAN
%token <tokval> TOK_CLEANUP
%token <tokval> TOK_CLEANUP_OBSOLETE
%token <tokval> TOK_CLEAR               /* Tandem extension */
%token <tokval> TOK_CLEARONPURGE        /* Tandem extension */
%token <tokval> TOK_COLUMN
%token <tokval> TOK_COLUMNS		/* MV _REFRESH    */
%token <tokval> TOK_COMPILE	
%token <tokval> TOK_COMPONENT
%token <tokval> TOK_COMPONENTS
%token <tokval> TOK_COMPRESSION
%token <tokval> TOK_CONFIG              /* Tandem extension */
%token <tokval> TOK_CONSTRAINT
%token <tokval> TOK_CONSTRAINTS
%token <tokval> TOK_COPY
%token <tokval> TOK_CREATE
%token <tokval> TOK_CREATE_LIBRARY
%token <tokval> TOK_CREATE_MV
%token <tokval> TOK_CREATE_MV_GROUP
%token <tokval> TOK_CREATE_PROCEDURE
%token <tokval> TOK_CREATE_ROUTINE
%token <tokval> TOK_CREATE_ROUTINE_ACTION
%token <tokval> TOK_CREATE_TABLE
%token <tokval> TOK_CREATE_TRIGGER
%token <tokval> TOK_CREATE_SYNONYM
%token <tokval> TOK_CREATE_VIEW
%token <tokval> TOK_DATA                /* ANSI SQL non-reserved word*/
%token <tokval> TOK_DBA
%token <tokval> TOK_DCOMPRESS           /* Tandem extension */
%token <tokval> TOK_DDL
%token <tokval> TOK_DESCENDING          /* Tandem extension */
%token <tokval> TOK_DEPENDENT
%token <tokval> TOK_DROP
%token <tokval> TOK_DROP_LIBRARY
%token <tokval> TOK_DROP_MV
%token <tokval> TOK_DROP_MV_GROUP
%token <tokval> TOK_DROP_PROCEDURE
%token <tokval> TOK_DROP_ROUTINE
%token <tokval> TOK_DROP_ROUTINE_ACTION
%token <tokval> TOK_DROP_SYNONYM
%token <tokval> TOK_DROP_TABLE
%token <tokval> TOK_DROP_TRIGGER
%token <tokval> TOK_DROP_VIEW
%token <tokval> TOK_DROPPABLE           /* Tandem extension */
%token <tokval> TOK_DSLACK              /* Tandem extension */
%token <tokval> TOK_ENTRY               /* Tandem extension */
%token <tokval> TOK_ENTRIES             /* Tandem extension */
%token <tokval> TOK_EXECUTION		/* Tandem extension */
%token <tokval> TOK_FOREIGN
%token <tokval> TOK_G                   /* Tandem extension */
%token <tokval> TOK_GHOST               /* Tandem extension non-reserved word */
%token <tokval> TOK_GIVE                /* Tandem extension */
%token <tokval> TOK_GRANT
%token <tokval> TOK_GRANTEES
%token <tokval> TOK_GRANTED
%token <tokval> TOK_HARDWARE
%token <tokval> TOK_HASH                /* Tandem extension */
%token <tokval> TOK_HASH2               /* Tandem extension */
%token <tokval> TOK_HASHPARTFUNC        /* Tandem extension */
%token <tokval> TOK_HASH2PARTFUNC       /* Tandem extension */
%token <tokval> TOK_HEADING             /* Tandem extension */
%token <tokval> TOK_HEADINGS            /* Tandem extension */
%token <tokval> TOK_ICOMPRESS           /* Tandem extension */
%token <tokval> TOK_HORIZONTAL          /* Tandem extension non-reserved word */
%token <tokval> TOK_INITIALIZE          /* Tandem extension non-reserved word */
%token <tokval> TOK_INITIALIZE_MAINTAIN
%token <tokval> TOK_REINITIALIZE_MAINTAIN
%token <tokval> TOK_INITIALIZE_SQL
%token <tokval> TOK_INDEX               /* Tandem extension non-reserved word */
%token <tokval> TOK_INDEXES             /* Tandem extension non-reserved word */
%token <tokval> TOK_INDEX_TABLE         /* Tandem extension non-reserved word */
%token <tokval> TOK_INSERTLOG			// MV 
%token <tokval> TOK_INVALID
%token <tokval> TOK_INVALIDATE
%token <tokval> TOK_ISIPV4
%token <tokval> TOK_ISIPV6
%token <tokval> TOK_ISLACK              /* Tandem extension */
%token <tokval> TOK_K                   /* Tandem extension */
%token <tokval> TOK_KEY
%token <tokval> TOK_KEY_RANGE_COMPARE   /* Tandem extension */
%token <tokval> TOK_LABEL
%token <tokval> TOK_LABEL_CREATE        /* internal label creates */
%token <tokval> TOK_LABEL_DROP          /* internal label drops */
%token <tokval> TOK_LABEL_ALTER         /* internal label alter */
%token <tokval> TOK_LABEL_PURGEDATA
%token <tokval> TOK_LOCATION            /* Tandem extension */
%token <tokval> TOK_LOCKING             /* TD extension that HP wants to ignore */
%token <tokval> TOK_LOCKONREFRESH		// MV
%token <tokval> TOK_M                   /* Tandem extension */
%token <tokval> TOK_MOVE                /* Tandem extension */
%token <tokval> TOK_MOVEMENT            /* Tandem extension */
%token <tokval> TOK_MVLOG				// MV
%token <tokval> TOK_NAMESPACE    	/* Tandem extension */	
%token <tokval> TOK_NO
%token <tokval> TOK_NONE
%token <tokval> TOK_NOMVLOG				// MV
%token <tokval> TOK_NOLOG
%token <tokval> TOK_NO_DEFAULT          /* Tandem extension */
%token <tokval> TOK_NO_PARTITION        /* Tandem extension */
%token <tokval> TOK_NO_PARTITIONS       /* Tandem extension */
%token <tokval> TOK_NO_LOAD
%token <tokval> TOK_NOT_DROPPABLE       /* Tandem extension */
%token <tokval> TOK_NOT_ENFORCED        /* Tandem extension */
%token <tokval> TOK_OBSOLETE
%token <tokval> TOK_OBJECT
%token <tokval> TOK_OBJECTS
%token <tokval> TOK_OFF
%token <tokval> TOK_OFFLINE             /* Tandem extension */
%token <tokval> TOK_ONLINE              /* Tandem extension */
%token <tokval> TOK_OPCODE              /* internal label alter opcode */
%token <tokval> TOK_OPTION
%token <tokval> TOK_OPTIONS
%token <tokval> TOK_OSIM
%token <tokval> TOK_SIMULATE
%token <tokval> TOK_PARALLEL            /* Tandem extension */
%token <tokval> TOK_PARTITION           /* Tandem extension non-reserved word*/
%token <tokval> TOK_PARTITIONING        /* Tandem extension non-reserved word*/
%token <tokval> TOK_PARTITIONS          /* Tandem extension non-reserved word*/
%token <tokval> TOK_PIPELINE			/* MV  _REFRESH */ 
%token <tokval> TOK_POPULATE            /* Tandem extension */
%token <tokval> TOK_PRIMARY
%token <tokval> TOK_PRIMARY_INDEX
%token <tokval> TOK_PRIVATE              
%token <tokval> TOK_PRIVILEGE           /* HP extension non-reserved word */
%token <tokval> TOK_PRIVILEGES
%token <tokval> TOK_PUBLIC
%token <tokval> TOK_PURGEDATA
%token <tokval> TOK_RANGE               /* Tandem extension non-reserved word*/
%token <tokval> TOK_RANGE_N             /* TD extension that HP wants to ignore */
%token <tokval> TOK_RANGELOG			/* MV */
%token <tokval> TOK_REBUILD
%token <tokval> TOK_REFERENCES
%token <tokval> TOK_REGEXP
%token <tokval> TOK_REGION
%token <tokval> TOK_REGISTER            /* Tandem extension */
%token <tokval> TOK_REGISTERED
%token <tokval> TOK_UNREGISTER          /* Tandem extension */
%token <tokval> TOK_RENAME              /* Tandem extension */
%token <tokval> TOK_REPLICATE           /* Tandem extension non-reserved word*/
%token <tokval> TOK_RESTRICT
%token <tokval> TOK_REVOKE
%token <tokval> TOK_ROWS                /* Tandem extension */
%token <tokval> TOK_RRPARTFUNC          /* Tandem extension */
%token <tokval> TOK_SALT                /* HP extension non-reserved word */
%token <tokval> TOK_SCHEMA
%token <tokval> TOK_SCHEMAS
%token <tokval> TOK_SECURITY
%token <tokval> TOK_STORE               /* Tandem extension */
%token <tokval> TOK_STORAGE
%token <tokval> TOK_STATISTICS          /* Tandem extension non-reserved word */
%token <tokval> TOK_HBMAP_TABLE
%token <tokval> TOK_STATS
%token <tokval> TOK_UNBOUNDED           /* Tandem extension */
%token <tokval> TOK_VIEW
%token <tokval> TOK_VIEWS
%token <tokval> TOK_VALIDATE            /* Tandem extension */
%token <tokval> TOK_ALIAS               /* Tandem extension */
%token <tokval> TOK_SYNONYM             /* Tandem extension */
%token <tokval> TOK_SYNONYMS             /* Tandem extension */
%token <tokval> TOK_LONG                /* Tandem extension */
%token <tokval> TOK_BIGINT              /* Tandem extension */
%token <tokval> TOK_LEVEL
%token <tokval> TOK_LEVELS
%token <tokval> TOK_EOF
%token <tokval> TOK_ISOLATION
%token <tokval> TOK_COMMITTED           /* ANSI SQL non-reserved word*/
%token <tokval> TOK_UNAVAILABLE			// MV
%token <tokval> TOK_UNCOMMITTED         /* ANSI SQL non-reserved word*/
%token <tokval> TOK_SIZE
%token <tokval> TOK_SERIALIZABLE        /* ANSI SQL non-reserved word */ 
%token <tokval> TOK_SERIALIZABLE_ACCESS /* Tandem extension */
%token <tokval> TOK_SOFTWARE
%token <tokval> TOK_REINITIALIZE        /* Tandem extension non-reserved word */
%token <tokval> TOK_SEPARATE            /* Tandem extension */
%token <tokval> TOK_BACKUP

// QSTUFF
%token <tokval> TOK_STREAM              /* Tandem ext: table streams pub/sub */
%token <tokval> TOK_SKIP		/* Tandem ext: table streams pub/sub */
%token <tokval> TOK_CONFLICT  		/* Tandem ext: table streams pub/sub */
%token <tokval> TOK_SKIP_CONFLICT_ACCESS /* extension */
%token <tokval> TOK_FOR_SKIP		/* Tandem ext: table streams pub/sub */
%token <tokval> TOK_RETURN              /* Tandem ext: table streams pub/sub */
%token <tokval> TOK_CURSOR_WITH_HOLD
%token <tokval> TOK_CURSOR_WITHOUT_HOLD
// QSTUFF

%token <tokval> TOK_VSBB                /* Tandem extension non-reserved word */

%token <tokval> TOK_ROWSET
%token <tokval> TOK_ROWWISE
%token <tokval> TOK_ROWSET_SIZE              /* Tandem ext: non-reserved word : dynamic rowsets*/
%token <tokval> TOK_ROWSET_VAR_LAYOUT_SIZE   /* Tandem ext: non-reserved word : dynamic rowsets*/
%token <tokval> TOK_ROWSET_IND_LAYOUT_SIZE   /* Tandem ext: non-reserved word : dynamic rowsets*/
%token <stringval> DOLLAR_IDENTIFIER    /* identifier starting w/ dollar sign */
                                        /* It is a LOCATION name or ENV value */
%token <tokval> TOK_PARAMETER_MODE      /* ANSI SQL non-reserved word */
%token <tokval> TOK_PARAMETER_ORDINAL_POSITION /* ANSI SQL non-reserved word */
%token <tokval> TOK_PARAMETER_INDEX /* INTERNAL non-reserved word */

%token <tokval> TOK_ALIGNED             /* Tandem extension non-reserved word */
%token <tokval> TOK_PACKED              /* Tandem extension non-reserved word */
%token <tokval> TOK_QID              /* Tandem extension non-reserved word */
%token <tokval> TOK_QID_INTERNAL     /* Tandem extension non-reserved word */
%token <tokval> TOK_PID              /* Tandem extension non-reserved word */
%token <tokval> TOK_CPU              /* Tandem extension non-reserved word */
%token <tokval> TOK_ACTIVE           /* Tandem extension non-reserved word */
%token <tokval> TOK_RMS         /* Tandem extension non-reserved word */
%token <tokval> TOK_REVERSE

%token <tokval> TOK_DATA_OFFSET        /* INTERNAL non-reserved word */
%token <tokval> TOK_NULL_IND_OFFSET    /* INTERNAL non-reserved word */
%token <tokval> TOK_ALIGNED_LENGTH     /* INTERNAL non-reserved word */

%token <tokval> TOK_ACTIVATE           /* INTERNAL non-reserved word */
%token <tokval> TOK_PARTITION_BY       /* compound token */
%token <tokval> TOK_UDF      /* non-reserved word */
%token <tokval> TOK_REPLICATE_PARTITION      /* compound token */


%token <tokval> TOK_RETURNS            /* ANSI SQL potential-reserved word */
%token <tokval> TOK_PASS               /* HP Neo extension non-reserved word */
%token <tokval> TOK_THROUGH            /* HP Neo extension non-reserved word */
%token <tokval> TOK_TEXT               /* HP Neo extension non-reserved word */
%token <tokval> TOK_FILE               /* HP Neo extension non-reserved word */
%token <tokval> TOK_FINAL              /* HP Neo extension non-reserved word */
%token <tokval> TOK_ALLOW              /* HP Neo extension non-reserved word */
%token <tokval> TOK_PARALLELISM        /* HP Neo extension non-reserved word */
%token <tokval> TOK_AREA               /* HP Neo extension non-reserved word */
%token <tokval> TOK_TABLE_MAPPING      /* HP Neo extension non-reserved word */
%token <tokval> TOK_SCALAR             /* HP Neo extension non-reserved word */
%token <tokval> TOK_TAG                /* HP Neo extension non-reserved word */
%token <tokval> TOK_UNIVERSAL          /* HP Neo extension non-reserved word */
%token <tokval> TOK_FAST               /* HP Neo extension non-reserved word */
%token <tokval> TOK_SAFE               /* HP Neo extension non-reserved word */
%token <tokval> TOK_MESSAGE            /* HP Neo extension non-reserved word */
%token <tokval> TOK_NORMAL             /* HP Neo extension non-reserved word */
%token <tokval> TOK_IO                 /* HP Neo extension non-reserved word */
%token <tokval> TOK_SAS_FORMAT         /* HP Neo extension non-reserved word */
%token <tokval> TOK_SAS_LOCALE         /* HP Neo extension non-reserved word */
%token <tokval> TOK_SAS_MODEL_INPUT_TABLE /* Neo extension non-reserved word */
%token <tokval> TOK_SQLROW             /* HP Neo extension non-reserved word */

%token <tokval> TOK_DEFINER            /* SPJ Definer Rights Support, non-reserved word */
%token <tokval> TOK_INVOKER            /* SPJ Definer Rights Support, non-reserved word */
%token <tokval> TOK_VERIFY            

/*
  ------------------------------------------------------------------------
   NOTE TO SPJ DEVELOPERS
  ------------------------------------------------------------------------
   (remove this note when merging from SPJ branch into a release branch)

  The tokens below represent SQL99 reserved words that are not yet
  being used in MX. The SPJ project has put to use many of these
  tokens, and in doing so moved token declarations from the list below
  to the large, alphabetized list above. When merging code between SPJ
  and other branches, make sure any SPJ-related reserved words are
  removed from the list below.

*/

/* ANSI SQL 99 additional reserved words not already used */
%token <tokval> TOK_AGGREGATE
%token <tokval> TOK_ARRAY
%token <tokval> TOK_BINARY

%token <tokval> TOK_CLASS
%token <tokval> TOK_CONSTRUCTOR
%token <tokval> TOK_CUBE
%token <tokval> TOK_CURRENT_PATH

%token <tokval> TOK_DEREF
%token <tokval> TOK_DESTROY
%token <tokval> TOK_DESTRUCTOR

%token <tokval> TOK_FREE
%token <tokval> TOK_FUNCTION
%token <tokval> TOK_FUNCTIONS
%token <tokval> TOK_GROUPING
%token <tokval> TOK_GROUPING_ID
%token <tokval> TOK_HOST

%token <tokval> TOK_ITERATE
%token <tokval> TOK_LARGE
%token <tokval> TOK_LATERAL
%token <tokval> TOK_LOCALTIME

%token <tokval> TOK_LOCALTIMESTAMP
%token <tokval> TOK_LOCATOR
%token <tokval> TOK_MAP
%token <tokval> TOK_NCLOB

%token <tokval> TOK_ORDINALITY
%token <tokval> TOK_POSTFIX

 //%token <tokval> TOK_PREFIX
%token <tokval> TOK_READS
%token <tokval> TOK_ROLLUP
%token <tokval> TOK_SCOPE

%token <tokval> TOK_SPECIFIC
%token <tokval> TOK_SPECIFICTYPE
%token <tokval> TOK_START
%token <tokval> TOK_STATE

%token <tokval> TOK_TERMINATE
%token <tokval> TOK_THAN
%token <tokval> TOK_TREAT
%token <tokval> TOK_UNNEST
%token <tokval> TOK_EXTENT
%token <tokval> TOK_MAXEXTENTS
%token <tokval> TOK_UID
%token <tokval> TOK_DISK
%token <tokval> TOK_POOL

%token <tokval> TOK_MTS

%token <tokval> TOK_CHECKSUM
%token <tokval> TOK_FALLBACK
%token <tokval> TOK_PROTECTED
%token <tokval> TOK_PROTECTION
%token <tokval> TOK_FREESPACE
%token <tokval> TOK_DUAL
%token <tokval> TOK_JOURNAL
%token <tokval> TOK_FORMAT
%token <tokval> TOK_CASESPECIFIC
%token <tokval> TOK_NOT_CASESPECIFIC
%token <tokval> TOK_FIXED

//
// Any tokens appended to the foregoing list likely need to be added to
// the "nonreserved_word" or "nonreserved_func_word" production at the 
// end of this file -- see comments there!

/* ',' has lower precedence than other operators,
 * that's why it comes FIRST in the following list
 */
%right ','
%left TOK_UNION TOK_INTERSECT TOK_EXCEPT
%left TOK_JOIN TOK_CROSS TOK_INNER TOK_NATURAL TOK_FULL TOK_LEFT TOK_RIGHT TOK_UNION_JOIN
%left TOK_ON
%left '>' '=' '<' TOK_GREATER_EQUAL TOK_LESS_EQUAL TOK_NOT_EQUAL
%left TOK_AND
%left '+' '-'
%left '*' '/'
%left '.'


%union
{
// This provides a way to exclude the union for modules which need the
// token defines, but do not want the union and all the references
// which come with it.
//
#ifdef INCLUDE_UNION
  Int32               	     	tokval;
  TokvalPlusYYText		tokval_plus_yytext;
  NAString             	     	*stringval;
  NAWString             	*wstringval;
  StringvalWithCharSet		stringval_with_charset;

  action               		*actn_ptr;
  TransMode::AccessType         accesstype;
  ComAnsiNameSpace              nameSpaceEnum;
  ComColumnOrdering 	     	columnOrderingEnum;
  ComCreateViewBehavior		createViewBehaviorEnum;
  ComDropBehavior   	     	dropBehaviorEnum;
  ComRegisterBehavior           registerBehaviorEnum;
  ComRoutineType                routineTypeEnum;
  ComUnregisterBehavior         unregisterBehaviorEnum;
  ComLevels                     levelEnum;
  ComOperation                  iudOp;
  ComObjectName                 *comObjectName;
  ComObjectType                 objectTypeEnum;
  ComPartitioningScheme         partitionType;
  ComParamDirection             routineParamMode;
  ComRoutineExecutionMode       routineExecutionMode;
  ComRoutinePassThroughInputType passThroughInputType;
  ComAuthenticationType         authTypeEnum;
  ComRCMatchOption  	     	matchTypeEnum;
  ComSchemaClass                schemaClassEnum;
  ComUnits          	     	fileAttrSizeUnitEnum;
  ComTableFeature		tableFeatureEnum;
  CorrName	       	     	*corrName;
  DatetimeQualifier             *datetimeQualifier;
  DescTypeList     		*descTypeList;
  Describe::Format              describeType;
  Describe::ShowcontrolOption   showcontrolEnum;
  designation          		*dsgtn;
  ElemDDLConstraint 		*pElemDDLConstraint;
  ElemDDLConstraintRI 		*pElemDDLConstraintRI;
  ElemDDLConstraintUnique 	*pElemDDLConstraintUnique;
  ElemDDLNode      	     	*pElemDDL;
  ElemDDLParamName              *pElemDDLParamName;
  ElemDDLPartition::optionEnum	partitionOptionEnum;
  ElemDDLSchemaName 		*pElemDDLSchemaName;
  CharInfo::CharSet	        charSetVal;
  CharInfo::Collation		collationVal;
  CollationAndCoercibility	collationAndCoercibility;
  CollationInfo::CollationType	CollationType;
  CollationInfo::SortDirection	SortDirection;
  TableTokens                  *tableTokens;
  ExprNode                      *exprnode;
  ExprNodePtrList               *exprnodeptrs;
  HVArgType      		*hvArgtype;
  HVArgTypeLookup      		*hvArgtypeLookup;
  Insert::InsertType            insertType;
  IntervalQualifier             *intervalQualifier;
  ItemExpr             		*item;
  ItemExprList        		*itemList;
  Lng32              	     	longint;
  Int64                         int64;
  LockMode                      lockmode;
  ForUpdateSpec			*forUpdateSpec;
  NABoolean         	     	boolean;
  NAType               		*na_type;
  OldNewNames                   *OldNewPtr;
  OperatorTypeEnum  	     	operator_type;
  PairOfUnsigned                *pairPtr;
  PartitionClause               *partitionClause;
  QualifiedName                 *pQualName;
  rec_datetime_field            datetimeField;
  RelExpr              		*relx;
  Scan                          *scan;
  double              		     doubleVal;
  Hint              		    *hint;
  HbaseAccessOptions          *hbaseAccessOptions;
  RelExpr::AtomicityType        atomicityType;
  SchemaName                    *pSchemaName;
  SequenceOfLong                *longSeq;
  ShortStringSequence  		*strSeq;
  SQLDESC_ITEM_ID             	descItemId;
  SQLDIAG_COND_INFO_ITEM_ID  	condInfoItemId;
  SQLDIAG_STMT_INFO_ITEM_ID   	stmtInfoItemId;
  StaticDescItem   		*staticDescItem;
  StmtDDLNode      	     	*pStmtDDL;
  StmtDDLCreateTrigger 	     	*pStmtDDLCreateTrigger;
  enum TableTokens::TableOptions tableLoadAttrEnum;
  enum TransMode::AccessMode	transAccessMode;
  enum TransMode::IsolationLevel isolation;
  StmtNode             		*stmt_ptr;
  //++ MV
  ComMVRefreshType              refreshType;    
  ComMVStatus			mvStatus;
  enum StmtDDLAlterMvRGroup::alterMvGroupType MVRGAlterActionType; 
  ComRangeLogType		rangelogType;
  ComMvsAllowed			mvsAllowedType;
  ComMvAuditType		mvAuditType;
  MvInitializationType          mvInitType;
  enum StmtDDLCommentOn::COMMENT_ON_TYPES  commentOnEnum;
	
  // internal refresh OZ_REFRESH 

  PipelineDefPtrList		*pPipelineDefPtrList;
  PipelineDef			*pPipelineDef;
  QualNamePtrList		*pQualifiedNamePtrList;
  NRowsClause			*pOptionalNRowsClause;
  PipelineClause		*pPipelineClause;
  DeltaDefinitionPtrList	*pDeltaDefinitionPtrList;
  DeltaDefinition		*pDeltaDefinition;
  IncrementalRefreshOption	*pIncrementalRefreshOption;
  RecomputeRefreshOption	*pRecomputeRefreshOption;

  DeltaOptions			*pDeltaOptions;
  DeltaDefLogs			*pDeltaDefLogs;  
  DeltaDefRangeLog		*pDeltaDefRangeLog; 
  DeltaDefIUDLog		*pDeltaDefIUDLog;
  IUDStatistics			*pIUDStatistics;
  IntegerList			*pIntegerList;
  ConstStringList               *pConstStringList;

  //-- MV
  StmtOrCursTag       		*stmt_or_curs;
  UInt32          	     	 uint;
  unsigned short    	     	 usmallint;
  BiRelat			*pBiRelat;

  NAList<PivotGroup::PivotOption*> * pivotOptionsList;
  PivotGroup::PivotOption * pivotOption;

  NAList<ExeUtilMaintainObject::MaintainObjectOption*> * maintainObjectOptionsList;
  ExeUtilMaintainObject::MaintainObjectOption * maintainObjectOption;

  NAList<ExeUtilAQR::AQROption*> * aqrOptionsList;
  ExeUtilAQR::AQROption * aqrOption;

  NAList<ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*> * hBaseBulkLoadOptionsList;
  ExeUtilHBaseBulkLoad::HBaseBulkLoadOption * hBaseBulkLoadOption;

  NAList<UnloadOption*> * hbbUnloadOptionsList;
  UnloadOption * hbbUnloadOption;

  ParTriggerScopeType    parTriggerScopeType;
  ExtractSource::ExtractType extractType;

  PtrPlaceHolder                *ptr_placeholder;
  ParAuxCharLenSpec             *pCharLenSpec;

  NAList<HbaseCreateOption*> * hbaseOptionsList;
  HbaseCreateOption * hbaseOption;

  NAList<HbaseColumnCreate::HbaseColumnCreateOptions *> * hbaseColumnCreateOptionsList;
  HbaseColumnCreate::HbaseColumnCreateOptions *hbaseColumnCreateOptions;


#endif   // INCLUDE_UNION
}

%type <stmt_ptr>  	     starting_production
%type <stmt_ptr>  	     starting_production2
%type <forUpdateSpec>        for_update_spec
%type <iudOp>                iud_event   
%type <boolean>              before_action_orientation //( Default/FALSE = ROW)
%type <boolean>              after_action_orientation // ( Def/TRUE =STATEMENT)
%type <OldNewPtr>            referencing_clause 
%type <item>                 triggered_before_action
%type <relx>                 triggered_after_action
%type <boolean>              enable_status
%type <boolean>              optional_all_of
%type <item>                 triggerred_when_clause
%type <itemList>      	     trigger_set_clause_list
%type <item>      	     trigger_set_clause
%type <refreshType>		  refresh_type
%type <pElemDDL>  		  create_mv_attribute_table_lists
%type <pElemDDL>  		  create_mv_one_attribute_table_list
%type <pElemDDL>  		  ignore_changes_on_table_list
%type <mvInitType>	          mv_initialization_clause
%type <boolean>			  optional_query_rewrite
%type <pElemDDL>  		  optional_create_mv_file_options
// table attributes
%type <pElemDDL>  		  file_attribute_rangelog_clause	
%type <rangelogType>  		  range_log_type 
%type <pElemDDL>  		  file_attribute_lockonrefresh_clause 
%type <pElemDDL>  		  file_attribute_insertlog_clause	
%type <pElemDDL>  		  file_attribute_mvs_allowed_clause	
%type <mvsAllowedType>		  mvs_allowed_type 
// mv attributes
%type <pElemDDL>  		  mv_file_attribute_clause
%type <tokval>			  mv_file_attribute_keyword
%type <pElemDDL>  		  mv_file_attribute_list
%type <pElemDDL>  		  mv_file_attribute
%type <mvAuditType>		  mv_audit_type
// for general use
%type <pElemDDL>  		  qual_name_list 
%type <pElemDDL>  		  qual_name
// MVGROUPS
%type <pStmtDDL>  		  create_mvrgroup_statement  
%type <pStmtDDL>  		  drop_mvrgroup_statement  
%type <pStmtDDL>		  alter_mv_refresh_group_statement 
%type <MVRGAlterActionType>	  mv_group_alter_action_type
%type <pQualName>		  mv_group_name_to_alter
%type <pElemDDL>		  mv_name_list
%type <pElemDDL>		  mv_name_node
// INTERANL REFRESH OZ_REFRESH
%type <relx>			  internal_refresh_command
%type <relx>			  internal_refresh_options
%type <pQualName>		  internal_refresh_mv_name
%type <pRecomputeRefreshOption>	  recompute_refresh_options
%type <pIncrementalRefreshOption> incremental_refresh_options
%type <pDeltaDefinitionPtrList>	  delta_definition_list
%type <pDeltaDefinition>	  delta_definition_node
%type <uint>			  begin_epoch
%type <uint>			  end_epoch
%type <pDeltaOptions>		  delta_options 
%type <pDeltaDefLogs>		  delta_def_logs
%type <pDeltaDefRangeLog>	  delta_def_range_log
%type <pDeltaDefIUDLog>		  delta_def_iud_log
%type <pIUDStatistics>		  iud_statistics_rows 
%type <uint>			  num_inserted 
%type <uint>			  num_deleted 
%type <uint>			  num_updated 
%type <pIntegerList>		  optional_update_collumns
%type <pIntegerList>		  columns_num_list
%type <pOptionalNRowsClause>	  optional_nrows_clause
%type <uint>			  phase_num
%type <item>			  optional_catchup
%type <pPipelineClause>		  optional_pipeline_clause
%type <pPipelineClause>		  pipeline_clause
%type <pPipelineDefPtrList>	  pipeline_def_list
%type <pPipelineDef>		  pipeline_def
%type <pQualifiedNamePtrList>	  pipeline_mv_name_list
%type <pQualName>	          pipeline_mv_name_node

// MVLOG
%type <relx>			  mvlog_command
%type <tokval>			  mvlog_keywords 
%type <pQualName>		  mvlog_table_name
%type <item>              mvlog_values_list

// IUD
%type <uint>                      no_check_log
%type <boolean>			  no_rollback
%type <boolean>			  ignore_triggers

// DIRECTEDBY comparison operator
%type <pIntegerList>		  direction_vector_comma_list
%type <pIntegerList>		  direction_vector
%type <tokval>			  direction_literal

//-- MV
%type <stmt_ptr>             open_cursor
%type <dsgtn>                extended_input_designation
%type <dsgtn>                using_descriptor
%type <dsgtn>                extended_output_designation
%type <dsgtn>                into_descriptor
%type <stmt_ptr>             fetch_cursor
%type <stmt_ptr>             dynamic_prepare
%type <stmt_ptr>             dynamic_execute
%type <stmt_ptr>             execute_immediate
%type <stmt_ptr>             alloc_desc_statement
%type <stmt_ptr>             dealloc_stmt_statement
%type <stmt_ptr>             dealloc_desc_statement
%type <longSeq>              set_info_item_list
%type <longint>              set_info_item
%type <longSeq>              get_info_item_list
%type <longint>              get_info_item
%type <longint>              info_item_name
%type <longSeq>              cond_info_item_list
%type <longint>              cond_info_item
%type <longint>              cond_info_item_name
%type <longSeq>              stmt_info_item_list
%type <longint>              stmt_info_item_name
%type <longint>              stmt_info_item
%type <longint>              simple_value_spec
%type <stmt_ptr>             get_desccount_statement
%type <stmt_ptr>             get_rowsetsize_statement
%type <stmt_ptr>             get_descitem_statement
%type <stmt_ptr>             set_desccount_statement
%type <stmt_ptr>             set_rowsetsize_statement
%type <stmt_ptr>             set_descitem_statement
%type <stmt_ptr>             get_stmtdiags_statement
%type <stmt_ptr>             get_conddiags_statement
%type <stmt_ptr>             close_statement
%type <stmt_ptr>             whenever_statement
%type <uint>                 whenever_condition
%type <actn_ptr>             whenever_action
%type <stmt_ptr>             describe_statement
%type <stringval>            describe_target
%type <uint>                 output_or_input
%type <uint>                 output_hostvar_list
%type <uint>                 input_hostvar_list
%type <boolean>              global_hint
%type <boolean>              set_quantifier
%type <tokval>               firstn_sorted
%type <item>                 sort_spec_list
%type <item>                 sort_spec
%type <item>                 order_by_clause
%type <item>                 order_by_clause_non_empty
%type <stmt_ptr>             declare_static_cursor
%type <relx>                 cursor_spec
%type <relx>		     query_exp_for_cursor
%type <stmt_ptr>             declare_dynamic_cursor
%type <stringval>            entity_name
%type <item>	             entity_name_as_item
%type <boolean>              scope_spec
%type <stmt_ptr>             alloc_static_desc_stmt
%type <uint>                 input_or_output
%type <stmt_or_curs>         for_stmt_or_curs
%type <staticDescItem>       host_var_type_item
%type <descTypeList>         host_var_type_list
%type <stmt_ptr>             procedure_stmt
%type <hvArgtype>            proc_arg_decl
%type <hvArgtypeLookup>      proc_arg_decls
%type <uint>                 argList_establishment
%type <stmt_ptr>             module_statement
%type <stmt_ptr> 		     source_file_statement
%type <stmt_ptr>             module_timestamp
%type <item>	  	     any_expression
%type <stmt_ptr>  	     sql_statement
%type <item>      		literal
%type <item>      		literal_negatable
%type <item>                   numeric_literal
%type <item>                   numeric_literal_exact
%type <item>                   character_literal_sbyte
%type <item>                   boolean_literal
%type <stringval> 		literal_as_string
%type <stringval> 		character_string_literal
%type <stringval>		sbyte_string_literal
%type <wstringval> 		unicode_string_literal
%type <tokval>    		sign
%type <corrName>  		table_name
%type <corrName>		special_table_name
%type <corrName>  		actual_table_name
%type <corrName>  		actual_table_name2
%type <corrName>		exception_table_name
%type <stringval> 		identifier
%type <stringval> 		identifier_with_hat
%type <stringval> 		identifier_with_dollar
%type <strSeq>    		qualified_name
%type <strSeq>    		schema_name_ss
%type <strSeq>    		module_name
%type <strSeq>    		routine_action_name
%type <stringval> 		correlation_name
%type <relx>      		table_reference
%type <relx>  		        table_name_and_hint
%type <relx>  		        upd_stmt_w_acc_type_and_as_clause
%type <relx>  		        upd_stmt_w_acc_type_and_as_clause_col_list
%type <relx>  		        upd_stmt_w_acc_type_rtn_list_and_as_clause
%type <relx>  		        upd_stmt_w_acc_type_rtn_list_and_as_clause_col_list
%type <relx>  		        del_stmt_w_acc_type_and_as_clause
%type <relx>  		        del_stmt_w_acc_type_and_as_clause_col_list
%type <relx>  		        del_stmt_w_acc_type_rtn_list_and_as_clause
%type <relx>  		        del_stmt_w_acc_type_rtn_list_and_as_clause_col_list
%type <relx>  		        table_name_as_clause_and_hint
%type <relx>  		        table_name_as_clause_hint_and_col_list
%type <relx>  		        rel_subquery_and_as_clause
%type <relx>  		        rel_subquery_as_clause_and_col_list
%type <relx>                    with_clause
%type <relx>                    with_clause_elements
%type <relx>                    with_clause_element
%type <hint>      		optimizer_hint
%type <hint>      		hints
%type <hint>      		index_hints
%type <hint>      		ignore_ms4_hints
%type <hbaseAccessOptions>     hbase_access_options
%type <stringval>    	index_hint
%type <doubleVal>       number
%type <doubleVal>       selectivity_number
%type <doubleVal>       predicate_selectivity_hint

//QSTUFF
%type <relx>            table_as_stream
%type <relx>            table_as_stream_any
//QSTUFF
%type <relx>                    table_as_tmudf_function

%type <relx>      		table_as_procedure
%type <relx>      		joined_table
%type <relx>      		joined_table_needing_spec
%type <relx>      		joined_table_needing_spec2
%type <item>      		derived_column_list
%type <charSetVal>      	    character_set
%type <charSetVal>      	    CHAR_FUNC_character_set
%type <charSetVal>      	    char_set
%type <collationVal>    	    collate_clause
%type <collationAndCoercibility>    collation_option
%type <item>      		sort_or_group_key
%type <tokval>    		ordering_spec
%type <columnOrderingEnum>  	ddl_ordering_spec
%type <item>      		set_function_specification
%type <operator_type>		set_function_type
%type <operator_type>		running_func_type
%type <operator_type>		moving_func_type
%type <item>				sequence_func_specification
%type <item>				running_sequence_function
%type <item>                moving_sequence_function
%type <item>                offset_sequence_function
%type <item>                this_sequence_function
%type <item>                olap_sequence_function
%type <item>                opt_olap_part_clause
%type <item>                opt_olap_order_clause
%type <longint>             olap_rows_spec
%type <longint>             olap_prec_follow
%type <item>                            insert_value_expression
%type <item>      			value_expression
%type <item>      			value_expression_sans_collate
%type <item>      			value_expression_list
%type <item>      			value_expression_list_comma
%type <item>      			value_expression_list_paren
%type <item>      			value_expression_list_lr
%type <item>                list_of_values

// left recursion for insert statement values.
%type <item>	      		insert_value_expression_list
%type <item>	      		insert_value_expression_list_comma
%type <item>				insert_value_expression_list_paren
// left recursion for insert statement values.

%type <hbaseColumnCreateOptionsList>                hbase_column_create_list
%type <hbaseColumnCreateOptions>                hbase_column_create_value
%type <item>      			cast_specification
%type <item>      			value_function
%type <item>                    optional_round_scale
%type <item>                    math_function
%type <operator_type>           math_func_0_operand
%type <operator_type>           math_func_1_operand
%type <operator_type>           math_func_2_operands
%type <item>                    misc_function
%type <operator_type>           date_time_operand
%type <charSetVal>		optional_character_set
%type <charSetVal>		CHAR_FUNC_optional_character_set
%type <item>                    string_function
%type <item>      		trim_operands
%type <item>                    insert_obj_to_lob_function
%type <item>                    update_obj_to_lob_function
%type <item>                    select_lob_to_obj_function
%type <item>                    insert_empty_blob_clob
%type <stringval>    		date_format
%type <tokval>    		trim_spec
%type <na_type>   		proc_arg_data_type
%type <na_type>   		data_type
%type <na_type>   		Set_Cast_Global_False_and_data_type
%type <na_type>   		routine_predef_type
%type <na_type>   		predef_type
%type <na_type>   		predefined_type
%type <na_type>   		date_time_type
%type <na_type>   		interval_type
%type <na_type>   		int_type
%type <na_type>   		non_int_type
%type <na_type>   		numeric_type
%type <tokval>                 numeric_type_token
%type <na_type>   		pic_type
%type <na_type>   		string_type
%type <na_type>                 blob_type
%type <na_type>                 boolean_type
%type <na_type>   		float_type
%type <na_type>   		proc_arg_float_type
%type <longint>                 pic_tail
%type <intervalQualifier>	interval_qualifier
%type <intervalQualifier>	single_datetime_field
%type <intervalQualifier>	start_field
%type <intervalQualifier>	end_field
%type <intervalQualifier>       fraction_only_interval
%type <datetimeField>		non_second_datetime_field
%type <datetimeField>		new_non_second_datetime_field
%type <datetimeField>		datetime_field
%type <datetimeQualifier>       datetime_qualifier           //For MP Datetime
%type <datetimeQualifier>       datetime_start_field         //For MP Datetime
%type <datetimeQualifier>       datetime_end_field           //For MP Datetime
%type <datetimeQualifier>       fraction_only_datetime       //For MP Datetime
%type <datetimeQualifier>       datetime_fraction_field      //For MP Datetime
%type <uint>                    interval_fraction_field
%type <item>	  	  datetime_keywords
%type <item>	  	  timestamp_keywords
%type <uint>      		unsigned_integer
%type <usmallint> 		unsigned_smallint
%type <uint>      		ts_left_unsigned_right
%type <uint>      		left_unsigned_right
%type <pCharLenSpec>		toggled_optional_left_charlen_right
%type <uint>      		optional_left_charlen_right
%type <longint>                 blob_optional_left_len_right
%type <longint>                 clob_optional_left_len_right
%type <pCharLenSpec>		new_optional_left_charlen_right
%type <tokval>      		nchar     
%type <tokval>      		nchar_varying
%type <tokval>      		optional_charlen_unit  
%type <tokval>			new_optional_charlen_unit  
%type <tokval>			tok_char_or_character
%type <tokval>			tok_char_or_character_or_byte
%type <uint>      		left_charlen_right 
%type <pCharLenSpec>		new_left_charlen_right
%type <uint>      		left_unsigned  
%type <item>      		left_largeint_right
%type <pairPtr>      		left_uint_uint_right
%type <item>      		term
%type <item>      		factor
%type <item>      		factor1
%type <item>      		primary
%type <item>      		dynamic_parameter
%type <item>                    dynamic_parameter_array
%type <item>      		internal_arith_placeholder
%type <item>      		internal_bool_placeholder
%type <relx>	  		table_value_constructor
%type <relx>      		table_expression
%type <relx>      		from_clause
%type <item>      		join_specification
%type <item>      		join_condition
%type <item>      		where_clause
%type <uint>                    multi_commit_size
%type <item>      		group_by_clause_non_empty
%type <item>      		having_clause_non_empty
%type <item>      		qualify_clause
%type <item>      		sort_by_key
%type <item>      		sort_by_key_list
%type <item>      		sort_by_value_expression
%type <item>      		sort_by_value_expression_list
%type <item>      		sort_by_clause
%type <item>      		sequence_by_clause
%type <relx>      		transpose_clause
%type <relx>      		transpose_clause_list
%type <relx>      		cond_transpose_clause_list
%type <item>      		transpose_list
%type <item>      		transpose_set
%type <item>      		transpose_item_list
%type <item>      		transpose_value
%type <item>      		transpose_col_list
%type <relx>      		query_specification
%type <relx>      		query_spec_body
%type <item>      		query_select_list //++ MV
%type <item>      		select_list
// QSTUFF
%type <item>      		return_list
// QSTUFF
%type <item>      		select_list_item
%type <item>      		derived_column
%type <stringval> 		as_clause
%type <relx>      		interactive_query_expression
%type <relx>			dml_query
%type <relx>			dml_statement
%type <relx>      		query_expression
%type <relx>      		query_term
%type <relx>			query_primary
%type <relx>      		non_join_query_expression
%type <relx>      		non_join_query_term
%type <relx>      		non_join_query_primary
%type <relx>      		simple_table
%type <relx>      		rel_subquery
%type <item>      		row_subquery
%type <item>      		predicate
%type <item>                    dml_column_reference
%type <item>      		null_predicate
%type <boolean>                 scan_key_hint
%type <pBiRelat>      		comparison_predicate
%type <item>      		directed_comparison_predicate
%type <item>                    key_comparison_predicate
%type <item>                    partitioning_key_type
%type <corrName>                pkey_access_path
%type <corrName>                ckey_access_path
%type <operator_type>  		comparison_operator
%type <tokval>  		between_operator
%type <tokval>    		quantifier
%type <tokval>    		select_token
%type <item>      		exists_predicate
%type <item>      		between_predicate
%type <item>      		in_predicate
%type <item>      		like_predicate
%type <tokval>	  		not_like
%type <item>      		quantified_predicate
%type <item>      		search_condition
%type <item>      		boolean_term
%type <item>      		boolean_factor
%type <item>      		boolean_test
%type <tokval>    		truth_value
%type <item>      		boolean_primary
%type <relx>      		Rest_Of_insert_statement
%type <relx>      		Rest_Of_insert_wo_INTO_statement
%type <insertType>     		front_of_insert
%type <insertType>     		Front_Of_Insert
%type <insertType>                  front_of_insert_with_rwrs
//%type <corrName>  		optional_exception_table_name
%type <atomicityType>           atomic_clause
%type <atomicityType>           opt_atomic_clause
%type <item>      		column_list
%type <tokval>    		group_list
%type <tokval>    		id_group_list
%type <tokval>    		id_group
%type <tokval>    		id_list
%type <tokval>    		showstats_opts
%type <relx>      	        update_statement_searched
%type <relx>      		update_statement_searched_body
%type <scan>                    update_statement_target_table
%type <relx>                    merge_statement
// QSTUFF
%type <item>      		set_update_list
%type <item>      		set_update_commit_list
%type <item>      		set_update_rollback_list
%type <item>      		set_delete_list
%type <item>      		set_delete_rollback_list
// QSTUFF
%type <item>      		set_clause
%type <relx>      		delete_statement
%type <relx>      		delete_start_tokens
%type <relx>      		control_statement
%type <relx>            osim_statement
%type <boolean>   		optional_osim_force
%type <relx>      		set_statement  
%type <relx>      		set_table_statement  
%type <boolean>                 optional_stream
%type <corrName>  		set_table_name
%type <item>                    timeout_value
%type <relx>      		set_session_default_statement  

%type <relx>      		declare_or_set_cqd
%type <relx>                    transaction_statement
%type <boolean>   		on_off
%type <boolean>   		on_or_empty
// but cannot be empty. (i.e) must specify.
%type <longint>			autoabort_interval
%type <longint>                 maxruntime_interval
%type <tokval>			hour_hours
%type <tokval>			minute_minutes
%type <tokval>			second_seconds
%type <relx>                    lock_unlock_statement
%type <relx>                    lock_statement
%type <relx>                    unlock_statement
%type <boolean>                 lock_index_option
%type <lockmode>                lock_mode
%type <lockmode>                optional_lock_mode
%type <tokval>			query_shape_options
%type <exprnode>		query_shape_control
%type <relx>			query_default_control
%type <relx>			session_control
%type <relx>			table_control
%type <stringval>		default_identifier
%type <stringval>               table_control_identifier
%type <stringval>		optional_control_identifier
%type <stringval>               optional_options
%type <exprnodeptrs>		shape_arg_list
%type <stringval>		shape_identifier
%type <tokval>			token_shape_identifier
%type <relx>                    show_statement
%type <longint>                 optional_showddl_schema_options_list
%type <longint>                 optional_showddl_object_options_list
%type <longint>                 optional_showddl_role_option
%type <corrName>                optional_showddl_action_name_clause
%type <longint>                 showddl_options_list
%type <longint>                 showddl_options
%type <describeType>            showcontrol_type
//%type <uint>      		returning_clause
%type <item>      		input_hostvar_expression
%type <item>      		hostvar_expression
%type <item>      		simple_host_variable
%type <item>      		hostvar_and_prototype
%type <item>      		param_and_prototype
%type <boolean>			mvs_umd_option
%type <boolean>   		upshift_flag
%type <boolean>			notcasespecific_option
%type <boolean>			pic_notcasespecific_option
%type <boolean>			character_literal_notcasespecific_option
%type <boolean>   		signed_option
%type <stringval> 		regular_identifier
%type <stringval> 		regular_identifier_not_builtin
%type <comObjectName>           user_defined_function_name
%type <objectTypeEnum>          givable_object_type
%type <tokval>                  nonreserved_word
%type <tokval>                  nonreserved_word_for_explain
%type <tokval>                  nonreserved_func_word
%type <tokval>                  MP_nonreserved_word
%type <tokval>                  MP_nonreserved_func_word
%type <tokval>                  nonreserved_datatype
%type <stringval> 		column_name
%type <pElemDDL>  		column_name_spec
%type <pQualName> 		constraint_name
%type <pElemDDL>  		constraint_name_list
%type <pElemDDL>  		constraint_simple_name
%type <boolean>   		constraint_setting
%type <pSchemaName> 		schema_name
%type <pElemDDLSchemaName>	schema_name_clause
%type <schemaClassEnum>         schema_class
%type <stringval> 		schema_authorization_identifier
%type <stringval> 		authorization_identifier
%type <stringval> 		authorization_identifier_or_public
%type <pElemDDL>  		authorization_identifier_list
%type <stringval>               as_auth_clause
%type <pElemDDL>                optional_schema_clause
%type <stringval>               optional_as_auth_clause
%type <stringval> 		external_user_identifier
%type <tokval>	 		user_or_role
%type <tokval>                  procedure_or_function
%type <pStmtDDL>  		sql_schema_statement
%type <pStmtDDL>  		sql_schema_definition_statement
%type <pStmtDDL>  		sql_schema_manipulation_statement
%type <pStmtDDL>  		sql_schema_statement_prologue
%type <pStmtDDL>  		schema_definition
%type <uint>   	        	schema_or_database
%type <pStmtDDL>  		routine_definition
%type <pStmtDDL>                alter_function_statement
%type <pElemDDL>                routine_params_list
%type <pElemDDL>                routine_params_list_clause
%type <tokval>                  return_tokens
%type <pElemDDL>                optional_routine_returns_clause
%type <pElemDDL>                routine_returns_clause
%type <pElemDDL>                optional_passthrough_inputs_clause
%type <pElemDDL>                passthrough_inputs_clause
%type <pElemDDL>                optional_add_passthrough_inputs_clause
%type <pElemDDL>                optional_alter_passthrough_inputs_clause
%type <pElemDDL>                alter_passthrough_inputs_clause
%type <tokval>                  passthrough_inputs_clause_start_tokens
%type <routineTypeEnum>         create_scalar_function_tokens
%type <routineTypeEnum>         table_mapping_function_tokens
%type <routineTypeEnum>         universal_function_tokens
%type <routineTypeEnum>         drop_routine_type_tokens
%type <pElemDDL>                universal_function_param
%type <pElemDDL>                universal_function_param_list
%type <pElemDDL>                universal_function_param_clause
%type <pElemDDL>                passthrough_params_list
%type <pElemDDL>                passthrough_params
%type <pElemDDL>                passthrough_param
%type <pElemDDL>                alter_passthrough_params_list
%type <pElemDDL>                alter_passthrough_params
%type <pElemDDL>                alter_passthrough_param
%type <uint>                    passthrough_param_position
%type <passThroughInputType>    optional_passthrough_input_type
%type <pElemDDL>                passthrough_input_value
%type <routineExecutionMode>    routine_execution_mode
%type <pElemDDL>                routine_params
%type <pElemDDL>                routine_param
%type <pElemDDL>                routine_return_param
%type <pElemDDL>                routine_return_param_optional_not_null
%type <pElemDDL>                routine_return_param_list
%type <pElemDDL>                routine_return_params
%type <longint>                 extent_page
%type <longint>                 signed_extent_page
%type <tokval>                  optional_page
%type <pElemDDLParamName>       optional_param_name
%type <pElemDDLParamName>       param_name
%type <routineParamMode>        optional_param_mode
%type <routineParamMode>        optional_return_param_mode
%type <pElemDDL>                optional_library_clientname
%type <pElemDDL>                optional_library_clientfilename
/*
%type <pElemDDL>                optional_library_attribute_list
%type <pElemDDL>                library_attribute_list
%type <pElemDDL>                library_attribute
*/
%type <pElemDDL>                optional_create_routine_attribute_list
%type <pElemDDL>                create_routine_attribute_list
%type <pElemDDL>                create_routine_attribute
%type <pElemDDL>                optional_create_function_attribute_list
%type <pElemDDL>                create_function_attribute_list
%type <pElemDDL>                create_function_attribute
%type <pElemDDL>                create_function_udf_attribute
%type <pElemDDL>                create_function_udr_attribute
%type <pElemDDL>                udr_external_name_clause
%type <stringval>               std_char_string_literal
%type <pElemDDL>                udr_external_path_clause 
%type <pElemDDL>                udr_language_clause 
%type <pElemDDL>                udr_library_clause 
%type <pElemDDL>                udr_param_style_clause
%type <pElemDDL>                routine_parameter_style_sql
%type <pElemDDL>                routine_parameter_style_sqlrow
%type <pElemDDL>                udr_access_clause
%type <pElemDDL>                udr_result_sets_clause 
%type <pElemDDL>                udr_deterministic_clause 
%type <pElemDDL>                udr_isolate_clause 
%type <pElemDDL>                udr_transaction_clause
%type <pElemDDL>                udr_external_security_clause
%type <pElemDDL>                udr_external_security_invoker
%type <pElemDDL>                udr_external_security_definer
%type <pElemDDL>                udf_param_style_clause
%type <pElemDDL>                udf_special_attributes_clause
%type <stringval>               udf_special_attributes
%type <pElemDDL>                udf_final_call_clause
%type <pElemDDL>                udf_state_area_clause
%type <pElemDDL>                udf_parallelism_clause
%type <pElemDDL>                udf_execution_mode_clause
%type <pElemDDL>                udf_version_tag_clause
%type <pElemDDL>                udf_optimization_hint_clause
%type <pElemDDL>                udf_number_of_unique_values_clause
%type <tokval>                  number_of_unique_values_tokens
%type <pElemDDL>                number_of_unique_output_values
%type <itemList>                unique_output_value_list
%type <item>                    unique_output_value
%type <tokval>                  udf_optimization_stage
%type <tokval>                  udf_resource_kind
%type <longint>                 udf_cost
%type <pStmtDDL>  		table_definition
%type <pStmtDDL>  		view_definition
%type <pStmtDDL>  		mv_definition 
%type <boolean>                 create_mv_keywords
%type <createViewBehaviorEnum>  create_view_keywords
%type <pStmtDDL>  		trigger_definition
%type <pStmtDDL>  		before_trigger_definition
%type <pStmtDDL>  		after_trigger_definition
%type <pStmtDDLCreateTrigger>	before_trigger_prefix
%type <pStmtDDLCreateTrigger>	after_trigger_prefix
%type <pQualName>               routine_action_qualified_name
%type <pQualName>               ddl_qualified_name
%type <pQualName>               optional_ghost_ddl_qualified_name
%type <pQualName>               volatile_ddl_qualified_name
%type <pElemDDL>                optional_view_column_list
%type <pElemDDL>                optional_ignored_table_options
%type <pElemDDL>                optional_ignored_table_option
%type <pElemDDL>                optional_ignored_prefix
%type <pElemDDL>                optional_ignored_prefix2
%type <pElemDDL>                optional_ignored_suffix
%type <pElemDDL>                view_column_list
%type <pElemDDL>                view_column_def_list
%type <pElemDDL>                view_column_definition
%type <pElemDDL>                optional_with_check_option
%type <pElemDDL>                with_check_option
%type <levelEnum>               optional_levels_clause
%type <levelEnum>               levels_clause
%type <pStmtDDL>                comment_on_statement
%type <commentOnEnum>           comment_on_object_types

%type <stringval>               optional_component_detail_clause
%type <int64>                   optional_lob_unit
%type <stringval>               component_privilege_name
%type <stringval>               component_name
%type <stringval>               identifier_with_7_bit_ascii_chars_only
%type <stringval>               regular_identifier_with_7_bit_ascii_chars_only
%type <stringval>               component_str_lit
%type <stringval>               priv_abbrev_str_lit
%type <pConstStringList>        component_privilege_name_list
%type <tokval>                  privilege_or_privileges_token
%type <pStmtDDL>                alter_user_statement
%type <pStmtDDL>                alter_library_statement
%type <pStmtDDL>                create_library_stmt
%type <pStmtDDL>                drop_library_statement
%type <boolean>                 optional_system
%type <pStmtDDL>		give_statement
%type <pStmtDDL>                grant_component_privilege_stmt
%type <pStmtDDL>  		grant_statement
%type <pStmtDDL>  		grant_role_statement
%type <pStmtDDL>  		revoke_role_statement
%type <boolean>                 optional_with_admin_option
%type <boolean>                 optional_granted
 /*%type <boolean>                 admin_option_for*/
%type <pElemDDL>                optional_granted_by
%type <pStmtDDL>                create_component_privilege_stmt
%type <pStmtDDL>                drop_component_privilege_stmt
%type <pStmtDDL>                register_component_statement
%type <pStmtDDL>                register_user_statement
%type <pStmtDDL>                register_hive_statement
%type <pStmtDDL>                register_hbase_statement
%type <boolean>                 optional_internal_clause
%type <pStmtDDL>                unregister_component_statement
%type <pStmtDDL>		unregister_user_statement
%type <pStmtDDL>		unregister_hive_statement
%type <pStmtDDL>		unregister_hbase_statement
%type <pElemDDL>  		privileges
%type <pElemDDL>  		privilege_action_list
%type <pElemDDL>  		privilege_action
%type <pElemDDL>  		optional_privilege_column_list
%type <pElemDDL>  		privilege_column_list
%type <pElemDDL>  		optional_update_column_list 
%type <pQualName> 		ddl_object_name
%type <pQualName>               optional_action
%type <pElemDDL>  		grantee_list
%type <pElemDDL>  		grantee
%type <pElemDDL>  		optional_with_grant_option
%type <pElemDDL>  		with_grant_option
%type <pElemDDL>  	        optional_by_auth_identifier
%type <pStmtDDL>                create_role_statement
%type <pStmtDDL>                drop_role_statement
%type <pElemDDL>                optional_with_admin_clause
%type <pElemDDL>                with_admin_clause

%type <pStmtDDL>		grant_schema_statement

%type <pStmtDDL>		create_sequence_statement
%type <pStmtDDL>		alter_sequence_statement
%type <pStmtDDL>		drop_sequence_statement
%type <pStmtDDL>           cleanup_objects_statement
%type <boolean>               optional_cleanup_return_details

%type <pStmtDDL>  		catalog_definition
%type <pStmtDDL>  		catalog_definition2
%type <stringval>               catalog_name
%type <stringval>               sql_mx_catalog_name
%type <stringval>               sql_mp_catalog_name
%type <pElemDDL>                optional_create_catalog_attribute_list
%type <pElemDDL>                create_catalog_attribute_list
%type <pElemDDL>                create_catalog_attribute
%type <pStmtDDL>  		drop_schema_statement
%type <stringval>               nsk_node_name
%type <partitionOptionEnum>  	partition_add_drop_option
%type <pElemDDL>  		add_table_constraint_definition
%type <pStmtDDL>  		alter_table_column_clause
%type <pElemDDL>  		location_definition
%type <stringval>               guardian_volume_name
%type <partitionClause>         optional_special_table_loc_clause
%type <int64>                   optional_special_utility_open_clause
%type <boolean>                 optional_with_shared_access_clause
%type <stringval>               fully_expanded_guardian_loc_name
%type <stringval>               guardian_location_name
%type <stringval>               partition_name
%type <pElemDDL>  		location_list
%type <pElemDDL>  		source_location_list
%type <pElemDDL>  		dest_location_list
%type <pStmtDDL>  		alter_index_action
%type <pStmtDDL>  		alter_index_statement
%type <pStmtDDL>  		alter_trigger_statement
%type <pStmtDDL>  		alter_view_statement
//++ MV
%type <pStmtDDL>  		alter_mv_statement   
%type <pStmtDDL>  		alter_mv_body
%type <pStmtDDL>  		alter_mv_query_rewrite
%type <pStmtDDL>  		alter_mv_file_attribs
%type <pStmtDDL>  		alter_mv_mvfile_attribs
%type <pStmtDDL>                alter_mv_rename
%type <pStmtDDL>                alter_mv_attribute_table_lists
//-- MV

%type <pStmtDDL>		alter_audit_config_statement
%type <pStmtDDL>		alter_catalog_statement
%type <pStmtDDL>		alter_schema_statement
%type <pElemDDL>  		alter_table_move_clause
%type <pStmtDDL>  		alter_table_rename_clause
%type <pStmtDDL>                alter_table_enable_index_clause
%type <pStmtDDL>                alter_table_disable_index_clause
%type <uint>  		        alter_stored_descriptor_option
%type <boolean>   		optional_cascade
%type <boolean>                 optional_skip_view_check
%type <pStmtDDL>  		alter_table_add_column_clause
%type <pStmtDDL>  		alter_table_drop_column_clause
%type <pStmtDDL>  		alter_table_alter_column_clause //++ MV
%type <pStmtDDL>  		alter_table_alter_column_default_value 
%type <pStmtDDL>  		alter_table_alter_column_datatype
%type <pStmtDDL>  		alter_table_alter_column_set_sg_option 
%type <pStmtDDL>  		alter_table_alter_column_rename
%type <boolean>   		alter_column_type //++ MV
%type <pStmtDDL>  		alter_table_set_constraint_clause
%type <pStmtDDL>                alter_table_disable_constraint_clause
%type <pStmtDDL>                alter_table_enable_constraint_clause
%type <pStmtDDL>  		alter_table_action
%type <uint>   	        	alter_table_start_tokens
%type <uint>   	        	alter_view_start_tokens
%type <uint>   	        	alter_schema_start_tokens
%type <pStmtDDL>  		alter_table_statement
%type <boolean>                 optional_ghost
%type <pStmtDDL>  		revoke_schema_statement
%type <pStmtDDL>                revoke_component_privilege_stmt
%type <pStmtDDL>                alter_synonym_statement
%type <pStmtDDL>  		drop_table_statement
%type <uint>   	        	drop_table_start_tokens
%type <pStmtDDL>  		drop_trigger_statement
%type <pStmtDDL>  		drop_mv_statement
%type <pStmtDDL>  		drop_view_statement
%type <pStmtDDL>  		revoke_statement
%type <boolean>   		optional_grant_option_for
%type <boolean>   		grant_option_for
%type <pStmtDDL>  		drop_catalog_statement
%type <pStmtDDL>  		drop_index_statement
%type <pStmtDDL>  		drop_routine_statement
%type <pStmtDDL>  		initialize_sql_statement
%type <pElemDDL>                optional_register_user_list
%type <pElemDDL>                init_register_user_list
%type <pElemDDL>                init_register_user_element
%type <pElemDDL>                optional_create_role_list
%type <pElemDDL>                init_create_role_list
%type <pElemDDL>                init_create_role_element
%type <tokval>    		empty
%type <pElemDDL>  		table_definition_body
%type <pElemDDL>  		like_definition
%type <pElemDDL>  		optional_like_option_list
%type <pElemDDL>  		like_option_list
%type <pElemDDL>  		like_option
%type <corrName> 		source_table
%type <pElemDDL>  		table_element_list
%type <pElemDDL>  		table_elements
%type <pElemDDL>  		table_element
%type <pElemDDL>                external_table_definition
%type <pElemDDLConstraint>  	column_constraint
%type <pElemDDL>  		optional_loggable 
%type <pElemDDL>                optional_lobattrs
%type <pElemDDL>  		column_constraint_definition
%type <pElemDDL>  		heading_character_string_literal
%type <pElemDDL>  		heading
%type <pElemDDL>  		serialized
%type <pElemDDL>  		optional_compress_clause
%type <pElemDDL>  		compress_clause
%type <pElemDDL>  		table_constraint_definition
%type <pElemDDLConstraint>  	table_constraint
%type <pElemDDL>  		column_definition
%type <uint>      		        set_in_column_defn
%type <uint>      		        reset_in_column_defn
%type <pElemDDL>  		optional_column_attributes
%type <pElemDDL>  		column_attributes
%type <pElemDDL>  		column_attribute
%type <tokval>    		constraints_keyword
%type <pElemDDL>  		col_def_default_clause
%type <pElemDDL>  		col_def_default_clause_argument
%type <pElemDDL>                alter_col_default_clause_arg
%type <uint>      		sg_type
%type <boolean>                 sg_sign
%type <pElemDDL>  		sg_identity_option
%type <pElemDDL>  		sg_identity_function
%type <pElemDDL>  		sequence_generator_options
%type <pElemDDL>  		all_sequence_generator_options
%type <pElemDDL>  		sequence_generator_option
%type <pElemDDL>  		sequence_generator_option_list
%type <pElemDDL>  		start_with_option
%type <pElemDDL>  		increment_option
%type <pElemDDL>  		max_value_option
%type <pElemDDL>  		min_value_option
%type <pElemDDL>  		cache_option
%type <pElemDDL>  		cycle_option
%type <pElemDDL>  		reset_option
%type <pElemDDL>                   datatype_option
%type <item>      		datetime_value_function
%type <item>      		datetime_misc_function
%type <item>      		datetime_misc_function_used_as_default
%type <stringval>  		format_attributes
%type <pElemDDL>  		optional_constraint_attributes
%type <pElemDDL>  		constraint_attributes
%type <pElemDDL>  		constraint_attribute
%type <pElemDDL>  		constraint_attribute_droppable
%type <pElemDDL>  		constraint_attribute_enforced
%type <pQualName> 		constraint_name_definition
%type <pElemDDLConstraintUnique>  column_unique_specification
%type <pElemDDLConstraintUnique>  unique_constraint_specification
%type <pElemDDLConstraintUnique>  unique_specification
%type <pElemDDLConstraintRI>  	  references_specification
%type <matchTypeEnum>  		optional_ri_match_clause
%type <showcontrolEnum>  	optional_comma_match_clause
%type <matchTypeEnum>  		match_clause
%type <matchTypeEnum>  		match_type
%type <pElemDDL>  		referenced_table_and_columns
%type <pElemDDL>  		optional_referential_triggered_action
%type <pElemDDL>  		referential_triggered_actions
%type <pElemDDL>  		referential_triggered_action
%type <pElemDDL>  		update_rule
%type <pElemDDL>  		delete_rule
%type <pElemDDL>  		referential_action
%type <pElemDDLConstraint>  	unique_constraint_definition
%type <pElemDDL>  		unique_column_list
%type <pElemDDLConstraint>  	references_constraint_definition
%type <pElemDDL>  		referencing_columns
%type <pElemDDL>  		reference_column_list
%type <pElemDDL>  		column_name_list
%type <pElemDDL>  		column_reference_list
%type <pElemDDL>  		column_reference
%type <pElemDDLConstraint>  	check_constraint_definition
%type <tokval>                  check_constraint_starting_tokens
%type <pElemDDL>  		optional_create_table_attribute_list
%type <pElemDDL>  		create_table_attribute_list
%type <pElemDDL>  		create_table_attribute
%type <pElemDDL>  		file_attribute_clause
%type <pElemDDL>  		file_attribute
%type <pElemDDL>		partition_attribute
%type <pElemDDL>  		file_attribute_allocate_clause
%type <pElemDDL>  		file_attribute_audit_clause
%type <tokval>			file_attribute_keyword
%type <pElemDDL>  		file_attribute_audit_compress_clause
%type <pElemDDL>  		file_attribute_block_size_clause
%type <tokval>    		optional_block_size_unit
%type <pElemDDL>  		file_attribute_buffered_clause
%type <pElemDDL>  		file_attribute_clear_on_purge_clause
/*%type <pElemDDL>  		file_attribute_dcompress_clause*/
%type <pElemDDL>  		file_attribute_deallocate_clause
%type <pElemDDL>  		file_attribute_icompress_clause
%type <pElemDDL>  		file_attribute_list
%type <pElemDDL>                file_attribute_compression_clause
%type <pElemDDL>  		file_attribute_extent_clause
%type <pElemDDL>  		file_attribute_maxextent_clause
%type <pElemDDL>  		file_attribute_uid_clause
%type <pElemDDL>  		file_attribute_row_format_clause
%type <pElemDDL>  		file_attribute_default_col_fam
%type <pElemDDL>  		file_attribute_pos_clause
%type <pElemDDL>                attribute_num_rows_clause
%type <pElemDDL>                attribute_inmemory_options_clause
%type <pElemDDL>                file_attribute_no_label_update_clause
%type <pElemDDL>                file_attribute_owner_clause
%type <pElemDDL>		optional_location_clause
%type <pElemDDL>  		location_clause
%type <stringval>  		optional_partition_name_clause
%type <pElemDDL>  		optional_partition_attribute_list
%type <pElemDDL>  		partition_definition
%type <pElemDDL>  		partition_by_column_list
%type <pElemDDL>		partition_attribute_list
%type <pElemDDL>  		optional_partition_definition_body
%type <pElemDDL>  		partition_definition_body
%type <pElemDDL>  		partition_list
%type <partitionType>           partition_type
%type <pElemDDL>  		range_partition
%type <pElemDDL>  		range_partition_list
%type <pElemDDL>  		system_partition_list
%type <pElemDDL>  		system_partition
%type <pElemDDL>  		file_attribute_extent
%type <pElemDDL>  		file_attribute_maxextent
%type <item>      		null_constant
%type <pElemDDL>  		key_list
%type <pElemDDL>  		key_value
%type <pElemDDL>  		key_value_list
%type <item>      		builtin_function_user
%type <boolean>   		optional_unique_option
%type <uint>      		optional_unique_optional_ghost
%type <pStmtDDL>  		index_definition
%type <pStmtDDL>  		populate_index_definition
%type <boolean>      	optional_purgedata
%type <stringval> 		index_name
%type <pElemDDL>  		index_column_list
%type <pElemDDL>  		optional_index_option_list
%type <uint>                    optional_ignore_clause
%type <pElemDDL>  		index_option_list
%type <pElemDDL>  		index_option_spec
%type <pElemDDL>                populate_option
%type <pElemDDL>  		parallel_execution_clause
%type <pElemDDL>  		parallel_execution_spec
%type <pElemDDL>  		index_division_clause
%type <pElemDDL>  		salt_by_clause
%type <pElemDDL>  		salt_like_clause
%type <pElemDDL>                optional_salt_column_list
%type <pElemDDL>  		division_by_clause
%type <pElemDDL>            hbase_table_options
%type <hbaseOptionsList>  hbase_options_list
%type <hbaseOption>         hbase_option
%type <tokval>    		division_by_clause_starting_tokens
%type <pElemDDL>  		optional_division_column_names
%type <pElemDDL>  		store_by_clause
%type <pElemDDL>  		store_option_clause
%type <pElemDDL>  		unique_store_option
%type <pElemDDL>  		store_option
%type <item>                    range_n_args
%type <item>                    range_n_arg
%type <boolean>                 optional_in_memory_clause
%type <stringval>               optional_map_to_hbase_clause
%type <boolean>                 optional_hbase_data_format
%type <dropBehaviorEnum>  	extension_drop_behavior
%type <dropBehaviorEnum>  	optional_drop_behavior
%type <dropBehaviorEnum>  	optional_drop_index_behavior
%type <dropBehaviorEnum>  	optional_drop_invalidate_dependent_behavior
%type <dropBehaviorEnum>  	drop_behavior
%type <boolean>   		optional_validate
%type <boolean>   		optional_cleanup
%type <stringval> 		optional_logfile
%type <stringval> 		oss_path_name
%type <stringval> 		oss_path_name_elem
%type <stringval> 		volume_only_name
%type <item>	  		case_expression
%type <item>	  		case_operand
%type <item>	  		simple_when_then_list
%type <item>	  		simple_when_then
%type <item>	  		searched_when_then_list
%type <item>	  		searched_when_then
%type <item>	  		else_clause
%type <item>	  		result_expr
%type <accesstype>    		access_type
%type <pStmtDDL>                create_synonym_stmt
%type <pStmtDDL>                drop_synonym_stmt
%type <pStmtDDL>                drop_sql
%type <pStmtDDL>                drop_table_constraint_definition
%type <pStmtDDL>                drop_module
%type <pStmtDDL>                drop_exception_stmt
%type <pStmtDDL>                drop_all_exception_stmt
%type <operator_type>           proc_identifier
%type <stmt_ptr>                set_transaction_statement
%type <item>                    transaction_mode_list
%type <item>                    transaction_mode
%type <item>                    isolation_level
%type <item>                    transaction_access_mode
%type <item>                    diagnostics_size
%type <isolation>               isolation_level_enum
%type <transAccessMode>         transaction_access
%type <item>                    number_of_conditions
%type <item>			rollback_mode_on_off
%type <item>			autoabort_interval_stmt
%type <item>			multi_commit_mode
%type <tokval> 	  		full_outer
%type <tokval>    		right_outer
%type <tokval>    		left_outer
%type <tokval>    		optional_col_keyword
%type <boolean>                 optional_cast_spec_not_null_spec
%type <boolean>                 optional_nullable_pkey
%type <boolean>                 optional_encode_key_ordering_spec
%type <CollationType>		optional_Collation_type
%type <SortDirection>		optional_sort_direction
%type <item>                    encode_key_cast_spec
%type <relx>			psm_3gl_statement
%type <relx>			psm_3gl_block_start
%type <relx>			psm_3gl_block_end
%type <relx>			psm_3gl_stmt
%type <stmt_ptr>		dynamic_sql_disallowed_in_cs
%type <relx>			elseif_else_opt
%type <relx>			assignment_statement
%type <relx>                    assignment_value

%type <relx>                    signal_statement
%type <item>                    item_signal_statement

%type <na_type>   		rowset_type
%type <relx>      		rowset_derived_table
%type <relx>			rowset_for
%type <relx>			rowset_for_input
%type <relx>			rowset_for_output
%type <relx>			rowwise_rowset_info
%type <na_type>   		proc_arg_rowset_type
%type <item>      		rowset_input_host_variable
%type <item>      		rowset_input_host_variable_list
%type <item>      		rowset_size
%type <item>      		rowset_input_size
%type <item>      		rowset_output_size
%type <item>      		rowset_index
%type <relx>                    sample_clause
%type <relx>                    sample_clause_x
%type <item>                    sample_clusters
%type <item>                    sample_cluster_expr
%type <item>                    sample_size_expr
%type <item>                    sample_size_numeric
%type <boolean>                 sample_absolute
%type <boolean>                 sample_absolute_rows
%type <item>                    balance_when_then_list
%type <item>                    balance_when_then
%type <item>                    balance_else
%type <item>                    balance_expr
%type <longint>			showplan_options

%type <relx>                    routine_invocation
%type <relx>                    standalone_call_statement
%type <relx>                    exe_util_statement
%type <relx>                    exe_util_display_explain
%type <relx>                    exe_util_maintain_object
%type <relx>                    exe_util_cleanup_volatile_tables
%type <relx>                    exe_util_aqr
%type <relx>                    exe_util_get_region_access_stats
%type <boolean>                 stats_or_statistics
%type <aqrOptionsList>          aqr_options_list
%type <aqrOption>               aqr_option
%type <uint>                    aqr_task
%type <item>                   optional_limit_spec

%type <tokval>                  dummy_token_lookahead
%type <relx>                    exe_util_get_volatile_info
%type <relx>                    exe_util_get_error_info
%type <relx>                    exe_util_get_statistics
%type <relx>                    exe_util_get_uid
%type <relx>                    exe_util_get_qid
%type <relx>                    exe_util_get_lob_info
%type <relx>                    exe_util_hive_query
%type <relx>                    exe_util_populate_in_memory_statistics
%type <relx>                    exe_util_lob_extract
%type <relx>                    exe_util_lob_update
%type <relx>                    unload_statement
%type <relx>                    load_statement
%type <boolean>                 load_sample_option
%type <relx>                    exe_util_init_hbase
%type <hBaseBulkLoadOptionsList> optional_hbbload_options
%type <hBaseBulkLoadOptionsList> hbbload_option_list
%type <hBaseBulkLoadOption>      hbbload_option
%type <hBaseBulkLoadOption>      hbb_no_recovery_option
%type <hBaseBulkLoadOption>      hbb_truncate_option
%type <hBaseBulkLoadOption>      hbb_update_stats_option
%type <hBaseBulkLoadOption>      hbb_no_duplicate_check
%type <hBaseBulkLoadOption>      hbb_rebuild_indexes
%type <hBaseBulkLoadOption>      hbb_constraints
%type <hBaseBulkLoadOption>      hbb_no_output
%type <hBaseBulkLoadOption>      hbb_continue_on_error
%type <hBaseBulkLoadOption>      hbb_log_error_rows
%type <hBaseBulkLoadOption>      hbb_stop_after_n_error_rows
%type <hBaseBulkLoadOption>      hbb_index_table_only
%type <hBaseBulkLoadOption>      hbb_upsert_using_load
%type <hbbUnloadOptionsList> optional_hbb_unload_options
%type <hbbUnloadOptionsList> hbb_unload_option_list
%type <hbbUnloadOption>      hbb_unload_option
%type <hbbUnloadOption>      hbb_unload_empty_target
%type <hbbUnloadOption>      hbb_unload_compress
%type <hbbUnloadOption>      hbb_unload_one_file
%type <hbbUnloadOption>      hbb_unload_no_output
%type <hbbUnloadOption>      hbb_unload_delimiter
%type <hbbUnloadOption>      hbb_unload_record_separator
%type <hbbUnloadOption>      hbb_unload_null_string
%type <hbbUnloadOption>      hbb_unload_header
%type <hbbUnloadOption>      hbb_unload_append
%type <hbbUnloadOption>      hbb_unload_snapshot
%type <boolean>              hbb_unload_optional_overwrite
%type <boolean>             hbb_unload_existing_snap

%type <pSchemaName>             optional_from_schema
%type <stringval>               get_statistics_optional_options

%type <ptr_placeholder>         truncate_table_name
%type <relx>                    truncate_table

%type <relx>                    exe_util_get_metadata_info
%type <relx>                    exe_util_get_version_info
%type <stringval> 		object_identifier
%type <stringval> 		objects_identifier
%type <stringval>             hivemd_identifier
%type <stringval> 		cleanup_object_identifier

/* Added the following two to avoid increase in shift/reduce conflicts */
%type <stringval> 		privileges_identifier
%type <stringval> 		obj_priv_identifier

%type <stringval>               get_info_io_clause
%type <stringval>               get_info_aus_clause
%type <ptr_placeholder>         optional_no_header_and_match_pattern_clause

%type <stringval>               explain_starting_tokens
%type <stringval> 		explain_identifier
%type <stmt_ptr> 		explain_stmt_finalized
%type <uint>                    showplan_starting_tokens
%type <strSeq>                  routine_name
%type <item>                    routine_arg_list
%type <corrName>		actual_routine_name
%type <corrName>                actual_routine_action_name
%type <pElemDDL>                proxy_column
%type <pElemDDL>                proxy_columns
%type <item>                    spproxy_string
%type <itemList>                spproxy_string_list
/* Added the following to avoid increase in shift/reduce conflicts */
%type <boolean>                 sp_proxy_stmt_prefix

%type <corrName>                special_regular_table_name
%type <corrName>                special_index_table_name
%type <partitionClause>         special_table_loc_clause
%type <int>                     disableCharsetInference
%type <int>                     enableCharsetInferenceInColDefaultVal
%type <pConstStringList>	    quoted_string_list
%type <pConstStringList>	    col_fam_quoted_string_list

%type <pivotOptionsList>        pivot_options_list
%type <pivotOptionsList>        pivot_options
%type <pivotOption>             pivot_option

%type <pivotOptionsList>        concat_options_list
%type <pivotOptionsList>        concat_options
%type <pivotOption>             concat_option

%type <maintainObjectOptionsList>    maintain_object_options
%type <maintainObjectOptionsList>    maintain_object_options_list
%type <maintainObjectOption>         maintain_object_option
%type <uint>                        maintain_object_token
%type <stringval>                   optional_mt_options
%type <stringval>                   run_from
%type <stringval>                   run_to
%type <longint>                     run_for

%type <stringval>                   log_file_name
//%type <int>                         markSelectQueryPos

%type <pElemDDL>               optional_locking_stmt_list
%type <item>                   locking_stmt_list
%type <item>                   locking_stmt
%type <parTriggerScopeType>         optional_row_table

%type <stringval>              optional_hive_options

%type <tableTokens>            create_table_start_tokens
%type <tableLoadAttrEnum>      ctas_load_and_in_memory_options
%type <pElemDDL>               ctas_insert_columns
%type <pElemDDL>	       table_feature
%type <boolean>                is_not_droppable
%type <boolean>   	       online_or_offline
%type <boolean>   	       optional_validate_clause
%type <extractType>            extract_type
%type <boolean>                optional_if_not_exists_clause
%type <boolean>                optional_if_exists_clause
%type <boolean>                optional_if_not_registered_clause
%type <boolean>                optional_if_registered_clause

%type <uint>                    merge_stmt_start_tokens
%type <relx>                   merge_stmt_using_clause
%type <item>                   merge_stmt_on_condition
%type <item>      	       merge_stmt_set_clause
%type <ptr_placeholder>                   merge_stmt_when_clause
%type <ptr_placeholder>                   merge_stmt_when_matched
%type <ptr_placeholder>                   merge_stmt_when_not_matched
%type <ptr_placeholder>                   merge_insert_with_values
%type <stringval>              cpu_identifier
%type <stringval>              cpu_identifier_with_all
%type <stringval>              pid_identifier
%type <stringval>              qid_internal_identifier
%type <uint>                   qid_internal_stats_merge_clause
%type <uint>                   stats_active_clause
%type <uint>                   stats_merge_clause
%type <uint>                    reset_clause  
%type <stringval>		qid_identifier
%type <relx>                    query_suspend_safe
%type <relx>                    query_suspend_forced
%type <relx>                    query_activate
%type <stringval>               optional_for_user_clause
%type <stringval>               optional_authid_clause


%type <relx>                    query_cancel_qid
%type <relx>                    query_cancel_pname
%type <relx>                    query_cancel_nid_pid
%type <relx>                    query_cancel_no_comment
%type <relx>                    query_cancel_optional_comment

// Rules for UDFs.
%type <item>                    user_defined_scalar_function
%type <item>                    udr_value_expression_list
%type <item>                    table_name_dot_star
%type <relx>                    table_mapping_function_invocation
%type <relx>                    tmudf_table_expression
%type <relx>                    tmudf_query_expression
%type <item>      		optional_tmudf_order_by
%type <item>                    tmudf_param
%type <item>                    optional_tmudf_param_list_with_comma
%type <item>                    optional_tmudf_param_list
%type <item>                    tmudf_param_list
%%

// There are three flavors of literal non-terminal.  The following
// table should help explain.
//
// where used                           type     negatable non-terminal
//=====================================+========+=========+====================
// simple_value_spec		        string   yes	   literal_as_string
// primary                              ItemExpr no	   literal
// in  DDL, host_var_type_item, etc.,   ItemExpr yes	   literal_negatable
//
// And for literals occuring in the prototype of a hostvariable,
// currently prototypes can only be used for table names, and so
// those literals are restricted to character strings.


/* type tokval */
sign : '+' { $$ = $1; }
     | '-' { $$ = $1; }

disableCharsetInference : 
	{ 
	   turnUnknownCharSetToISO88591CurrentValue = turnUnknownCharSetToISO88591;
	   turnUnknownCharSetToISO88591 = TRUE;
	}

enableCharsetInferenceInColDefaultVal : 
	{ 
	   turnUnknownCharSetToISO88591CurrentValue = turnUnknownCharSetToISO88591;
	   turnUnknownCharSetToISO88591 = FALSE;
	}

/* type item */
numeric_literal_exact :       NUMERIC_LITERAL_EXACT_NO_SCALE
                {
                  $$ = literalOfNumericNoScale($1);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                }

/* type item */
numeric_literal :       numeric_literal_exact
	      |	NUMERIC_LITERAL_EXACT_WITH_SCALE
                {
                  $$ = literalOfNumericWithScale($1);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                }
	      | NUMERIC_LITERAL_APPROX
		{
                  $$ = literalOfApproxNumeric($1);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
		}

/* type item */
character_literal_sbyte : sbyte_string_literal character_literal_notcasespecific_option
                {
//
// literal <-- sbyte_string_literal  character_literal_notcasespecific_option
//
                  CharInfo::CharSet cs = getStringCharSet(&$1);
                  const NAString& ns = *$1;

                  $$ = new (PARSERHEAP()) ConstValue(*$1, cs);
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  ((ConstValue*)$$)->setStrLitWithCharSetPrefixFlag(TRUE); // for use with DDL col def DEFAULT str lit only

                  if ($2/*character_literal_notcasespecific_option specified*/)
                  {
                    NAType * newType = ((ConstValue*)$$)->getType()->newCopy(PARSERHEAP());
                    ((CharType*)newType)->setCaseinsensitive(TRUE);
                    ((ConstValue*)$$)->changeType(newType);
                  }
                  delete $1/*sbyte_string_literal*/;
                }
             | /*no_charset_prefix*/std_char_string_literal character_literal_notcasespecific_option
                {
//
// literal <-- /*no_charset_prefix*/std_char_string_literal  character_literal_notcasespecific_option
//
                   CharInfo::CharSet cs = getStringCharSet(&$1);
                   const NAString& ns = *$1;

                   CharInfo::CharSet inputCS = (CharInfo::CharSet)SqlParser_CurrentParser->charset_;

                   NAString inferCharSetDefaultAttrVal;
                   NABoolean charsetInference = getCharSetInferenceSetting(inferCharSetDefaultAttrVal);


                   PARSERASSERT(cs == CharInfo::ISO88591 || cs == CharInfo::UTF8);
                   PARSERASSERT(inputCS == CharInfo::UTF8);

                   if ( charsetInference && ToStringvalWithCharSet(&$1)->isInferCSUnknownCSLogicEnabled() )
                   {
                     NAWString* wstr = NULL;
                     if ( $1->length() == 0 )
                     {
                       wstr = new (PARSERHEAP()) NAWString(PARSERHEAP());
                       $$ = new (PARSERHEAP()) ConstValue (*$1,*wstr);
                       SqlParser_CurrentParser->collectItem4HQC($$);
                     }
                     else // $1->length() != 0
                     {
                       // Convert to UCS2 because the existing code handles UCS2 string literals reliably.
                       wstr = charToUnicode ( (Lng32)cs     // char set of src str
                                            , $1->data()    // src str
                                            , $1->length()  // src str len in bytes
                                            , PARSERHEAP()  // heap for allocated target str
                                            );
                       if (wstr == NULL) // conversion failed
                       {
                         // The string argument contains characters that cannot be converted.
                         *CmpCommon::diags() << DgSqlCode(-8413);
                         YYERROR;
                       }
                       if (cs == CharInfo::ISO88591)
                       {
                         $$ = new (PARSERHEAP()) ConstValue (*$1,*wstr);
                         SqlParser_CurrentParser->collectItem4HQC($$);		 
                       }
                       else // cs == CharInfo::UTF8
                       {
                         // Convert to DEFAULT_CHARSET if possible to preserve the old behavior.
                         NAString * newstr = charToChar ( (Lng32)SqlParser_DEFAULT_CHARSET // targetCS
                                                        , $1->data()              // const char *s
                                                        , $1->length()            // Int32 sLenInBytes
                                                        , (Lng32)getStringCharSet(&$1)     // sourceCS
                                                        , PARSERHEAP() // heap for allocated target str
                                                        );
                         if (newstr == NULL) // conversion failed
                         {
                           $$ = new (PARSERHEAP()) ConstValue (*wstr, CharInfo::UnknownCharSet);
                           SqlParser_CurrentParser->collectItem4HQC($$);
                         }
                         else
                         {
                           $$ = new (PARSERHEAP()) ConstValue (*newstr,*wstr);
                           SqlParser_CurrentParser->collectItem4HQC($$);
                           delete newstr;
                         }
                       }
                     } // $1->length() != 0
                     delete wstr;
                   }
                   else // INFER_CHARSET == OFF || ToStringvalWithCharSet(&$1)->isInferCSUnknownCSLogicDisabled() 
                   {
                     if ( cs == CharInfo::ISO88591 )
                     {
                       // Note that an empty string has the ISO88591 character set attribute
                       $$ = new (PARSERHEAP()) ConstValue (*$1, CharInfo::ISO88591);
                       SqlParser_CurrentParser->collectItem4HQC($$);
                     }
                     else // cs == CharInfo::UTF8
                     {
                       // Convert to UCS2 because the existing code handles UCS2 string literals reliably.
                       NAWString * wstr3 = charToUnicode ( (Lng32)cs     // char set of src str
                                                         , $1->data()    // src str
                                                         , $1->length()  // src str len in bytes
                                                         , PARSERHEAP()  // heap for allocated target str
                                                         );
                       if (wstr3 != NULL) // str converted to UCS2/UTF16 successfully
                       {
                         // Convert to DEFAULT_CHARSET if possible to preserve the old behavior.
                         NAString * cstr3 = unicodeToChar ( wstr3->data()
                                                          , wstr3->length() // in NAWchars
                                                          , SqlParser_DEFAULT_CHARSET
                                                          , PARSERHEAP()
                                                          );
                         if (cstr3 != NULL) // str converted to DEFAULT_CHARSET successfully
                         {
                           $$ = new (PARSERHEAP()) ConstValue (*cstr3, SqlParser_DEFAULT_CHARSET);
                           SqlParser_CurrentParser->collectItem4HQC($$);
                           delete cstr3;
                         }
                         else
                         {
                           $$ = new (PARSERHEAP()) ConstValue (*wstr3, CharInfo::UCS2);
                           SqlParser_CurrentParser->collectItem4HQC($$);
                         }
                         delete wstr3;
                       }
                       else // charToUnicode conversion failed
                       {
                         $$ = new (PARSERHEAP()) ConstValue (*$1, getStringCharSet(&$1));
                         SqlParser_CurrentParser->collectItem4HQC($$);
                       }
                     }
                   }

		   if ($2)
		     {
		       NAType * newType = ((ConstValue*)$$)->getType()->newCopy(PARSERHEAP());
		       ((CharType*)newType)->setCaseinsensitive(TRUE);
		       ((ConstValue*)$$)->changeType(newType);
		     }

                  delete $1;
                }

/* type item */
literal :       numeric_literal
              | TOK_INTERVAL disableCharsetInference sign QUOTED_STRING interval_qualifier
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfInterval($4, $5, $3);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();

                }
              | TOK_INTERVAL disableCharsetInference QUOTED_STRING interval_qualifier
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfInterval($3, $4);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | '{' TOK_INTERVAL disableCharsetInference sign QUOTED_STRING interval_qualifier '}'
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfInterval($5, $6, $4);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | '{' TOK_INTERVAL disableCharsetInference QUOTED_STRING interval_qualifier '}'
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfInterval($4, $5);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | '{' TOK_D disableCharsetInference QUOTED_STRING '}'
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfDate($4);		  
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);	  
                  restoreInferCharsetState();
                }
              | TOK_DATE_BEFORE_QUOTE disableCharsetInference QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfDate($3);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | QUOTED_STRING TOK_LPAREN_BEFORE_DATE_COMMA_AND_FORMAT TOK_DATE ',' TOK_FORMAT QUOTED_STRING  ')'
                {
		  // CheckModeSpecial1(); -- Allow general NEO users to use
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  // in MS2, formatting is done as part of Format function.
		  // Right now limit this to MS2. Once it is tested, we can do
		  // it for all modes.
                  /*		  if (CmpCommon::getDefault(MODE_SPECIAL_2) == DF_ON)
		    {
                      $$ = new (PARSERHEAP()) ConstValue
                        (*$1, getStringCharSet(&$1));
                      SqlParser_CurrentParser->collectItem4HQC($$);	
                      $$ = new (PARSERHEAP()) DateFormat($$, *$6, DateFormat::FORMAT_TO_DATE);
		    }
                    else*/
		    {
		      $$ = literalOfDate($1);
		      if (! $$) YYERROR;
                      SqlParser_CurrentParser->collectItem4HQC($$);
		      restoreInferCharsetState();
                      $$ = new (PARSERHEAP()) DateFormat($$, *$6, DateFormat::FORMAT_TO_CHAR);
		    }

                }
              | '{' TOK_T disableCharsetInference QUOTED_STRING '}'
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfTime($4);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | TOK_TIME_BEFORE_QUOTE disableCharsetInference QUOTED_STRING
                {
                  $$ = literalOfTime($3);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | TOK_TIMESTAMP disableCharsetInference QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfTimestamp($3);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | '{' TOK_TS disableCharsetInference QUOTED_STRING '}'
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfTimestamp($4);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | character_literal_sbyte 
              | unicode_string_literal
                {
                  $$ = new (PARSERHEAP()) ConstValue(*$1, getStringCharSet(&$1));
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  ((ConstValue*)$$)->setStrLitWithCharSetPrefixFlag(TRUE); // for use with DDL col def DEFAULT str lit only
                  delete $1;
                }
              | TOK_DATETIME disableCharsetInference QUOTED_STRING datetime_qualifier
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfDateTime($3, $4);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
             | boolean_literal

boolean_literal : truth_value
                  {
                    if ($1 == TOK_UNKNOWN)
                      YYERROR;

                    char v = ($1 == TOK_TRUE ? 1 : 0);
                    NAString literalBuf($1 == TOK_TRUE ? "TRUE" : "FALSE");
                    $$ = new (PARSERHEAP()) ConstValue 
                      (new (PARSERHEAP()) SQLBooleanNative(PARSERHEAP(), FALSE),
                       (void *) &v, 1, &literalBuf);
                  }

character_literal_notcasespecific_option : '(' TOK_NOT_CASESPECIFIC ')'
                                            {$$=TRUE;}
                                           | '(' TOK_CASESPECIFIC ')'
                                            {$$=FALSE;}
                                           | empty
                                            {
                                              if (CmpCommon::getDefault(MODE_SPECIAL_1) == DF_ON)
						$$ = TRUE;
					      else
						$$=FALSE;
					    }

/* type item */
literal_negatable : literal
              | sign NUMERIC_LITERAL_EXACT_NO_SCALE
                {
                  $$ = literalOfNumericNoScale($2, $1);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                }
	      |	sign NUMERIC_LITERAL_EXACT_WITH_SCALE
                {
                  $$ = literalOfNumericWithScale($2, $1);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                }
	      | sign NUMERIC_LITERAL_APPROX
		{
                  $$ = literalOfApproxNumeric($2, $1);
                  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
		}
              | sign TOK_INTERVAL disableCharsetInference QUOTED_STRING interval_qualifier
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = literalOfInterval($4, $5, $1);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }
              | sign TOK_INTERVAL disableCharsetInference sign QUOTED_STRING interval_qualifier
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  char sign_sign = ($1 == $4) ? '+' : '-';
                  $$ = literalOfInterval($5, $6, sign_sign);
		  if (! $$) YYERROR;
                  SqlParser_CurrentParser->collectItem4HQC($$);
                  restoreInferCharsetState();
                }

/* type stringval */
literal_as_string :       NUMERIC_LITERAL_EXACT_NO_SCALE
	      |	NUMERIC_LITERAL_EXACT_WITH_SCALE
	      | NUMERIC_LITERAL_APPROX
              | TOK_INTERVAL disableCharsetInference sign QUOTED_STRING interval_qualifier
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | TOK_INTERVAL disableCharsetInference QUOTED_STRING interval_qualifier
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | sign NUMERIC_LITERAL_EXACT_NO_SCALE
                { $$ = $2; }
	      |	sign NUMERIC_LITERAL_EXACT_WITH_SCALE
                { $$ = $2; }
	      | sign NUMERIC_LITERAL_APPROX
                { $$ = $2; }
              | sign TOK_INTERVAL disableCharsetInference QUOTED_STRING interval_qualifier
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | TOK_DATE disableCharsetInference QUOTED_STRING
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | TOK_TIME disableCharsetInference QUOTED_STRING
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | TOK_TIMESTAMP disableCharsetInference QUOTED_STRING
                { // bogus
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  $$ = NULL;
                  restoreInferCharsetState();
                }
              | character_string_literal
                /* DEFAULT_CHARSET has no effect on character_string_literal in this context */

/* type stringval */
character_string_literal: sbyte_string_literal
  {
    // character_string_literal ::= sbyte_string_literal

    if ( ( getStringCharSet(&$1) == CharInfo::ISO88591 && NOT NAStringHasOnly7BitAsciiChars(*$1)) ||
         ( getStringCharSet(&$1) != CharInfo::ISO88591 && getStringCharSet(&$1) != CharInfo::UTF8 ))
    {
      // Convert text from getStringCharSet(&$1) to UTF8 to keep the same semantic as
      // that of the non-terminal symbol std_char_string_literal.
      NAString * utf8str = charToChar ( (Lng32) CharInfo::UTF8 // targetCS
                                      , $1->data()             // source string
                                      , $1->length()           // src str len in bytes
                                      , getStringCharSet(&$1)  // sourceCS
                                      , PARSERHEAP()           // heap for target string
                                      , FALSE                  // allowInvalidChar
                                      );
      if (utf8str == NULL)
      {
        // The string argument contains characters that cannot be converted.
        *SqlParser_Diags << DgSqlCode(-8413);
        YYERROR;
      }
      ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1));
      ToStringvalWithCharSet(&$$)->stringval = utf8str; // same as $$ = utf8str;
      ToStringvalWithCharSet(&$$)->charSet_ = CharInfo::UTF8;
      ToStringvalWithCharSet(&$$)->/*max*/bytesPerChar_ = CharInfo::maxBytesPerChar(CharInfo::UTF8);
      delete $1;
    }
    else if ( getStringCharSet(&$1) == CharInfo::UTF8 && NAStringHasOnly7BitAsciiChars(*$1) )
    {
      // Keep the same semantic as that of the non-terminal symbol std_char_string_literal.
      ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1));
      ToStringvalWithCharSet(&$$)->charSet_ = CharInfo::ISO88591;
      ToStringvalWithCharSet(&$$)->bytesPerChar_ = CharInfo::maxBytesPerChar(CharInfo::ISO88591);
    }
  }
       | std_char_string_literal /* i.e., no charset prefix */

/* type stringval */
sbyte_string_literal : TOK_SBYTE_LITERAL
       | sbyte_string_literal TOK_SBYTE_LITERAL
           {
             // sbyte_string_literal ::= sbyte_string_literal TOK_SBYTE_LITERAL

             // Mismatch example: The user specifies _iso88591'abc' _utf8'def'
             if (charsetMismatchError(&$1, &$2)) YYERROR;

             // Example: The user specifies _iso88591'abc' _iso88591'defghij';
             // combine them to form _iso88591'abcdefghij'; we actually only
             // store abcdefghij in an NAString object pointed by $$ and
             // CharInfo::ISO88591 in the field ToStringvalWithCharSet(&$$)->charSet_
             // and 1 in the field ToStringvalWithCharSet(&$$)->bytesPerChar_

             $$ = $1;
             $$->append(*$2);
             delete $2;
           }
       | sbyte_string_literal QUOTED_STRING
           {
             // sbyte_string_literal ::= sbyte_string_literal QUOTED_STRING

             // Example: The user specifies _iso88591'abc' 'defghij'

             NAString defVal;
             NABoolean charsetInference = getCharSetInferenceSetting(defVal);

             
             PARSERASSERT( getStringCharSet(&$1/*sbyte_string_literal*/) != CharInfo::UnknownCharSet &&
                           ( getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::ISO88591 ||
                             getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::UTF8 ) );

             if ($2->length() == 0)
             {
               // An empty string can be in any character set so make it to have $1 character set attribute
               NAString * savedstr2 = $2;
               ToStringvalWithCharSet(&$2)->shallowCopy(ToStringvalWithCharSet(&$1));
               ToStringvalWithCharSet(&$2)->stringval = savedstr2; // shallow copy - same as $2 = savedstr2;
             }
             else if (getStringCharSet(&$1) != getStringCharSet(&$2))
             {
                NAString * newcstr = charToChar ( (Lng32)getStringCharSet(&$1) // targetCS
                                                , $2->data()              // const char *s
                                                , $2->length()            // Int32 sLenInBytes
                                                , (Lng32)getStringCharSet(&$2) // sourceCS
                                                , PARSERHEAP()            // heap for allocated target str
                                                );
                if (newcstr != NULL) // str converted successfully
                {
                  NAString * oldcstr = $2;
                  ToStringvalWithCharSet(&$2)->shallowCopy(ToStringvalWithCharSet(&$1));
                  ToStringvalWithCharSet(&$2)->stringval = newcstr; // shallow copy - same as $2 = newcstr;
                  delete oldcstr;
                }
             }
             // else keep getStringCharSet(&$2) setting, we will get a mismatched error below.
             if (charsetMismatchError(&$1, &$2)) YYERROR;

             // The following call is not required, the parser have already done this by default if the rhs is $1
             ToStringvalWithCharSet(&$$/*lhs*/)->shallowCopy(ToStringvalWithCharSet(&$1/*sbyte_string_literal*/)); // $$ = $1;
             $$->append(*$2);
             delete $2;

           }
       | std_char_string_literal TOK_SBYTE_LITERAL
           {
             // sbyte_string_literal ::= std_char_string_literal TOK_SBYTE_LITERAL

             // Example: The user specifies 'abcde' _iso88591'fghij';
             // we combine the two string literals into _iso88591'abcdefghij';


             PARSERASSERT( ( getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::ISO88591 ||
                             getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::UTF8 ) &&
                           getStringCharSet(&$2/*TOK_SBYTE_LITERAL*/) != CharInfo::UnknownCharSet );

             // Example: The user specifies 'abcde' _iso88591'fghij'
             // Combine them to form a new string literal _iso88591'abcdefghij'

             if ($1->length() == 0)
             {
               // An empty string can be in any character set so make it to have $2 character set attribute
               NAString * savedstr1 = $1;
               ToStringvalWithCharSet(&$1)->shallowCopy(ToStringvalWithCharSet(&$2));
               ToStringvalWithCharSet(&$1)->stringval = savedstr1; // shallow copy - same as $1 = savedstr1;
             }
             else if (getStringCharSet(&$1) != getStringCharSet(&$2))
             {
               NAString * newstr = charToChar ( (Lng32)getStringCharSet(&$2) // targetCS
                                              , $1->data()              // const char *s
                                              , $1->length()            // Int32 sLenInBytes
                                              , (Lng32)getStringCharSet(&$1) // sourceCS
                                              , PARSERHEAP()            // heap for allocated target str
                                              );
               if (newstr != NULL) // str converted successfully
               {
                 NAString * oldstr1 = $1;
                 ToStringvalWithCharSet(&$1)->shallowCopy(ToStringvalWithCharSet(&$2/*TOK_SBYTE_LITERAL*/));
                 ToStringvalWithCharSet(&$1)->stringval = newstr; // shallow copy - same as $1 = newstr;
                 delete oldstr1;
               }
             }

            if (charsetMismatchError(&$1, &$2)) YYERROR;

             NAString *savestr1 = $1/*std_char_string_literal*/;
             // The following call is required to copy the contents of the StringvalWithCharSet
             // data structure associating with $2 to the one associating with $$.
             ToStringvalWithCharSet(&$$/*lhs*/)->shallowCopy(ToStringvalWithCharSet(&$2/*TOK_SBYTE_LITERAL*/)); // must do this instead of $$ = $2;
             $$ = savestr1; // same as ToStringvalWithCharSet(&$$/*lhs*/)->stringval = savestr1;
             $$->append(*$2);
             delete $2;
           }
       | sbyte_string_literal TOK_MBYTE_LITERAL
           {
             // sbyte_string_literal ::= sbyte_string_literal TOK_MBYTE_LITERAL

             charsetMismatchError(&$1, &$2);
             YYERROR;
           }

/* type wstringval */
unicode_string_literal : TOK_MBYTE_LITERAL 
	   {
	     // unicode_string_literal ::= TOK_MBYTE_LITERAL 

	     NonISO88591LiteralEncountered = TRUE;
	     $$ = $1; // No need to call ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1) here.
	   }
       | unicode_string_literal TOK_MBYTE_LITERAL
           {
             // unicode_string_literal ::= unicode_string_literal TOK_MBYTE_LITERAL

	     NonISO88591LiteralEncountered = TRUE;
             // Mismatch example: The user specifies _ucs2'abc' _ucs4'def'
             if (charsetMismatchError(&$1, &$2)) YYERROR;
             $$ = $1; // No need to call ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1) here.
             $$->append(*$2);
             delete $2;
           }
       | std_char_string_literal TOK_MBYTE_LITERAL
           {
             // unicode_string_literal ::= std_char_string_literal TOK_MBYTE_LITERAL

             // Example: The user specifies 'abcde' _ucs2'fghij'
             // Combine them to form a new string literal _ucs2'abcdefghij'

             NonISO88591LiteralEncountered = TRUE;


             PARSERASSERT( ( getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::ISO88591 ||
                             getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::UTF8 ) &&
                           getStringCharSet(&$2/*TOK_MBYTE_LITERAL*/) == CharInfo::UCS2 );

             NAWString * newwstr = NULL;
             if ($1->length() == 0)
             {
               // An empty string can have any character set attribute
               newwstr = new(PARSERHEAP()) NAWString(PARSERHEAP());
             }
             else
             {
               newwstr = charToUnicode ( (Lng32)getStringCharSet(&$1)     // char set of src str
                                       , $1->data()             // src str
                                       , $1->length()           // src str len in bytes
                                       , PARSERHEAP()           // heap for allocated target str
                                       );
             }
             if (newwstr == NULL)
             {
               *SqlParser_Diags << DgSqlCode(-8413); // The string argument contains characters that cannot be converted.
               YYERROR;
             }

             // The following call is required to copy the contents of the StringvalWithCharSet
             // data structure associating with $2 to the one associating with $$.
             ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$2/*TOK_MBYTE_LITERAL*/)); // do this intead of $$ = $2
             newwstr->append(*$2);
             ToStringvalWithCharSet(&$$)->wstringval = newwstr; // shallow copy - same as $$ = newwstr;

             delete $1/*std_char_string_literal*/;
           }
       | unicode_string_literal QUOTED_STRING
           {
             // unicode_string_literal ::= unicode_string_literal QUOTED_STRING

             NonISO88591LiteralEncountered = TRUE;

             // Example: The user specifies _ucs2'abc' 'defghij';
             // Combine them to form a new string literal _ucs2'abcdefghij'


             PARSERASSERT( getStringCharSet(&$1/*unicode_string_literal*/) == CharInfo::UCS2 &&
                           ( getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::ISO88591 ||
                             getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::UTF8 ) );
             
             NAWString* newwstr = NULL;
             if ($2->length() == 0)
             {
               // An empty string can have any character set attribute
               newwstr = new(PARSERHEAP()) NAWString(PARSERHEAP());
             }
             else
             {
               newwstr = charToUnicode ( (Lng32)getStringCharSet(&$2)     // char set of src str
                                       , $2->data()             // src str
                                       , $2->length()           // src str len in bytes
                                       , PARSERHEAP()           // heap for allocated target str
                                       );
               if (newwstr == NULL) // conversion failed
               {
                 *SqlParser_Diags << DgSqlCode(-8413); // The string argument contains characters that cannot be converted.
                 YYERROR;
               }
             }

             ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1)); // $$ = $1;
             $$->append(*newwstr);
             delete newwstr;
             delete $2/*QUOTED_STRING*/;

           }
       | unicode_string_literal TOK_SBYTE_LITERAL 
           {
             // unicode_string_literal ::= unicode_string_literal TOK_SBYTE_LITERAL

             charsetMismatchError(&$1, &$2);
             YYERROR;
           }

/* This is the production for declaring static cursors.
 * One difference from FULL ANSI is that there is no INSENSITIVE
 * nor SCROLL attributes allowed in the declaration.
 */
/* stmt_ptr */
declare_static_cursor : TOK_DECLARE entity_name TOK_CURSOR TOK_FOR cursor_spec
  {

    if ($2)
      {
	$$ = new (PARSERHEAP()) StmtDeclStatCurs($2,$5);
      }
    else
      /* entity_name is NULL, and was given by a host var string expression */
      {
	// In what appears from the cursor specification, to be a
	// static cursor declaration, you have a syntax error.
	// You attempted to name the cursor with a host variable expression.
	// You must name static cursors literally.
        *SqlParser_Diags << DgSqlCode(-3005);
	YYABORT;
      }

    if (intoClause)
      {
	// static cursors shouldn't have any into clause specified
	*SqlParser_Diags << DgSqlCode(-3142);
	YYABORT;
      }

    // A cursor on an embedded INSERT is not supported
    if(WeAreInAnEmbeddedInsert == TRUE)
      {
        WeAreInAnEmbeddedInsert = FALSE;
        *SqlParser_Diags << DgSqlCode(-3409);
        YYABORT;
      }

  }
  // QSTUFF
  | TOK_DECLARE entity_name TOK_CURSOR_WITH_HOLD TOK_FOR cursor_spec
  {
    if ($2)
      {
	$$ = new (PARSERHEAP()) StmtDeclStatCurs($2,$5,TRUE);
      }
    else
      /* with hold entity_name is NULL, and was given by a host var string expression */
      {
	// In what appears from the cursor specification, to be a
	// static cursor declaration, you have a syntax error.
	// You attempted to name the cursor with a host variable expression.
	// You must name static cursors literally.
        *SqlParser_Diags << DgSqlCode(-3005);
	YYABORT;
      }

    if (intoClause)
      {
	// static cursors shouldn't have any into clause specified
	*SqlParser_Diags << DgSqlCode(-3142);
	YYABORT;
      }

    // A cursor on an embedded INSERT is not supported
    if(WeAreInAnEmbeddedInsert == TRUE)
      {
        WeAreInAnEmbeddedInsert = FALSE;
        *SqlParser_Diags << DgSqlCode(-3409);
        YYABORT;
      }

  }
  | TOK_DECLARE entity_name TOK_CURSOR_WITHOUT_HOLD TOK_FOR cursor_spec
  {
   if ($2)
      {
	$$ = new (PARSERHEAP()) StmtDeclStatCurs($2,$5);
      }
    else
      /*  without hold entity_name is NULL, and was given by a host var string expression */
      {
	// In what appears from the cursor specification, to be a
	// static cursor declaration, you have a syntax error.
	// You attempted to name the cursor with a host variable expression.
	// You must name static cursors literally.
        *SqlParser_Diags << DgSqlCode(-3005);
	YYABORT;
      }

    if (intoClause)
      {
	// static cursors shouldn't have any into clause specified
	*SqlParser_Diags << DgSqlCode(-3142);
	YYABORT;
      }

    // A cursor on an embedded INSERT is not supported
    if(WeAreInAnEmbeddedInsert == TRUE)
      {
        WeAreInAnEmbeddedInsert = FALSE;
        *SqlParser_Diags << DgSqlCode(-3409);
        YYABORT;
      }

  }
 // QSTUFF

/* The dynamic cursor declaration
 * is a bit more flexible than for the static case.
 * The first entity_name is the cursor name and the second entity_name
 * is the statement name.  Note that an entity_name can be a string typed
 * host variable expression.
 *
 * The entity_name is either NULL, or a pointer to an NAString naming it.
 * We need to check for three cases here:
 *   + Where both entity_names are non-null, and hence, literally named, we
 *     create a StmtDeclDynCurs
 *   + Where both entity_names are NULL, and hence named by host variables,
 *     we cleverly use methods of the HvRoles.C in order to set the first
 *     to a cursor name role, and the last (second) to a statement name role.
 *   + If one of them is NULL and the other is non-null (two cases possible)
 *     that is an error that we flag.  I'm not sure how the arror propogates
 *     up and out, but it is an error.
 */

/* stmt_ptr */
declare_dynamic_cursor :
  TOK_DECLARE entity_name TOK_CURSOR TOK_FOR entity_name
  {
      if ($2 && $5)
	{
	  $$ = new (PARSERHEAP()) StmtDeclDynCurs($2,$5);
	}
      else if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs();
	}
      else
	{
	  // Parse Error: In a dynamic cursor declaration you must name both
	  // the cursor and the statement the same way.  They must both be given
	  // by literals, or, by a string host variable expression. No mixing.

          *SqlParser_Diags << DgSqlCode(-3006);
	  YYABORT;
	}

      // A cursor on an embedded INSERT is not supported
      if(WeAreInAnEmbeddedInsert == TRUE)
        {
          WeAreInAnEmbeddedInsert = FALSE;
          *SqlParser_Diags << DgSqlCode(-3409);
          YYABORT;
        }

    }
   // QSTUFF
  | TOK_DECLARE entity_name TOK_CURSOR_WITH_HOLD TOK_FOR entity_name
  {
      if ($2 && $5)
	{
	  $$ = new (PARSERHEAP()) StmtDeclDynCurs($2,$5,TRUE);
	}
      else if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs(TRUE);
	}
      else
	{
	  // Parse Error: In a dynamic cursor declaration you must name both
	  // the cursor and the statement the same way.  They must both be given
	  // by literals, or, by a string host variable expression. No mixing.

          *SqlParser_Diags << DgSqlCode(-3006);
	  YYABORT;
	}

      // A cursor on an embedded INSERT is not supported
      if(WeAreInAnEmbeddedInsert == TRUE)
        {
          WeAreInAnEmbeddedInsert = FALSE;
          *SqlParser_Diags << DgSqlCode(-3409);
          YYABORT;
        }

    }
  | TOK_DECLARE entity_name TOK_CURSOR_WITHOUT_HOLD TOK_FOR entity_name
  {
      if ($2 && $5)
	{
	  $$ = new (PARSERHEAP()) StmtDeclDynCurs($2,$5,FALSE);
	}
      else if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs(FALSE);
	}
      else
	{
	  // Parse Error: In a dynamic cursor declaration you must name both
	  // the cursor and the statement the same way.  They must both be given
	  // by literals, or, by a string host variable expression. No mixing.

          *SqlParser_Diags << DgSqlCode(-3006);
	  YYABORT;
	}

      // A cursor on an embedded INSERT is not supported
      if(WeAreInAnEmbeddedInsert == TRUE)
        {
          WeAreInAnEmbeddedInsert = FALSE;
          *SqlParser_Diags << DgSqlCode(-3409);
          YYABORT;
        }

    }
   // QSTUFF
  |   TOK_ALLOCATE entity_name TOK_CURSOR TOK_FOR entity_name
   {

      if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs();
	}
      else
	{
          // Parse Error: In an Allocate Cursor statement you must name both
          // the cursor and the statement using string host variables.
          *SqlParser_Diags << DgSqlCode(-3007);
	  YYABORT;
	}
    }
  // QSTUFF
    |   TOK_ALLOCATE entity_name TOK_CURSOR_WITH_HOLD TOK_FOR entity_name
   {

      if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs(TRUE);
	}
      else
	{
          // Parse Error: In an Allocate Cursor statement you must name both
          // the cursor and the statement using string host variables.
          *SqlParser_Diags << DgSqlCode(-3007);
	  YYABORT;
	}
    }
   |   TOK_ALLOCATE entity_name TOK_CURSOR_WITHOUT_HOLD TOK_FOR entity_name
   {

      if ($2 == NULL && $5 == NULL)
	{
	  TheHostVarRoles->setFirstUnassignedTo(HV_IS_CURSOR_NAME);
	  TheHostVarRoles->setLastUnassignedTo(HV_IS_STMT_NAME);
	  $$ = new (PARSERHEAP()) StmtXdynCurs(FALSE);
	}
      else
	{
          // Parse Error: In an Allocate Cursor statement you must name both
          // the cursor and the statement using string host variables.
          *SqlParser_Diags << DgSqlCode(-3007);
	  YYABORT;
	}
    }
  // QSTUFF


/* The way that this non-terminal works is that its data has two states:
*    + If it is NULL, that means a host variable specified the entity name.
*      This is what happens in extended dynamic SQL.  In that case, the
*      production in which entity_name occurs must be sure to set up
*      TheHostVarRoles in its action part to set the role for the host variable
*      encountered here.  That means that the production must test whether
*      or not entity_name's data is NULL.
*    + If it is NOT NULL then it is a pointer to an NAString that contains the
*      literal string that names the entity.  No host variables involved.
*
* Note that currently we do not support the local/global scoping of entities.
*/

/* stringval */
entity_name : identifier  /* just return *NAString by default */
            | scope_spec character_string_literal
               {
                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
		 // Upshift the literal, unless it's a delimited identifier
		 // in double quotes. NOTE: there is a similar piece of
		 // code in proc GetNameViaDesc() in file cli/Descriptor.cpp,
		 // make sure those two counterparts remain in sync, or
		 // otherwise literals for names will behave differently
		 // from host variables.
		 if (($2->data())[0] != '\"')
		   $2->toUpper();
		 ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$2)); // do this instead of $$ = $2; to copy charset info
	       }
            | scope_spec simple_host_variable
               {
                 $$ = NULL;
               }

/* item */
entity_name_as_item : identifier
		{
		  $$ = new (PARSERHEAP()) ConstValue(*$1);
		}
		
            | simple_host_variable
               {
                  if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_OFF) 
                    {
                      TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
                      
                      $$ = $1;
                    }
               }

/* Note that there is a default on the scope_spec which is: local.          */
/* A value of TRUE means GLOBAL and FALSE means LOCAL.                      */

/* boolean */
scope_spec :   { $$ = FALSE;  /* default to LOCAL, FALSE */ }
           | TOK_GLOBAL   { $$ = TRUE; }
           | TOK_LOCAL    { $$ = FALSE; }



/* A cursor-spec, for now, is really just a query_expression.  We provide
 * the full syntax that includes the order_by_clause and so on, but
 * we warn the user that these clauses are ignored.  Later, we will
 * implement the semantic actions to support the syntax.
 */
cursor_spec : query_exp_for_cursor
	    | rowset_for_input query_exp_for_cursor
		{
		    // Make sure the root is on top of the rowsetfor node
		    // the parse tree is root->rowsetfor->previous child of root
		    $1->setChild(0, $2->child(0));
		    $2->setChild(0, $1);
		    $$ = $2;
		} 

query_exp_for_cursor : query_expression for_update_spec
			{
			    $$ = finalize($1, FALSE/*i.e., no outputVar count checking*/);
			    $2->finalizeUpdatability($$);
			}
		    | query_expression order_by_clause access_type optional_lock_mode for_update_spec
			{
			    $$ = finalize($1, FALSE/*i.e., no outputVar count checking*/);
			    ((RelRoot *)$$)->addOrderByTree($2);
			    if (!finalizeAccessOptions($$, $3, $4)) YYERROR;
			    $5->finalizeUpdatability($$);
			}

/* forUpdateSpec */
for_update_spec: TOK_FOR_READ_ONLY
                     { $$ = new (PARSERHEAP()) ForUpdateSpec(TRUE, FALSE); }
	       | TOK_FOR TOK_UPDATE
                     { $$ = new (PARSERHEAP()) ForUpdateSpec(TRUE, TRUE); }
               | TOK_FOR TOK_UPDATE TOK_OF column_list
                     { $$ = new (PARSERHEAP()) ForUpdateSpec(TRUE, TRUE, $4);}
               | /*empty*/
                     { $$ = new (PARSERHEAP()) ForUpdateSpec(FALSE); }


/* In order to setup the host var roles for the host variables in hostvar_list
 * we take the count obtained from hostvar_list and use it to
 * set the last n host vars whose roles are unassigned to HV_IS_INPUT.
 */

using_clause: TOK_USING input_hostvar_list
                   {
		     TheHostVarRoles->setLastNunassignedTo($2,HV_IS_INPUT);
		   }

/* Similar to the using clause, for the into_clause we set the roles
 * so obtained to HV_IS_OUTPUT. If we are in an a compound statement, then
 * the INTO clause is equivalent to a SET, or assignment, statement, in which
 * case the variable must be treated as both input and output
 */
into_clause: TOK_INTO {InAssignmentSt = TRUE;} output_hostvar_list
  {

    if (intoClause && (in3GL_ == 0)) {
      // More than one INTO statement in the same query is not supported
      *SqlParser_Diags << DgSqlCode(-30011);
      YYERROR;
	}
    ThereAreAssignments = (in3GL_ > 0);
	if (ThereAreAssignments) {
	  TheHostVarRoles->setLastNunassignedTo($3,HV_IS_INPUT_OUTPUT);
	}
	else {
      TheHostVarRoles->setLastNunassignedTo($3,HV_IS_OUTPUT);
	}
    intoClause = TRUE;	
	InAssignmentSt = FALSE;
    NumOfScalars = NumOfArrays = 0;
  }

/* This non-terminal must count how many host variable expressions occur and
 * then return that count as the data belonging to $$.
 */


/* uint */
output_hostvar_list : hostvar_expression
           {
			 // Get variable just inserted
			 HostVar *var = (HostVar *) ((*AllHostVars)[AllHostVars->entries() - 1]);

			 if (var->getType()->getTypeQualifier() == NA_ROWSET_TYPE) {
			    NumOfArrays++;
			 }
			 else {
			    NumOfScalars++;
			 }
			 
			 // In the output list, we should have only scalar or only arrays
			 if ((NumOfArrays > 0) && (NumOfScalars > 0)) {
			   *SqlParser_Diags << DgSqlCode(-30006);
               YYERROR;
			 }

		     $$  = 1;
		   }

        | output_hostvar_list ',' hostvar_expression
           {

			 // Get variable just inserted
			 HostVar *var = (HostVar *) ((*AllHostVars)[AllHostVars->entries() - 1]);

			 if (var->getType()->getTypeQualifier() == NA_ROWSET_TYPE) {
			    NumOfArrays++;
			 }
			 else {
			    NumOfScalars++;
			 }
			 
			 // In the output list, we should have only scalar or only arrays
			 if ((NumOfArrays > 0) && (NumOfScalars > 0)) {
			   *SqlParser_Diags << DgSqlCode(-30006);
               YYERROR;
			 }

		     $$ = $1 + 1;
		   }

/* uint */
input_hostvar_list : input_hostvar_expression
                   {
		     $$  = 1;
		   }

             | input_hostvar_list ',' input_hostvar_expression
                   {
		     $$ = $1 + 1;
		   }

/* OPEN CURSOR
 * -----------
 * We parse a general grammar
 * handling the static, dynamic, and extended dyanamic cases all as
 * going to a single non-terminal for the open statement.  This differs
 * from our approach to cursor declaration in that for cursor declaration
 * we have distinct non-terminals for these various cases.  However, the
 * consumers of these data structures are different in these two cases.
 * With the open cursor statement, only the preprocessor sees it, and the
 * preprocessor is designed to be able to translate the general case.
 *   We need merely to enforce certain constraints when we interpret
 * the parsed data (see the Preprocessor's dosql() routine).  Namely,
 * if the open cursor statement names the cursor statically, then there
 * can be no descriptor nor host variables named in the statement.  Conversely,
 * if there ARE host variables or descriptor named, then the cursor must
 * be designated by means of a name of a dynamic descriptor, or, by an
 * extended dynamic name given by a string valued host variable expression.
 * We can enforce that here in the parser.  The preprocessor code maps the
 * returned Statement Node to its internal structures for generating output.
 */

/* stmt_ptr */
open_cursor : TOK_OPEN entity_name
                 {
                   assignRoleToFirst($2,HV_IS_CURSOR_NAME);
                   $$ = new (PARSERHEAP())
		     StmtOpen( $2, new (PARSERHEAP()) designation(DT_NULL));
                 }

            | TOK_OPEN entity_name extended_input_designation
                {
                   assignRoleToFirst($2,HV_IS_CURSOR_NAME);
                   $$ = new (PARSERHEAP()) StmtOpen( $2, $3);
                }


/* Extended input designation is about specifying either an input host
 * variable list, OR, an input descriptor.
 *
 * using_clause takes care of setting host variable roles.
 *
 * In the case of entity_name, we need to do the usual assignment of roles.
 */


/* dsgtn */
extended_input_designation : using_clause
                   {
                      $$ = new (PARSERHEAP()) designation(DT_HVLIST);
                   }
                | using_descriptor

/* dsgtn */
using_descriptor : TOK_USING   TOK_SQL    TOK_DESCRIPTOR  entity_name
                    {
		      assignRoleToLast($4,HV_IS_DESC_SOURCE);
		      $$ = new (PARSERHEAP()) designation($4);
                    }

/* fetch cursor.  Fetch is just like open, EXCEPT, that the
 * extended_input_designation IS extended_output_designation.  So here
 * we go: observe the copy/paste results that follow, based on OPEN CURSOR.
 *
 * The only real difference (except for the input/output change) from
 * OPEN CURSOR to FETCH CURSOR is that with Fetch, the user MUST
 * provide at least one output host variable to receive the data.  With
 * OPEN, the user is NOT required to provide an input variable if they choose
 * not to.
 */


/* stmt_ptr */
fetch_cursor :  TOK_FETCH entity_name extended_output_designation
                {
                   assignRoleToFirst($2,HV_IS_CURSOR_NAME);
                   $$ = new (PARSERHEAP()) StmtFetch( $2, $3);
                }
             |  TOK_FETCH TOK_FROM entity_name extended_output_designation
                {
                   assignRoleToFirst($3,HV_IS_CURSOR_NAME);
                   $$ = new (PARSERHEAP()) StmtFetch( $3, $4);
                }


/* Extended output designation is about specifying either an output host    */
/* variable list, OR, an output descriptor.                                 */

/* dsgtn */
extended_output_designation :  into_clause
                   {
                      $$ = new (PARSERHEAP()) designation(DT_HVLIST);
                   }
                | into_descriptor

/* dsgtn */
into_descriptor : TOK_INTO  TOK_SQL      TOK_DESCRIPTOR  entity_name
                    {
		      assignRoleToLast($4,HV_IS_DESC_DEST);
                      $$ = new (PARSERHEAP()) designation($4);
                      intoClause = TRUE;
                    }

/* prepare dynamic statement                                                */
/* The entity_name has to be for a statement.  The host_variable            */
/* expression has to be string valued.                                      */

/* stmt_ptr */
dynamic_prepare : TOK_PREPARE entity_name TOK_FROM  simple_host_variable
                 {
		   assignRoleToFirst($2,HV_IS_STMT_NAME);
		   TheHostVarRoles->setLastUnassignedTo(HV_IS_STRING);
		   $$ = new (PARSERHEAP()) StmtPrepare($2);
                 }


/* See the preprocessor Internal Spec  and External Spec. for reference     */
/* to information concerning the RETURNING clause of the EXECUTE statement. */
/*                                                                          */
/* Note that in addition to not supporting the RETURNING clause, we also    */
/* are not supporting the INTO clause (for now, anyway).                    */

/* stmt_ptr */
dynamic_execute : TOK_EXECUTE     entity_name
                 {
		   assignRoleToFirst($2, HV_IS_STMT_NAME);
                   $$ = new (PARSERHEAP())
		     StmtExecute($2, new (PARSERHEAP()) designation(DT_NULL));
                 }

              | TOK_EXECUTE   entity_name    extended_input_designation
                 {
		   assignRoleToFirst($2, HV_IS_STMT_NAME);
                   $$ = new (PARSERHEAP()) StmtExecute($2,$3);
                 }

              | TOK_EXECUTE   entity_name    extended_output_designation
                 {
		   assignRoleToFirst($2, HV_IS_STMT_NAME);
                   $$ = new (PARSERHEAP()) StmtExecute($2,NULL,$3);
                 }

              | TOK_EXECUTE entity_name extended_input_designation extended_output_designation
                 {
		   assignRoleToFirst($2, HV_IS_STMT_NAME);
                   $$ = new (PARSERHEAP()) StmtExecute($2,$3,$4);
                 }

/* stmt_ptr */
execute_immediate : TOK_EXECUTE    TOK_IMMEDIATE    simple_host_variable
           {
	     TheHostVarRoles->setFirstUnassignedTo(HV_IS_STRING);
             $$ = new (PARSERHEAP()) StmtNode(STM_EXEC_IMMED); 
           }

/* stmt_ptr */
whenever_statement : TOK_WHENEVER 
          {
	    SqlParser_WheneverClause = TRUE;
	  }
		     whenever_condition whenever_action
          {
	    $$ = new (PARSERHEAP()) StmtWhenever((MBD_CONDITION)$3, $4);
	    SqlParser_WheneverClause = FALSE;
	  }

/* uint -- really some enumerations */
whenever_condition : TOK_NOT TOK_FOUND    { $$ = onEnd; }
                   | TOK_SQLERROR  { $$ = onError; }
                   | TOK_SQL_WARNING  { $$ = on_Warning; }

/* actn_ptr */
whenever_action : CALL_CASED_IDENTIFIER
                  {
                    NAString casedIdent;
                    parseCasedIdentifier(ParCALL_CASED_IDENTIFIER_CLAUSE,
                                         $1, casedIdent);
                    $$ = new (PARSERHEAP()) action;
                    $$->setActionLabel( CALL_ACTION, casedIdent);
                    delete $1;
                  }

                | CALL_CASED_IDENTIFIER '.' regular_identifier
                  {
                     NAString casedIdent,casedIdent2;
                     parseCasedIdentifier(ParCALL_CASED_IDENTIFIER_CLAUSE,
                                           $1, casedIdent);
                     $$ = new (PARSERHEAP()) action;
		     casedIdent.append(".");
                     casedIdent.append($3->data());
                     $$->setActionLabel( CALL_ACTION, casedIdent);
                     delete $1;
                     delete $3;
                  }

//                  TOK_CALL host_identifier
//                  {  $$ = new (PARSERHEAP()) action;
//                     $$->setActionLabel( CALL_ACTION, *$2);
//                     delete $2;
//                  }

//                | TOK_GOTO host_identifier
//                  {  $$ = new (PARSERHEAP()) action;
//                     $$->setActionLabel( GOTO_ACTION, *$2);
//                     delete $2;
//                  }
//
//                | TOK_GO TOK_TO host_identifier
//                  {  $$ = new (PARSERHEAP()) action;
//                     $$->setActionLabel( GOTO_ACTION, *$3);
//                     delete $3;
//                  }

                | GOTO_CASED_IDENTIFIER
                  {
                     NAString casedIdent;
                     parseCasedIdentifier(ParGOTO_CASED_IDENTIFIER_CLAUSE,
                                           $1, casedIdent);
                     $$ = new (PARSERHEAP()) action;
                     $$->setActionLabel( GOTO_ACTION, casedIdent);
                     delete $1;
                  }

                | PERFORM_CASED_IDENTIFIER
                  {
                     NAString casedIdent;
                     parseCasedIdentifier(ParPERFORM_CASED_IDENTIFIER_CLAUSE,
                                          $1, casedIdent);
                     $$ = new (PARSERHEAP()) action;
                     $$->setActionLabel( CALL_ACTION, casedIdent);
                     delete $1;
                  }

                | TOK_CONTINUE
                  {  $$ = new (PARSERHEAP()) action;
                     $$->setActionLabel( NULL_ACTION, "");
                  }

/* describe prepared statement.                                             */
/* We are going to create this assuming only ANSI descriptors and NOT       */
/* those wacky SQL/MP type descriptors.  That will be for another day       */
/* (read: for another milestone).                                           */
/*                                                                          */
/* The first entity_name is for a statement, the second entity_name is for  */
/* a descriptor. We need to be a little clever about how we assign roles to */
/* host vars used (if any) in the entity_name non terminals.  This is       */
/* because there may be zero, one, or two such host variables, and the      */
/* action of "assignRoleToFirst" (or last) won't be the same in all such    */
/* cases ;-)  */

/* stmt_ptr */
describe_statement :
   TOK_DESCRIBE   output_or_input     entity_name   describe_target
    {
      if ($3 == NULL)
	assignRoleToFirst($3, HV_IS_STMT_NAME);
//      if ($4 == NULL)
//	assignRoleToLast($4, HV_IS_DESC_NAME);
      $$ = new (PARSERHEAP()) StmtDescribe($2,$3,$4);
    }

describe_target : TOK_INTO entity_name
                  {
	            assignRoleToLast($2, HV_IS_DESC_NAME);
		    $$ = $2;
		  }
                | using_descriptor
                  {
		    $$ = $1->descName;
		  }
// 17.9 says that into can only be used in dynamic fetch or result using clause
// also, preprocessors conform to this and can't handle into usage
//                | into_descriptor
//                  {
//		    $$ = $1->descName;
//		  }

/* uint -- actually an enum */
output_or_input :   { $$ = OUTPUT_DIRECTION; }
                |  TOK_INPUT  { $$ = INPUT_DIRECTION; }
                |  TOK_OUTPUT { $$ = OUTPUT_DIRECTION; }



/* ALLOCATE STATIC input descriptor  name_of_desc for <statement | cursor> */
/* name_of_stmt_or_cursor <this is the host variable type list>            */
/*                                                                         */
/* The type of this non-terminal is stmt_ptr, since it is a kind of        */
/* statement to be represented by a StmtNode derived class.                */
/*                                                                         */
/* To satisfy the args of StmtAllocStaticDesc:                             */
/* For the namePlusDescPtr, we get a new one, and then supply the          */
/* descriptor name and the host_var_type_list.                             */
/* For theTag, we get that out of the for_stmt_or_curs struct.             */
/* For theName, we also get that out of the for_stmt_or_curs struct.       */
/*                                                                         */
/*                                                                         */

/* stmt_ptr */
alloc_static_desc_stmt : TOK_ALLOCATE TOK_STATIC input_or_output
        TOK_DESCRIPTOR identifier for_stmt_or_curs '(' host_var_type_list ')'

/* all we're going to do here is stuff the data we get back from the
 * right side of this production, stuff it into a structure,
 * StmtAllocStaticDesc.  It's already packaged up by the right side non-terms.
 */
       {
          $$ = new (PARSERHEAP()) StmtAllocStaticDesc
	    (new (PARSERHEAP()) NamePlusDesc($5,
					 $3==INPUT_DIRECTION,
					 $8),
	     $6->tag,
	     $6->theName);
       }

alloc_static_desc_stmt : TOK_ALLOCATE TOK_STATIC input_or_output
        TOK_DESCRIPTOR identifier for_stmt_or_curs TOK_LPAREN_BEFORE_DATATYPE host_var_type_list ')'

/* all we're going to do here is stuff the data we get back from the
 * right side of this production, stuff it into a structure,
 * StmtAllocStaticDesc.  It's already packaged up by the right side non-terms.
 */
       {
          $$ = new (PARSERHEAP()) StmtAllocStaticDesc
	    (new (PARSERHEAP()) NamePlusDesc($5,
					 $3==INPUT_DIRECTION,
					 $8),
	     $6->tag,
	     $6->theName);
       }

/* Then for the input_or_output non-term, it should return a value          */
/* that's an enumeration indicating the direction of the descriptor.        */
/* Note that it can be epsilon..which defaults to input.                    */
/*                                                                          */

/* uint -- actually an enum */
input_or_output :   { $$ = INPUT_DIRECTION; }
                |  TOK_INPUT  { $$ = INPUT_DIRECTION; }
                |  TOK_OUTPUT { $$ = OUTPUT_DIRECTION; }


/* A for_stmt_or_curs non-terminal can either be empty,                     */
/* or indicate a string which names                                         */
/* a cursor, or which names a statement.                                    */
/*                                                                          */
/* If it were simply a string pointer, it would have either a NULL or valid */
/* value, and then we need to pass a tag back, telling what kind as well.   */
/*                                                                          */
/* For the default case, we get a new StmtOrCursTag, its name will be empty */
/* as that is the default constructor's result for NAString.                */
/* Also, we set the StmtOrCursTag's                                         */
/* tag to NAME_ABSENT.                                                     */


/* stmt_or_curs */
for_stmt_or_curs :
                   {
                      $$ = new (PARSERHEAP()) StmtOrCursTag;
                      $$->tag = NAME_ABSENT;
                      $$->theName = new (PARSERHEAP()) NAString (PARSERHEAP()); // theName pts to empty str
                   }

              | TOK_FOR TOK_STATEMENT identifier
                   {
                      $$ = new (PARSERHEAP()) StmtOrCursTag;
                      $$->tag = NAME_STATEMENT;
                      $$->theName = $3;
                   }
              | TOK_FOR TOK_CURSOR    identifier
                   {
                      $$ = new (PARSERHEAP()) StmtOrCursTag;
                      $$->tag = NAME_CURSOR;
                      $$->theName = $3;
                   }

/* And... in addition to what it says next, this non-terminal
 * now supports the StaticDescItem as a member of the generated
 * data structure (a sequence).  (...more later...)
 */

/* The host variable type list is a sequence of
 * 0 or more pairs.  Each pair is a sql type followed by a string
 * that specifies either nullable, "NULL," or not nullable "NOT NULL."
 *
 * In the case that "NULL" appears, that means that there is a
 * raw-host-variable of SQL type "SMALLINT."
 *
 * All we have to do is make sure that we return a DescTypeList.  It
 * can be empty, have a single element, or, multiple elements.
 */

/* descTypeList */
host_var_type_list :  { /* this is the empty-list case */
                        $$ = new (PARSERHEAP()) DescTypeList (PARSERHEAP());
                      }
                   | host_var_type_item
                      {
                        $$ = new (PARSERHEAP()) DescTypeList (PARSERHEAP());
                        $$->append($1);
                      }
                   | host_var_type_list ',' host_var_type_item
                      {
                        $$ = $1;
                        $$->append($3);
                      }

/* The host_var_type_item is a SQL type followed by NULL or NOT NULL.
 *
 * Each host_var_type_item is a struct containing a flag and then
 * SQL data type.
 *
 * We can represent the NULLABLE/NOT NULLABLE by means of a boolean,
 * of course, say, isNullable.
 */

/* staticDescItem */
host_var_type_item : proc_arg_data_type TOK_NULL
                      {
			if ($1->isExternalType()) externalDataTypeCnt_--;
                        HostVarExprType *t = new (PARSERHEAP()) HostVarExprType;
                        t->isNullable = TRUE;
                        t->the_type = $1;
                        $$ = new (PARSERHEAP()) StaticDescItem(t);
                      }
                   | proc_arg_data_type TOK_NOT TOK_NULL
                      {
			if ($1->isExternalType()) externalDataTypeCnt_--;
                        HostVarExprType *t = new (PARSERHEAP()) HostVarExprType;
                        t->isNullable = FALSE;
                        t->the_type = $1;
                        $$ = new (PARSERHEAP()) StaticDescItem(t);
                      }
                   | literal_negatable
                      {
                        assert($1->getOperatorType() == ITM_CONSTANT);
                        $$ = new (PARSERHEAP()) StaticDescItem ((ConstValue *) $1);
                      }


/* The format of a procedure statement is pretty easy, actually:            */
/*                                                                          */
/* PROCEDURE name_of_proc ( proc_arg_decls ) sql_statement                  */
/*                                                                          */
/* Note that the parser COULD be the one which, at this point, verifies     */
/* that the host var list has names which match up exactly with the names   */
/* which occur in the sql statement.                                        */

/* stmt_ptr */
procedure_stmt : TOK_PROCEDURE identifier argList_establishment sql_statement
                 {
		   $$ = new (PARSERHEAP()) StmtProcedure( $2, $4);
                 }

/* The purpose of this production is to cause the
 * HVArgTypeLookup from the header of a procedure to be
 * assigned to the static var TheProcArgTypes.  This makes it available
 * later in the right side of procedure_stmt.  This is part of the scheme
 * of passing the types of host variables to the point where we do
 * the reduction to a HostVar() class object.
 */

/* uint -- but doesn't matter */
argList_establishment : '(' proc_arg_decls ')'
                 {
		   assert(!TheProcArgTypes);	// otherwise, memory leak!
                   TheProcArgTypes = $2;
                   $$ = 0;  // dummy value, doesn't matter
		 }

// An hvArgtypeLookup can be an empty list, or have one or more items.
//
// Each item is either a hostvar (:ident, per Ansi syntax 12.3 + 5.4)
// or an identifier (no colon in front, Tandem-extension),
// followed by a SQL datatype.
//
// This hostvar-or-ident flexibility has a tiny chance of causing an ambiguity;
// see comments in the HOSTVAR production in SqlLexer.l.
//
/* hvArgtype */
proc_arg_decl  : HOSTVAR proc_arg_data_type
		 {
		   // HOSTVAR $1 has a :colon, courtesy of SqlLexer
		   $$ = new (PARSERHEAP()) HVArgType($1, $2);
		   if ($2->isExternalType()) externalDataTypeCnt_--;
		 }
               | identifier proc_arg_data_type
		 {
		   $1->prepend(':');	// $1 is now :ident, same fmt as HOSTVAR
		   $$ = new (PARSERHEAP()) HVArgType($1, $2);
		   if ($2->isExternalType()) externalDataTypeCnt_--;
		 }

/* hvArgtypeLookup */
proc_arg_decls : {
		   $$ = new (PARSERHEAP()) HVArgTypeLookup (PARSERHEAP());
		 }
               | proc_arg_decl
		 {
		   $$ = new (PARSERHEAP()) HVArgTypeLookup (PARSERHEAP());
		   $$->insert($1);
		 }
               | proc_arg_decls ',' proc_arg_decl
		 {
		   if ($$->get($3->getName()))
		     {
		       // ANSI 12.3 SR 2  (err 3160 "param declared twice")
		       *SqlParser_Diags << DgSqlCode(-3160)
		         << DgString0(*$3->getName());
		       YYERROR;
		     }
		   $$->insert($3);
		 }


/* stmt_ptr */
module_statement : TOK_MODULE module_name TOK_NAMES TOK_ARE identifier
             {
	       QualifiedName *modName = qualifiedNameFromStrings($2);
	       if (!modName) YYERROR;
               $$ = new (PARSERHEAP()) StmtModule(*modName, *$5, PARSERHEAP());
             }
		 | TOK_MODULE module_name
             {
	       QualifiedName *modName = qualifiedNameFromStrings($2);
	       if (!modName) YYERROR;
	       NAString cs(CharInfo::getCharSetName(CharInfo::DefaultCharSet));
               $$ = new (PARSERHEAP()) StmtModule(*modName, cs, PARSERHEAP());
             }

/* stmt_ptr */
source_file_statement : TOK_SOURCE_FILE QUOTED_STRING
             { 
               // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
               $$ = new (PARSERHEAP()) StmtSourceFile($2);
             }

/* TIMESTAMP DEFINITION timestamp
 *
 * Does POSIX allow us to
 * use the seconds since midnight Jan. 1, 1970?  I'll bet yes, and that will
 * further mean that an unsigned long has just become what we are
 * going to represent <timestamp> as.
 *
 * So, for convenience reasons, then, we'll put parens around the
 * number in the timestamp. That's because I would prefer having only a single
 * non-terminal which does unsigned-verification of a NUMERIC_LITERAL
 * and the CLOSEST FIT to that requirement is left_unsigned_right.
 */
module_timestamp : TOK_TIMESTAMP TOK_DEFINITION left_largeint_right
        {
           NABoolean junkme = FALSE;
           ConstValue *theValue = $3->castToConstValue(junkme);
           $$ = new (PARSERHEAP()) StmtTimeStamp( 
                   * (Int64 *) (theValue->getConstValue()) );
        }


/* allocate dynamic descriptor */


dealloc_stmt_statement : TOK_DEALLOCATE TOK_PREPARE entity_name
   {
      assignRoleToLast($3, HV_IS_STMT_NAME);
      $$ = new (PARSERHEAP()) StmtDeallocStm($3);
   }

dealloc_desc_statement : TOK_DEALLOCATE TOK_DESCRIPTOR entity_name
   {
      assignRoleToLast($3, HV_IS_DESC_NAME);
      $$ = new (PARSERHEAP()) StmtDeallocDesc($3);
   }

close_statement : TOK_CLOSE entity_name
   {
      assignRoleToLast($2, HV_IS_CURSOR_NAME);
      $$ = new (PARSERHEAP()) StmtClose($2);
   }

// The grammar allows a SQL literal,
// or a simple input host variable.  No prototype is allowed, and
// no environment variable is allowed.
// The literal is as a string, and it gets queued into the StmtNode
// literal list.  If there is a host variable, its role gets set
// to "input."  A host variable's
// non-terminal value, a HostVar node, gets deleted.
// That's because the SQL compiler never looks at host variables used in
// simple value specifications.

simple_value_spec : literal_as_string
          {
             // enqueue the $1 literal string to the string list by appending
             (CURRENTSTMT->getParserStmtLiteralList()).append($1);
             TheHostVarRoles->addARole(HV_IS_LITERAL); 
             $$ = 0;  // just set 0 as a don't care value
          }
      | simple_host_variable
          {
            if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_OFF) 
              {
                // don't delete the hostvar since it is shared with AllHostVars...
                TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
                $$ = 0;  // just set 0 as a don't care value
              }
          }

// The ALLOCATE DESCRIPTOR has an optional "max value," so we yet
// need to implement that part of the syntax and supply the default
// value of 500.

alloc_desc_statement : TOK_ALLOCATE TOK_DESCRIPTOR entity_name
                         TOK_WITH TOK_MAX simple_value_spec
           {
              if ($3 == NULL)
                TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
              $$ = new (PARSERHEAP()) StmtAllocDesc($3); 
           }
        | TOK_ALLOCATE TOK_DESCRIPTOR entity_name
           {
              if ($3 == NULL)
                TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
              $$ = new (PARSERHEAP()) StmtAllocDesc($3); 
             (CURRENTSTMT->getParserStmtLiteralList()).append(new (PARSERHEAP()) 
                                               NAString("500", PARSERHEAP()));
              TheHostVarRoles->addARole(HV_IS_LITERAL); 
           }


// We need to make sure the entity_name ($3) gets a role of
// descriptor, in case a host variable gave the name of the descriptor.
// We discard the simple_host_variable's HostVar Node since we don't need it,
// but we let the preprocessor know that that host variable should have
// a mode of output.

get_desccount_statement : TOK_GET TOK_DESCRIPTOR entity_name
simple_host_variable '=' TOK_COUNT
      {
         if ($3 == NULL)
            TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
         delete $4;  // don't need the host variable node
         TheHostVarRoles->setLastUnassignedTo(HV_IS_OUTPUT);
         $$ = new (PARSERHEAP()) StmtGetDescCount($3);
      }

get_rowsetsize_statement : TOK_GET TOK_DESCRIPTOR entity_name
simple_host_variable '=' TOK_ROWSET_SIZE
      {
         if ($3 == NULL)
            TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
         delete $4;  // don't need the host variable node
         TheHostVarRoles->setLastUnassignedTo(HV_IS_OUTPUT);
         $$ = new (PARSERHEAP()) StmtGetRowsetSize($3);
      }

/* longSeq */
get_info_item_list : get_info_item
              {
                  $$ = new (PARSERHEAP()) SequenceOfLong (PARSERHEAP());
                  assert($$);
                  $$->append(new (PARSERHEAP()) long($1));
              }
           | get_info_item_list ',' get_info_item
              {
                  $$ = $1;
                  $$->append(new (PARSERHEAP()) long($3));
              }

/* longint */
get_info_item : simple_host_variable '=' info_item_name
              {
                 delete $1;
                 TheHostVarRoles->setLastUnassignedTo(HV_IS_OUTPUT);
                 $$ = $3;
              }

/* longint */
info_item_name :  TOK_TYPE        { $$ = SQLDESC_TYPE; }
   | TOK_TYPE_ANSI                { $$ = SQLDESC_TYPE; }
   | TOK_TYPE_FS                  { $$ = SQLDESC_TYPE_FS; } 
   | TOK_DATETIME_CODE            { $$ = SQLDESC_DATETIME_CODE; }
   | TOK_LENGTH                   { $$ = SQLDESC_LENGTH; }
   | TOK_OCTET_LENGTH             { $$ = SQLDESC_OCTET_LENGTH; }
   | TOK_PRECISION                { $$ = SQLDESC_PRECISION; }
   | TOK_SCALE                    { $$ = SQLDESC_SCALE; }
   | TOK_LEADING_PRECISION        { $$ = SQLDESC_INT_LEAD_PREC; }
   | TOK_NULLABLE                 { $$ = SQLDESC_NULLABLE; }
   | TOK_CHAR TOK_SET             { $$ = SQLDESC_CHAR_SET; }
   | TOK_CHARACTER TOK_SET        { $$ = SQLDESC_CHAR_SET; }
   | TOK_CHARACTER_SET_CATALOG    { $$ = SQLDESC_CHAR_SET_CAT; }
   | TOK_CHARACTER_SET_SCHEMA     { $$ = SQLDESC_CHAR_SET_SCH; }
   | TOK_CHARACTER_SET_NAME       { $$ = SQLDESC_CHAR_SET_NAM; }
   | TOK_COLLATION                { $$ = SQLDESC_COLLATION; }
   | TOK_COLLATION_CATALOG        { $$ = SQLDESC_COLL_CAT; }
   | TOK_COLLATION_SCHEMA         { $$ = SQLDESC_COLL_SCH; }
   | TOK_COLLATION_NAME           { $$ = SQLDESC_COLL_NAM; }
   | TOK_NAME                     { $$ = SQLDESC_NAME; }
   | TOK_UNNAMED                  { $$ = SQLDESC_UNNAMED; }
   | TOK_HEADING                  { $$ = SQLDESC_HEADING; }
   | TOK_INDICATOR_TYPE           { $$ = SQLDESC_IND_TYPE; }
   | TOK_VARIABLE_POINTER         { $$ = SQLDESC_VAR_PTR; }
   | TOK_ROWSET_VAR_LAYOUT_SIZE   { $$ = SQLDESC_ROWSET_VAR_LAYOUT_SIZE; }
   | TOK_INDICATOR_POINTER        { $$ = SQLDESC_IND_PTR; }
   | TOK_ROWSET_IND_LAYOUT_SIZE   { $$ = SQLDESC_ROWSET_IND_LAYOUT_SIZE; }
   | TOK_RETURNED_LENGTH          { $$ = SQLDESC_RET_LEN; }
   | TOK_RETURNED_OCTET_LENGTH    { $$ = SQLDESC_RET_OCTET_LEN; }
   | TOK_DATA                     { $$ = SQLDESC_VAR_DATA; }
   | TOK_VARIABLE_DATA            { $$ = SQLDESC_VAR_DATA; }
   | TOK_INDICATOR                { $$ = SQLDESC_IND_DATA; }
   | TOK_INDICATOR_DATA           { $$ = SQLDESC_IND_DATA; }
   | TOK_PARAMETER_MODE           { $$ = SQLDESC_PARAMETER_MODE; }
   | TOK_PARAMETER_ORDINAL_POSITION  { $$ = SQLDESC_ORDINAL_POSITION; }
   | TOK_PARAMETER_INDEX	     { $$ = SQLDESC_PARAMETER_INDEX; }
   | TOK_DATA_OFFSET              { $$ = SQLDESC_DATA_OFFSET; }
   | TOK_NULL_IND_OFFSET          { $$ = SQLDESC_NULL_IND_OFFSET; }
   | TOK_ALIGNED_LENGTH           { $$ = SQLDESC_ALIGNED_LENGTH; }

get_descitem_statement : TOK_GET TOK_DESCRIPTOR entity_name TOK_VALUE
          simple_value_spec get_info_item_list
      {
         if ($3 == NULL)
           TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
          $$ = new (PARSERHEAP()) StmtGetDescItem($3,$6);
      }

// This statement has a lot in common with "allocate descriptor" because
// the data involved is: 1) a name of a descriptor 2) a simple value spec.

set_desccount_statement : TOK_SET TOK_DESCRIPTOR entity_name TOK_COUNT
           '=' simple_value_spec
      {
         if ($3 == NULL)
           TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
         $$ = new (PARSERHEAP()) StmtSetDescCount($3); 
      }

set_rowsetsize_statement : TOK_SET TOK_DESCRIPTOR entity_name TOK_ROWSET_SIZE
           '=' simple_value_spec
      {
         if ($3 == NULL)
           TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
         $$ = new (PARSERHEAP()) StmtSetRowsetSize($3); 
      }

/* longSeq */
set_info_item_list : set_info_item
              {
                  $$ = new (PARSERHEAP()) SequenceOfLong (PARSERHEAP());
                  assert($$);
                  $$->append(new (PARSERHEAP()) long($1));
              }
           | set_info_item_list ',' set_info_item
              {
                  $$ = $1;
                  $$->append(new (PARSERHEAP()) long($3));
              }

/* longint */
set_info_item : info_item_name '=' simple_value_spec
              {
                 $$ = $1;
              }

set_descitem_statement : TOK_SET TOK_DESCRIPTOR entity_name TOK_VALUE
        simple_value_spec set_info_item_list
      {
         if ($3 == NULL)
           TheHostVarRoles->setFirstUnassignedTo(HV_IS_DESC_NAME);
         $$ = new (PARSERHEAP()) StmtSetDescItem($3,$6); 
      }

// For the first rule, we want to create a StmtDiagItemList
// fresh, and place the $1 into it.
// For the second rule, we want to append the new item to the
// list we should already have.

stmt_info_item_list : stmt_info_item
              {
                  $$ = new (PARSERHEAP()) SequenceOfLong (PARSERHEAP());
                  assert($$);
                  $$->append(new (PARSERHEAP()) long($1));
              }
           | stmt_info_item_list ',' stmt_info_item
              {
                  $$ = $1;
                  $$->append(new (PARSERHEAP()) long($3));
              }

stmt_info_item : simple_host_variable '=' stmt_info_item_name
              {
                 delete $1;
                 TheHostVarRoles->setLastUnassignedTo(HV_IS_OUTPUT);
                 $$ = $3;
              }


stmt_info_item_name :  TOK_NUMBER            { $$ = SQLDIAG_NUMBER; }
                     | TOK_MORE              { $$ = SQLDIAG_MORE;   }
                     | TOK_COMMAND_FUNCTION  { $$ = SQLDIAG_COMMAND_FUNC; }
                     | TOK_DYNAMIC_FUNCTION  { $$ = SQLDIAG_DYNAMIC_FUNC; }
                     | TOK_ROW_COUNT         { $$ = SQLDIAG_ROW_COUNT; }
                     | TOK_AVERAGE_STREAM_WAIT      { $$ = SQLDIAG_AVERAGE_STREAM_WAIT; }
                     | TOK_COST              { $$ = SQLDIAG_COST; }
                     | TOK_FIRST_FSCODE      { $$ = SQLDIAG_FIRST_FSCODE; }
                     | TOK_LAST_FSCODE       { $$ = SQLDIAG_LAST_FSCODE; }
                     | TOK_LAST_SYSKEY       { $$ = SQLDIAG_LAST_SYSKEY; }

get_stmtdiags_statement : TOK_GET TOK_DIAGNOSTICS stmt_info_item_list
      {
         $$ = new (PARSERHEAP()) StmtStmtDiag($3);
      }

// SequenceOfLong
cond_info_item_list : cond_info_item
              {
                  $$ = new (PARSERHEAP()) SequenceOfLong (PARSERHEAP());
                  assert($$);
                  $$->append(new (PARSERHEAP()) long($1));
              }
           | cond_info_item_list ',' cond_info_item
              {
                  $$ = $1;
                  $$->append(new (PARSERHEAP()) long($3));
              }

cond_info_item : simple_host_variable '=' cond_info_item_name
              {
                 delete $1;
                 TheHostVarRoles->setLastUnassignedTo(HV_IS_OUTPUT);
                 $$ = $3;
              }


cond_info_item_name : TOK_CONDITION_NUMBER { $$ = SQLDIAG_COND_NUMBER;}
  | TOK_SQLCODE                       { $$ = SQLDIAG_SQLCODE; }
  | TOK_RETURNED_SQLSTATE             { $$ = SQLDIAG_RET_SQLSTATE;}
  | TOK_CLASS_ORIGIN                  { $$ = SQLDIAG_CLASS_ORIG;}
  | TOK_SUBCLASS_ORIGIN               { $$ = SQLDIAG_SUBCLASS_ORIG;}
  | TOK_SERVER_NAME                   { $$ = SQLDIAG_SERVER_NAME;}
  | TOK_CONNECTION_NAME               { $$ = SQLDIAG_CONNECT_NAME;}
  | TOK_CONSTRAINT_CATALOG            { $$ = SQLDIAG_CONSTR_CAT;}
  | TOK_CONSTRAINT_SCHEMA             { $$ = SQLDIAG_CONSTR_SCHEMA;}
  | TOK_CONSTRAINT_NAME               { $$ = SQLDIAG_CONSTR_NAME;}
  | TOK_TRIGGER_CATALOG               { $$ = SQLDIAG_TRIGGER_CAT;}
  | TOK_TRIGGER_SCHEMA                { $$ = SQLDIAG_TRIGGER_SCHEMA;}
  | TOK_TRIGGER_NAME                  { $$ = SQLDIAG_TRIGGER_NAME;}
  | TOK_NSK_CODE                      { $$ = SQLDIAG_NSK_CODE;}
  | TOK_CATALOG_NAME                  { $$ = SQLDIAG_CATALOG_NAME;}
  | TOK_SCHEMA_NAME                   { $$ = SQLDIAG_SCHEMA_NAME;}
  | TOK_TABLE_NAME                    { $$ = SQLDIAG_TABLE_NAME;}
  | TOK_COLUMN_NAME                   { $$ = SQLDIAG_COLUMN_NAME;}
  | TOK_CURSOR_NAME                   { $$ = SQLDIAG_CURSOR_NAME;}
  | TOK_MESSAGE_TEXT                  { $$ = SQLDIAG_MSG_TEXT;}
  | TOK_MESSAGE_LEN                   { $$ = SQLDIAG_MSG_LEN;}
  | TOK_MESSAGE_OCTET_LEN             { $$ = SQLDIAG_MSG_OCTET_LEN;}
  | TOK_COLUMN_NUMBER                 { $$ = SQLDIAG_COLUMN_NUMBER;}
  | TOK_NATIVE                        { $$ = SQLDIAG_NATIVE;}
  | TOK_ROW_NUMBER                    { $$ = SQLDIAG_ROW_NUMBER;}
  | TOK_SOURCE_FILE                   { $$ = SQLDIAG_SOURCE_FILE;}
  | TOK_LINE_NUMBER                   { $$ = SQLDIAG_LINE_NUMBER;}
  | TOK_SUBSYSTEM_ID                  { $$ = SQLDIAG_SUBSYSTEM_ID;}


get_conddiags_statement : TOK_GET TOK_DIAGNOSTICS TOK_EXCEPTION
         simple_value_spec cond_info_item_list
      {
         $$ = new (PARSERHEAP()) StmtCondDiag( $5 );
      }


/****/
// About the host variables used for the environment variables giving a
// table name:
//
// The code is currently just experimental.  The issues remaining include:
// 1. The names for the host variable and indicator are always hard coded.
//    What should they really be?
// 2. The preprocessor really sets up a host variable of type char* which,
//    currently has no SQL equivalent.  What SQL type (SQLChar(100) is just
//    a placeholder, dummy type) should actually be used?
// 3. What should be the "return type" or the value placed into $$ for
//    this production?
// 4. Just a documentation issue: the production below accepts 
//	$foo	$Foo	$FOO	$ foo
//    all the same (resulting var is FOO), and
//	$"foo"	$"Foo"	$"FOO"	$" foo"
//    as all different (but note that	$ "foo"  ==  $"foo", of course).
/****/

/* type corrName */
table_name : special_table_name
	     | actual_table_name
	     | exception_table_name

/* type corrName */
special_index_table_name : TOK_TABLE '(' TOK_INDEX_TABLE actual_table_name
                           optional_special_table_loc_clause 
                           optional_special_utility_open_clause 
                           optional_with_shared_access_clause ')'
                {
                  if ((Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE)) ||
                      (Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL)))
                    {
                      // We don't allow a user to do their own index maint,
                      // nor even SELECT from an index (because that
                      // would become a bad habit).
                      // See CatROIndex.cpp & Parser::parseDML.
                      //
                      $4->setSpecialType(ExtendedQualName::INDEX_TABLE);
                      if ($5)
                        {
                          $4->setPartnClause(*$5);
                          delete $5;

			  if ($6 != -1)
			    $4->setUtilityOpenId($6);

			  // The isNSAOperation flag to TRUE if
			  // WITH SHARED ACCESS is specified in the 
			  // syntax.
			  $4->setIsNSAOperation($7);
			  
                        }
                      $$ = $4;  // actual_table_name
                    }
                  else
                    { yyerror(""); YYERROR; /*internal syntax only!*/}
                } 

           | TOK_TABLE '(' ghost TOK_INDEX_TABLE actual_table_name
                           optional_special_table_loc_clause 
                           optional_special_utility_open_clause 
                           optional_with_shared_access_clause ')'
                {
                  $5 /*actual_table_name*/ ->setSpecialType(ExtendedQualName::GHOST_INDEX_TABLE);
                  if ($6 /*optional_special_table_loc_clause*/)
                    {
                      $5 /*actual_table_name*/ ->setPartnClause(*$6 /*optional_special_table_loc_clause*/);
                      delete $6 /*optional_special_table_loc_clause*/;
  
                      if ($7 /*optional_special_utility_open_clause*/ != -1)
                        $5 /*actual_table_name*/ ->setUtilityOpenId($7 /*optional_special_utility_open_clause*/);
  
                      // Set the isNSAOperation flag to TRUE if
                      // WITH SHARED ACCESS is specified in the syntax.
                      $5 /*actual_table_name*/ ->setIsNSAOperation($8 /*optional_with_shared_access_clause*/);
  
                    }
                  $$ = $5 /*actual_table_name*/;
                }

special_regular_table_name : TOK_TABLE '(' TOK_TABLE actual_table_name
                             optional_special_table_loc_clause 
                             optional_special_utility_open_clause 
                             optional_with_shared_access_clause ')'
                {
                      // Since we DO want to allow the user to SELECT
                      // and also DELETE from, or LOCK or UNLOCK,
                      // an individual partition
                      // (since SELECT is useful and the others can do no harm),
                      // this is NOT disallowed here via SqlParser_Flags.
                      //
                      // See BindRelExpr.cpp, where INSERT and UPDATE
                      // are prevented unless ALLOW_SPECIALTABLETYPE is set.
                      //
                      if ($5)
                        {
                          $4->setPartnClause(*$5);
                          delete $5;

			  if ($6 != -1)
			    $4->setUtilityOpenId($6);

			  // The isNSAOperation flag to TRUE if
			  // WITH SHARED ACCESS is specified in the 
			  // syntax.
			  $4->setIsNSAOperation($7);

                        }
                      $$ = $4;  // actual_table_name
                }

special_table_name : special_regular_table_name

	   | special_index_table_name

	   | TOK_TABLE '(' TOK_TEMP_TABLE actual_table_name
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
		      $4->setSpecialType(ExtendedQualName::TRIGTEMP_TABLE);
                      if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $4/*actual_table_name*/->setPartnClause(*$5);
                          delete $5/*optional_special_table_loc_clause*/;
                        }
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}
	   | TOK_TABLE '(' TOK_MV_TABLE actual_table_name
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
					  $4->setSpecialType(ExtendedQualName::MV_TABLE);
                      if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $4/*actual_table_name*/->setPartnClause(*$5);
                          delete $5/*optional_special_table_loc_clause*/;
                        }
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}
	   | TOK_TABLE '(' TOK_IUD_LOG_TABLE actual_table_name
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
		      $4->setSpecialType(ExtendedQualName::IUD_LOG_TABLE);
                      if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $4/*actual_table_name*/->setPartnClause(*$5);
                          delete $5/*optional_special_table_loc_clause*/;
                        }
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}
	   | TOK_TABLE '(' TOK_GHOST TOK_IUD_LOG_TABLE actual_table_name
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
		      $5->setSpecialType(ExtendedQualName::GHOST_IUD_LOG_TABLE);
                      if ($6 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $5/*actual_table_name*/->setPartnClause(*$6);
                          delete $6/*optional_special_table_loc_clause*/;
                        }
		      $$ = $5;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}

		   // OZ 

	   | TOK_TABLE '(' TOK_RANGE_LOG_TABLE actual_table_name 
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
		      $4->setSpecialType(ExtendedQualName::RANGE_LOG_TABLE);
                      if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $4/*actual_table_name*/->setPartnClause(*$5);
                          delete $5/*optional_special_table_loc_clause*/;
                        }
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}

	   | TOK_TABLE '(' TOK_MVS_UMD actual_table_name
             optional_special_table_loc_clause ')'
		{
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
		      $4->setSpecialType(ExtendedQualName::MVS_UMD);
                      if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                        {
                          $4/*actual_table_name*/->setPartnClause(*$5);
                          delete $5/*optional_special_table_loc_clause*/;
                        }
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
		}
	
           | TOK_TABLE '(' ghost TOK_TABLE actual_table_name
             optional_special_table_loc_clause ')'
                {
                  $5 /*actual_table_name*/ ->setSpecialType(ExtendedQualName::GHOST_TABLE);
                  if ($6 /*optional_special_table_loc_clause*/ NEQ NULL)
                  {
                    $5 /*actual_table_name*/ ->setPartnClause(*$6);
                    delete $6/*optional_special_table_loc_clause*/;
                  }
                  $$ = $5;  // actual_table_name
                }
  
           | TOK_TABLE '(' ghost TOK_MV_TABLE actual_table_name
             optional_special_table_loc_clause ')'
                {
                  $5 /*actual_table_name*/ ->setSpecialType(ExtendedQualName::GHOST_MV_TABLE);
                  if ($6 /*optional_special_table_loc_clause*/ NEQ NULL)
                  {
                    $5 /*actual_table_name*/ ->setPartnClause(*$6);
                    delete $6/*optional_special_table_loc_clause*/;
                  }
                  $$ = $5;  // actual_table_name
                }
	   | TOK_TABLE '(' TOK_EXCEPTION_TABLE actual_table_name
             optional_special_table_loc_clause ')'
		{
		  $4->setSpecialType(ExtendedQualName::EXCEPTION_TABLE);
                  if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
                    {
                      $4/*actual_table_name*/->setPartnClause(*$5);
                      delete $5/*optional_special_table_loc_clause*/;
                    }
		  $$ = $4;  // actual_table_name
		}
		
	   /* Sequence Generators */
	   | TOK_TABLE '(' TOK_SG_TABLE actual_table_name ')'
	      {
                if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                {
		      $4->setSpecialType(ExtendedQualName::SG_TABLE);
		      $$ = $4;  // actual_table_name
                }
                else
                  { yyerror(""); YYERROR; /*internal syntax only!*/}
              }

	   /* Hbase Mapped tables */
	   | TOK_TABLE '(' TOK_HBMAP_TABLE actual_table_name ')'
	      {
                $4->setSpecialType(ExtendedQualName::HBMAP_TABLE);
                $$ = $4;  // actual_table_name
              }
		
exception_table_name :  TOK_EXCEPTION TOK_TABLE actual_table_name 
		{
		  $3->setSpecialType(ExtendedQualName::EXCEPTION_TABLE);
		  $$ = $3;  // actual_table_name
		}	
		
/* type PartitionClause */
optional_special_table_loc_clause : empty
                  {
                    $$ = NULL;
                  }
           | ',' special_table_loc_clause
                  {
		    $$ = $2;
		  }

/* type int64 */
optional_special_utility_open_clause : empty
                  {
                    $$ = -1;
                  }
               | TOK_OPEN NUMERIC_LITERAL_EXACT_NO_SCALE
                 {
                   // assuming here SQL/MX Utility will 
		   // always pass a valid Int64 value (correct
                   // number of digits)
		   $$ = atoInt64($2->data()); 
		   delete $2;

                 }

/* type boolean */
optional_with_shared_access_clause : empty
                  {
                    $$ = FALSE;
                  }
               | TOK_WITH TOK_SHARED TOK_ACCESS
                  {
		    $$ = TRUE;
                  }

/* type PartitionClause */
special_table_loc_clause : TOK_LOCATION fully_expanded_guardian_loc_name
                  {
		    $$ = new (PARSERHEAP()) PartitionClause(PARSERHEAP());
		    $$->setLocationName(*$2); // fully_expanded_guardian_loc_name
                  }
		  | TOK_PARTITION partition_name
                  {
                     $$ = new (PARSERHEAP()) PartitionClause(*$2, PARSERHEAP());
		     delete $2;
                  }
		  | TOK_PARTITION TOK_NAME partition_name
		   {
                     $$ = new (PARSERHEAP()) PartitionClause(*$3, PARSERHEAP());
		     delete $3;
                  }
		  |  TOK_PARTITION TOK_NUMBER NUMERIC_LITERAL_EXACT_NO_SCALE
		  {
		     Int32 partNum = (Int32)atoi(*$3);
		     if (partNum < 0)
		      YYERROR;

                     $$ = new (PARSERHEAP()) PartitionClause(partNum, PARSERHEAP());
		     delete $3;
                  }
		  |  TOK_PARTITION TOK_NUMBER TOK_FROM NUMERIC_LITERAL_EXACT_NO_SCALE TOK_TO NUMERIC_LITERAL_EXACT_NO_SCALE
		  {
		    Int32 beginPartNum = (Int32)atoi(*$4);
		    if (beginPartNum <= 0)
		      YYERROR;
		    Int32 endPartNum = (Int32)atoi(*$6);
		    if (endPartNum <= 0)
		      YYERROR;
		    
		    if (beginPartNum > endPartNum)
		      YYERROR;
		    
		    $$ = new (PARSERHEAP()) 
		      PartitionClause(beginPartNum, endPartNum,
				      PARSERHEAP());
		    delete $4;
		    delete $6;
                  }
		  |  TOK_PARTITION TOK_NUMBER TOK_FROM NUMERIC_LITERAL_EXACT_NO_SCALE 
		  {
		    Int32 beginPartNum = (Int32)atoi(*$4);
		    if (beginPartNum <= 0)
		      YYERROR;
		    
		    $$ = new (PARSERHEAP()) 
		      PartitionClause(beginPartNum, -1,
				      PARSERHEAP());
		    delete $4;
                  }
		  |  TOK_PARTITION TOK_NUMBER TOK_TO NUMERIC_LITERAL_EXACT_NO_SCALE 
		  {
		    Int32 beginPartNum = -1;
		    Int32 endPartNum = (Int32)atoi(*$4);
		    if (endPartNum <= 0)
		      YYERROR;
		    
		    $$ = new (PARSERHEAP()) 
		      PartitionClause(-1, endPartNum,
				      PARSERHEAP());
		    delete $4;
                  }


/* type stringval */
fully_expanded_guardian_loc_name : guardian_location_name
                  {
                    ComLocationName locName(*$1,
                      ComLocationName::GUARDIAN_LOCATION_NAME_FORMAT);
                    if (NOT locName.isValid())
                      // The format of the specified location name
                      // $0~string0 is invalid.
                      *SqlParser_Diags << DgSqlCode(-3061)
                        << DgString0($1->data());
                    else  // valid location specified
                      *$1 = locName.
                            getGuardianFullyQualifiedName();
                    $1->toUpper();
                    $$ = $1;
                  }

/* type corrName */
actual_table_name : qualified_name  
		  {
		     // helps with computing view text
		     //
		     ParInsertNameLoc($1->getPosition(), $1->getNameLength());
		     //
		     // note that corrNameFromStrings()
		     // contains code that deletes $1
		     //
		     $$ = corrNameFromStrings($1);
		     if ($$ == NULL) YYABORT;

                     //ct-bug-10-030102-3803 -Begin
                     NAString *tmpName = new (PARSERHEAP()) NAString((""),PARSERHEAP()); 
                     NAString *tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getCatalogName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                     {
                       conditionalDelimit(*tmpName,*tmp);
                       tmpName->append(".",1);
                     }
                     tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getSchemaName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                     {
                       conditionalDelimit(*tmpName,*tmp);
                       tmpName->append(".",1);
                     }
                     tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getObjectName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                       conditionalDelimit(*tmpName,*tmp);
                     $$->setUgivenName(*tmpName);
                    //ct-bug-10-030102-3803 End
		  }
              | '=' identifier
                                {
                                  NAString *defineName =
				    new (PARSERHEAP()) NAString('=', PARSERHEAP());
				  defineName->append($2->data(), $2->length());
                                  delete $2;

				  HostVar *vvX = new (PARSERHEAP()) 
				    HostVar(*defineName, new (PARSERHEAP()) 
				      SQLChar(
				        PARSERHEAP(), ComAnsiNamePart::MAX_IDENTIFIER_EXT_LEN));
				  vvX->setIsDefine();
                                  $$ = new (PARSERHEAP())
				    CorrName("envVar$", 
                                             PARSERHEAP(),
					     vvX->getName(),  // debugging ease
					     "$bogus");
                                  assert($$);
				  $$->setPrototype(vvX);
                                  //ct-bug-10-030102-3803 -Begin
                                  NAString *tmpName =
				    new (PARSERHEAP()) NAString(vvX->getName(), PARSERHEAP());
                                  $$->setUgivenName(*tmpName);
                                  //ct-bug-10-030102-3803 -End
                                }

              | hostvar_and_prototype
                                {
                                  // don't delete hostvar because it's also
                                  // referenced from AllHostVars
				  HostVar *vv = (HostVar *)$1;
                                  $$ = new (PARSERHEAP())
				    CorrName("HostVar$", 
                                             PARSERHEAP(),
					     vv->getName(),   // debugging ease
					     "$bogus");
                                  assert($$);
				  $$->setPrototype(vv);
                                  //ct-bug-10-030102-3803 -Begin
                                  NAString *tmpName =
				    new (PARSERHEAP()) NAString(vv->getPrototypeValue(), PARSERHEAP());
                                  $$->setUgivenName(*tmpName);
                                  //ct-bug-10-030102-3803 -End
                                  //
                                  // does not support computing view text yet
                                }

              | param_and_prototype
                                {
                                  // don't delete hostvar because it's also
                                  // referenced from AllHostVars
				  HostVar *vv = (HostVar *)$1;
                                  $$ = new (PARSERHEAP())
				    CorrName("HostVar$", 
                                             PARSERHEAP(),
					     vv->getName(),   // debugging ease
					     "$bogus");
                                  assert($$);
				  $$->setPrototype(vv);
                                  //ct-bug-10-030102-3803 -Begin
                                  NAString *tmpName =
				    new (PARSERHEAP()) NAString(vv->getPrototypeValue(), PARSERHEAP());
                                  $$->setUgivenName(*tmpName);
                                  //ct-bug-10-030102-3803 -End
                                  //
                                  // does not support computing view text yet
                                }

/* type corrName */
actual_routine_name : qualified_name
                  {
		     $$ = corrNameFromStrings($1);
		     if ($$ == NULL) YYABORT;
		  }

/* type corrName */
actual_routine_action_name : routine_action_name
		  {
		     $$ = corrNameFromStrings($1);
		     if ($$ == NULL) YYABORT;
		     $$->getQualifiedNameObj().setObjectNameSpace(COM_UUDF_ACTION_NAME);
		  }

/* 100% identical to "actual_table_name", actual_table_name2 is provided only
 * for use in the "select_list_item" productions.  By doing so, it
 * provides a way to get around a reduce/reduce problem that would
 * otherwise occur.  Our Yacc has certain kinds of lookahead, you see....
 * and not others!
 */

/* type corrName */
actual_table_name2 : qualified_name
		  {
		     // helps with computing view text
		     //
		     ParInsertNameLoc($1->getPosition(), $1->getNameLength());
		     //
		     // note that corrNameFromStrings()
		     // contains code that deletes $1
		     //
		     $$ = corrNameFromStrings($1);
		     if ($$ == NULL) YYABORT;
                     //ct-bug-10-030102-3803 -Begin
                     NAString *tmpName = new (PARSERHEAP()) NAString((""),PARSERHEAP()); 
                     NAString *tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getCatalogName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                     {
                       conditionalDelimit(*tmpName,*tmp);
                       tmpName->append(".",1);
                     }
                     tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getSchemaName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                     {
                       conditionalDelimit(*tmpName,*tmp);
                       tmpName->append(".",1);
                     }
                     tmp =new (PARSERHEAP()) NAString(( $$->getQualifiedNameObj().getObjectName()),PARSERHEAP());
                     if(! (tmp->isNull()))
                       conditionalDelimit(*tmpName,*tmp);
                     $$->setUgivenName(*tmpName);
                     //ct-bug-10-030102-3803 End
		  }
| hostvar_and_prototype
{
                                  // don't delete hostvar because it's also
                                  // referenced from AllHostVars
				  HostVar *vv = (HostVar *)$1;
                                  $$ = new (PARSERHEAP())
				    CorrName("HostVar$", 
                                             PARSERHEAP(),
					     vv->getName(),   // debugging ease
					     "$bogus");
                                  assert($$);
				  $$->setPrototype(vv);
                                  //ct-bug-10-030102-3803 -Begin
                                  NAString *tmpName =
				    new (PARSERHEAP()) NAString(vv->getPrototypeValue(), PARSERHEAP());
                                  $$->setUgivenName(*tmpName);
                                  //ct-bug-10-030102-3803 -End
                                  //
                                  // does not support computing view text yet
                                }

/* type stringval */
//host_identifier : IDENTIFIER  // This allows C/C++ identifiers, a
                                // superset of Fortran ones, and COBOL words.
                                // We need to allow other funny host-language
                                // characters ('-' Cobol, '&' Mumps, ...).

/* type stringval */
identifier : regular_identifier
				{
				   $$=$1;
				   if ( ($$==NULL) || transformIdentifier(*$$)) YYERROR;
				}
              | DELIMITED_IDENTIFIER
				{
                                  $$=$1;
                                  if ( ($$==NULL) || transformIdentifier(*$$)) YYERROR;
				}
              | BACKQUOTED_IDENTIFIER
				{
                                  if (NOT SqlParser_CurrentParser->hiveDDLInfo_->checkForDDL_)
                                    {
                                      yyerror(""); 
                                      YYERROR;
                                    }

                                  $$=$1;
                                  if ( ($$==NULL) || transformIdentifier(*$$)) YYERROR;

                                  SqlParser_CurrentParser->hiveDDLInfo_->backquotedDelimFound_ = TRUE;

				}

/* type stringval */
// Delimited identifiers of this type may contain circumflex ("^") characters
identifier_with_hat : regular_identifier
				{
				   $$=$1;
				   if ( ($$==NULL) || transformIdentifier(*$$, TRUE, FALSE)) YYERROR;
				}
              | DELIMITED_IDENTIFIER
				{
				   $$=$1;
				   if ( ($$==NULL) || transformIdentifier(*$$, TRUE, TRUE)) YYERROR;
				}

/* type stringval */
// Delimited identifiers of routine actions may contain dollar sign ("$") characters
identifier_with_dollar : regular_identifier
				{
				   $$=$1;
				   if ( ($$==NULL) || transformIdentifier(*$$)) YYERROR;
				}
              | DELIMITED_IDENTIFIER
				{
				   $$=$1;
				   if ( ($$==NULL) || transformIdentifier(*$$, TRUE/*upCase - n/a to delim ident*/, FALSE/*^ ok?*/, NASTRING_DELIM_IDENT_WITH_DOLLAR_PREFIX) ) YYERROR;
				}

/* type stringval */
regular_identifier : IDENTIFIER
             | nonreserved_word
                {
                  // On the old  platform,
                  // This identifier string needs to be converted back to
                  // ISO88591 because it may be passed to catman code to
                  // determine if the named object exists. When catman 
                  // becomes Unicode-enabled, this ISO88591 conversion
                  // can go away. This comment also applies to other 
                  // unicodeToChar() call sites here & elsewhere.
                  //
                  // On SeaQuest Linux and Windows NT platforms,
                  // convert this identifier from UCS2/UTF16 to UTF8.
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet() // CharInfo::UTF8
                                          ),
                     PARSERHEAP());
				  // Do not toUpper here; let the enclosing
				  // production decide whether transformIdent
				  // should upcase it or not.
				  //$$->toUpper();
                }
             | nonreserved_func_word
                {
                  // Process the same as a nonreserved_word here.
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
                }
             | MP_nonreserved_word
                {
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
                }
             | MP_nonreserved_func_word
                {
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
                }
             | nonreserved_datatype
                {
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
                }


regular_identifier_not_builtin : IDENTIFIER
             | nonreserved_word
                {
                  // This identifier string needs to be converted back to
                  // ISO88591 because it may be passed to catman code to
                  // determine if the named object exists. When catman 
                  // becomes Unicode-enabled, this ISO88591 conversion
                  // can go away. This comment also applies to other 
                  // unicodeToChar() call sites here & elsewhere.
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
				  // Do not toUpper here; let the enclosing
				  // production decide whether transformIdent
				  // should upcase it or not.
				  //$$->toUpper();
                }
             | MP_nonreserved_word
                {
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
                }
             | nonreserved_datatype
                {
                  $$ = unicodeToChar
                    (ToTokvalPlusYYText(&$1)->yytext,
                     ToTokvalPlusYYText(&$1)->yyleng,
                     (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet()
                                          ),
                     PARSERHEAP());
               }


/* type strSeq */
qualified_name : identifier
                {
                  ShortStringSequence *strseq =
                  new (PARSERHEAP()) ShortStringSequence($1);
                  if (! strseq->isValid()) YYABORT;
                  $$ = strseq;
                }
                | qualified_name '.' identifier
                {
                  if (Get_SqlParser_Flags(PARSING_IUS_WHERE_CLAUSE))
                    {
                      *SqlParser_Diags << DgSqlCode(-9237) << DgString0("qualified column name");
                      YYERROR;
                    }
                  $1->append($3);
                  if (! $1->isValid()) 
                    YYABORT;

                  $$ = $1;
                }

/* type strSeq */
// A module name is different from other types of ANSI names in that the
// object name part can contain circumflex ("^") characters
module_name : identifier_with_hat
			       {
				   ShortStringSequence *strseq =
				     new (PARSERHEAP()) ShortStringSequence($1);
				   if (! strseq->isValid()) YYABORT;
				   $$ = strseq;
			       }
              | qualified_name '.' identifier_with_hat
			       {
				   $1->append($3);
				   if (! $1->isValid()) YYABORT;
				   $$ = $1;
			       }

/* type strSeq */
// A routine action name is different from other types of ANSI names in that the
// object name part can contain dollar sign ("$") characters
routine_action_name : identifier_with_dollar
			       {
				   ShortStringSequence *strseq =
				     new (PARSERHEAP()) ShortStringSequence
				     ( $1 // identifier_with_dollar
				     , ( NASTRING_REGULAR_IDENT_WITH_DOLLAR_PREFIX |
				         NASTRING_DELIM_IDENT_WITH_DOLLAR_PREFIX )
				     );
				   if (! strseq->isValid()) YYABORT;
				   $$ = strseq;
			       }
              | qualified_name '.' identifier_with_dollar
			       {
				   $1->toInternalIdentifierFlags_ |=
				     ( NASTRING_REGULAR_IDENT_WITH_DOLLAR_PREFIX |
				       NASTRING_DELIM_IDENT_WITH_DOLLAR_PREFIX );
				   $1->append($3);
				   if (! $1->isValid()) YYABORT;
				   $$ = $1;
			       }

/* type stringval */
correlation_name : identifier

/* type relx */
table_as_procedure : 
TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')'
{
  // DEFAULT_CHARSET has no effect on character_string_literal in this context
  $$ = new(PARSERHEAP())RelInternalSP(*$5, 0, REL_INTERNALSP, PARSERHEAP(), getTdmispArkcmpInfo(*$5));
  delete $5;  
}

| TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ',' value_expression_list ')' ')'
{
  // DEFAULT_CHARSET has no effect on character_string_literal in this context
  $$=new(PARSERHEAP())RelInternalSP(*$5, $7, REL_INTERNALSP, PARSERHEAP(), getTdmispArkcmpInfo(*$5));
  delete $5;				  
}

| TOK_TABLE '(' proc_identifier '(' value_expression_list ')' ')'
				{
				  if ($3 == REL_EXPLAIN) {
				    $$ = new (PARSERHEAP()) ExplainFunc($5);
				  }
				  else if ($3 == REL_STATISTICS) {
				    $$ = new (PARSERHEAP()) StatisticsFunc($5);
				  }
				}
| TOK_TABLE '(' TOK_HIVEMD '(' hivemd_identifier ')' ')'
				{
                                  $$ = new (PARSERHEAP()) HiveMDaccessFunc($5);
				}
| TOK_TABLE '(' TOK_HIVEMD '(' hivemd_identifier ',' identifier ')' ')'
				{
                                  $$ = new (PARSERHEAP()) HiveMDaccessFunc($5, $7);
				}
| TOK_TABLE '(' TOK_HIVEMD '(' hivemd_identifier ',' identifier ',' identifier ')' ')'
				{
                                  $$ = new (PARSERHEAP()) HiveMDaccessFunc($5, $7, $9);
				}

| TOK_TABLE '(' TOK_QUERY_CACHE '(' value_expression_list ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("QUERYCACHE"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_QUERY_CACHE_ENTRIES '(' value_expression_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) RelInternalSP( "QUERYCACHEENTRIES"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
|TOK_TABLE '(' TOK_HYBRID_QUERY_CACHE '(' value_expression_list ')' ')'
  {
      $$ =  new (PARSERHEAP()) RelInternalSP( "HYBRIDQUERYCACHE"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
|TOK_TABLE '(' TOK_HYBRID_QUERY_CACHE_ENTRIES '(' value_expression_list ')' ')'
  {
      $$ =  new (PARSERHEAP()) RelInternalSP( "HYBRIDQUERYCACHEENTRIES"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_CATMAN_CACHE '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("CATMANCACHE"
                                          , 0
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_NATABLE_CACHE '(' value_expression_list ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("NATABLECACHE"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_NATABLE_CACHE_ENTRIES '(' value_expression_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) RelInternalSP( "NATABLECACHEENTRIES"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_NAROUTINE_CACHE '(' value_expression_list ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("NAROUTINECACHE"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_NAROUTINE_ACTION_CACHE '(' value_expression_list ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("NAROUTINEACTIONCACHE"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }
| TOK_TABLE '(' TOK_VERSION_INFO '(' value_expression_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) RelInternalSP( "VERSION_INFO"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp | 
                                            RelInternalSP::suppressDefaultSchema | 
                                            RelInternalSP::requiresTMFTransaction);
  }
| TOK_TABLE '(' TOK_RELATEDNESS '(' value_expression_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) RelInternalSP( "RELATEDNESS"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp | 
                                            RelInternalSP::suppressDefaultSchema | 
                                            RelInternalSP::requiresTMFTransaction);
  }
| TOK_TABLE '(' TOK_FEATURE_VERSION_INFO '(' value_expression_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) RelInternalSP( "FEATURE_VERSION_INFO"
                                          , $5
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp | 
                                            RelInternalSP::suppressDefaultSchema | 
                                            RelInternalSP::requiresTMFTransaction);
  }
| sp_proxy_stmt_prefix '(' proxy_columns ')' ')'
  {
    $$ =  new (PARSERHEAP()) SPProxyFunc($3, NULL, PARSERHEAP());
    inRSProxyStmt = FALSE;
  }
| sp_proxy_stmt_prefix '(' proxy_columns ',' spproxy_string_list ')' ')'
  {
    $$ =  new (PARSERHEAP()) SPProxyFunc($3, $5, PARSERHEAP());
    inRSProxyStmt = FALSE;
  }
| TOK_TABLE '(' TOK_EXTRACT_SOURCE '(' extract_type ',' QUOTED_STRING ','
                                       QUOTED_STRING ','
                                       proxy_columns ')' ')'
  {
    // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context

    if (CmpCommon::getDefault(IS_DB_TRANSPORTER) == DF_OFF)
      YYERROR;

    NAString &espPhandle = *$7;
    NAString &securityKey = *$9;
    ElemDDLNode *columns = $11;
    TrimNAStringSpace(espPhandle);
    TrimNAStringSpace(securityKey);
    $$ = new (PARSERHEAP()) ExtractSource(columns, espPhandle, securityKey,
                                          PARSERHEAP());
  }
| TOK_TABLE '(' TOK_LOB QUOTED_STRING ')'
  {
    ConstValue * handle = new(PARSERHEAP()) ConstValue(*$4);

    ExeUtilLobExtract * lle =
      new (PARSERHEAP ()) ExeUtilLobExtract
      (handle, 
       ExeUtilLobExtract::TO_STRING_,
       0, 0, 0, 0);

    $$ = lle;
  }
| TOK_TABLE '(' TOK_CLUSTER stats_or_statistics '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilRegionStats(CorrName(""), FALSE, FALSE, FALSE, TRUE, NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_REGION stats_or_statistics '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilRegionStats(CorrName(""), FALSE, FALSE, FALSE, FALSE, NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_REGION stats_or_statistics '(' table_name ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilRegionStats(*$6, FALSE, FALSE, FALSE, FALSE, NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_REGION stats_or_statistics '(' TOK_INDEX table_name ')' ')'
  {
    $7->setSpecialType(ExtendedQualName::INDEX_TABLE);
    $$ = new (PARSERHEAP()) 
      ExeUtilRegionStats(*$7, FALSE, TRUE, FALSE, FALSE, NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_LOB stats_or_statistics '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilLobInfo(CorrName(""), TRUE,  NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_LOB stats_or_statistics '(' table_name ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilLobInfo(*$6, TRUE,  NULL, PARSERHEAP());
  }
| TOK_TABLE '(' TOK_REGION stats_or_statistics '(' TOK_USING rel_subquery ')' ')'
  {
    $$ = new (PARSERHEAP()) 
      ExeUtilRegionStats(CorrName("DUMMY"), FALSE, FALSE, FALSE, FALSE, $7, PARSERHEAP());
  }

hivemd_identifier : 
                    TOK_ALIAS { $$ = new (PARSERHEAP()) NAString("ALIAS"); }
                  | TOK_COLUMNS { $$ = new (PARSERHEAP()) NAString("COLUMNS"); }
                  | TOK_PRIMARY TOK_KEY { $$ = new (PARSERHEAP()) NAString("PKEYS"); }
                  | TOK_FOREIGN TOK_KEY { $$ = new (PARSERHEAP()) NAString("FKEYS"); }
                  | TOK_SYNONYMS { $$ = new (PARSERHEAP()) NAString("SYNONYMS"); }
                  | TOK_TABLES   { $$ = new (PARSERHEAP()) NAString("TABLES"); }
                  | TOK_VIEWS    { $$ = new (PARSERHEAP()) NAString("VIEWS"); }
                  | TOK_SYSTEM TOK_TABLES { $$ = new (PARSERHEAP()) NAString("SYSTEM_TABLES"); }
                  | TOK_SCHEMAS { $$ = new (PARSERHEAP()) NAString("SCHEMAS"); }

/* type boolean */
sp_proxy_stmt_prefix : TOK_TABLE '(' TOK_SP_RESULT_SET 
{
   beginRSProxyStmtParsing();
   $$ = TRUE;
}

/* type extractType */
extract_type : QUOTED_STRING
{
  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
  NAString &token = *$1;
  TrimNAStringSpace(token);

  // Right now we are enforcing that the literal must be a
  // single-quoted 'ESP' otherwise we report a parse error.
  if (token.compareTo("ESP", NAString::ignoreCase) == 0)
    $$ = ExtractSource::ESP;
  else
    YYERROR;
}

/* type pElemDDL */
proxy_column : qualified_name data_type optional_column_attributes
               {
                 ShortStringSequence *seq = (ShortStringSequence *) $1;
                 UInt32 numParts = seq->numParts();
                 
                 if (numParts != 1 && numParts != 4)
                   YYABORT;
                 
                 NAString *colName = seq->extract(numParts - 1);
                 
                 QualifiedName *tblName = NULL;
                 if (numParts == 4)
                 {
                   tblName = new (PARSERHEAP())
                     QualifiedName(*(seq->extract(2)),
                                   *(seq->extract(1)),
                                   *(seq->extract(0)),
                                   PARSERHEAP(),
                                   0);
                 }
                 
                 $$ = new (PARSERHEAP())
                   ElemProxyColDef(tblName  /* optional table name */,
                                   *colName /* 1-part column name */,
                                   $2       /* data type */,
                                   $3       /* column attributes */,
                                   PARSERHEAP());
               }

/* type pElemDDL */
proxy_columns : proxy_column
              | proxy_columns ',' proxy_column
                {
                  $$ = new (PARSERHEAP()) ElemDDLList($1, $3);
                }

/* type item */
spproxy_string : QUOTED_STRING
                 {
                   // DEFAULT_CHARSET setting has no effect
                   const NAString &s = *$1;
                   $$ = new (PARSERHEAP()) ConstValue(s);
                 }

/*type itemList */
spproxy_string_list : spproxy_string
                      {
                        ItemExprList *l = new (PARSERHEAP())
                          ItemExprList(PARSERHEAP());
                        l->insert($1);
                        $$ = l;
                      }
                    | spproxy_string_list ',' spproxy_string
                      {
                        ((ItemExprList *)$1)->insert($3);
                        $$ = $1;
                      }

/* type relx  */

//QSTUFF
table_as_stream_any   : table_as_stream | 
                        table_as_stream TOK_AFTER TOK_LAST TOK_ROW 
                        {
				((RelExpr *)$$)->getGroupAttr()->setSkipInitialScan(TRUE);				
                        }

table_as_stream : TOK_STREAM '(' table_name optimizer_hint ')'
			{
                           if (in3GL_ > 0)
                           {
                             *SqlParser_Diags << DgSqlCode(-3180);
                             YYERROR;
                           }
                           // Streams are not supported in MVs
                           if(WeAreInACreateMVStatement == TRUE)
                           {
                             *SqlParser_Diags << DgSqlCode(-12065);
                             YYABORT;
                           }
                           $$ = new(PARSERHEAP())Scan(*$3,TRUE);
                           $$->getGroupAttr()->setStream(TRUE);
                           if ($4)
                             $$->setHint($4);
                           delete $3;
			}
//QSTUFF

/* type operator_type */
proc_identifier : TOK_EXPLAIN
                           {
			     $$ = REL_EXPLAIN;
			   }
                     | TOK_STATISTICS
                          {
			    $$ = REL_STATISTICS;
			  }

/* type item */
rowset_input_host_variable: hostvar_expression
{
  TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
  $$ = $1;
}

/* type item */
rowset_input_host_variable_list : rowset_input_host_variable
   {
     // A Null Terminated list
     $$ = new (PARSERHEAP()) ItemList( $1, NULL);
   }
|  rowset_input_host_variable ',' rowset_input_host_variable_list
   {
     $$ = new (PARSERHEAP()) ItemList( $1, $3 );
   }

/* type item */
rowset_size: unsigned_integer
   {
     $$ = new (PARSERHEAP()) ConstValue($1);
   }
| simple_host_variable
   {
     TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
     $$ = $1;
   }
| dynamic_parameter
   

/* type relx */
rowset_derived_table :
TOK_ROWSET '(' rowset_input_host_variable_list ')'
       {
         $$ = new (PARSERHEAP()) Rowset($3);
       }
| TOK_ROWSET '(' rowset_input_host_variable_list ')' rowset_index
       {
         $$ = new (PARSERHEAP()) Rowset($3, $5);
       }
| TOK_ROWSET rowset_size '(' rowset_input_host_variable_list ')'
       {
         $$ = new (PARSERHEAP()) Rowset($4, NULL, $2);
       }
| TOK_ROWSET rowset_size '(' rowset_input_host_variable_list ')' rowset_index
       {
         $$ = new (PARSERHEAP()) Rowset($4, $6, $2);
       }

/* type boolean */
global_hint : empty { $$ = FALSE; }
    | TOK_BEGIN_HINT TOK_ORDERED TOK_END_HINT 
      { $$ = TRUE; QueryAnalysis::Instance()->setJoinOrderByUser(); }

/* type hbaseAccessOptions */
hbase_access_options : empty 
       {
         Lng32 n = CmpCommon::getDefaultNumeric(TRAF_NUM_HBASE_VERSIONS);
         if (n == -1)
           $$ = new (PARSERHEAP()) HbaseAccessOptions(-1, PARSERHEAP());
         else if (n == -2)
           $$ = new (PARSERHEAP()) HbaseAccessOptions(-2, PARSERHEAP());
         else if (n > 1)
           $$ = new (PARSERHEAP()) HbaseAccessOptions(n, PARSERHEAP());
         else
           $$ = NULL; 
       }
    | '{' TOK_VERSIONS NUMERIC_LITERAL_EXACT_NO_SCALE '}'
      {
        Int64 value = atoInt64($3->data()); 
        if (value <= 0)
          YYERROR;

        if (value > 1)
          $$ = new (PARSERHEAP()) HbaseAccessOptions(value, PARSERHEAP());
        else
          $$ = NULL;
      }
    | '{' TOK_VERSIONS TOK_MAX '}'
      {
        $$ = new (PARSERHEAP()) HbaseAccessOptions(-1, PARSERHEAP());
      }
    | '{' TOK_VERSIONS TOK_ALL '}'
      {
        $$ = new (PARSERHEAP()) HbaseAccessOptions(-2, PARSERHEAP());
      }

/* type hint */
optimizer_hint : empty { $$ = NULL; }
    | TOK_BEGIN_HINT hints TOK_END_HINT { $$ = $2; }

/* type hint */
hints : TOK_CARDINALITY number
      { $$ = new (PARSERHEAP()) Hint(PARSERHEAP()); $$->setCardinality($2); }
    | TOK_INDEX index_hints { $$ = $2; }
    | TOK_SELECTIVITY number 
      { $$ = new (PARSERHEAP()) Hint($2, PARSERHEAP()); }
    | TOK_CARDINALITY number TOK_BITOR_OPERATOR TOK_INDEX index_hints
      { $$ = $5->setCardinality($2); }
    | TOK_CARDINALITY number TOK_BITOR_OPERATOR TOK_SELECTIVITY number
      { $$ = new (PARSERHEAP()) Hint($2, $5, PARSERHEAP()); }
    | TOK_INDEX index_hints TOK_BITOR_OPERATOR TOK_CARDINALITY number
      { $$ = $2->setCardinality($5); }
    | TOK_INDEX index_hints TOK_BITOR_OPERATOR TOK_SELECTIVITY number
      { $$ = $2->setSelectivity($5); }
    | TOK_SELECTIVITY number TOK_BITOR_OPERATOR TOK_INDEX index_hints
      { $$ = $5->setSelectivity($2); }
    | TOK_SELECTIVITY number TOK_BITOR_OPERATOR TOK_CARDINALITY number
      { $$ = new (PARSERHEAP()) Hint($5, $2, PARSERHEAP()); }
    | TOK_CARDINALITY number TOK_BITOR_OPERATOR TOK_INDEX index_hints 
      TOK_BITOR_OPERATOR TOK_SELECTIVITY number
      { $$ = $5->setCardinality($2); $$->setSelectivity($8); }
    | TOK_CARDINALITY number TOK_BITOR_OPERATOR TOK_SELECTIVITY number 
      TOK_BITOR_OPERATOR TOK_INDEX index_hints
      { $$ = $8->setCardinality($2); $$->setSelectivity($5); }
    | TOK_INDEX index_hints TOK_BITOR_OPERATOR TOK_CARDINALITY number 
      TOK_BITOR_OPERATOR TOK_SELECTIVITY number
      { $$ = $2->setSelectivity($8); $$->setCardinality($5); }
    | TOK_INDEX index_hints TOK_BITOR_OPERATOR TOK_SELECTIVITY number 
      TOK_BITOR_OPERATOR TOK_CARDINALITY number
      { $$ = $2->setSelectivity($5); $$->setCardinality($8); }
    | TOK_SELECTIVITY number TOK_BITOR_OPERATOR TOK_INDEX index_hints 
      TOK_BITOR_OPERATOR TOK_CARDINALITY number
      { $$ = $5->setSelectivity($2); $$->setCardinality($8); }
    | TOK_SELECTIVITY number TOK_BITOR_OPERATOR TOK_CARDINALITY number 
      TOK_BITOR_OPERATOR TOK_INDEX index_hints
      { $$ = $8->setSelectivity($2); $$->setCardinality($5); }

/* type doubleVal */
number : NUMERIC_LITERAL_APPROX 
        { 
          double val; NABoolean singleP, result;
          result = literalToDouble($1, val, singleP);
          delete $1;
          if (!result) {
            YYERROR;
          }
          else {
            $$ = val;
          }
        }
    | NUMERIC_LITERAL_EXACT_WITH_SCALE
        { 
          double val; 
          if (!literalToNumeric($1, val)) {
            YYERROR;
          }
          else {
            $$ = val;
          }
        }

/* type hint */
index_hints : index_hint { $$ = new (PARSERHEAP()) Hint(*$1, PARSERHEAP()); }
    | index_hints ',' index_hint { $$ = $1->addIndexHint(*$3); }

/* type stringval */
index_hint : qualified_name 
      { 
        $$ = new (PARSERHEAP()) NAString
          (qualifiedNameFromStrings($1)->getQualifiedNameAsAnsiString(),
           PARSERHEAP()); 
      }

/* type relx */
table_reference : table_name_and_hint
                  { $$ = $1; }

              | table_as_procedure
              | table_as_procedure as_clause
	                        {
                                  $$ = new (PARSERHEAP())
				    RenameTable($1, *$2);
                                  delete $2;
                                }
              | table_as_procedure as_clause '(' derived_column_list ')'
                                {
                                  $$ = new (PARSERHEAP())
								  RenameTable($1, *$2, $4);
                                  delete $2;
                                }

//QSTUFF
              | table_as_stream_any
              | table_as_stream_any as_clause
	                        {
                                  $$ = new (PARSERHEAP())
                                    RenameTable($1, *$2);
                                  delete $2;
                                }
              | table_as_stream_any as_clause '(' derived_column_list ')'
                                {
                                   $$ = new (PARSERHEAP())
                                     RenameTable($1, *$2, $4);
                                   delete $2;
                                }

              | upd_stmt_w_acc_type_and_as_clause
                { $$ = $1; }

              | upd_stmt_w_acc_type_and_as_clause_col_list
                { $$ = $1; }

              | upd_stmt_w_acc_type_rtn_list_and_as_clause
                { $$ = $1; }

              | upd_stmt_w_acc_type_rtn_list_and_as_clause_col_list
                { $$ = $1; }

              | del_stmt_w_acc_type_and_as_clause
                { $$ = $1; }

              | del_stmt_w_acc_type_and_as_clause_col_list
                { $$ = $1; }

              | del_stmt_w_acc_type_rtn_list_and_as_clause
                { $$ = $1; }

              | del_stmt_w_acc_type_rtn_list_and_as_clause_col_list
                { $$ = $1; }

             | '(' front_of_insert TOK_WITH TOK_MTS TOK_INTO table_name 
                    query_expression ')' as_clause
               {
		 Insert *insert = new (PARSERHEAP())
		   Insert(CorrName(*$6, PARSERHEAP()),
			  NULL,
			  REL_UNARY_INSERT,
			  $7);
		 insert->setInsertType($2);
		 ((GenericUpdate *)insert)->setMtsStatement(TRUE);

		 if (NOT Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
		   {
		     yyerror(""); YYERROR; /*internal syntax only!*/
		   }

		 RelRoot *root = new (PARSERHEAP())
		   RelRoot(insert, REL_ROOT);
		 
		 $$ = new (PARSERHEAP()) RenameTable(root, *$9);
		 delete $6;
	       }

             | '(' front_of_insert TOK_WITH TOK_MTS TOK_INTO table_name 
                   query_expression ')' as_clause '(' derived_column_list ')'
                {
		  Insert *insert = new (PARSERHEAP())
		    Insert(CorrName(*$6, PARSERHEAP()),
			   NULL,
			   REL_UNARY_INSERT,
			   $7);
		  insert->setInsertType($2);
		  ((GenericUpdate *)insert)->setMtsStatement(TRUE);
		 
		 if (NOT Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
		   {
		     yyerror(""); YYERROR; /*internal syntax only!*/
		   }
 
		  RelRoot *root = new (PARSERHEAP())
		    RelRoot(insert, REL_ROOT);
		  
		  $$ = new (PARSERHEAP()) RenameTable(root, *$9, $11);
		  delete $6;
		}

             | '(' Front_Of_Insert Rest_Of_insert_statement ')' as_clause 
               {
                 // Embedded inserts are not supported in MVs
                 if(WeAreInACreateMVStatement == TRUE)
                 {
                   *SqlParser_Diags << DgSqlCode(-12066)
                                    << DgString0("INSERT");
                   YYABORT;
                 }

                 // A cursor on an embedded INSERT is not supported
                 WeAreInAnEmbeddedInsert = TRUE;

                 ((Insert*)$3)->setInsertType($2);

                 //  Embedded INSERT.
                 //  Supports returning the generated Identity column
                 //  back to the user.

                 ((GenericUpdate *)$3)->setMtsStatement(TRUE);

                 // Set this as an embedded insert
                 $3->getGroupAttr()->setEmbeddedIUD(REL_UNARY_INSERT);

                 RelRoot * root = new (PARSERHEAP())
                   RelRoot($3, 
                           TransMode::ACCESS_TYPE_NOT_SPECIFIED_, 
                           LOCK_MODE_NOT_SPECIFIED_, 
                           REL_ROOT);

                 $$ = new (PARSERHEAP()) RenameTable(root, *$5);
                 delete $5;
               }

             | '(' Front_Of_Insert Rest_Of_insert_statement ')' as_clause '(' derived_column_list ')'

               {
                 // Embedded inserts are not supported in MVs
                 if(WeAreInACreateMVStatement == TRUE)
                 {
                   *SqlParser_Diags << DgSqlCode(-12066)
                                    << DgString0("INSERT");
                   YYABORT;
                 }

                 // A cursor on an embedded INSERT is not supported
                 WeAreInAnEmbeddedInsert = TRUE;

                 ((Insert*)$3)->setInsertType($2);

                 //  Embedded INSERT.
                 //  Supports returning the generated Identity column
                 //  back to the user.

		 ((GenericUpdate *)$3)->setMtsStatement(TRUE);
		 
		 // Set this as an embedded insert
		 $3->getGroupAttr()->setEmbeddedIUD(REL_UNARY_INSERT);
		 
		 RelRoot * root = new (PARSERHEAP())
		   RelRoot($3, 
			   TransMode::ACCESS_TYPE_NOT_SPECIFIED_, 
			   LOCK_MODE_NOT_SPECIFIED_, 
			   REL_ROOT);
                 $$ = new (PARSERHEAP())
                    RenameTable(root, *$5, $7);
                 delete $5;
               }

              | table_name_as_clause_and_hint
                { $$ = $1; }

              | table_name_as_clause_hint_and_col_list
                { $$ = $1; }
             | '(' exe_util_get_statistics ')' as_clause '(' derived_column_list ')'
                                {

				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($2, REL_ROOT);

                                  $$ = new (PARSERHEAP())
				    RenameTable(root, *$4, $6);
                                  delete $4;
                                }


             | '(' exe_util_get_metadata_info ')' as_clause '(' derived_column_list ')'
                                {
				  ((ExeUtilGetMetadataInfo *)$2)->setNoHeader(TRUE);

				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($2, REL_ROOT);

                                  $$ = new (PARSERHEAP())
				    RenameTable(root, *$4, $6);
                                  delete $4;
                                }
             | '(' exe_util_get_version_info ')' as_clause '(' derived_column_list ')'
                                {

				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($2, REL_ROOT);

                                  $$ = new (PARSERHEAP())
				    RenameTable(root, *$4, $6);
                                  delete $4;
                                }

             | '(' exe_util_get_uid ')' as_clause '(' derived_column_list ')'
                                {

				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($2, REL_ROOT);

                                  $$ = new (PARSERHEAP())
				    RenameTable(root, *$4, $6);
                                  delete $4;
                                }

              | rel_subquery_and_as_clause
                { $$ = $1; }

              | rel_subquery_as_clause_and_col_list
                { $$ = $1; }

              | rel_subquery
                 {
                   Int64 sqAddr = (Int64)$1;
                   char sqAddrStr[100];
                   str_itoa(sqAddr, sqAddrStr);
                   NAString corrName("X");
                   corrName += sqAddrStr;
                   $$ = new (PARSERHEAP()) RenameTable($1, corrName);
                 }

             | joined_table  /* default action is fine: $$ = $1  */
                                {
                                  $$ = $1;
                                }

             | rowset_derived_table as_clause '(' derived_column_list ')'
                                {
                                  // Part of Rowset. 
                                  // This comment is used to identify 
                                  // location in generated file 
                                  // for debugging purposes
                                  $$ = new (PARSERHEAP())
                                    RenameTable($1, *$2, $4);
                                  delete $2;
                                }

             | table_as_tmudf_function
             | table_as_tmudf_function as_clause
				{
                                  $$=new(PARSERHEAP()) RenameTable($1, *$2);
                                  ((TableMappingUDF*)$1)->setCorrName(*$2);
                                  delete $2;
				 } 
	     | table_as_tmudf_function as_clause '(' derived_column_list ')'
                {
                    $$ = new(PARSERHEAP()) RenameTable($1,*$2,$4);
                    ((TableMappingUDF*)$1)->setCorrName(*$2);
                    delete $2;
                } 
             | TOK_DUAL
              {


                ConstValue * cv = 
                  (ConstValue*)literalOfNumericNoScale(new (PARSERHEAP()) NAString("0", PARSERHEAP()));
                
                Tuple * t = new (PARSERHEAP()) Tuple(cv);
                
                NAString id("x");
                RelRoot * root = new (PARSERHEAP())
                  RelRoot(t, 
                          TransMode::ACCESS_TYPE_NOT_SPECIFIED_, 
                          LOCK_MODE_NOT_SPECIFIED_, 
                          REL_ROOT);
                
                $$ = new (PARSERHEAP()) RenameTable(root, id);
              }

table_as_tmudf_function : TOK_UDF '(' table_mapping_function_invocation ')'
  {
    $$ = $3;
  }

table_name_and_hint : table_name optimizer_hint hbase_access_options
                      {
                        NAString cteName = ((*$1).getQualifiedNameAsString());
                        if(SqlParser_CurrentParser->hasWithDefinition(&cteName) )
                        {
                          RelExpr *re = SqlParser_CurrentParser->getWithDefinition(&cteName);
                          if (CmpCommon::getDefault(CSE_FOR_WITH) == DF_ON)
                            {
                              CommonSubExprRef *cse =
                                new(PARSERHEAP()) CommonSubExprRef(re,cteName);

                              if (!cse->isFirstReference())
                                cse->setChild(0, re->copyTree(PARSERHEAP()));

                              if ($2)
                                cse->setHint($2);
                              if ($3)
                                cse->setHbaseAccessOptions($3);

                              cse->addToCmpStatement(TRUE);
                              $$ = cse;
                            }
                          else
                            $$=re->copyTree(PARSERHEAP());
                          delete $1;
                        }
                        else
                        {
                          $$ = new (PARSERHEAP()) Scan(*$1);
                          if ($2)
                            $$->setHint($2);

                          if ($3)
                            ((Scan*)$$)->setHbaseAccessOptions($3);

                          delete $1;
                        }
                      }

                    | '(' table_name_and_hint ')'
                      {
                        CheckModeSpecial1();
                        $$ = $2;
                      }

upd_stmt_w_acc_type_and_as_clause : '(' update_statement_searched access_type ')' as_clause
					 {
                                           // Embedded updates are not supported in MVs
                                           if(WeAreInACreateMVStatement == TRUE)
	                                   {
                                             *SqlParser_Diags << DgSqlCode(-12066)
                                                              << DgString0("UPDATE");
                                             YYABORT;
	                                   }

					   ColRefName *starName = 
					     new (PARSERHEAP()) ColRefName(TRUE, 
									   CorrName("NEW", PARSERHEAP()), PARSERHEAP());
					   ColReference *colRef = new (PARSERHEAP()) ColReference(starName);

					   RelRoot *update =
					     new(PARSERHEAP()) 
					     RelRoot($2,REL_ROOT,colRef);
					   
					   if ($3  != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
					     update->accessOptions().accessType() = $3;
					   
					   $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE);
					   
					   $$ = new (PARSERHEAP()) RenameTable(update, *$5);
					   delete $5;
					 }

                                  | '(' upd_stmt_w_acc_type_and_as_clause ')'
                                    {
                                      CheckModeSpecial1();
                                      $$ = $2;
                                    }

upd_stmt_w_acc_type_and_as_clause_col_list : '(' update_statement_searched access_type ')' as_clause '(' derived_column_list ')'
					 {
                                           // Embedded updates are not supported in MVs
                                           if(WeAreInACreateMVStatement == TRUE)
	                                   {
                                             *SqlParser_Diags << DgSqlCode(-12066)
                                                              << DgString0("UPDATE");
                                             YYABORT;
	                                   }
					
					   ColRefName *starName =
					     new (PARSERHEAP()) ColRefName(TRUE,
									   CorrName("NEW", PARSERHEAP()), PARSERHEAP());
					   ColReference *colRef = new (PARSERHEAP()) ColReference(starName);

					   RelRoot *update =
					     new(PARSERHEAP())
					     RelRoot($2,REL_ROOT,colRef);
					
					   if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
					     update->accessOptions().accessType() = $3;

					   $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE);
					
					   $$ = new (PARSERHEAP()) RenameTable(update,*$5,$7);
					   delete $5;
					 }

                                       | '(' upd_stmt_w_acc_type_and_as_clause_col_list ')'
                                         {
                                           CheckModeSpecial1();
                                           $$ = $2;
                                         }

upd_stmt_w_acc_type_rtn_list_and_as_clause : '(' update_statement_searched access_type return_list ')' as_clause

				  {
                                    // Embedded updates are not supported in MVs
                                    if(WeAreInACreateMVStatement == TRUE)
	                            {
                                      *SqlParser_Diags << DgSqlCode(-12066)
                                                       << DgString0("UPDATE");
                                      YYABORT;
	                            }

				    RelRoot *update =
				      new(PARSERHEAP()) 
				      RelRoot($2,REL_ROOT,$4);
				    
				    if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
				      update->accessOptions().accessType() = $3;
				    
				    $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE);
				    
				    $$ = new (PARSERHEAP()) RenameTable(update, *$6);
				    delete $6;
				  }
                               | '(' upd_stmt_w_acc_type_rtn_list_and_as_clause ')'
                                  {
                                    CheckModeSpecial1();
                                    $$ = $2;
                                  }

upd_stmt_w_acc_type_rtn_list_and_as_clause_col_list : '('  update_statement_searched access_type return_list ')' as_clause '(' derived_column_list ')'

				 {
                                    // Embedded updates are not supported in MVs
                                    if(WeAreInACreateMVStatement == TRUE)
	                            {
                                      *SqlParser_Diags << DgSqlCode(-12066)
                                                       << DgString0("UPDATE");
                                      YYABORT;
	                            }

				   RelRoot *update =
				     new(PARSERHEAP()) RelRoot($2,REL_ROOT,$4);
				   
				   if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
				     update->accessOptions().accessType() = $3;
				   
				   $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_UPDATE);

				   $$ = new (PARSERHEAP()) RenameTable(update, *$6, $8);
				   
				   delete $6;
				 }
            | '(' upd_stmt_w_acc_type_rtn_list_and_as_clause_col_list ')'
               {
                 CheckModeSpecial1();
                 $$ = $2;
               }

del_stmt_w_acc_type_and_as_clause : '(' delete_statement access_type ')' as_clause
                                 {
                                   // Embedded deletes are not supported in MVs
                                   if(WeAreInACreateMVStatement == TRUE)
                                   {
                                      *SqlParser_Diags << DgSqlCode(-12066)
                                                       << DgString0("DELETE");
                                      YYABORT;
	                           }

                                   // Embedded deletes are not supported with LRU
                                   if(WeAreInALRUOperation == TRUE)
                                   {
				     WeAreInALRUOperation = FALSE;
                                      *SqlParser_Diags << DgSqlCode(-3425)
                                                       << DgString0("DELETE");
                                      YYABORT;
	                           }


				   RelRoot *update = 
				     new(PARSERHEAP()) RelRoot($2,REL_ROOT);
				   
				   if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
				     update->accessOptions().accessType() = $3;
				   
				   // If firstN rows flag is set, then this statement is considered an MTS delete 
				   // and not a Pub/Sub Delete.
				   if ($2->getFirstNRows() == -1)  
				     $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_DELETE);
				   
				   $$ = new (PARSERHEAP()) RenameTable(update, *$5);
				   delete $5;
				   
				 }
                              | '(' del_stmt_w_acc_type_and_as_clause ')'
                                 {
                                   CheckModeSpecial1();
                                   $$ = $2;
                                 }

del_stmt_w_acc_type_and_as_clause_col_list : '('  delete_statement access_type ')' as_clause '(' derived_column_list ')'
		    {
                      // Embedded deletes are not supported in MVs
                      if(WeAreInACreateMVStatement == TRUE)
                      {
                         *SqlParser_Diags << DgSqlCode(-12066)
                                          << DgString0("DELETE");
                         YYABORT;
                      }

                     // Embedded deletes are not supported with LRU
                     if(WeAreInALRUOperation == TRUE)
                       {
			 WeAreInALRUOperation = FALSE;
			 *SqlParser_Diags << DgSqlCode(-3425)
					  << DgString0("DELETE");
			 YYABORT;
		       }

		      RelRoot *update = 
			new(PARSERHEAP()) RelRoot($2,REL_ROOT);
		      
		      if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
			update->accessOptions().accessType() = $3;
		      
		      // If firstN rows flag is set, then this statement is considered an MTS delete 
		      // and not a Pub/Sub Delete.
		      if ($2->getFirstNRows() == -1)  
			$2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_DELETE);

		      $$ = new (PARSERHEAP()) RenameTable(update, *$5, $7);
		      
		      delete $5;	  
		    }
                  | '(' del_stmt_w_acc_type_and_as_clause_col_list ')'
                     {
                       CheckModeSpecial1();
                       $$ = $2;
                     }

del_stmt_w_acc_type_rtn_list_and_as_clause : '(' delete_statement access_type return_list ')' as_clause
		    {
                      // Embedded deletes are not supported in MVs
                      if(WeAreInACreateMVStatement == TRUE)
                      {
                         *SqlParser_Diags << DgSqlCode(-12066)
                                          << DgString0("DELETE");
                         YYABORT;
                      }

                     // Embedded deletes are not supported with LRU
		      if(WeAreInALRUOperation == TRUE)
			{
			  WeAreInALRUOperation = FALSE;
			  *SqlParser_Diags << DgSqlCode(-3425)
					   << DgString0("DELETE");
			  YYABORT;
			}


		      RelRoot *update = 
			new(PARSERHEAP()) RelRoot($2,REL_ROOT,$4);
		      
		      if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
			update->accessOptions().accessType() = $3;
		      
		      // If firstN rows flag is set, then this statement is considered an MTS delete 
		      // and not a Pub/Sub Delete.
		      if ($2->getFirstNRows() == -1)  
			$2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_DELETE);
		      
		      $$ = new (PARSERHEAP()) RenameTable(update, *$6);
		      delete $6;
		      
		    }
                  | '(' del_stmt_w_acc_type_rtn_list_and_as_clause ')'
                     {
                       CheckModeSpecial1();
                       $$ = $2;
                     }

del_stmt_w_acc_type_rtn_list_and_as_clause_col_list : '('  delete_statement access_type return_list ')' as_clause '(' derived_column_list ')'
		{
                  // Embedded deletes are not supported in MVs
                  if(WeAreInACreateMVStatement == TRUE)
                  {
                     *SqlParser_Diags << DgSqlCode(-12066)
                                      << DgString0("DELETE");
                      YYABORT;
                  }


		  // Embedded deletes are not supported with LRU
		  if(WeAreInALRUOperation == TRUE)
		    {
		      WeAreInALRUOperation = FALSE;
		      *SqlParser_Diags << DgSqlCode(-3425)
				       << DgString0("DELETE");
		      YYABORT;
		    }
		  
		  RelRoot *update =
		    new(PARSERHEAP()) RelRoot($2,REL_ROOT, $4);
		  
		  if ($3 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
		    update->accessOptions().accessType() = $3;
		  
		  // If firstN rows flag is set, then this statement is considered an MTS delete 
		  // and not a Pub/Sub Delete.
		  if ($2->getFirstNRows() == -1)  
		    $2->child(0)->getGroupAttr()->setEmbeddedIUD(REL_UNARY_DELETE);
		  
		  $$ = new (PARSERHEAP()) RenameTable(update, *$6, $8);
		  
		  delete $6;	  
		}
              | '(' del_stmt_w_acc_type_rtn_list_and_as_clause_col_list ')'
                 {
                   CheckModeSpecial1();
                   $$ = $2;
                 }

table_name_as_clause_and_hint : table_name as_clause optimizer_hint hbase_access_options
                                {
                                   NAString cteName = ((*$1).getQualifiedNameAsString());
                                   if(SqlParser_CurrentParser->hasWithDefinition(&cteName) )
                                   {     
                                     RelExpr *re = SqlParser_CurrentParser->getWithDefinition(&cteName);
                                     if (CmpCommon::getDefault(CSE_FOR_WITH) == DF_ON)
                                       {
                                         CommonSubExprRef *cse =
                                           new(PARSERHEAP()) CommonSubExprRef(re,cteName);

                                         if (!cse->isFirstReference())
                                           cse->setChild(0, re->copyTree(PARSERHEAP()));

                                         if ($3) 
                                           cse->setHint($3);
                                         if ($4)
                                           cse->setHbaseAccessOptions($4);

                                         cse->addToCmpStatement(TRUE);
                                         $$ = cse;
                                       }
                                     else
                                       $$=re->copyTree(PARSERHEAP());
                                     $$ = new (PARSERHEAP()) RenameTable($$, *$2);
                                  }
                                  else
                                  {
                                    $1->setCorrName(*$2);
                                    $$ = new (PARSERHEAP()) Scan(*$1);
                                    if ($3) 
                                      $$->setHint($3);
                                    if ($4)
                                      ((Scan*)$$)->setHbaseAccessOptions($4);
                                  }  
                                  delete $1;
                                  delete $2;
                                }
                              | '(' table_name_as_clause_and_hint ')'
                                {
                                  CheckModeSpecial1();
                                  $$ = $2;
                                }

table_name_as_clause_hint_and_col_list : table_name as_clause optimizer_hint hbase_access_options '(' derived_column_list ')'
                                         {
                                           Scan * sc = new (PARSERHEAP()) Scan(*$1);
                                           $$ = new (PARSERHEAP())
				             RenameTable(sc, *$2, $6);

                                           if ($3) 
                                             $$->setHint($3);

                                           if ($4)
                                             sc->setHbaseAccessOptions($4);
                                           
                                           delete $1;
                                           delete $2;
                                         }
                                       | '(' table_name_as_clause_hint_and_col_list ')'
                                         {
                                           CheckModeSpecial1();
                                           $$ = $2;
                                         }

rel_subquery_and_as_clause : rel_subquery as_clause
                             {
                               $$ = new (PARSERHEAP()) RenameTable($1, *$2);
                               delete $2;
                             }
                           | '(' rel_subquery_and_as_clause ')'
                             {
                               CheckModeSpecial1();
                               $$ = $2;
                             }
with_clause : 
              TOK_WITH with_clause_elements
              {
                 $$ = NULL;
              }
              | TOK_WITH TOK_RECURSIVE with_clause_elements
              {
                        *SqlParser_Diags << DgSqlCode(-3022) << DgString0("WITH RECURSIVE");
                        YYERROR;
              }

with_clause_elements : with_clause_element
              {
                 $$ = NULL;
              }
              | with_clause_elements ',' with_clause_element
              {
                 $$ = NULL;
              }

with_clause_element : correlation_name TOK_AS '(' query_expression ')'
                      {
                         RelExpr *root = $4;

                         if (root->getOperatorType() != REL_ROOT)
                           root = new (PARSERHEAP()) RelRoot(root, REL_ROOT);

                         $$= new (PARSERHEAP()) RenameTable(root, *$1); 

                         //Duplicated definition of WITH
                         if(SqlParser_CurrentParser->hasWithDefinition($1) )
                          {
                            *SqlParser_Diags << DgSqlCode(-3288)
                                             << DgString0((*$1).toCharStar());
                             YYERROR;
                          }

                          SqlParser_CurrentParser->insertWithDefinition($1 , $$);
                      }

rel_subquery_as_clause_and_col_list : rel_subquery as_clause '(' derived_column_list ')'
                                      {
                                        $$ = new (PARSERHEAP())
				          RenameTable($1, *$2, $4);
                                        delete $2;
                                      }
                                    | '(' rel_subquery_as_clause_and_col_list ')'
                                      {
                                        CheckModeSpecial1();
                                        $$ = $2;
                                      }


/* type relx */
joined_table_needing_spec: joined_table_needing_spec2
	   {
	     inJoinSpec->push(SqlParser_ParenDepth + STACKDELTA_ENSURES_NONZERO);
	   }

joined_table_needing_spec2:
         table_reference TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $3, REL_JOIN);
	   }
       | table_reference TOK_INNER TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_JOIN);
	   }
       | table_reference left_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_LEFT_JOIN);
	   }
       | table_reference right_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_RIGHT_JOIN);
	   }
       | table_reference full_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_FULL_JOIN);
	   }

/* type relx */
joined_table :  '(' joined_table ')'   { $$ = $2; }

       // ODBC extension to support {oj outer-join-expression}
       |  '{' TOK_OJ joined_table '}'
           {
             $$ = $3;
             if ($$->getOperatorType() != REL_LEFT_JOIN && 
                 $$->getOperatorType() != REL_RIGHT_JOIN && 
                 $$->getOperatorType() != REL_FULL_JOIN &&
                 $$->getOperatorType() != REL_JOIN
                ) 
             {
               *SqlParser_Diags << DgSqlCode(-3136);
               YYERROR;
             }
           }

       |  table_reference TOK_CROSS TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_JOIN);
	   }

	 /* non NATURAL joins must have join_specifications  -- ANSI */
	 /* note that a join is an INNER join by default -- ANSI */
       |  joined_table_needing_spec join_specification
	   {
	     ((Join *)$$)->setJoinPredTree($2);
	     inJoinSpec->pop();
	   }

	 /* NATURAL joins CANNOT have a join specification  -- ANSI */
	 /* note that a join is an INNER join by default -- ANSI */
	 /* No such thing as a "NATURAL UNION" join -- ANSI */
       | table_reference TOK_NATURAL TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $4, REL_JOIN, NULL, TRUE);
	   }
       | table_reference TOK_NATURAL TOK_INNER TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $5, REL_JOIN, NULL, TRUE);
	   }
       | table_reference TOK_NATURAL left_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $5, REL_LEFT_JOIN, NULL, TRUE);
	   }
       | table_reference TOK_NATURAL right_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $5, REL_RIGHT_JOIN, NULL, TRUE);
	   }
       | table_reference TOK_NATURAL full_outer TOK_JOIN table_reference
	   {
	     $$ = new (PARSERHEAP()) Join($1, $5, REL_FULL_JOIN, NULL, TRUE);
	   }

	 /* UNION joins CANNOT have a join specification -- ANSI */
       | table_reference TOK_UNION_JOIN table_reference
	   { 
		   *SqlParser_Diags << DgSqlCode(-3137);
		   //yyerror("");
		   //YYERROR;
		   YYABORT;
	    }

full_outer : TOK_FULL 
             { 
                $$ = 0;
             }
             | TOK_FULL TOK_OUTER
             {
	       $$ = NULL;
             }          

right_outer : TOK_RIGHT 
            {
	      $$ = NULL;
            }
            | TOK_RIGHT TOK_OUTER
            {
              $$ = NULL;
            }


left_outer : TOK_LEFT 
            {
              $$ = NULL;
            }
            | TOK_LEFT TOK_OUTER
            {
              $$ = NULL;
            }




/* type item */
derived_column_list : identifier
				{
				  $$ = new (PARSERHEAP())
				    RenameCol(NULL, new (PARSERHEAP())
				      ColRefName(*$1, PARSERHEAP()));
				  delete $1;
				}
	      | identifier ',' derived_column_list
				{
				  $$ = new (PARSERHEAP())
				    ItemList(new (PARSERHEAP())
				      RenameCol(NULL, new (PARSERHEAP())
				        ColRefName(*$1, PARSERHEAP())),
				      $3);
				  delete $1;
				}

/* type item */
set_function_specification : set_function_type '(' set_quantifier value_expression ')'
			   {
			     if ($1 == ITM_COUNT)
			       {
				 // count of all non-null operand is
				 // to be returned.
				 if ($4->getOperatorType() != ITM_CONSTANT)
				   $1 = ITM_COUNT_NONULL;

				 $$ = new (PARSERHEAP())
				   Aggregate($1, $4, $3, ITM_COUNT, '!');
			       }
			     else if ($1 == ITM_VARIANCE || $1 == ITM_STDDEV)
			       $$ = new (PARSERHEAP()) Variance($1, $4, NULL, $3);
			     else
			       $$ = new (PARSERHEAP()) Aggregate($1, $4, $3);
			   }
              | set_function_type '(' set_quantifier value_expression ',' 
                                                     value_expression ')'
			   {
			     if ($1 == ITM_VARIANCE || $1 == ITM_STDDEV)
			       $$ = new (PARSERHEAP()) Variance($1, $4, $6, $3);
			     else
			       {
				 // no other aggs accept 2 operands
				 Aggregate a($1, $4, $3);
				 *SqlParser_Diags << DgSqlCode(-3129)
				   << DgString0(a.getTextUpper());
				 YYERROR;  // CHANGE TO YYABORT
			       }
			   }
	      | set_function_type '(' '*' ')'
			   {
                              if ($1 != ITM_COUNT)
                              {
                                // only COUNT allows (*)
                                *SqlParser_Diags << DgSqlCode(-3012);
                                YYERROR;  // CHANGE TO YYABORT
                              }
                              else
                              {
                                $$ = new (PARSERHEAP())
				  Aggregate(ITM_COUNT,
					    new (PARSERHEAP()) SystemLiteral(1),
					    FALSE /*i.e. not distinct*/,
					    ITM_COUNT_STAR__ORIGINALLY,
					    '!');
                              }
			   }
              | TOK_GROUP_CONCAT '('  set_quantifier value_expression concat_options ')' 
               {
                  $$ = new (PARSERHEAP())
                  PivotGroup(ITM_PIVOT_GROUP, $4, $5, $3);
 
               }
              | TOK_PIVOT '(' set_quantifier value_expression pivot_options ')'
                  {

                    $$ = new (PARSERHEAP()) PivotGroup(ITM_PIVOT_GROUP, $4, $5, $3);
                  }
              | TOK_PIVOT_GROUP '(' set_quantifier value_expression pivot_options ')'
                  {

                    $$ = new (PARSERHEAP()) PivotGroup(ITM_PIVOT_GROUP, $4, $5, $3);
                  }
              | TOK_XMLAGG '(' TOK_XMLELEMENT '(' identifier ',' value_expression ')' order_by_clause ')' '.' TOK_EXTRACT '(' QUOTED_STRING ')' '.' identifier '(' ')'
                 {
                   CheckModeSpecial4;

                   PivotGroup::PivotOption * po = 
                     new (PARSERHEAP ()) PivotGroup::PivotOption
                     (PivotGroup::DELIMITER_, NULL, (char*)"", -1);

                   NAList<PivotGroup::PivotOption*> * frol =
                     new (PARSERHEAP ()) NAList<PivotGroup::PivotOption*>(PARSERHEAP ());
                   frol->insert(po);
                   
                   $$ = new (PARSERHEAP()) PivotGroup(ITM_PIVOT_GROUP, $7, frol);
                  }

/* type operator_type */
set_function_type :   TOK_AVG 		{ $$ = ITM_AVG; }
                    | TOK_MAX 		{ $$ = ITM_MAX; }
                    | TOK_MIN 		{ $$ = ITM_MIN; }
                    | TOK_SUM 		{ $$ = ITM_SUM; }
                    | TOK_COUNT 	{ $$ = ITM_COUNT; }
                    | TOK_VARIANCE 	{ $$ = ITM_VARIANCE; }
                    | TOK_STDDEV 	{ $$ = ITM_STDDEV; }
                    | TOK_GROUPING 	{ $$ = ITM_GROUPING; }

concat_options : empty
                       {
                         $$ = NULL;
                       }
                    |  concat_options_list
                      {
                        $$ = $1;
                      }

pivot_options : empty
                       {
                         $$ = NULL;
                       }
                    | ',' pivot_options_list
                      {
                        $$ = $2;
                      }
concat_options_list : concat_option
                      {
                        NAList<PivotGroup::PivotOption*> * frol =
                          new (PARSERHEAP ()) NAList<PivotGroup::PivotOption*>(PARSERHEAP ());
                        frol->insert($1);
                        $$ = frol;
                      }
                    | concat_option  concat_options_list
                      {
                        $2->insert($1);
                        $$ = $2;
                      }

pivot_options_list : pivot_option
                      {
			NAList<PivotGroup::PivotOption*> * frol =
			  new (PARSERHEAP ()) NAList<PivotGroup::PivotOption*>(PARSERHEAP ());
			frol->insert($1);
			$$ = frol;
		      }
                    | pivot_option ',' pivot_options_list
                      {
			$3->insert($1);
			$$ = $3;
		      }
;

concat_option : TOK_SEPARATOR QUOTED_STRING
                      {
                        PivotGroup::PivotOption * po =
                          new (PARSERHEAP ()) PivotGroup::PivotOption
                          (PivotGroup::DELIMITER_, NULL, (char*)$2->data(), -1);

                        $$ = po;
                      }
                   | TOK_ORDER TOK_BY sort_spec_list  
                      {
                        PivotGroup::PivotOption * po =
                          new (PARSERHEAP ()) PivotGroup::PivotOption
                          (PivotGroup::ORDER_BY_, $3, NULL, -1);

                        $$ = po;
                      }
                   | TOK_MAX TOK_LENGTH NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
                        Int64 value = atoInt64($3->data());

                        PivotGroup::PivotOption * po =
                          new (PARSERHEAP ()) PivotGroup::PivotOption
                          (PivotGroup::MAX_LENGTH_, NULL, NULL, (Lng32)value);

                        $$ = po;
                      }

pivot_option : TOK_DELIMITER QUOTED_STRING
                      {
			PivotGroup::PivotOption * po = 
			  new (PARSERHEAP ()) PivotGroup::PivotOption
			  (PivotGroup::DELIMITER_, NULL, (char*)$2->data(), -1);
			
			$$ = po;
		      }
                   | TOK_ORDER TOK_BY '('  sort_spec_list  ')'
                      {
			PivotGroup::PivotOption * po = 
			  new (PARSERHEAP ()) PivotGroup::PivotOption
			  (PivotGroup::ORDER_BY_, $4, NULL, -1);
			
			$$ = po;
		      }
                   | TOK_MAX TOK_LENGTH NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
                        Int64 value = atoInt64($3->data()); 
  
			PivotGroup::PivotOption * po = 
			  new (PARSERHEAP ()) PivotGroup::PivotOption
			  (PivotGroup::MAX_LENGTH_, NULL, NULL, (Lng32)value);
			
			$$ = po;
		      }


/* type item */
sequence_func_specification : offset_sequence_function
                            | this_sequence_function
                            | moving_sequence_function
                            | running_sequence_function
                            | olap_sequence_function

/* type item */

this_sequence_function : TOK_THIS '(' value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqThisFunction($3);
                           }

/* type item */

offset_sequence_function : TOK_OFFSET '(' value_expression ',' 
                                          value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqOffset($3, $5);
                           }
                        | TOK_OFFSET '(' value_expression ',' 
                                         value_expression ',' 
                                         value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqOffset($3, $5, $7);
                           }

                        |  TOK_DIFF1 '('  value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqDiff1($3);
                           }

                        |  TOK_DIFF1 '('  value_expression ','
                                          value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqDiff1($3, $5);
                           }

                        |  TOK_DIFF2 '('  value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqDiff2($3);
                           }
                        |  TOK_DIFF2 '('  value_expression ','
                                          value_expression ')'
                           {
                             $$ = new (PARSERHEAP())
                               ItmSeqDiff2($3, $5);
                           }

/* type item */            

running_sequence_function : TOK_RCOUNT '(' '*' ')'
                             {
                               $$ = new (PARSERHEAP())
                                 ItmSeqRunningFunction(ITM_RUNNING_COUNT,
                                                    new (PARSERHEAP()) SystemLiteral(1));
                             }
                          | TOK_RCOUNT '(' value_expression ')'
                             {
                               $$ = new (PARSERHEAP())
                                 ItmSeqRunningFunction(ITM_RUNNING_COUNT, $3);
                             }

                          | TOK_ROWS TOK_SINCE TOK_CHANGED '(' value_expression_list ')'
                             {
                              $$ = new (PARSERHEAP())
                               ItmSeqRunningFunction(ITM_RUNNING_CHANGE, $5);
                             }

                          | running_func_type '(' value_expression ')'
                            {
                              $$ = new (PARSERHEAP())
                               ItmSeqRunningFunction($1, $3);
                            }
                            
                          | TOK_RRANK '(' sort_by_value_expression_list ')'
                            {
                            
                            ItmSeqRunningFunction *tmp = new (PARSERHEAP())
                                                  ItmSeqRunningFunction(ITM_RUNNING_RANK, $3);
                                                       
                            if (SqlParser_CurrentParser->modeSpecial1()	|| 
                                  CmpCommon::getDefault(COMP_BOOL_200) == DF_ON) 
                              {               
                                // group by becomes the partition by for TD.
                                // see getTableExpressionRelExpr in SqlParserAux.cpp
                                tmp->setOLAPInfo(NULL, $3, TRUE);
                                if (SqlParser_CurrentParser->hasTDFunctionsEntries() == 0)
                                {
                                  YYERROR;
                                } 

                                SqlParser_CurrentParser->setTopHasTDFunctions(TRUE);
                              }              
                              
                              $$ = tmp;                
                            }


running_func_type        :  TOK_RAVG         { $$ = ITM_RUNNING_AVG; }
                         | TOK_LASTNOTNULL    { $$ = ITM_LAST_NOT_NULL; }
                         | TOK_RMAX           { $$ = ITM_RUNNING_MAX; }
                         | TOK_RMIN           { $$ = ITM_RUNNING_MIN; }
                         | TOK_RSTDDEV        { $$ = ITM_RUNNING_SDEV; }
                         | TOK_RSUM           { $$ = ITM_RUNNING_SUM; }
                         | TOK_RVARIANCE      { $$ = ITM_RUNNING_VARIANCE; }

/* type item */
moving_sequence_function  : TOK_ROWS TOK_SINCE '(' search_condition ')'
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqRowsSince( $4,  /*search_condition */
                                                 NULL,
                                                 FALSE );
                            }
                          | TOK_ROWS TOK_SINCE '(' search_condition ',' value_expression ')'
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqRowsSince( $4,  /*search_condition */
                                                 $6,  /*value_expression*/
                                                 FALSE                      );
                            }

                          | TOK_ROWS TOK_SINCE TOK_INCLUSIVE '(' search_condition ')'
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqRowsSince( $5,  /*search_condition */
                                                 NULL,
                                                 TRUE                      );
                            }
                          | TOK_ROWS TOK_SINCE TOK_INCLUSIVE '(' search_condition ',' value_expression')'
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqRowsSince( $5,  /*search_condition */
                                                 $7,  /*value_expression*/
                                                 TRUE                      );
                            }
                          | TOK_MCOUNT '(' '*' ',' value_expression ')'
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqMovingFunction(ITM_MOVING_COUNT,
                                                   new (PARSERHEAP()) SystemLiteral(1),
                                                   $5);
                            }
                          | TOK_MCOUNT '(' '*' ',' value_expression ',' value_expression')'     // three argument version
                            {
                              $$ = new (PARSERHEAP())
                                ItmSeqMovingFunction(ITM_MOVING_COUNT, 
                                                   new (PARSERHEAP()) SystemLiteral(1),
                                                   $5,
                                                   $7);
                            }
                          | TOK_MCOUNT '(' value_expression ',' value_expression')'     // two argument version
                            {
                              $$ = new (PARSERHEAP())
                               ItmSeqMovingFunction(ITM_MOVING_COUNT, $3, $5);
                            }
                          | TOK_MCOUNT '(' value_expression ',' value_expression ',' value_expression')'     // three argument version
                            {
                              $$ = new (PARSERHEAP())
                               ItmSeqMovingFunction(ITM_MOVING_COUNT, $3, $5, $7);
                            }

                         | moving_func_type '(' value_expression ',' value_expression ')'     // two argument version
                            {
                              $$ = new (PARSERHEAP())
                               ItmSeqMovingFunction($1, $3, $5);
                            }
                         | moving_func_type '(' value_expression ',' value_expression ',' value_expression')'     // three argument version
                            {
                              $$ = new (PARSERHEAP())
                               ItmSeqMovingFunction($1, $3, $5, $7);
                            }

moving_func_type         :  TOK_MAVG      { $$ = ITM_MOVING_AVG; }
                         | TOK_MMAX      { $$ = ITM_MOVING_MAX; }
                         | TOK_MMIN      { $$ = ITM_MOVING_MIN; }
                         | TOK_MSTDDEV   { $$ = ITM_MOVING_SDEV; }
                         | TOK_MSUM      { $$ = ITM_MOVING_SUM; }
                         | TOK_MVARIANCE { $$ = ITM_MOVING_VARIANCE; }
                         | TOK_MRANK     { $$ = ITM_MOVING_RANK; }

/* type item */
olap_sequence_function : set_function_specification TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause
                         ')'
                            {
                              $$ = $1;
                              if ($5 == NULL)
                              {
				((Aggregate *)$$)->setOLAPInfo($4, $5, -INT_MAX, INT_MAX);
			      }
			      else
			      {
				((Aggregate *)$$)->setOLAPInfo($4, $5, -INT_MAX, 0);
			      }
			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                            }

                       | set_function_specification TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause
                         TOK_ROWS olap_rows_spec
                         ')'
                            {
                              $$ = $1;
                              ((Aggregate *)$$)->setOLAPInfo($4, $5, $7, 0);
       			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                            }

                       | set_function_specification TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause
                         TOK_ROWS TOK_BETWEEN olap_rows_spec TOK_AND olap_rows_spec
                         ')'
                            {
                              $$ = $1;
                              ((Aggregate *)$$)->setOLAPInfo($4, $5, $8, $10);
			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                            }

                       | TOK_RRANK '(' ')' TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause ')'
                            {
                              $$ = new (PARSERHEAP()) 
                              //ITM_RUNNING_RANK is not really an aggregate, it was added to support olap
                                Aggregate(ITM_RUNNING_RANK, $7);
                              ((Aggregate *)$$)->setOLAPInfo($6, $7, -INT_MAX, 0);
			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                            }

                       | TOK_D_RANK '(' ')' TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause ')'
                            {
                              $$ = new (PARSERHEAP()) 
                              //ITM_RUNNING_DRANK is not really an aggregate, it was added to support olap
                                Aggregate(ITM_RUNNING_DRANK, $7);
                              ((Aggregate *)$$)->setOLAPInfo($6, $7, -INT_MAX, 0);
			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                              
                            }
                         
                       | TOK_ROW_NUMBER '(' ')' TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause ')'
                            {
                              $$ = new (PARSERHEAP()) 
                                Aggregate(ITM_COUNT, 
                                          new (PARSERHEAP()) SystemLiteral(1),
                                          FALSE /*i.e. not distinct*/,
                                          ITM_COUNT_STAR__ORIGINALLY,
                                          '!');
                              ((Aggregate *)$$)->setOLAPInfo($6, $7, -INT_MAX, 0);
			      if (SqlParser_CurrentParser->hasOlapFunctionsEntries() == 0)
			      {
				YYABORT;
			      } 
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                            }

// start of OLAP LEAD function()
                       | TOK_LEAD '(' value_expression ')' TOK_OVER '('
                         opt_olap_part_clause opt_olap_order_clause ')'
                        {
                          ItmLeadOlapFunction* leadExpr =
                                       new (PARSERHEAP()) ItmLeadOlapFunction($3, 1);
                          leadExpr->setOLAPInfo($7, $8);
                          $$=leadExpr;

                          SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                        }
                       | TOK_LEAD '(' value_expression ',' value_expression ')' TOK_OVER '('
                         opt_olap_part_clause opt_olap_order_clause ')'
                        { 
                          ItmLeadOlapFunction* leadExpr = 
                                       new (PARSERHEAP()) ItmLeadOlapFunction($3, $5);
                          leadExpr->setOLAPInfo($9, $10);
                          $$=leadExpr;
                          
                          SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                        }
                       | TOK_LEAD '(' value_expression ',' value_expression ',' value_expression ')' TOK_OVER '('
                         opt_olap_part_clause opt_olap_order_clause ')'
                        { 
                          ItmLeadOlapFunction* leadExpr = 
                                       new (PARSERHEAP()) ItmLeadOlapFunction($3, $5, $7);
                          leadExpr->setOLAPInfo($11, $12);
                          $$=leadExpr;
                          
                          SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                        }
// end of OLAP LEAD function()
// start of OLAP LAG function()
                       |TOK_LAG '(' value_expression ','  value_expression ','  value_expression ')'  TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause ')'
                         {
                             //3rd value_expression is default value    
                              ItmLagOlapFunction* lagExpr =
                                                       new (PARSERHEAP()) ItmLagOlapFunction($3, $5, $7);
                             lagExpr->setOLAPInfo($11, $12);
                             $$=lagExpr;
                             SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                         }
                       |TOK_LAG '(' value_expression ','  value_expression ')'  TOK_OVER '('
                         opt_olap_part_clause
                         opt_olap_order_clause ')'
                         {
                              ItmLagOlapFunction* lagExpr =
                                                       new (PARSERHEAP()) ItmLagOlapFunction($3, $5);
                             lagExpr->setOLAPInfo($9, $10);
                             $$=lagExpr;
                             SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                         }
                       |TOK_LAG '(' value_expression  ')'  TOK_OVER '('
                          opt_olap_part_clause
                          opt_olap_order_clause ')'
                          {    
                               //default offset is 1;
                               NAString * defaultOffset = new (PARSERHEAP()) NAString("1");
                               ItemExpr * offsetExpr = literalOfNumericNoScale(defaultOffset);
                               if (!offsetExpr) YYERROR;   
                               ItmLagOlapFunction* lagExpr =
                                                        new (PARSERHEAP()) ItmLagOlapFunction($3, offsetExpr);
                              lagExpr->setOLAPInfo($7, $8);
                              $$=lagExpr;
                              SqlParser_CurrentParser->setTopHasOlapFunctions(TRUE);
                          }
// end of OLAP LAG function()



opt_olap_part_clause   : empty
                         {
                           $$ = NULL;
                         }
                       | TOK_PARTITION_BY value_expression_list
                         {
                           $$ = $2;
                         }

opt_olap_order_clause  : empty
                         {
                           $$ = NULL;
                         }
                       | TOK_ORDER TOK_BY sort_by_value_expression_list
                         { 
                           $$ = $3; 
                         }

olap_rows_spec         : TOK_UNBOUNDED olap_prec_follow
                         {
                           $$ = INT_MAX * $2;
                         }
                       | unsigned_smallint olap_prec_follow
                         {
                           $$ = $1 * $2;
                         }
                       | TOK_CURRENT TOK_ROW
                         {
                           $$ = 0;
                         }


olap_prec_follow       : TOK_PRECEDING
                         {
                           $$ = -1;
                         }
                       | TOK_FOLLOWING
                         {
                           $$ = 1;
                         }

//
// This list, VEL, can be any of:
// VE		-- which, through rule "primary", can be '(VE)'		[VE]
// 'VE,VE'	-- Tandem extension to row-value-constructor		[VELC]
// '(VE,VE)'	-- Ansi row-value-ctor, which can also be '((VE,VE))'	[VELP]
//
// A VEL has one or more items; a VELC or VELP has two or more.
// In other right-hand-sides in other rules herein, you often see
//	'(' value_expression_list ')'
// which is NOT the same as
//	value_expression_list_paren
// because the first can have one item while the second must have two or more.
//
// Note that the ItemLists, to preserve order, are built right-recursively
// (so yacc shifts its stack rather than reducing, unfortunately).
//
// The %precedence means that these rules won't be reduced when we
// have the opportunity to shift in the comparison_predicate rule
// (has the higher %prec '=' '<' '>' etc).
// (Shift is always already taken in the between_predicate rule, %prec TOK_AND.)
// This is part of the fix for Genesis 10-971104-1441.

value_expression_list : value_expression			%prec ','
		      	    | value_expression_list_comma	%prec ','
		      	    | value_expression_list_paren	%prec ','

value_expression_list_paren : '(' value_expression_list_comma ')'
				  {
				    $$ = $2;
				  }
			    | '(' value_expression_list_paren ')'
				  {
				    $$ = $2;
				  }

value_expression_list_comma : value_expression ',' value_expression
				  {
				    $$ = new (PARSERHEAP()) ItemList( $1, $3 );
				  }
		      	    | value_expression ',' value_expression_list_comma
				  {
				    $$ = new (PARSERHEAP()) ItemList( $1, $3 );
				  }

			    // The next subrules are a palliative for
			    // Genesis 10-970929-8459: that is, we just want
			    // to issue a more helpful error message for the
			    // ambiguity introduced by our Tandem extension
			    // of not requiring parens around a value-expr-list.
			    //
			    // The subrules below are abstracted from the
			    // actual_table_name and table_reference rules
			    // (cannot use those directly because that makes
			    // hundreds of yacc conflicts!).
			    //
			    // Other similar "fixes" are also in the Binder,
			    // for cases that cannot be detected here
			    // without yacc conflicts.
			    //
		      	    | value_expression ',' value_expression as_clause
				  {
				    checkError4101($4, $3);
				    YYABORT;
				  }
		      	    | value_expression ',' HOSTVAR TOK_PROTOTYPE
				  {
				    checkError4101($3);
				    YYABORT;
				  }
		      	    | value_expression ',' SYSTEM_VOLUME_NAME
				  {
				    checkError4101($3);
				    YYABORT;
				  }
		      	    | value_expression ',' DOLLAR_IDENTIFIER
				  {
				    checkError4101($3);
				    YYABORT;
				  }

/* type item */
value_expression_list_lr    : value_expression		
		      	    | value_expression_list_lr ',' value_expression
				{
				  ItemList * il =
				    new (PARSERHEAP()) ItemList( $3, $1 );

				  NABoolean lcConst = FALSE;
				  NABoolean rcConst = FALSE;
				  /* isStrict = TRUE, considerVEG = FALSE are the args for
				  doesExprEvaluateToConstant */
				  if ($3->castToItemExpr()->doesExprEvaluateToConstant(TRUE,FALSE))
				    {
				      rcConst = TRUE;
				    }
				  
				  if ($1->castToItemExpr()->getOperatorType()
				      == ITM_ITEM_LIST)
				    {
				      ItemList * lc = 
					(ItemList*)($1->castToItemExpr());
				      il->numOfItems() = 
					lc->numOfItems() + 1;
				      
				      if (lc->constChild())
					lcConst = TRUE;
				    }
				  else
				    {
				      // left is not a list.
				      if ($1->castToItemExpr()->doesExprEvaluateToConstant(TRUE,FALSE))
					lcConst = TRUE;
				      il->numOfItems() = 2;
				    }
				  if (lcConst && rcConst)
				    il->constChild() = TRUE;

				  $$ = il;
				}


/* type item */
value_expression : value_expression_sans_collate collation_option
			    {
				if ($2.collation_  == CharInfo::CZECH_COLLATION){
				  *SqlParser_Diags << DgSqlCode(-3430)<<  DgString0(SQLCOLLATIONSTRING_CZECH);
				  YYERROR;
				  }
			      if ($2.coercibility_ == CharInfo::EXPLICIT) {
				// Per ANSI 6.13 SR 4(a)(i), overwrite
				// any collation, even an EXPLICIT one.
				//
				// We must let the Binder apply (or reject)
				// this collation during type synthesis.
				//
				$1->collateClause() = new (PARSERHEAP())
				  CollationAndCoercibility;
				memcpy($1->collateClause(), &$2, sizeof($2));
			      }
			    }

/* type item */
value_expression_sans_collate : term
              | value_expression '+' term
				{
				  $$ = new (PARSERHEAP())
				    BiArith(ITM_PLUS, $1, $3);
				}
              | value_expression '-' term
				{
				  $$ = new (PARSERHEAP())
				    BiArith(ITM_MINUS, $1, $3);
				}
              | value_expression TOK_CONCATENATION term
                                {
                                  $$ = new (PARSERHEAP())
				    Concat( $1, $3);
                                }
              | value_expression '&' term
                {
		  $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITAND, $1, $3);
		}
              | value_expression TOK_BITOR_OPERATOR term
                {
		  $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITOR, $1, $3);
		}
              | value_expression '^' term
                {
		  $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITXOR, $1, $3);
		}
             | '~' term
                {
		  $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITNOT, $2);
		}

/* type item */
term : factor1
              | term '*' factor1
				{
				  $$ = new (PARSERHEAP())
				    BiArith(ITM_TIMES, $1, $3);
				}
              | term '/' factor1
				{
				  $$ = new (PARSERHEAP())
				    BiArith(ITM_DIVIDE, $1, $3);
				}

/* type item */
factor1 : factor
        | factor TOK_EXPONENTIATE factor1
				{
				  $$ = new (PARSERHEAP())
				    MathFunc(ITM_EXPONENT, $1, $3);
				}

/* type item */
factor : sign primary
				{
				  if ($1 == '+') // just eat the unnecessary '+'
				    $$ = $2;
				  else {
				    // **NO: $$ = new UnArith(ITM_NEGATE, $2);**
				    //
				    // Represent unary "-$2" as binary "0 - $2"
				    $$ = new (PARSERHEAP()) // "-$2" => "0 - $2"
				      BiArith(ITM_MINUS,
					      literalOfNumericNoScale(
						new (PARSERHEAP()) NAString("0", PARSERHEAP())),
					      $2);
				    ((BiArith*) $$)->setIsUnaryNegate();
				    //fixup hqc constant list for UnaryNegate, not for 1.1
				    //SqlParser_CurrentParser->FixupForUnaryNegate((BiArith*) $$);
				    }
				}
              | '!' primary
              {
                $$ = new (PARSERHEAP())
                  UnArith($2);
              }
              | primary
	      | primary TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ')'
                               {
                                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
				 $$ = new (PARSERHEAP()) Format($1, *$4, FALSE);
			       }
	      | primary TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ')'
                        TOK_LPAREN_BEFORE_DATATYPE data_type ')'
                               {
                                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
				 CheckModeSpecial1();
				 $$ = new (PARSERHEAP()) Cast($1, $7);
			       }

	      | primary TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ',' TOK_TITLE character_string_literal ')'
                               {
                                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
				 $$ = new (PARSERHEAP()) Format($1, *$4, FALSE);
			       }
	      | primary TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ',' TOK_TITLE character_string_literal ')' TOK_LPAREN_BEFORE_DATATYPE data_type ')'
                               {
                                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
				 CheckModeSpecial1();
				 
				 $$ = new (PARSERHEAP()) Cast($1, $10);
			       }

	      | primary TOK_LPAREN_BEFORE_NAMED TOK_NAMED correlation_name ')'
                               {
				 CheckModeSpecial1();
				 
				 $$ = new (PARSERHEAP())
				   RenameCol($1, new (PARSERHEAP()) 
					     ColRefName(*$4, PARSERHEAP()));
				 delete $4;
			       }

	      | primary TOK_LPAREN_BEFORE_DATATYPE data_type optional_cast_spec_not_null_spec ')'
                               {
				 CheckModeSpecial1();
				 
				 $$ = new (PARSERHEAP()) Cast($1, $3);
                                  if ($4) // NOT NULL phrase specified
                                  {
                                    $3->setNullable(FALSE);
                                  }

			       }

/* type item (Scalar Subquery) */
row_subquery :  rel_subquery { $$ = new (PARSERHEAP()) RowSubquery($1); }
	     | '(' row_subquery ')' 
                                { $$ = $2; }

/* type item */
primary :     '(' value_expression ')'
				{ $$ = $2; }
	      | '(' value_expression ')' interval_qualifier
				{
				  if ($2->getOperatorType() == ITM_MINUS)
                                  {
                                    SQLInterval *iq =
				      new (PARSERHEAP()) SQLInterval(
					PARSERHEAP(), TRUE,
					$4->getStartField(),
					$4->getLeadingPrecision(),
					$4->getEndField(),
					$4->getFractionPrecision());
				    delete $4;
                                    if (! iq->checkValid(SqlParser_Diags))
                                      YYERROR;
				    $$ = new (PARSERHEAP()) Cast ($2, iq);
                                  } 
                                  else
                                  {
				    // Only minus allowed: "(dt - dt) iq"
                                    *SqlParser_Diags << DgSqlCode(-3013);
                                     YYERROR;
                                  }  
				}
	      | row_subquery
	      | dml_column_reference
	      | dml_column_reference TOK_LPAREN_BEFORE_DATE_COMMA_AND_FORMAT TOK_DATE ',' TOK_FORMAT character_string_literal ')'
                {
                  // DEFAULT_CHARSET has no effect on character_string_literal in this context
                  $$ = new (PARSERHEAP()) DateFormat($1, *$6, DateFormat::FORMAT_TO_CHAR);
		}

              | hostvar_expression
                        {
                          if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_OFF) 
                            {
                              TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
                              $$ = $1;
                            }
			}
              | literal
                        {
                          $$ = $1;
			}
              | dynamic_parameter
	      | dynamic_parameter_array
	      | internal_arith_placeholder
              | set_function_specification
              | sequence_func_specification
              | cast_specification
	      | value_function

              /* ODBC extension, map {fn scalar-function} to scalar-function */
              | '{' TOK_FN set_function_specification '}'
                        {
                         $$ = $3;
                        }

              | '{' TOK_FN value_function '}'
                        {
                          $$ = $3;
			}

              /* added ODBC extension: map LENGTH(str) in ODBC to Char LENGTH.
	       Trim the trailing blanks...that's what ODBC wants */
              | '{' TOK_FN TOK_LENGTH '(' value_expression ')' '}'
                         {
			   $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_ODBC_LENGTH, $5);
                         }

              | '{' TOK_FN cast_specification '}'
                        {
                          $$ = $3;
			}
	      | TOK_USERNAMEINTTOEXT '(' value_expression ')'
	      {
		NAString ldap("USER_NAME");
		ColRefName  *ldapuser =  new (PARSERHEAP()) ColRefName(ldap);
		ItemExpr* select_list = new (PARSERHEAP()) ColReference(ldapuser);

		NAString usercat("MANAGEABILITY");
		NAString usersch("USER_MANAGEMENT");
		NAString usertab("USERDATA");
		CorrName * tabName = new (PARSERHEAP()) CorrName(usertab, 0, usersch, usercat);
		RelExpr * from_clause = new (PARSERHEAP()) Scan(*tabName);

		NAString neouser_colname("NEOUSER_NAME");
		ColRefName  *neouser = new (PARSERHEAP()) ColRefName(neouser_colname);
		ItemExpr* wc_col = new (PARSERHEAP()) ColReference(neouser);
		ItemExpr* where_clause = new (PARSERHEAP()) BiRelat(ITM_EQUAL, wc_col, $3);

		RelExpr * root_child = getTableExpressionRelExpr(from_clause, where_clause, NULL, NULL, NULL, NULL, NULL);
		RelRoot *root =  new (PARSERHEAP())
					    RelRoot(root_child, TransMode::ACCESS_TYPE_NOT_SPECIFIED_, LOCK_MODE_NOT_SPECIFIED_, REL_ROOT, select_list);
		RelRoot * root1 = finalize(root);
		$$ = new (PARSERHEAP()) RowSubquery(root1);
	      }

	      | TOK_DEFAULT		// Genesis 10-980217-0715, -0716
	         {
	           $$ = new (PARSERHEAP()) DefaultSpecification();
	         }
	      | null_constant

// CURRENTLY UNUSED...
// /* type item */
// value_specification : literal
//                     | dynamic_parameter
//                     | hostvar_expression
//                     {
//                       TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT);
//                       $$ = $1;
//                     }

/* type item */
null_constant : TOK_NULL
                                {
                                  $$ = new (PARSERHEAP()) ConstValue();
                                  SqlParser_CurrentParser->collectItem4HQC($$);
                                }

/* type item */
value_function :
       builtin_function_user

     | datetime_misc_function

     | datetime_misc_function_used_as_default

     | datetime_value_function

     | math_function

     | misc_function

     | string_function

     | user_defined_scalar_function

     | select_lob_to_obj_function

/* Get user defined function name.  Allow function only, or with schema, or catalog and schema.
   Must use ShortStringSequence to collect names for use with ComObjectName - in case any are
   delimited.  The function name must be changed to upper case, since it cannot be delimited 
   and the INTERNAL_FORMAT flag to ComObjectName is being used.  An INTERNAL_FORMAT name must
   be capitalized or it will be treated as a delimited name.
*/
user_defined_function_name : 
       regular_identifier_not_builtin 
         {
           // Function name only.
           $1->toUpper();
           ComObjectName *name = new (PARSERHEAP()) 
             ComObjectName(*$1, COM_UDF_NAME, 1, PARSERHEAP());
           if (name == NULL) YYABORT;
           $$ = name;
         }
     | DELIMITED_IDENTIFIER
         {
           ComObjectName *name = new (PARSERHEAP()) 
             ComObjectName(*$1, COM_UDF_NAME, 1, PARSERHEAP());
           if (name == NULL) YYABORT;
           $$ = name;
         }
     | qualified_name '.' regular_identifier_not_builtin
         {
           // qualified name can't be more than 2 parts.
           if ($1->numParts() > 2) YYABORT;

           NAString cat, sch;
           if ($1->numParts() == 2) 
           {
             cat=*($1->extract(0));
             sch=*($1->extract(1));
           }
           else if ($1->numParts() == 1) 
             sch=*($1->extract(0));

           $3->toUpper(); // UDF names can't be delimited.
           ComObjectName *comName = new (PARSERHEAP()) 
             ComObjectName(cat, sch, *$3,
                           COM_UDF_NAME, 
                           ComAnsiNamePart::INTERNAL_FORMAT, 
                           PARSERHEAP());
           if (comName == NULL) YYABORT;
           $$ = comName;
         }
user_defined_scalar_function : user_defined_function_name '(' udr_value_expression_list ')'
     {
        // UDFs - returns a UDFunction (ItemExpr).
        ComObjectName functionName(*$1, PARSERHEAP());
        LIST(ItemExpr *) newList(PARSERHEAP(), 0);
        newList = PARSERHEAP();


        // Insert arguments from a one-sided tree to a list.
        Int32 i=0;
        ItemExpr *expr = (ItemExpr *) $3;
        while (expr && expr->getOperatorType() == ITM_ITEM_LIST)
        { 
          // Child(1) always has the value expression to insert to list.
          // Child(0) always has the next node with 2 children.
          if (expr->child(1)) newList.insertAt((CollIndex) i++, (ItemExpr *)expr->child(1));
          expr = (ItemExpr *) expr->child(0);
        }
        if (expr) newList.insertAt((CollIndex) i, expr); // Insert last argument.

        UDFunction *udf = new (PARSERHEAP()) UDFunction(functionName, newList, PARSERHEAP());

        // The following is for computing view text (and MV, ... 
        // We need to save the position of the UDF name (and length) in the query
        // statement so that MVs, views, and triggers can rewrite the query to 
        // substitute fully qualified names.  Unfortunately, we cannot directly
        // use the same approach for columns and tables elsewhere in the parser.  
        // However, there should be a better way of doing it than what we have here.
        NAWchar *inputStr = SQLTEXTW();
        const ParScannedTokenQueue::scannedTokenInfo &tokInfo
            = ParScannedTokens->getScannedTokenInfo(0);
        Int32 pos = tokInfo.tokenStrPos - tokInfo.tokenStrOffset +
                    tokInfo.tokenStrLen;
        //TRAFODION-2931
	//Chinese character of inputStr will cause core dump
        //NAString *input = unicodeToChar(&inputStr[0], pos, (long) SqlParser_ISO_MAPPING,
        //                                 PARSERHEAP());
        NAString *input = unicodeToChar(&inputStr[0],
                                        pos,
                                        (CharInfo::CharSet) (ComGetNameInterfaceCharSet()),
                                        PARSERHEAP());
        //TRAFODION-2931
        char *inputC = new (PARSERHEAP()) char[pos+1];
        strncpy(inputC, input->data(), pos+1);
        delete input;
        
        Int32 openParen=0, openQuote=0, openSQuote=0,
              endOfUdfName=0, begOfUdfName=0, prevWasLetter=0, startPos=pos;
        do 
        {
          // We must backtrack through the query from the current position, which is
          // the closing paren for the UDF argument list and find the beginning of the
          // UDF name.  This backtrace must cross all arguments, which could be other
          // UDFs, subqueries, and include delimited names.  
          char c = inputC[pos];
          if (c == 0)        continue;
          if (c == '"')      openQuote  = openQuote  ? 0 : 1;
          if (openQuote > 0) continue;    // skip text in double quotes.
          if (c == '\'')     openSQuote = openSQuote ? 0 : 1;
          if (openSQuote > 0) continue;   // skip text in single quotes.
          if (c == ')')      openParen++;
          if (c == '(')      openParen--;
          if (openParen > 0) continue;    // skip text in parens
          if (c == ' ' || c == ',')       // Prev char could be beg of name.
            if (pos<startPos && isalnum(inputC[pos+1])) prevWasLetter=1;
             
          // Not text in parens or quotes:
          if (endOfUdfName == 0)  endOfUdfName = pos;
          else if (prevWasLetter == 1) { begOfUdfName = pos+1; break; }
          else if (openParen == -1)    { begOfUdfName = pos+1; break; }    
          prevWasLetter=0;
        } while (--pos>0);
        // end code for computing UDF func name position.

        ParInsertNameLocInOrder(begOfUdfName, endOfUdfName-begOfUdfName);
        udf->setNamePosOfUdfInQuery(begOfUdfName);

        NADELETEBASIC(inputC, PARSERHEAP());

	$$ = udf;
     }

table_mapping_function_invocation :
     qualified_name '(' tmudf_table_expression ',' tmudf_table_expression optional_tmudf_param_list_with_comma ')' 
   {
     // TBD: Support TMUDFs with two table-valued inputs
     YYERROR;
   }
   | qualified_name '(' tmudf_table_expression optional_tmudf_param_list_with_comma ')' 
   {
     //Table mapping UDF returns a TMUDFunction (RelExpr)
     CorrName  *functionName = corrNameFromStrings($1);
     if (functionName == NULL)
		YYABORT;

     TableMappingUDF *tmudf =
       new (PARSERHEAP()) TableMappingUDF(1, *functionName, $4 );

     tmudf->child(0) = $3;
     $$ = tmudf;
   }
   |  qualified_name '(' optional_tmudf_param_list ')' 
   {
     //Table mapping UDF returns a TMUDFunction (RelExpr)
     CorrName  *functionName = corrNameFromStrings($1);
     if (functionName == NULL)
		YYABORT;

     $$ = new (PARSERHEAP()) TableMappingUDF(0, *functionName, $3 );
   } 



tmudf_table_expression : TOK_TABLE '(' tmudf_query_expression ')' 
                         {
                           $$ = $3;
                         }
                         | 
                         TOK_TABLE '(' tmudf_query_expression ')' as_clause
                         {
                           $$=new (PARSERHEAP()) RenameTable($3, *$5);
                           delete $5;
                         }
                         | TOK_TABLE '(' tmudf_query_expression ')' as_clause '(' derived_column_list ')'
			 {
                           $$ = new(PARSERHEAP()) RenameTable($3,*$5,$7);
                           delete $5;
                         }

tmudf_query_expression : query_specification optional_tmudf_order_by
                           {
                             if ($2)
                               ((RelRoot*)$1)->addOrderByTree($2);
                             $$ = $1;
                           }
                       | query_specification TOK_PARTITION_BY value_expression_list optional_tmudf_order_by
                           {
                             ((RelRoot*)$1)->addPartitionByTree($3);
                             ((RelRoot*)$1)->setPartReqType(SPECIFIED_PARTITIONING);
                             if ($4)
                               ((RelRoot*)$1)->addOrderByTree($4);
                             $$ = $1;
                           }
                       | query_specification TOK_NO_PARTITION optional_tmudf_order_by
                           {
                             ((RelRoot*)$1)->setPartReqType(NO_PARTITIONING);
                             if ($3)
                               ((RelRoot*)$1)->addOrderByTree($3);
                             $$ = $1;
                           }
                       | query_specification TOK_REPLICATE_PARTITION optional_tmudf_order_by
                           {
                             ((RelRoot*)$1)->setPartReqType(REPLICATE_PARTITIONING);
                             $$ = $1;
                             if ($3)
                               ((RelRoot*)$1)->addOrderByTree($3);
                           }

optional_tmudf_order_by : empty
                           {
                             $$ = NULL;
                           }
                        | TOK_ORDER TOK_BY sort_by_value_expression_list
                           {
                             $$ = $3;
                           }

/* type item */
optional_tmudf_param_list_with_comma : empty
                   {
                     $$ = NULL;
                   }
               | ',' tmudf_param_list
                   {
                     $$ = $2;
                   }

/* type item */
optional_tmudf_param_list : empty
                   {
                     $$ = NULL;
                   }
               | tmudf_param_list

/* type item */
tmudf_param_list : tmudf_param
                   {
                     $$ = $1;
                   }
                   | tmudf_param ',' tmudf_param_list
                   {
		     $$ = new(PARSERHEAP()) ItemList($1, $3);
                   } 

/* type item */
tmudf_param : value_expression


udr_value_expression_list : 
       value_expression
     | table_name_dot_star
     | value_expression ',' udr_value_expression_list
        {
          ItemList * il = new (PARSERHEAP()) ItemList( $3, $1 );
          $$ = il; // ItemList *
        }
     | table_name_dot_star ',' udr_value_expression_list
        {
          ItemList * il = new (PARSERHEAP()) ItemList( $3, $1 );
          $$ = il; // ItemList *
        }
     | empty
        {
          $$ = NULL;
        }

table_name_dot_star : actual_table_name TOK_DOT_STAR
     {
        // Returns a ColReference ItemExpr.
        ColRefName *starName
          = new (PARSERHEAP()) ColRefName(TRUE, CorrName(*$1, PARSERHEAP()), PARSERHEAP());
        $$ = new (PARSERHEAP()) ColReference(starName);
        ParUpdateNameLocForDotStar(starName);
        delete $1;
     }

/* type item */
datetime_value_function : TOK_CURDATE '(' ')'
                                {
                                  /* ODBC extension, map to  */
                                  /* TOK_CURRENT_DATE        */
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                 DatetimeType::SUBTYPE_SQLDate, 0);
                                }
     | TOK_CURRENT_DATE
                                {
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLDate, 0);
                                }
     | TOK_SYSDATE
                                {
                                  if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_ON) 
                                    {
                                      $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                           DatetimeType::SUBTYPE_SQLTimestamp, 0);
                                    }
                                  else
                                    {
                                      $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                           DatetimeType::SUBTYPE_SQLDate, 0);
                                    }
                                }
     | TOK_DATE
                                {
				  CheckModeSpecial1();

				  /* special1 mode extenstion*/
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLDate, 0);
                                }
     | TOK_TIME
				{
				  CheckModeSpecial1();

                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTime, 
                                                                       SQLTime::DEFAULT_FRACTION_PRECISION);
				}

     | TOK_LPAREN_BEFORE_DATE_AND_LPAREN TOK_DATE TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ',' TOK_TITLE character_string_literal ')' ')'
                                {
                                  // DEFAULT_CHARSET has no effect on character_string_literal in this context
				  CheckModeSpecial1();
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLDate, 0);
                                }

     | TOK_LPAREN_BEFORE_DATE_AND_LPAREN TOK_DATE TOK_LPAREN_BEFORE_FORMAT TOK_FORMAT character_string_literal ')' ')'
                                {
                                  // DEFAULT_CHARSET has no effect on character_string_literal in this context
				  CheckModeSpecial1();

                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLDate, 0);
                                 }

     | TOK_CURRENT
				{
                                  $$ = CurrentTimestamp::construct(PARSERHEAP());
				}

     | TOK_CURRENT ts_left_unsigned_right
				{
				  if ($2 > DatetimeType::MAX_FRACTION_PRECISION)
				    {
				      *SqlParser_Diags << DgSqlCode(-3134)
						       << DgInt0($2);
				      YYERROR;
				    }
                                  
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTimestamp, $2);
				}

     /* CURRENT for MP DATETIME with start-end fields */
     | TOK_CURRENT datetime_qualifier
             {
                 DatetimeType *dt = DatetimeType::constructSubtype( 
                                 TRUE,                           
                                 $2->getStartField(),
                                 $2->getEndField(),
                                 $2->getFractionPrecision(),
                                 PARSERHEAP()
                                 );
                                 if (dt == NULL) 
                                     {
                                     *SqlParser_Diags << DgSqlCode(-3158) <<          
                                     DgString0(""); // Error - invalid datetime
                                     YYERROR;
                                     }

                                 $$ = new (PARSERHEAP()) Cast (new (PARSERHEAP())
                                                               CurrentTimestamp(), dt);
                 }

     | TOK_CURRENT_TIME
				{
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTime, 
                                                                       SQLTime::DEFAULT_FRACTION_PRECISION);
				}
     | TOK_CURRENT_TIME ts_left_unsigned_right
				{
				  if ($2 > DatetimeType::MAX_FRACTION_PRECISION)
				    {
				      *SqlParser_Diags << DgSqlCode(-3134)
						       << DgInt0($2);
				      YYERROR;
				    }

                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTime, 
                                                                       $2);
				}
     | TOK_CURRENT_TIMESTAMP
				{
                                  $$ = CurrentTimestamp::construct(PARSERHEAP());
				}
     | TOK_SYSTIMESTAMP
				{
                                  $$ = CurrentTimestamp::construct(PARSERHEAP());
				}
     | TOK_CURRENT_TIMESTAMP ts_left_unsigned_right
				{
				  if ($2 > DatetimeType::MAX_FRACTION_PRECISION)
				    {
				      *SqlParser_Diags << DgSqlCode(-3134)
						       << DgInt0($2);
				      YYERROR;
				    }

                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTimestamp, $2);
				}
     | TOK_CURRENT_RUNNING
				{
				  $$ = new (PARSERHEAP())
				    CurrentTimestampRunning();
				}

     | TOK_CURRENT_TIMESTAMP_RUNNING
				{
				  $$ = new (PARSERHEAP())
				    CurrentTimestampRunning();
				}
     | TOK_CURRENT_TIMESTAMP_UTC
        {
          $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CURRENT_TIMESTAMP_UTC);
        }
     | TOK_CURRENT_TIME_UTC
        {
          $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CURRENT_TIME_UTC);
        }
      /* ODBC extension, map TOK_CURTIME to TOK_CURRENT_TIME */
     | TOK_CURTIME '(' ')'
                                {
                                  $$ = CurrentTimestamp::construct(PARSERHEAP(),
                                                                       DatetimeType::SUBTYPE_SQLTime, 
                                                                       SQLTime::DEFAULT_FRACTION_PRECISION);
                                }
     | TOK_NOW '(' ')'
                                {
  /* ODBC extension, map TOK_NOW to TOK_CURRENT_TIMESTAMP */
                                  $$ = CurrentTimestamp::construct(PARSERHEAP());
                                }

    | TOK_UNIX_TIMESTAMP '(' ')'
                                {
                                   NAType * type;
                                   type = new (PARSERHEAP())
                                      SQLLargeInt(PARSERHEAP() , FALSE , FALSE);
                                   ItemExpr * ie = new (PARSERHEAP()) UnixTimestamp();
                                   $$ = new (PARSERHEAP()) Cast(ie, type);
                                }
    | TOK_UNIX_TIMESTAMP '(' value_expression ')'
                                {
                                   NAType * type;
                                   type = new (PARSERHEAP())
                                      SQLLargeInt(PARSERHEAP() , FALSE , FALSE);
                                   ItemExpr * ie = new (PARSERHEAP()) UnixTimestamp($3);
                                   $$ = new (PARSERHEAP()) Cast(ie, type);
				}
    | TOK_SYS_GUID '(' ')'
              {
                  ItemExpr * uniqueId =  new (PARSERHEAP()) BuiltinFunction(ITM_UNIQUE_ID_SYS_GUID, PARSERHEAP());
                  ItemExpr *conv = new (PARSERHEAP()) ConvertHex(ITM_CONVERTTOHEX, uniqueId);
                  NAType * type;
                  type = new (PARSERHEAP())
                       SQLVarChar(PARSERHEAP() , 32, FALSE);
                  $$ = new (PARSERHEAP()) Cast(conv,type);
              }
    | TOK_UUID '(' ')'
              {
                  ItemExpr * uniqueId =  new (PARSERHEAP()) BuiltinFunction(ITM_UNIQUE_ID, PARSERHEAP());
                  NAType * type;
                  type = new (PARSERHEAP())
                       SQLVarChar(PARSERHEAP() , 36, FALSE);
                  $$ = new (PARSERHEAP()) Cast(uniqueId,type);
              }
    | TOK_UUID_SHORT '(' ')'
              {
                  ItemExpr * uniqueId =  new (PARSERHEAP()) BuiltinFunction(ITM_UNIQUE_SHORT_ID, PARSERHEAP());
                  NAType * type;
                  type = new (PARSERHEAP())
                       SQLVarChar(PARSERHEAP() , 36, FALSE);
                  $$ = new (PARSERHEAP()) Cast(uniqueId,type);
              }

/* type item */
datetime_misc_function_used_as_default:      TOK_TO_CHAR '(' value_expression ',' character_string_literal ')'
                               {
                                 NAString * ves= unicodeToChar
                                   (ToTokvalPlusYYText(&$3)->yytext,
                                   ToTokvalPlusYYText(&$3)->yyleng,
                                   (CharInfo::CharSet) (
                                          ComGetNameInterfaceCharSet() // CharInfo::UTF8
                                          ),
                                   PARSERHEAP()); 
                                 //save the original text
                                 NAString fullstr;
                                 fullstr  += "TO_CHAR(";
                                 //Column Reference will not be able to convert to NAString
                                 //And it is not be allowed bo become default value, so no need to save original text 
                                 if( ves != NULL) 
                                 {
                                   fullstr += *ves + ", '" +  *$5 + "')";
                                 }
                                 $$ = new (PARSERHEAP()) 
                                   DateFormat($3, *$5, DateFormat::FORMAT_TO_CHAR);
                                 ((DateFormat *)$$)->setOriginalString(fullstr);
                               }

/* type item */
datetime_misc_function : TOK_CONVERTTIMESTAMP '(' value_expression ')'
				{
				  $$ = new (PARSERHEAP())
				    ConvertTimestamp($3);
				}
     | TOK_DATEFORMAT '(' value_expression ',' date_format  ')'
                                {
                                  $$ = new (PARSERHEAP()) 
                                    DateFormat($3, *$5, 
                                               DateFormat::FORMAT_TO_CHAR,
                                               TRUE);
                                }
				    
     | TOK_DAYOFWEEK '(' value_expression ')'
				{
				  $$ = new (PARSERHEAP())
				    DayOfWeek($3);
				}
     | TOK_DAYOFYEAR '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_DAYOFYEAR, $3);
	}

     | TOK_DAYNAME '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_DAYNAME, $3);
	}  

     | TOK_FIRSTDAYOFYEAR '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_FIRSTDAYOFYEAR, $3);
	}  

     | TOK_DAYOFMONTH '(' value_expression ')'
        {
          $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_DAYOFMONTH, $3);
        }
     | TOK_MONTHNAME '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_MONTHNAME, $3);
	}  
     | TOK_QUARTER '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_QUARTER, $3);
	}  
     | TOK_WEEK '(' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_WEEK, $3);
	}  
 
     | TOK_JULIANTIMESTAMP '(' value_expression ')'
				{
				  $$ = new (PARSERHEAP())
				    JulianTimestamp($3);
				}

     | TOK_YEAR '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_YEAR, $3,
						TRUE);
				}
     | TOK_MONTH '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_MONTH, $3,
						TRUE);
				}
     | TOK_DAY '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_DAY, $3,
						TRUE);
                                }
      | TOK_HOUR '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_HOUR, $3, TRUE);
                                }
     | TOK_MINUTE '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_MINUTE, $3, TRUE);
                                }
     | TOK_SECOND '(' value_expression ')'
                                {
				  $$ = new(PARSERHEAP())
				    ExtractOdbc(REC_DATE_SECOND, $3, TRUE);
                                }
     | TOK_EXTEND '(' value_expression ',' datetime_qualifier ')'
                                {
                                DatetimeType *dt = 
                                        DatetimeType::constructSubtype( 
                                                TRUE,                           
                                                $5->getStartField(),
                                                $5->getEndField(),
                                                $5->getFractionPrecision(),
                                                PARSERHEAP()
                                                );
                                                if (dt == NULL) 
                                                { *SqlParser_Diags << DgSqlCode(-3158) <<  DgString0(""); // Error - invalid datetime
                                                        YYERROR;
                                                }

                                $$ = new (PARSERHEAP()) Cast ($3, dt);
                                }

     | TOK_EXTEND '(' value_expression ')'
                                {
                                DatetimeType *dt = new (PARSERHEAP())
                                                SQLTimestamp(PARSERHEAP(), TRUE, SQLTimestamp::DEFAULT_FRACTION_PRECISION);

                                $$ = new (PARSERHEAP()) Cast ($3, dt);
                                }
    | TOK_TO_CHAR '(' value_expression ')'
                               {
                                 $$ = new (PARSERHEAP()) DateFormat
                                   ($3, "UNSPECIFIED", DateFormat::FORMAT_TO_CHAR);

			       }
    | TOK_TO_DATE '(' value_expression ',' character_string_literal ')'
                               {
                                 $$ = new (PARSERHEAP()) 
                                   DateFormat($3, *$5, DateFormat::FORMAT_TO_DATE);
			       }
   | TOK_TO_DATE '(' value_expression  ')'
                               {
				 $$ = new (PARSERHEAP()) 
				   DateFormat($3, "YYYY-MM-DD", DateFormat::FORMAT_TO_DATE);
			       }
    | TOK_TO_NUMBER '(' value_expression ')'
                               {
				 $$ = new (PARSERHEAP()) 
				   ZZZBinderFunction(ITM_TO_NUMBER, $3);
			       }
    | TOK_TO_TIME '(' value_expression ',' character_string_literal ')'
                               {
                                 $$ = new (PARSERHEAP()) 
                                   DateFormat($3, *$5, DateFormat::FORMAT_TO_TIME);
			       }
    | TOK_TO_TIMESTAMP '(' value_expression ')'
                               {
				 $$ = new (PARSERHEAP()) 
				   ZZZBinderFunction(ITM_TO_TIMESTAMP, $3);
			       }
    | TOK_SLEEP '(' numeric_literal_exact ')'
				{
				 $$ = new (PARSERHEAP()) 
				   SleepFunction( $3);
				}

CHAR_FUNC_optional_character_set : ',' CHAR_FUNC_character_set
	  {
	    $$ = $2;
	  }
      |   empty
	  {
	    $$ = CharInfo::ISO88591;
	  }

optional_character_set : ',' character_set
	  {
	    $$ = $2;
	  }
      |   empty
	  {
	    if ( SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591 )
	       $$ = CharInfo::ISO88591;
	    else {
	       if (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON)
	          $$ = CharInfo::ISO88591; // Try to eliminate Translate nodes
	       else
	          $$ = CharInfo::UCS2;
	    }
	  }



/* type item */
string_function : 
      TOK_ASCII '(' value_expression ')'
	  {
	    /* ODBC extension: ASCII */
	    $$ = new (PARSERHEAP()) CodeVal(ITM_ASCII, $3);
	  }
     | TOK_CODE_VALUE '(' value_expression ')'
	  {
            // assume $3 is ASCII. CodeVal::synthesizeType() decides the type
            // based on the true type of $3. 
	    $$ = new (PARSERHEAP()) CodeVal(NO_OPERATOR_TYPE, $3);
	  }
     | TOK_CHAR '(' value_expression CHAR_FUNC_optional_character_set ')' 
	  {
	    if ( ($4 != CharInfo::ISO88591) && ($4 != CharInfo::UTF8) &&
                 ($4 != CharInfo::UCS2)     && ($4 != CharInfo::SJIS) )
	    {
	      *SqlParser_Diags << DgSqlCode(-3217) << DgString0(CharInfo::getCharSetName($4)) << DgString1("CHAR");
	      YYABORT;
	    }
	    $$ = new (PARSERHEAP()) CharFunc($4, $3);
	  }
     | TOK_CHR '(' value_expression CHAR_FUNC_optional_character_set ')' 
	  {
	    if (!(($4 == CharInfo::ISO88591) || ( CharInfo::maxBytesPerChar($4) == 2))){
	      *SqlParser_Diags << DgSqlCode(-3217) << DgString0(CharInfo::getCharSetName($4)) << DgString1("CHAR");
	      YYABORT;
	    }
	    $$ = new (PARSERHEAP()) CharFunc($4, $3);
	  }
     | TOK_CHAR_LENGTH '(' value_expression ')'
	 {
	    $$ = new (PARSERHEAP()) CharLength($3);
	 }

     | TOK_COALESCE '(' value_expression_list ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_COALESCE,
						    $3);

	}  

     | TOK_CONVERTFROMHEX '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) ConvertHex(ITM_CONVERTFROMHEX, $3);
        } 

     | TOK_CONVERTTOHEX   '('   value_expression   ')'
        {
          if ( (SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591) ||
               (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON) )
          {
            $$ = new (PARSERHEAP()) ConvertHex(ITM_CONVERTTOHEX, $3);
          }
          else
          {
              $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CONVERTTOHX, $3);
          }
        }
     | TOK_CONVERTTOHX_INTN  '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) ConvertHex(ITM_CONVERTTOHEX, $3);
        } 

	| TOK_DECODE '(' value_expression_list ')'
        {

	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_DECODE,$3);
        }

     | TOK_INSERT '(' value_expression ',' value_expression ',' 
		      value_expression ',' value_expression ')'
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_INSERT_STR,
						    $3, $5, $7, $9, NULL);
         SqlParser_CurrentParser->setIsHQCCacheable(FALSE);
	}  

     /* added ODBC extension: map LEFT(str,count) in ODBC to  */
     /* SUBSTRING(str FROM 1 FOR count) in SQL/MX             */
     | TOK_LEFT '(' value_expression ',' value_expression ')' 
        {
	  $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_LEFT,
						    $3, $5);
	}  

     /* ODBC extension: map LOCATE(str-exp1, str-exp2) to */
     /* POSITION(str-exp1 IN str-exp2)                    */
     | TOK_LOCATE '(' value_expression ',' value_expression ')'
        {
          $$ = new (PARSERHEAP()) PositionFunc($3,$5,NULL,NULL);
        }

     /* ODBC extension: map LOCATE(str-exp1, str-exp2, START) to */
     /* POSITION(str-exp1 IN str-exp2)                    */
    | TOK_LOCATE '(' value_expression ',' value_expression ',' value_expression ')'
 	   {
 	     $$ = new (PARSERHEAP()) PositionFunc($3,$5,$7,NULL); 
 	   }

     | TOK_LPAD '(' value_expression ',' value_expression ')'
                  {
		    $$ = 
		      new (PARSERHEAP()) ZZZBinderFunction(ITM_LPAD, $3, $5);
                  }
           
     | TOK_LPAD '(' value_expression ',' value_expression ',' value_expression ')'
                  {
		    $$ = 
		      new (PARSERHEAP()) ZZZBinderFunction(ITM_LPAD, $3, $5, $7);
                  }
           
     | TOK_RPAD '(' value_expression ',' value_expression ')'
                  {
		    $$ = 
		      new (PARSERHEAP()) ZZZBinderFunction(ITM_RPAD, $3, $5);
                  }
           
     | TOK_RPAD '(' value_expression ',' value_expression ',' value_expression ')'
                  {
		    $$ = 
		      new (PARSERHEAP()) ZZZBinderFunction(ITM_RPAD, $3, $5, $7);
                  }
           
     /* ODBC extension: map LTRIM(str) to TRIM(LEADING FROM str) */
     | TOK_LTRIM '(' value_expression ')'
	     { 
		$$ = new (PARSERHEAP()) Trim((Int32)Trim::LEADING,
			    new (PARSERHEAP()) SystemLiteral(" ", WIDE_(" ")), $3); 
	     }

     | TOK_OCTET_LENGTH '(' value_expression ')'
                 {
                    $$ = new (PARSERHEAP()) OctetLength($3);
                 }

     | TOK_POSITION '(' value_expression TOK_IN value_expression ')'
                  {
                    $$ = new (PARSERHEAP()) PositionFunc($3,$5,NULL,NULL);
                  }

     | TOK_INSTR '(' value_expression TOK_IN value_expression ')'
                  {
                    $$ = new (PARSERHEAP()) PositionFunc($3,$5,NULL,NULL);
                  }

     | TOK_INSTR '(' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP()) PositionFunc($5,$3,NULL,NULL);
                  }
     | TOK_INSTR '(' value_expression ',' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP()) PositionFunc($5,$3,$7,NULL);
                  }
     | TOK_INSTR '(' value_expression ',' value_expression ',' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP()) PositionFunc($5,$3,$7,$9);
                  }

     /* ODBC extension */
     | TOK_CONCAT '(' value_expression ',' value_expression ')'
                  {
                     $$ = new (PARSERHEAP()) Concat( $3, $5);
                  }

     | TOK_REPEAT '(' value_expression ',' value_expression ')'
                  {
		    $$ = new (PARSERHEAP()) Repeat ($3, $5);
		  }

     | TOK_REPEAT '(' value_expression ',' value_expression ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
                  {
                    Int64 value = atoInt64($7->data()); 
                    if (value == 0)
                      value = -1; 
		    $$ = new (PARSERHEAP()) Repeat 
                      ($3, $5, (Int32)value);
		  }

     | TOK_REPLACE '(' value_expression ',' value_expression ',' value_expression ')'
                  {
		    $$ = new (PARSERHEAP()) Replace ($3, $5, $7);
		  }

     | TOK_RIGHT '(' value_expression ',' value_expression ')'
                  {
		    $$ = 
		      new (PARSERHEAP()) ZZZBinderFunction(ITM_RIGHT, $3, $5);
                  }
     /* ODBC extension: RTRIM(str) is the same as TRIM(TRAILING FROM str) */
     | TOK_RTRIM '(' value_expression ')'
	{ 
            $$ = new (PARSERHEAP()) Trim((Int32)Trim::TRAILING,
	              new (PARSERHEAP()) SystemLiteral(" ", WIDE_(" ")), $3); 
        }

     | TOK_RTRIM '(' value_expression ',' value_expression ')'
	{ 
            $$ = new (PARSERHEAP()) Trim((Int32)Trim::TRAILING,
                                         $5, $3);
        }

     | TOK_SPACE '(' value_expression optional_character_set ')'
     	  {
                  switch ($4) {
		    case CharInfo::ISO88591:
		    case CharInfo::UTF8:
		    case CharInfo::SJIS:
		       $$ = new (PARSERHEAP()) ZZZBinderFunction( ITM_SPACE,
			    new (PARSERHEAP()) SystemLiteral(" ", CharInfo::ISO88591), $3);
                       break;

		    case CharInfo::KANJI_MP:
		    case CharInfo::KSC5601_MP:
		       $$ = new (PARSERHEAP()) ZZZBinderFunction( ITM_SPACE,
			    new (PARSERHEAP()) SystemLiteral("  ", CharInfo::ISO88591), $3);
                       break;
		    case CharInfo::UNICODE:
		       $$ = new (PARSERHEAP()) ZZZBinderFunction( ITM_SPACE, 
			    new (PARSERHEAP()) SystemLiteral(WIDE_(" "), CharInfo::UNICODE), $3);
                       break;

                    default:

                     if ( $4 == CharInfo::UnknownCharSet &&
                          Get_SqlParser_Flags(ALLOW_UNKNOWN_CHARSET)) {
		       $$ = new (PARSERHEAP()) ZZZBinderFunction( ITM_SPACE, 
			    new (PARSERHEAP()) SystemLiteral(" ", WIDE_(" ")), $3);
                     } else {
               // 3403: Function $0 does not take an operand with character set $4.
		    	*SqlParser_Diags << DgSqlCode(-3403) << 
                             DgString0("SPACE") <<
                             DgString1(CharInfo::getCharSetName($4));
		    	YYABORT;
		     }
		  }
         } 
     | TOK_SUBSTRING '(' value_expression TOK_FROM value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    Substring($3, $5);
                                }
     | TOK_SUBSTRING '(' value_expression TOK_FROM value_expression TOK_FOR value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    Substring($3, $5, $7);
                               }
     | TOK_SUBSTRING '(' value_expression TOK_FOR value_expression ')'
                     {
                       // Causes mxcmp to crash, so use ZZZBinderFunction for now.
                       // $$ = new (PARSERHEAP()) Substring($3,
                       //                         new (PARSERHEAP()) ConstValue(1),
                       //                         $7);
                       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SUBSTR, $3, $5);
                     }
     /* ODBC extension, SUBSTRING(string_exp,start,lenth) */
     | TOK_SUBSTRING '(' value_expression ',' value_expression ',' value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    Substring($3, $5, $7);
                               }
     | TOK_SUBSTRING '(' value_expression ',' value_expression ')'
                     {
                       $$ = new (PARSERHEAP()) Substring($3, $5);
                     }

     | TOK_SUBSTRING TOK_LPAREN_BEFORE_DATE_AND_LPAREN value_expression ',' value_expression ',' value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    Substring($3, $5, $7);
                               }

     /* ODBC extension, map UCASE(str) to UPPER(str) */
     | TOK_UCASE    '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) Upper($3);
        }

     | TOK_UPPER    '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) Upper($3);
        }
     | TOK_UPSHIFT    '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) Upper($3);
        } 

     /* ODBC extension, map LCASE(str) to LOWER(str) */
     | TOK_LCASE    '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) Lower($3);
        }

     | TOK_LOWER    '('   value_expression   ')'
        {
           $$ = new (PARSERHEAP()) Lower($3);
        }

     | TOK_TRIM '(' trim_operands ')'
                                {
                                  $$ = $3;
                                }

     | TOK_EXTRACT '(' datetime_field TOK_FROM value_expression ')'
				{
				  $$ = new (PARSERHEAP())
				    Extract($3, $5, FALSE);
				}
     | TOK_CONVERTTOBITS    '('   value_expression   ')'
        {
	  $$ = new (PARSERHEAP()) 
	    BuiltinFunction(ITM_CONVERTTOBITS, CmpCommon::statementHeap(), 1, $3);
        } 

     | TOK_TOKENSTR    '('   QUOTED_STRING ',' value_expression  ')'
        {
	  NAString nas = *$3;
//	  nas.toUpper();
	  nas = nas.strip(NAString::both);
	  if (nas.length() == 0)
	    YYERROR;
	  if (NOT nas.contains(":"))
	    {
	      nas.append(":");
	    }
	  nas.append(" ");

	  ConstValue * cv = new (PARSERHEAP()) ConstValue((char*)nas.data());

	  $$ = new (PARSERHEAP()) 
	    BuiltinFunction(ITM_TOKENSTR, CmpCommon::statementHeap(), 2, cv, $5);
        } 

     | TOK_REVERSE    '('   value_expression   ')'
        {
	  $$ = new (PARSERHEAP()) 
	    BuiltinFunction(ITM_REVERSE, CmpCommon::statementHeap(), 1, $3);
        } 
     | TOK_SPLIT_PART '(' value_expression ',' value_expression ',' value_expression ')'
        {                     
               $$ = new (PARSERHEAP()) SplitPart($3, $5, $7);
        }



/* type item */
builtin_function_user : TOK_USER
				{
                                  if ( (SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591) ||
                                       (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON) )
                                  {
				     $$ = new (PARSERHEAP())
				       AnsiUSERFunction(ITM_CURRENT_USER);
                                  }
                                  else
                                  {
	                            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CURRNT_USER);
                                  }
				}
                        | TOK_USER '(' ')'
				{
                                  if ( (SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591) ||
                                       (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON) )
                                  {
				     $$ = new (PARSERHEAP())
				       AnsiUSERFunction(ITM_CURRENT_USER);
                                  }
                                  else
                                  {
	                            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CURRNT_USER);
                                  }
				}
                        | TOK_CURRENT_USER
                                {
                                  if ( (SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591) ||
                                       (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON) )
                                  {
				     $$ = new (PARSERHEAP()) AnsiUSERFunction(ITM_CURRENT_USER);
                                  }
                                  else
                                  {
	                            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_CURRNT_USER);
                                  }
                                }
                        | TOK_CURRNT_USR_INTN
				{
				  $$ = new (PARSERHEAP())
				    AnsiUSERFunction(ITM_CURRENT_USER);
				}
                        | TOK_SESSION_USER
                                {
                                  if ( (SqlParser_DEFAULT_CHARSET == CharInfo::ISO88591) ||
                                       (CmpCommon::getDefault(ALLOW_IMPLICIT_CHAR_CASTING) == DF_ON) )
                                  {
				     $$ = new (PARSERHEAP()) AnsiUSERFunction(ITM_SESSION_USER);
                                  }
                                  else
	                            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SESSN_USER);
                                }
                        | TOK_SESSN_USR_INTN
				{
				  $$ = new (PARSERHEAP())
				    AnsiUSERFunction(ITM_SESSION_USER);
				}

 /* type pElemDDL */
sg_identity_function : 
                  TOK_IDENTITY
                  {
                        $$ = new (PARSERHEAP()) ElemDDLSGOptions(
		                       1, /* SG_INTERNAL */
                                       NULL);
	          } 

                  |TOK_INTERNAL
                  {
                        $$ = new (PARSERHEAP()) ElemDDLSGOptions(
		                       3, /* SG_INTERNAL_COMPUTED */
                                       NULL);
	          } 
 	          
	          |TOK_IDENTITY '(' sequence_generator_options ')'
                    {
                    
		        $$ = new (PARSERHEAP()) ElemDDLSGOptions(
		                       1, /* SG_INTERNAL */
                                       $3 /*sequence_generator_option_list*/);
                                     
		    }  
	
/* type pElemDDL */
all_sequence_generator_options : empty
                                {
                                  $$ = NULL;
                                }
                      | sequence_generator_option_list
                      | reset_option
	                   
/* type pElemDDL */
sequence_generator_options : empty
                                {
                                  $$ = NULL;
                                }
                      | sequence_generator_option_list

/* type pElemDDL */
sequence_generator_option_list :   sequence_generator_option
		      | sequence_generator_option_list sequence_generator_option
                        {
                          $$ = new (PARSERHEAP())
                            ElemDDLOptionList(
                                              $1 /*sequence_generator_option_list*/,
                                              $2 /*sequence_generator_option*/);
                        }

/* type pElemDDL */
sequence_generator_option : start_with_option
                      | increment_option
		      | max_value_option
                      | min_value_option
                      | cycle_option
                      | cache_option
                      | datatype_option

/* type pElemDDL */
start_with_option : TOK_START TOK_WITH sg_sign NUMERIC_LITERAL_EXACT_NO_SCALE
    {
      // Validate that the value is not larger than
      // the maximum allowed for a LARGEINT. 

      NABoolean result = validateSGOption(TRUE, FALSE,(char *)$4->data(), "START WITH", "SEQUENCE");
      
      if (result == FALSE)
        YYERROR;

      Int64 value = atoInt64($4->data()); 
     if (NOT $3)
        value = -value;
       
      $$ = new (PARSERHEAP())
	ElemDDLSGOptionStartValue(value); 

    }
                                
/* type pElemDDL */                                
max_value_option : TOK_MAXVALUE sg_sign NUMERIC_LITERAL_EXACT_NO_SCALE
    {
      // Validate that the value is not larger than
      // the maximum allowed for a LARGEINT. 
      NABoolean result = validateSGOption(TRUE, FALSE, (char *)$3->data(), "MAXVALUE", "SEQUENCE");
      
      if (result == FALSE)
        YYERROR;

      Int64 value = atoInt64($3->data()); 
      if (NOT $2)
        value = -value;
      $$ = new (PARSERHEAP())
	ElemDDLSGOptionMaxValue(value /*Int64*/); 
    }
    
    | TOK_NO TOK_MAXVALUE               
     {
 
     $$ = new (PARSERHEAP())
            ElemDDLSGOptionMaxValue(TRUE);
  
     }
                                  
 /* type pElemDDL */
 min_value_option : TOK_MINVALUE sg_sign NUMERIC_LITERAL_EXACT_NO_SCALE
    {
      // Validate that the value is not larger than
      // the maximum allowed for a LARGEINT. 
         
      NABoolean result = validateSGOption(TRUE, FALSE, (char *)$3->data(), "MINVALUE", "SEQUENCE");
      
      if (result == FALSE)
        YYERROR;

      Int64 value = atoInt64($3->data()); 
      if (NOT $2)
        value = -value;
      $$ = new (PARSERHEAP())
	ElemDDLSGOptionMinValue(value /*Int64*/); 
     }
                                                                      
    | TOK_NO TOK_MINVALUE               
     {
 
     $$ = new (PARSERHEAP())
            ElemDDLSGOptionMinValue(TRUE);
  
     }
                                
 /* type pElemDDL */                             
 increment_option : TOK_INCREMENT TOK_BY sg_sign NUMERIC_LITERAL_EXACT_NO_SCALE
     {
      // Validate that the value is not larger than
      // the maximum allowed for a LARGEINT. 
         
       NABoolean result = validateSGOption(TRUE, TRUE, (char *)$4->data(), "INCREMENT BY", "SEQUENCE");
      
      if (result == FALSE)
        YYERROR;

      Int64 value = atoInt64($4->data()); 
      if (NOT $3)
	value = -value;

      $$ = new (PARSERHEAP())
	ElemDDLSGOptionIncrement(value /*Int64*/); 
     }
                                           
/* type pElemDDL */
cycle_option : TOK_CYCLE 
     {
        // CYCLE Option
        $$ = new (PARSERHEAP())
        ElemDDLSGOptionCycleOption(TRUE);
  
     } 
                                          
   | TOK_NO TOK_CYCLE               
     {
        // NO CYCLE Option
        $$ = new (PARSERHEAP())
        ElemDDLSGOptionCycleOption(FALSE);
  
     }

/* type pElemDDL */
reset_option : TOK_RESET
     {
        // RESET Option
        $$ = new (PARSERHEAP())
          ElemDDLSGOptionResetOption();
  
     } 
                                          
/* type pElemDDL */
cache_option : TOK_CACHE NUMERIC_LITERAL_EXACT_NO_SCALE
     {
       Int64 value = atoInt64($2->data()); 

        // CACHE Option
        $$ = new (PARSERHEAP())
	  ElemDDLSGOptionCacheOption(TRUE, value);
  
     } 
                                          
   | TOK_NO TOK_CACHE               
     {
        // NO CACHE Option
        $$ = new (PARSERHEAP())
	  ElemDDLSGOptionCacheOption(FALSE, 0);
  
     }
 
/* type pElemDDL */
datatype_option : int_type
     {
       NumericType * type = (NumericType*)$1;
       if (NOT DFS2REC::isBinary(type->getFSDatatype()))
         YYERROR;

        // CACHE Option
        $$ = new (PARSERHEAP())
	  ElemDDLSGOptionDatatype((ComFSDataType)type->getFSDatatype());
     } 
                                          
     
/* type boolean */
sg_sign : empty { $$ = TRUE; }  // sequence generator option value sign
        | '+' { $$ = TRUE; }   
        | '-' { $$ = FALSE; }    
                                                                                                                                           
optional_round_scale : empty
  {
    $$ = NULL;
  }
  | ',' value_expression
  {
    $$ = $2;
  }
  
/* type item */
math_function :
         TOK_ABS '(' value_expression ')'
	 {
	   $$ = new (PARSERHEAP()) Abs($3);
	 }

       | TOK_MOD '(' value_expression ',' value_expression ')'
	 {
	   $$ = new (PARSERHEAP()) Modulus($3, $5);
	 }

       | TOK_RAND '(' ')'
	 {
       if (allowRandFunction()) {
         $$ = new (PARSERHEAP()) RandomNum(/* NULL */);
       } else {
         *SqlParser_Diags << DgSqlCode(-4313); 
         yyerror(""); YYABORT;
       }
	 }

       | TOK_RANDOM '(' ')'
	 {
       if (allowRandFunction()) {
         $$ = new (PARSERHEAP()) RandomNum(NULL, TRUE);
       } else {
         *SqlParser_Diags << DgSqlCode(-4313); 
         yyerror(""); YYABORT;
       }
	 }

       | TOK_RAND '(' value_expression ')'
	 {
       if (allowRandFunction()) {
         $$ = new (PARSERHEAP()) RandomNum($3);
       } else {
         *SqlParser_Diags << DgSqlCode(-4313); 
         yyerror(""); YYABORT;
       }
	 }

       | TOK_SIGN '(' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SIGN, $3);
	 }

       | TOK_TRANSLATE '(' value_expression TOK_USING regular_identifier ')'
				{
				  $$ = new (PARSERHEAP()) Translate($3, $5);
				}
       | TOK_ROUND '(' value_expression optional_round_scale ')'
         {
            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_ROUND, $3, $4);
         }

       | TOK_ROUND '(' value_expression ',' value_expression ',' value_expression ')'
         {
            $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_ROUND, $3, $5, $7);
         }

       | TOK_BITNOT '(' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITNOT, $3);
	 }

       | TOK_BITAND '(' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITAND, $3, $5);
	 }

       | TOK_BITOR '(' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITOR, $3, $5);
	 }

       | TOK_BITXOR '(' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITXOR, $3, $5);
	 }

       | TOK_BITEXTRACT '(' value_expression ',' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) BitOperFunc(ITM_BITEXTRACT, $3, $5, $7);
	 }

       | TOK_LOG '(' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) MathFunc(ITM_LOG, $3);
	 }

       | TOK_LOG '(' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) MathFunc(ITM_LOG, $3, $5);
	 }

       | math_func_0_operand '(' ')'
         {
	   $$ = new (PARSERHEAP()) MathFunc($1);
	 }

       | math_func_1_operand '(' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) MathFunc($1, $3);
	 }

       | math_func_2_operands '(' value_expression ',' value_expression ')'
         {
	   $$ = new (PARSERHEAP()) MathFunc($1, $3, $5);
	 }

/* type operator_type */
math_func_0_operand :
              TOK_PI {$$ = ITM_PI;}

/* type operator_type */
math_func_1_operand :
              TOK_ACOS {$$ = ITM_ACOS;}
           |  TOK_ASIN {$$ = ITM_ASIN;}
           |  TOK_ATAN {$$ = ITM_ATAN;}
           |  TOK_CEIL {$$ = ITM_CEIL;}
           |  TOK_CEILING {$$ = ITM_CEIL;}
           |  TOK_COS {$$ = ITM_COS;}
           |  TOK_COSH {$$ = ITM_COSH;}
           |  TOK_DEGREES {$$ = ITM_DEGREES;}
           |  TOK_EXP {$$ = ITM_EXP;}
           |  TOK_FLOOR {$$ = ITM_FLOOR;}
           |  TOK_LOG10 {$$ = ITM_LOG10;}
           |  TOK_LOG2 {$$ = ITM_LOG2;}
           |  TOK_RADIANS {$$ = ITM_RADIANS;}
           |  TOK_SIN {$$ = ITM_SIN;}
           |  TOK_SINH {$$ = ITM_SINH;}
           |  TOK_SQRT {$$ = ITM_SQRT;}
           |  TOK_TAN {$$ = ITM_TAN;}
           |  TOK_TANH {$$ = ITM_TANH;}


/* type operator_type */
math_func_2_operands :
              TOK_ATAN2 {$$ = ITM_ATAN2;}
           |  TOK_POWER {$$ = ITM_POWER;}
//           |  TOK_TRUNCATE {$$ = ITM_SCALE_TRUNC;}


/* type item */
misc_function :
     TOK_OS_USERID '(' value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    MonadicUSERIDFunction($3);
                                }

     | TOK_USER '(' value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
				    ZZZBinderFunction(ITM_USER, $3);
                                }

     | TOK_AUTHNAME '(' value_expression ')'
                  {
                    $$ = new (PARSERHEAP())
                              ZZZBinderFunction(ITM_AUTHNAME, $3);
                  }

     | TOK_AUTHTYPE '(' value_expression ')'
                  {
                    $$ = new (PARSERHEAP())
                              ZZZBinderFunction(ITM_AUTHTYPE, $3);
                  }

     | TOK_CASE case_expression TOK_END
				{
				  $$ = $2;
				}

     | TOK_SHA  '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_SHA1,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_SHA1  '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_SHA1,
                            CmpCommon::statementHeap(),
                            1, $3);
                }

     | TOK_SHA2 '(' value_expression ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
                {
                    int mode = atoInt64($5->data());
                    switch (mode) {
                    case 0:
                    case 256:
                        $$ = new (PARSERHEAP())
                        BuiltinFunction(ITM_SHA2_256,
                                        CmpCommon::statementHeap(),
                                        1, $3);
                        break;

                    case 224:
                        $$ = new (PARSERHEAP())
                        BuiltinFunction(ITM_SHA2_224,
                                        CmpCommon::statementHeap(),
                                        1, $3);
                        break;

                    case 384:
                        $$ = new (PARSERHEAP())
                        BuiltinFunction(ITM_SHA2_384,
                                        CmpCommon::statementHeap(),
                                        1, $3);
                        break;

                    case 512:
                        $$ = new (PARSERHEAP())
                        BuiltinFunction(ITM_SHA2_512,
                                        CmpCommon::statementHeap(),
                                        1, $3);
                        break;

                    default:
                        yyerror("The second operand expects 0, 224, 256, 384 or 512");
                        YYERROR;
                        break;
                    }

                }

     | TOK_MD5 '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_MD5,
                            CmpCommon::statementHeap(),
                            1, $3);
                }

     | TOK_CRC32 '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_CRC32,
                            CmpCommon::statementHeap(),
                            1, $3);
                }


     | TOK_GREATEST '(' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP())
                      ZZZBinderFunction(ITM_GREATEST, $3, $5);
                  }

     | TOK_LEAST '(' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP())
                      ZZZBinderFunction(ITM_LEAST, $3, $5);
                  }

     | TOK_NULLIFZERO '(' value_expression ')'
                                {
                  $$ = new (PARSERHEAP()) 
                    BuiltinFunction(ITM_NULLIFZERO, 
                            CmpCommon::statementHeap(), 
                            1, $3);
                }
     | TOK_ISIPV4 '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_ISIPV4,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_ISIPV6 '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_ISIPV6,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_INET_ATON '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_INET_ATON,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_INET_NTOA '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_INET_NTOA,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_ISNULL '(' value_expression ',' value_expression ')'
                  {
                    $$ = new (PARSERHEAP())
                              BuiltinFunction(ITM_NVL,
                                 CmpCommon::statementHeap(),
                                 2, $3, $5);
                  }

     | TOK_NVL '(' value_expression ',' value_expression ')'
                                {
				  $$ = new (PARSERHEAP()) 
				    BuiltinFunction(ITM_NVL, 
                                                    CmpCommon::statementHeap(),
						    2, $3, $5);
				}

    | TOK_JSONOBJECTFIELDTEXT '(' value_expression ',' value_expression ')'
    {
        $$ = new (PARSERHEAP()) 
        BuiltinFunction(ITM_JSONOBJECTFIELDTEXT, CmpCommon::statementHeap(), 2, $3, $5);
    }
     | TOK_NULLIF '(' value_expression ',' value_expression ')'
              {
                $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_NULLIF, $3, $5);
              }

     | TOK_QUERYID_EXTRACT '(' value_expression ',' value_expression ')'
                                {
				  $$ = new (PARSERHEAP()) 
				    BuiltinFunction(ITM_QUERYID_EXTRACT, 
                                                    CmpCommon::statementHeap(), 
						    2, $3, $5);
				}

     | TOK_ZEROIFNULL'(' value_expression ')'
                         {
			   $$ = new (PARSERHEAP()) 
			     ZZZBinderFunction(ITM_ZEROIFNULL, $3);
                         }

     | TOK_ENCODE_KEY '(' encode_key_cast_spec
       optional_encode_key_ordering_spec ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    CompEncode ( $3, NOT $4 );
                                }
     | TOK_SOUNDEX '(' value_expression ')'
                {
                    $$ = new (PARSERHEAP())
                    BuiltinFunction(ITM_SOUNDEX,
                            CmpCommon::statementHeap(),
                            1, $3);
                }
     | TOK_SORT_KEY '(' value_expression optional_Collation_type optional_sort_direction ')'
                                {
                                  if ($5 != CollationInfo::DefaultDir  && $4 != CollationInfo::Sort)
                                  {
					                  yyerror(""); 
					                  YYERROR;
                                  }
                                  $$ = new (PARSERHEAP())
                                    CompEncode ( $3,  ($5 == CollationInfo::Descending)? TRUE : FALSE  , -1 ,$4);
                                  //((CompEncode *)$$)->setCollationEncode( TRUE);
                                }
                                
     | TOK_HASHPARTFUNC '(' value_expression_list TOK_FOR value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    ProgDistrib(new (PARSERHEAP())
                                                HashDistPartHash($3),
                                                new (PARSERHEAP())
                                                Cast($5, new (PARSERHEAP())
                                                     SQLInt(PARSERHEAP(), FALSE, FALSE)));
                                }
     | TOK_HASH2PARTFUNC '(' value_expression_list TOK_FOR value_expression ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    Hash2Distrib(new (PARSERHEAP())
                                                 HashDistPartHash($3),
                                                 new (PARSERHEAP())
                                                 Cast($5, new (PARSERHEAP())
                                                      SQLInt(PARSERHEAP(), FALSE, FALSE)));
                                }
     | TOK_RRPARTFUNC '(' value_expression TOK_FOR value_expression ')'
                                {
                             /*   $$ = new (PARSERHEAP())
                                    ProgDistrib(new (PARSERHEAP()) 
                                                Cast(new (PARSERHEAP()) 
                                                     Shift(ITM_SHIFT_RIGHT,
                                                           $3,
                                                           new (PARSERHEAP()) 
                                                           ConstValue(32)),
                                                     new (PARSERHEAP())
                                                     SQLInt(PARSERHEAP(), FALSE,FALSE)),
                                                new (PARSERHEAP())
                                                Cast($5, new (PARSERHEAP())
                                                     SQLInt(PARSERHEAP(), FALSE, FALSE))); */
                                }

     | TOK_DATE_PART '(' QUOTED_STRING ',' value_expression  ')'
                   {
                     // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                     rec_datetime_field         CmpOper = REC_DATE_UNKNOWN;

                     $3->toUpper();
                     if      ( *$3 == "YEAR"   ) CmpOper = REC_DATE_YEAR;
                     else if ( *$3 == "MONTH"  ) CmpOper = REC_DATE_MONTH;
                     else if ( *$3 == "DAY"    ) CmpOper = REC_DATE_DAY;
                     else if ( *$3 == "HOUR"   ) CmpOper = REC_DATE_HOUR;
                     else if ( *$3 == "MINUTE" ) CmpOper = REC_DATE_MINUTE;
                     else if ( *$3 == "SECOND" ) CmpOper = REC_DATE_SECOND;
                     else if ( *$3 == "YEARQUARTER" )  CmpOper = REC_DATE_YEARQUARTER_EXTRACT;
                     else if ( *$3 == "YEARMONTH" )    CmpOper = REC_DATE_YEARMONTH_EXTRACT;
                     else if ( *$3 == "YEARWEEK" )     CmpOper = REC_DATE_YEARWEEK_EXTRACT;
                     else if ( *$3 == "YEARQUARTERD" ) CmpOper = REC_DATE_YEARQUARTER_D_EXTRACT;
                     else if ( *$3 == "YEARMONTHD" )   CmpOper = REC_DATE_YEARMONTH_D_EXTRACT;
                     else if ( *$3 == "YEARWEEKD" )    CmpOper = REC_DATE_YEARWEEK_D_EXTRACT;

                     if (CmpOper == REC_DATE_UNKNOWN) {
                          *SqlParser_Diags << DgSqlCode(-3415)
                                           << DgString0("DATE_PART");
                          YYERROR;
                     }
                     else if (CmpOper == REC_DATE_YEARWEEK_EXTRACT)
                       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_YEARWEEK, $5);
                     else if (CmpOper == REC_DATE_YEARWEEK_D_EXTRACT)
                       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_YEARWEEKD, $5);
                     else $$ = new (PARSERHEAP()) Extract(CmpOper, $5, FALSE);
                   }

     | TOK_DATE_TRUNC '(' QUOTED_STRING ',' value_expression ')'
                      {
                        // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                        OperatorTypeEnum            OperTyp = INVALID_OPERATOR_TYPE;

                        $3->toUpper();
                        if      ( *$3 == "YEAR"   ) OperTyp = ITM_DATE_TRUNC_YEAR;
                        else if ( *$3 == "MONTH"  ) OperTyp = ITM_DATE_TRUNC_MONTH;
                        else if ( *$3 == "DAY"    ) OperTyp = ITM_DATE_TRUNC_DAY;
                        else if ( *$3 == "HOUR"   ) OperTyp = ITM_DATE_TRUNC_HOUR;
                        else if ( *$3 == "MINUTE" ) OperTyp = ITM_DATE_TRUNC_MINUTE;
                        else if ( *$3 == "SECOND" ) OperTyp = ITM_DATE_TRUNC_SECOND;
                        else if ( *$3 == "CENTURY" ) OperTyp =ITM_DATE_TRUNC_CENTURY;
                        else if ( *$3 == "DECADE" ) OperTyp = ITM_DATE_TRUNC_DECADE;

                        if (OperTyp == INVALID_OPERATOR_TYPE) {
                             *SqlParser_Diags << DgSqlCode(-3415)
                                              << DgString0("DATE_TRUNC");
                             YYERROR;
                        }
                        $$ = new (PARSERHEAP()) ZZZBinderFunction(OperTyp, $5);
                      }

     | TOK_TRUNC '(' value_expression ',' QUOTED_STRING ')'
                      {
                        // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                        OperatorTypeEnum            OperTyp = INVALID_OPERATOR_TYPE;

                        $5->toUpper();
                        if      ( *$5 == "YEAR"   ) OperTyp = ITM_DATE_TRUNC_YEAR;
                        else if ( *$5 == "MONTH"  ) OperTyp = ITM_DATE_TRUNC_MONTH;
                        else if ( *$5 == "DAY"    ) OperTyp = ITM_DATE_TRUNC_DAY;
                        else if ( *$5 == "D"    ) OperTyp = ITM_DATE_TRUNC_DAY;
                        else if ( *$5 == "HOUR"   ) OperTyp = ITM_DATE_TRUNC_HOUR;
                        else if ( *$5 == "MINUTE" ) OperTyp = ITM_DATE_TRUNC_MINUTE;
                        else if ( *$5 == "SECOND" ) OperTyp = ITM_DATE_TRUNC_SECOND;
                        else if ( *$5 == "CENTURY" ) OperTyp =ITM_DATE_TRUNC_CENTURY;
                        else if ( *$5 == "DECADE" ) OperTyp = ITM_DATE_TRUNC_DECADE;

                        if (OperTyp == INVALID_OPERATOR_TYPE) {
                             *SqlParser_Diags << DgSqlCode(-3415)
                                              << DgString0("DATE_TRUNC");
                             YYERROR;
                        }
                        $$ = new (PARSERHEAP()) ZZZBinderFunction(OperTyp, $3);
                      }

     | TOK_DATEDIFF '(' date_time_operand ',' value_expression ',' value_expression ')'
                      {
                        $$ = new (PARSERHEAP())
                             ZZZBinderFunction($3, $5, $7);
                      }

    | TOK_MONTHS_BETWEEN '(' value_expression ',' value_expression ')'
                      {
                        $$ = new (PARSERHEAP())
                             ZZZBinderFunction(ITM_MONTHS_BETWEEN, $3, $5);
		      }

     | TOK_TIMESTAMPDIFF '(' IDENTIFIER ',' value_expression ',' value_expression ')'
        {
          OperatorTypeEnum op = NO_OPERATOR_TYPE;
          $3->toUpper();
          if      ( *$3 == "SQL_TSI_YEAR"  )    op = ITM_TSI_YEAR;
          else if ( *$3 == "SQL_TSI_MONTH"  )   op = ITM_TSI_MONTH;
          else if ( *$3 == "SQL_TSI_DAY"  )     op = ITM_TSI_DAY;
          else if ( *$3 == "SQL_TSI_HOUR"  )    op = ITM_TSI_HOUR;
          else if ( *$3 == "SQL_TSI_MINUTE"  )  op = ITM_TSI_MINUTE;
          else if ( *$3 == "SQL_TSI_SECOND"  )  op = ITM_TSI_SECOND;
          else if ( *$3 == "SQL_TSI_QUARTER"  ) op = ITM_TSI_QUARTER;
          else if ( *$3 == "SQL_TSI_WEEK"  )    op = ITM_TSI_WEEK;
          else {
            *SqlParser_Diags << DgSqlCode(-3415)
                             << DgString0("TIMESTAMPDIFF");
            YYERROR;
          }
          $$ = new (PARSERHEAP()) ZZZBinderFunction(op, $5, $7);
        }

     | TOK_ADD_MONTHS '(' value_expression ',' value_expression ')'
                      {
                         NABoolean maybeNullable = TRUE;

                         if ($5 ->getOperatorType() == ITM_CONSTANT)
                           {
                            NABoolean dummyNegate = FALSE;
                            ConstValue *cv = $5->castToConstValue(dummyNegate);

                            if (cv->isNull())
                              { 
                               *SqlParser_Diags << DgSqlCode(-4097) << DgString0("Add_Months");
                               YYERROR;                        
                              } 
                            maybeNullable = FALSE;
                           }

                         SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), maybeNullable, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
                         ItemExpr *iq2 =	new (PARSERHEAP()) Cast($5, iq);
                         $$ = new (PARSERHEAP())  BiArith(ITM_PLUS, $3,iq2);
						 ((BiArith*) $$)->setStandardNormalization();
                      }
	 | TOK_ADD_MONTHS '(' value_expression ',' value_expression ',' unsigned_integer ')'
                      {
                         NABoolean maybeNullable = TRUE;

                         if ($5 ->getOperatorType() == ITM_CONSTANT)
                           {
                            NABoolean dummyNegate = FALSE;
                            ConstValue *cv = $5->castToConstValue(dummyNegate);

                            if (cv->isNull())
                              { 
                               *SqlParser_Diags << DgSqlCode(-4097) << DgString0("Add_Months");
                               YYERROR;                        
                              }
                            maybeNullable = FALSE;
                           }

                         SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), maybeNullable, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
                         ItemExpr *iq2 =	new (PARSERHEAP()) Cast($5, iq);
                         $$ = new (PARSERHEAP())  BiArith(ITM_PLUS, $3,iq2);
						 UInt32 value = $7;
					  	 if      ( value == 0 )
					  	   ((BiArith*) $$)->setStandardNormalization();
						 else if  ( value == 1 )
					  	   ((BiArith*) $$)->setKeepLastDay();
						 else {
                           yyerror("");   // emits syntax error 15001
                           YYERROR;
                         }
                      }
	 | TOK_DATE_ADD '(' value_expression ',' value_expression  ')'
                                {
                  $$ = new (PARSERHEAP()) 	BiArith(ITM_PLUS, $3, $5);
				  ((BiArith*) $$)->setStandardNormalization();
                }
	 | TOK_DATEADD '(' datetime_keywords ',' value_expression ')'		
                                {
                  $$ = new (PARSERHEAP())  BiArith(ITM_PLUS, $5, $3);
				  ((BiArith*) $$)->setStandardNormalization();
                }
	 | TOK_TIMESTAMPADD '(' timestamp_keywords ',' value_expression ')'		
      {
        $$ = new (PARSERHEAP())  BiArith(ITM_PLUS, $5, $3);
        ((BiArith*) $$)->setStandardNormalization();
      }
	 | TOK_DATE_SUB '(' value_expression ',' value_expression ')'
                                {
                  $$ = new (PARSERHEAP())  BiArith(ITM_MINUS, $3, $5);
				  ((BiArith*) $$)->setStandardNormalization();
                }

         | TOK_LAST_DAY '(' value_expression ')'
             {
	       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_LAST_DAY, $3);
	     }

         | TOK_NEXT_DAY '(' value_expression ',' value_expression ')'
             {

	       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_NEXT_DAY, $3, $5);
	     }

         | TOK_TRUNC '(' value_expression ',' unsigned_integer ')'
             {

	       ConstValue * cv = new (PARSERHEAP()) ConstValue($5);

	       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SCALE_TRUNC, $3, cv);
	     }
         | TOK_TRUNC '(' value_expression ')'
             {	       

	       ConstValue * cv = new (PARSERHEAP()) ConstValue(0);

	       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SCALE_TRUNC, $3, cv);
	     }
         | TOK_TRUNCATE '(' value_expression ',' unsigned_integer ')'
             {
	       ConstValue * cv = new (PARSERHEAP())ConstValue($5);

	       $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_SCALE_TRUNC, $3, cv);
	     }
         | TOK_UNIQUE_ID '(' ')'
                                {
				  $$ = new (PARSERHEAP()) 
				    BuiltinFunction(ITM_UNIQUE_ID, 
                                                    CmpCommon::statementHeap());
				}
         | TOK_COLUMN_LOOKUP '(' dml_column_reference ',' QUOTED_STRING ')'
                              {
				NAType * type = new(PARSERHEAP()) SQLVarChar(PARSERHEAP(), 100000);
				$$ = new (PARSERHEAP()) 
				    HbaseColumnLookup($3, *$5, type);
			      }
        | TOK_COLUMN_LOOKUP '(' dml_column_reference ',' QUOTED_STRING ',' TOK_CAST TOK_AS Set_Cast_Global_False_and_data_type ')'
                              {
				  HbaseColumnLookup * hcl = new (PARSERHEAP()) 
				    HbaseColumnLookup($3, *$5);

				  $$ = new (PARSERHEAP()) Cast(hcl, $9);
			      }
        | TOK_COLUMN_LOOKUP '(' dml_column_reference ',' QUOTED_STRING ',' TOK_TYPE TOK_AS Set_Cast_Global_False_and_data_type ')'
                              {
				  HbaseColumnLookup * hcl = new (PARSERHEAP()) 
				    HbaseColumnLookup($3, *$5, $9);
				  //				  $$ = hcl;
				  $$ = new (PARSERHEAP()) CastType(hcl, $9);
			      }

        | TOK_COLUMN_CREATE '(' hbase_column_create_list ')'
                              {

				// validate that all created cols use the same CAST/TYPE type,
				// or none.
				NAList<HbaseColumnCreate::HbaseColumnCreateOptions *> 
				  * hccol = $3;
				HbaseColumnCreate::HbaseColumnCreateOptions * hcco0 =
				  (*hccol)[0];

				HbaseColumnCreate * hcl = new (PARSERHEAP()) 
				    HbaseColumnCreate($3);

				if (hcco0->convType() == HbaseColumnCreate::HbaseColumnCreateOptions::CAST_AS)
				  $$ = new (PARSERHEAP()) Cast(hcl, hcco0->naType());
				else if (hcco0->convType() == HbaseColumnCreate::HbaseColumnCreateOptions::TYPE_AS)
				  $$ = new (PARSERHEAP()) CastType(hcl, hcco0->naType());
				else
				  $$ = hcl;
			      }
        | TOK_COLUMN_DISPLAY '(' dml_column_reference  ')'
                              {
				  $$ = new (PARSERHEAP()) 
				    HbaseColumnsDisplay($3);
			      }
        | TOK_COLUMN_DISPLAY '(' dml_column_reference ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
	                      {
				Int64 longIntVal = atoInt64($5->data());

				  $$ = new (PARSERHEAP()) 
				    HbaseColumnsDisplay($3, NULL, longIntVal);
			      }
       | TOK_COLUMN_DISPLAY '(' dml_column_reference ',' '(' quoted_string_list ')'  ')'
                              {
				  $$ = new (PARSERHEAP()) 
				    HbaseColumnsDisplay($3, $6);
			      }
        | TOK_COLUMN_DISPLAY '(' dml_column_reference ',' '(' quoted_string_list ')'  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
	                      {
				Int64 longIntVal = atoInt64($9->data());

				  $$ = new (PARSERHEAP()) 
				    HbaseColumnsDisplay($3, $6, longIntVal);
			      }
        | TOK_SEQNUM '(' ddl_qualified_name  ')'
	                      {
				CorrName cn(*$3);
				cn.setSpecialType(ExtendedQualName::SG_TABLE);

				$$ = new(PARSERHEAP()) SequenceValue(cn);
			      }
        | TOK_SEQNUM '(' ddl_qualified_name ',' TOK_CURRENT ')'
	                      {
				CorrName cn(*$3);
				cn.setSpecialType(ExtendedQualName::SG_TABLE);

				$$ = new(PARSERHEAP()) SequenceValue(cn, TRUE, FALSE);
			      }
        | TOK_SEQNUM '(' ddl_qualified_name ',' TOK_NEXT ')'
	                      {
				CorrName cn(*$3);
				cn.setSpecialType(ExtendedQualName::SG_TABLE);

				$$ = new(PARSERHEAP()) SequenceValue(cn, FALSE, TRUE);
			      }

       | TOK_ROWNUM '(' ')'
                                {
                                  $$ = new (PARSERHEAP()) RowNumFunc();
                                }

       | TOK_HBASE_VERSION '(' dml_column_reference  ')'
                              {
                                $$ = new (PARSERHEAP()) HbaseVersionRef($3);
			      }

       | TOK_HBASE_TIMESTAMP '(' dml_column_reference  ')'
                              {
                                $$ = new (PARSERHEAP()) HbaseTimestampRef($3);
			      }
       | TOK_GROUPING_ID '(' value_expression_list ')'
             {
               $$ = new (PARSERHEAP()) ZZZBinderFunction(ITM_GROUPING_ID, $3);
             }
       | TOK_AES_ENCRYPT '(' value_expression ',' value_expression ',' value_expression ')'
             {
               $$ = new (PARSERHEAP()) BuiltinFunction(ITM_AES_ENCRYPT, CmpCommon::statementHeap(),
                                                       3, $3, $5, $7);
             }
       | TOK_AES_ENCRYPT '(' value_expression ',' value_expression ')'
             {
               $$ = new (PARSERHEAP()) BuiltinFunction(ITM_AES_ENCRYPT, CmpCommon::statementHeap(),
                                                       2, $3, $5);
             }
       | TOK_AES_DECRYPT '(' value_expression ',' value_expression ',' value_expression ')'
             {
               $$ = new (PARSERHEAP()) BuiltinFunction(ITM_AES_DECRYPT, CmpCommon::statementHeap(),
                                                       3, $3, $5, $7);
             }
       | TOK_AES_DECRYPT '(' value_expression ',' value_expression ')'
             {
               $$ = new (PARSERHEAP()) BuiltinFunction(ITM_AES_DECRYPT, CmpCommon::statementHeap(),
                                                       2, $3, $5);
             }

hbase_column_create_list : '(' hbase_column_create_value ')'
                                   {
				     NAList<HbaseColumnCreate::HbaseColumnCreateOptions *> * hccol =
				       new (PARSERHEAP()) 
				       NAList<HbaseColumnCreate::HbaseColumnCreateOptions *>(PARSERHEAP ());
				     hccol->insert($2);
				     $$ = hccol;
				   }
                               | hbase_column_create_value 
                                   {
				     NAList<HbaseColumnCreate::HbaseColumnCreateOptions *> * hccol =
				       new (PARSERHEAP()) 
				       NAList<HbaseColumnCreate::HbaseColumnCreateOptions *>(PARSERHEAP ());
				     hccol->insert($1);
				     $$ = hccol;
				   }
                              | '(' hbase_column_create_value ')' ',' hbase_column_create_list
                                 {
				   $5->insert($2);
				   $$ = $5;
				 }
hbase_column_create_value : value_expression ',' value_expression ',' TOK_TYPE TOK_AS Set_Cast_Global_False_and_data_type
                                {
				  HbaseColumnCreate::HbaseColumnCreateOptions * hcco =
				    new (PARSERHEAP()) HbaseColumnCreate::HbaseColumnCreateOptions
				    ($1, $3, $7, HbaseColumnCreate::HbaseColumnCreateOptions::TYPE_AS);
				  $$ = hcco;
				}
                             | value_expression ',' value_expression ',' TOK_CAST TOK_AS data_type
                                {
				  HbaseColumnCreate::HbaseColumnCreateOptions * hcco =
				    new (PARSERHEAP()) HbaseColumnCreate::HbaseColumnCreateOptions
				    ($1, $3, $7, HbaseColumnCreate::HbaseColumnCreateOptions::CAST_AS);
				  $$ = hcco;
				}
 
                            | value_expression ',' value_expression 
                                {
				  HbaseColumnCreate::HbaseColumnCreateOptions * hcco =
				    new (PARSERHEAP()) HbaseColumnCreate::HbaseColumnCreateOptions
				    ($1, $3, NULL, HbaseColumnCreate::HbaseColumnCreateOptions::NONE);
				  $$ = hcco;
				}

/* type operator_type */
date_time_operand : TOK_YEAR    { $$ = ITM_DATEDIFF_YEAR   ;}
                  | TOK_MONTH   { $$ = ITM_DATEDIFF_MONTH  ;}
                  | TOK_M       { $$ = ITM_DATEDIFF_MONTH  ;}
                  | TOK_DAY     { $$ = ITM_DATEDIFF_DAY    ;}
                  | TOK_D       { $$ = ITM_DATEDIFF_DAY    ;}
                  | TOK_HOUR    { $$ = ITM_DATEDIFF_HOUR   ;}
                  | TOK_MINUTE  { $$ = ITM_DATEDIFF_MINUTE ;}
                  | TOK_SECOND  { $$ = ITM_DATEDIFF_SECOND ;}
                  | TOK_QUARTER { $$ = ITM_DATEDIFF_QUARTER;}
                  | TOK_WEEK    { $$ = ITM_DATEDIFF_WEEK   ;}
                  | IDENTIFIER
                    {
                      $1->toUpper();
                      if      ( *$1 == "YYYY") $$ = ITM_DATEDIFF_YEAR;
                      else if ( *$1 == "YY"  ) $$ = ITM_DATEDIFF_YEAR;
                      else if ( *$1 == "MM"  ) $$ = ITM_DATEDIFF_MONTH;
                      else if ( *$1 == "DD"  ) $$ = ITM_DATEDIFF_DAY;
                      else if ( *$1 == "HH"  ) $$ = ITM_DATEDIFF_HOUR;
                      else if ( *$1 == "MI"  ) $$ = ITM_DATEDIFF_MINUTE;
                      else if ( *$1 == "N"   ) $$ = ITM_DATEDIFF_MINUTE;
                      else if ( *$1 == "SS"  ) $$ = ITM_DATEDIFF_SECOND;
                      else if ( *$1 == "S"   ) $$ = ITM_DATEDIFF_SECOND;
                      else if ( *$1 == "QQ"  ) $$ = ITM_DATEDIFF_QUARTER;
                      else if ( *$1 == "Q"   ) $$ = ITM_DATEDIFF_QUARTER;
                      else if ( *$1 == "WK"  ) $$ = ITM_DATEDIFF_WEEK;
                      else if ( *$1 == "WW"  ) $$ = ITM_DATEDIFF_WEEK;
                      else {
                           *SqlParser_Diags << DgSqlCode(-3415)
                                            << DgString0("DATEDIFF");
                           YYERROR;
                      }
                    }

// The value_expression must be cast to the Token Type
/* type token */
datetime_keywords : TOK_QUARTER  ',' value_expression 		  // 3 months	Cast 3*num_expr to months
                   	{
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
					$$ = new (PARSERHEAP()) 
					       Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(3)), iq);
					}                    
                   | TOK_WEEK   ',' value_expression 		  // 7 days	  Cast 7*num_expr to days
                    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
					$$ = new (PARSERHEAP()) 
					       Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(7)), iq);
					}
                   | TOK_YEAR   ',' value_expression
				    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_YEAR, 6, REC_DATE_YEAR, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}
                   | TOK_MONTH  ',' value_expression 
				    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}
				   | TOK_DAY    ',' value_expression 
                   	{
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}
                   | TOK_M  ',' value_expression 
				    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}
				   | TOK_D    ',' value_expression 
                   	{
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}                   
                   | TOK_HOUR   ',' value_expression
                    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_HOUR, 8, REC_DATE_HOUR, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}                    
                   | TOK_MINUTE ',' value_expression
				    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MINUTE, 10, REC_DATE_MINUTE, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}                    
                   | TOK_SECOND ',' value_expression 
				    {
					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_SECOND, 12, REC_DATE_SECOND, 1);
					$$ = new (PARSERHEAP()) Cast($3, iq);
					}
				   | IDENTIFIER ',' value_expression
                    {
                      $1->toUpper();
                      if      ( *$1 == "YYYY" | *$1 == "YY" )
					    {
					      SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_YEAR, 6, REC_DATE_YEAR, 1);
					      $$ = new (PARSERHEAP()) Cast($3, iq);
					    }
                      else if ( *$1 == "MM" ) 
				        {
					      SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
					      $$ = new (PARSERHEAP()) Cast($3, iq);
					    }                       
                      else if ( *$1 == "DD" ) 
                   	    {
					       SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
					       $$ = new (PARSERHEAP()) Cast($3, iq);
					    }                       
                      else if ( *$1 == "HH"  ) 
                        {
        					SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_HOUR, 8, REC_DATE_HOUR, 1);
		        			$$ = new (PARSERHEAP()) Cast($3, iq);
					    }
                      else if ( *$1 == "MI" | *$1 == "N" ) 
				        {
				       	   SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MINUTE, 10, REC_DATE_MINUTE, 1);
				       	   $$ = new (PARSERHEAP()) Cast($3, iq);
					    }                       
                      else if ( *$1 == "SS" | *$1 == "S" ) 
				        {
					      SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_SECOND, 12, REC_DATE_SECOND, 1);
					      $$ = new (PARSERHEAP()) Cast($3, iq);
					    }                        
                      else if ( *$1 == "QQ" | *$1 == "Q" ) 
                        {
					      SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
					      $$ = new (PARSERHEAP()) 
					             Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(3)), iq);
					    }                       
                      else if ( *$1 == "WK" | *$1 == "WW" ) 
                       	{
				         SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
					     $$ = new (PARSERHEAP()) 
					          Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(7)), iq);
				     	}
                      else {
                           *SqlParser_Diags << DgSqlCode(-3415)
                                            << DgString0("DATEADD");
                           YYERROR;
                      }
					}

timestamp_keywords : IDENTIFIER ',' value_expression
  {
    $1->toUpper();
    if ( *$1 == "SQL_TSI_YEAR" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_YEAR, 6, REC_DATE_YEAR, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_MONTH" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_DAY" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_HOUR" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_HOUR, 8, REC_DATE_HOUR, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_MINUTE" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MINUTE, 10, REC_DATE_MINUTE, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_SECOND" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_SECOND, 12, REC_DATE_SECOND, 1);
        $$ = new (PARSERHEAP()) Cast($3, iq);
      }
    else if ( *$1 == "SQL_TSI_QUARTER" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_MONTH, 6, REC_DATE_MONTH, 1);
        $$ = new (PARSERHEAP()) 
              Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(3)), iq);
      }
    else if ( *$1 == "SQL_TSI_WEEK" )
      {
        SQLInterval *iq = new (PARSERHEAP()) SQLInterval(PARSERHEAP(), TRUE, REC_DATE_DAY, 6, REC_DATE_DAY, 1);
        $$ = new (PARSERHEAP()) 
        Cast(new (PARSERHEAP())BiArith(ITM_TIMES, $3,  new (PARSERHEAP()) ConstValue(7)), iq);
      }
    else 
      {
        *SqlParser_Diags << DgSqlCode(-3415)
                         << DgString0("TIMESTAMPADD");
        YYERROR;
      }
  }

/* type item */
encode_key_cast_spec : cast_specification

                   | TOK_LOW_VALUE '(' data_type
                     optional_cast_spec_not_null_spec ')'
				{
                                  if ($4) // NOT NULL phrase specified
                                  {
                                    $3->setNullable(FALSE);
                                  }
                                  $$ = new (PARSERHEAP())
                                    ConstValue($3,      // datatype
	                                       TRUE,    // wantMinValue
	                                       NOT $4); // allowNull
				}
                   | TOK_HIGH_VALUE '(' data_type
                      optional_cast_spec_not_null_spec ')'
				{
                                  if ($4) // NOT NULL phrase specified
                                  {
                                    $3->setNullable(FALSE);
                                  }
                                  $$ = new (PARSERHEAP())
                                    ConstValue($3,      // datatype
	                                       FALSE,   // wantMinValue
	                                       NOT $4); // allowNull
				}
                   | TOK_LOW_VALUE TOK_LPAREN_BEFORE_DATATYPE data_type
                     optional_cast_spec_not_null_spec ')'
				{
                                  if ($4) // NOT NULL phrase specified
                                  {
                                    $3->setNullable(FALSE);
                                  }
                                  $$ = new (PARSERHEAP())
                                    ConstValue($3,      // datatype
	                                       TRUE,    // wantMinValue
	                                       NOT $4); // allowNull
				}
                   | TOK_HIGH_VALUE TOK_LPAREN_BEFORE_DATATYPE data_type
                      optional_cast_spec_not_null_spec ')'
				{
                                  if ($4) // NOT NULL phrase specified
                                  {
                                    $3->setNullable(FALSE);
                                  }
                                  $$ = new (PARSERHEAP())
                                    ConstValue($3,      // datatype
	                                       FALSE,   // wantMinValue
	                                       NOT $4); // allowNull
				}

/* type boolean */
optional_encode_key_ordering_spec : empty
                                {
                                  $$ = TRUE; // default is ASC(ENDING)
                                }

     | TOK_ASC
                                {
                                  $$ = TRUE;
                                }

     | TOK_DESC
                                {
                                  $$ = FALSE;
                                }
/*type CollationType*/                                
optional_Collation_type:  empty
			  {
			    $$ = CollationInfo::Sort;
			  }
			| TOK_FOR TOK_SORT
			  {
			    $$ = CollationInfo::Sort;
			  }
			| TOK_FOR TOK_COMPARE
			  {
			    $$ = CollationInfo::Compare;
			  }
			| TOK_FOR TOK_STRING_SEARCH
			  {
			    $$ = CollationInfo::Search;
			  }
/*type SortDirection*/                                
optional_sort_direction:  empty
			  {
			    $$ = CollationInfo::DefaultDir;
			  }
			| TOK_ASC
			  {
			    $$ = CollationInfo::Ascending;
			  }
			|  TOK_DESC
			  {
			    $$ = CollationInfo::Descending;
			  }

			
/* type item */
trim_operands : value_expression
        { 
            $$ = new (PARSERHEAP()) Trim(Trim::BOTH,
                 new (PARSERHEAP()) SystemLiteral(" ", WIDE_(" ")), $1); 
        }
     | TOK_FROM value_expression
        { 
          $$ = new (PARSERHEAP()) Trim(
               Trim::BOTH,
               new (PARSERHEAP()) ConstValue(" ", WIDE_(" ")), $2); 
        }
     | trim_spec TOK_FROM value_expression
        { 
          $$ = new (PARSERHEAP()) Trim(
               $1,
               new (PARSERHEAP()) ConstValue(" ", WIDE_(" ")), $3); 
        }
     | value_expression TOK_FROM value_expression
        { $$ = new (PARSERHEAP()) Trim(Trim::BOTH, $1, $3); }
     | trim_spec value_expression TOK_FROM value_expression
        { $$ = new (PARSERHEAP()) Trim($1,$2,$4); }

/* type uint */
trim_spec : TOK_LEADING     {  $$ = (Int32) Trim::LEADING;  }
        | TOK_TRAILING      {  $$ = (Int32) Trim::TRAILING; }
        | TOK_BOTH          {  $$ = (Int32) Trim::BOTH;     }




/* type stringval */
date_format : TOK_DEFAULT   
    {  
      $$ = new (PARSERHEAP()) NAString(ExpDatetime::getDatetimeFormatStr(ExpDatetime::DATETIME_FORMAT_DEFAULT));
    }
	| TOK_EUROPEAN      
    {  
      $$ = new (PARSERHEAP()) NAString(ExpDatetime::getDatetimeFormatStr(ExpDatetime::DATETIME_FORMAT_EUROPEAN));
    }
	| TOK_USA           
    {  
      $$ = new (PARSERHEAP()) NAString(ExpDatetime::getDatetimeFormatStr(ExpDatetime::DATETIME_FORMAT_USA));
    }


/* type item */
case_expression : case_operand simple_when_then_list
				{
				  $$ = new (PARSERHEAP())
				    Case($1, $2);
				}
		| searched_when_then_list
				{
				  $$ = new (PARSERHEAP())
				    Case(NULL, $1);
				}

/* type item */
case_operand : value_expression
			{
			  $$ = $1;
			}

/* type item */
simple_when_then_list : simple_when_then else_clause
			{
			  ((IfThenElse *) $1)->setElse($2);
			  $$ = $1;
			}
		| simple_when_then simple_when_then_list
			{
			  ((IfThenElse *) $1)->setElse($2);
			  $$ = $1;
			}

/* type item */
simple_when_then : TOK_WHEN value_expression TOK_THEN result_expr
			{
			  $$ = new (PARSERHEAP())
			    IfThenElse($2, $4, NULL);
			}

/* type item */
searched_when_then_list : searched_when_then else_clause
			{
			  ((IfThenElse *) $1)->setElse($2);
			  $$ = $1;
			}
		| searched_when_then searched_when_then_list
			{
			  ((IfThenElse *) $1)->setElse($2);
			  $$ = $1;
			}

/* type item */
searched_when_then : TOK_WHEN search_condition TOK_THEN result_expr
			{
			  $$ = new (PARSERHEAP())
			    IfThenElse($2, $4, NULL);
			}

/* type item */
else_clause : TOK_ELSE result_expr
			{
			  $$ = $2;
			}
		| /* empty */
			{
			  // same as ELSE NULL
			  $$ = new (PARSERHEAP()) SystemLiteral();
			}

/* type item */
result_expr : value_expression
			{
			  $$ = $1;
			}

/* type boolean */
optional_cast_spec_not_null_spec : empty
                                {
                                  $$ = FALSE; // NOT NULL phrase not specified
                                }

     | TOK_NOT TOK_NULL
                                {
                                  $$ = TRUE;  // NOT NULL phrase specified
                                }

optional_nullable_pkey: empty
                                {
                                  if (CmpCommon::getDefault(ALLOW_NULLABLE_UNIQUE_KEY_CONSTRAINT) == DF_OFF)
                                    $$ = FALSE;
                                  else
                                    $$ = TRUE;
                                }
     | TOK_NULLABLE
                                {
                                  $$ = TRUE;
                                }

/* type item */
cast_specification : TOK_CAST '(' value_expression  TOK_AS  Set_Cast_Global_False_and_data_type
                                  optional_cast_spec_not_null_spec ')'
				{
				  $$ = new (PARSERHEAP()) Cast($3, $5);
                                  if ($6) // NOT NULL phrase specified
                                  {
                                    $5->setNullable(FALSE);
                                  }
                                  if ( cast_target_cs_specified )
                                  {
                                     ((Cast *)$$)->setTgtCSSpecified(TRUE);
                                     cast_target_cs_specified = FALSE ;
                                  }
				}

                   /* ODBC extension, map CONVERT(expression, data-type) to */
                   /* CAST( expression AS data-type)                        */ 
                   | TOK_CONVERT '(' value_expression ',' {empty_charlen_specifier_allowed =TRUE;} data_type ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    CastConvert($3, $6);
                                  empty_charlen_specifier_allowed = FALSE;
                                }
                      // source is not converted. It is only interpreted as data_type.
                   | TOK_TYPECAST '(' value_expression ',' data_type ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    CastType($3, $5);
                                  empty_charlen_specifier_allowed = FALSE;
                                }
                   | TOK_CAST '(' value_expression TOK_AS TOK_NULLABLE ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    CastType($3, TRUE);
                                  empty_charlen_specifier_allowed = FALSE;
                                }

/* proc_arg_data_type are the types that are generated by the preprocessor
   as the arguments of a PROCEDURE statement. The tandem_float_type are the
   float types that represent the hostvars which are declared as tandem
   float datatype */
proc_arg_data_type : predefined_type
	    {
	      if ($1->isExternalType()) {
	        externalDataTypeCnt_++;
		size_t i = 0;
		NAString nam($1->getTypeSQLname(TRUE/*terse*/));
		if ($1->getTypeQualifier() == NA_CHARACTER_TYPE)
		  if (((CharType *)$1)->isNullTerminated())
		    if (nam[i] == 'C' || nam[i] == 'V')
		      nam = "ANSIVARCHAR";
		i = nam.index(' ');
		if (i != NA_NPOS && i > 0) nam.remove(i);
		i = nam.index('(');
		if (i != NA_NPOS && i > 0) nam.remove(i);
		nam.prepend(" ");
		nam.append(" ");
		if (!strstr(*externalDataTypeNames_, nam))
		  *externalDataTypeNames_ += nam;
	      }
	      
	      // bignum not allowed as proc arguments generated by preprocessor
	      if (($1->getTypeQualifier() == NA_NUMERIC_TYPE) &&
		  (((NumericType *)$1)->isBigNum()))
		{
		  *SqlParser_Diags << DgSqlCode(-3165) << DgString0("NUMERIC");
		  YYERROR;
		}
	    }
	  | proc_arg_rowset_type
          | proc_arg_float_type
            {
	      if ($1->isExternalType())
	        externalDataTypeCnt_++;
	    }

/* Note:
 * pic_type can be string or numeric and is syntactic sugar not representing
 * any distinct SQL data types. It is simply cobolesque type syntax. */

/* type na_type */
data_type : predef_type | rowset_type

/* type na_type */
predef_type : predefined_type
	    {
	      if ($1->isExternalType()) {
	        externalDataTypeCnt_++;
		size_t i = 0;
		NAString nam($1->getTypeSQLname(TRUE/*terse*/));
		if ($1->getTypeQualifier() == NA_CHARACTER_TYPE)
		  if (((CharType *)$1)->isNullTerminated())
		    if (nam[i] == 'C' || nam[i] == 'V')
		      nam = "ANSIVARCHAR";
		i = nam.index(' ');
		if (i != NA_NPOS && i > 0) nam.remove(i);
		i = nam.index('(');
		if (i != NA_NPOS && i > 0) nam.remove(i);
		nam.prepend(" ");
		nam.append(" ");
		if (!strstr(*externalDataTypeNames_, nam))
		  *externalDataTypeNames_ += nam;
	      }
	    }
          | float_type

/* type na_type */
predefined_type : date_time_type
		| interval_type
		| numeric_type
		| pic_type
		| string_type
                | blob_type
                | boolean_type


/* type na_type */
rowset_type : TOK_ROWSET unsigned_integer predefined_type
	      {
		$$ = new (PARSERHEAP()) SQLRowset(PARSERHEAP(), $3, $2, $2);
	      }
             | TOK_ROWSET unsigned_integer float_type
	      {
		$$ = new (PARSERHEAP()) SQLRowset(PARSERHEAP(), $3, $2, $2);
	      }

/* type na_type */
proc_arg_rowset_type : TOK_ROWSET unsigned_integer predefined_type
	      {
		$$ = new (PARSERHEAP()) SQLRowset(PARSERHEAP(), $3, $2, $2);
	      }
             | TOK_ROWSET unsigned_integer proc_arg_float_type
	      {
		$$ = new (PARSERHEAP()) SQLRowset(PARSERHEAP(), $3, $2, $2);
	      }

/* type na_type */
numeric_type : non_int_type
	     | int_type

/* na type for the numeric */
int_type : TOK_INTEGER signed_option
             {
		$$ = new (PARSERHEAP()) SQLInt(PARSERHEAP(),  $2, TRUE);
             }
	 | TOK_SMALLINT signed_option
             {
		$$ = new (PARSERHEAP()) SQLSmall( PARSERHEAP(), $2, TRUE);
             }
	 | TOK_LARGEINT signed_option
             {
               $$ = new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(),  $2, TRUE);
             }
         | TOK_BIGINT signed_option
             {
                if (!$2) {
                  // UNSIGNED specified. Error. Largeint must be signed. 
                  *SqlParser_Diags << DgSqlCode(-3130);
                  // YYABORT;
                  yyerror(""); 
                  YYERROR;
                }
                $$ = new (PARSERHEAP()) SQLLargeInt (PARSERHEAP(), $2,TRUE);
                // ((SQLLargeInt *)$$)->setDisplayDataType("BIGINT");
	     }
	 | TOK_BIT TOK_PRECISION TOK_INTEGER left_unsigned_right signed_option
             {
		if ($5 == TRUE) {
		  // ParserError: UNSIGNED expected
                   *SqlParser_Diags << DgSqlCode(-3125);
		   YYABORT;
		}
		if ($4 < 1 || $4 > 15) {
		  // Parser Error: An unsigned integer between 1 and 15 expected
                   *SqlParser_Diags << DgSqlCode(-3126);
		   YYABORT;
		}
		$$ = new (PARSERHEAP()) SQLBPInt (PARSERHEAP(), $4, TRUE, FALSE);
	     }
	 | TOK_BIT
       { 
         // odbc SQL_BIT is single bit binary data
         $$ = new (PARSERHEAP()) SQLChar(PARSERHEAP(), 1);
         // ((SQLChar *)$$)->setDisplayDataType("BIT");
       }
	 | TOK_TINYINT signed_option
       {
         // odbc SQL_TINYINT is exact numeric value with precision 3 &
         // scale 0. signed: -128<=n<=127, unsigned: 0<=n<=255.
         if (CmpCommon::getDefault(TRAF_TINYINT_SUPPORT) == DF_OFF)
           $$ = new (PARSERHEAP()) SQLSmall(PARSERHEAP(),  $2, TRUE);
         else
           $$ = new (PARSERHEAP()) SQLTiny(PARSERHEAP(),  $2, TRUE);
       }
	 | TOK_BYTEINT signed_option
       {
         // For TD compatibility, we map BYTEINT to TINYINT/SMALLINT
         // BYTEINT is supposed to be exact numeric value with precision 3 &
         // scale 0. signed: -128<=n<=127, unsigned: 0<=n<=255.
         if (CmpCommon::getDefault(TRAF_TINYINT_SUPPORT) == DF_OFF)
           $$ = new (PARSERHEAP()) SQLSmall(PARSERHEAP(),  $2, TRUE);
         else
           $$ = new (PARSERHEAP()) SQLTiny(PARSERHEAP(),  $2, TRUE);
       }

numeric_type_token :    TOK_NUMERIC
			//			          | TOK_NUMBER

/* na type for the numeric */
non_int_type : numeric_type_token left_uint_uint_right signed_option
             {

	       if (! ($2->left() > 0 ))  {
		 // Precision must be > 0.
		 *SqlParser_Diags << DgSqlCode(-3003) << DgInt0($2->left());
		 
		 delete $2;
		 yyerror("");
		 YYABORT;
	       }
	       
	       /////////////////////////////////////////////////////////////
	       //
	       // CQD MAX_NUMERIC_PRECISION_ALLOWED has a range of 18-128,
	       // it is set to 128 by default. This range is validated when
	       // the default is set.
	       //
	       //  MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION = 18
	       //  MAX_HARDWARE_SUPPORTED_UNSIGNED_NUMERIC_PRECISION = 9
	       //     (these 2 are defined in common/ComSmallDefs.h)
	       //
	       // If cqd MAX_NUMERIC_PRECISION_ALLOWED is set to 18, then
	       // old behavior is triggered (max numeric precision allowed, 
	       // both signed and unsigned, will be limited to what is 
	       // supported by hardware (18 and 9, resp.).
	       //
	       ////////////////////////////////////////////////////////////
	       if (($2->left() > MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION) &&
		   (CmpCommon::getDefaultNumeric(MAX_NUMERIC_PRECISION_ALLOWED)
		    == MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION))
		 {
		   // Precision of a Numeric may not exceed 18.
		   *SqlParser_Diags << DgSqlCode(-3014) << DgInt0($2->left())
				    << DgInt1(MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION);
		   delete $2;
		   YYABORT;
		 }
	       
	       // Precision of a Numeric cannot exceed max allowed
	       if ($2->left() > (UInt32)CmpCommon::getDefaultNumeric(MAX_NUMERIC_PRECISION_ALLOWED))
		 {
		   *SqlParser_Diags << DgSqlCode(-3014) << DgInt0($2->left())
				    << DgInt1((Int32)CmpCommon::getDefaultNumeric(MAX_NUMERIC_PRECISION_ALLOWED));
		   delete $2;
		   YYABORT;
		 }
	       
	       if ($2->right() > $2->left()) {
		 // Scale, $2->right()  cannot exceed 
		 // precision,  $2->left(). 
		 *SqlParser_Diags << DgSqlCode(-3015) << DgInt0($2->right()) << DgInt1($2->left()); 
		 delete $2;
		 YYABORT;
	       }

	       if (($2->left() > MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION) ||
		   (($2->left() > MAX_HARDWARE_SUPPORTED_UNSIGNED_NUMERIC_PRECISION) AND NOT $3))
		 $$ = new (PARSERHEAP())
		   SQLBigNum(PARSERHEAP(), $2->left(), $2->right(), TRUE, $3, TRUE);
	       else {
		 const Int16 DisAmbiguate = 0; // added for 64bit project
		 $$ = new (PARSERHEAP())
		   SQLNumeric(PARSERHEAP(), $3,$2->left(), $2->right(), DisAmbiguate );
	       }
	       delete $2;
             }
         | TOK_NUMERIC signed_option
	     {
	       // Default (precision,scale) for NUMERIC is (9,0)
               // But in MS4, it is 18.
               Lng32 prec = 9;
               if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_ON) 
                 prec = 18; 

	       const Int16 DisAmbiguate = 0; // added for 64bit project
	       $$ = new (PARSERHEAP()) SQLNumeric(PARSERHEAP(), $2, prec, 0, DisAmbiguate);
	     }
	 | TOK_LSDECIMAL left_uint_uint_right signed_option
             {
                if ($2->left() > 18) {
		  // Precision of a Decimal, " << $2->left()
                  // may not exceed 18.
                    *SqlParser_Diags << DgSqlCode(-3016) << DgInt0($2->left());
                    delete $2;
                    YYABORT;
                }
                if (! ($2->left() > 0 ))  {
		  // Precision must be > 0.
                    *SqlParser_Diags << DgSqlCode(-3003) << DgInt0($2->left());
                    delete $2;
                    yyerror("");
                    YYABORT;
                   }
                if ($2->right() > $2->left()) {
		  // Scale, $2->right(), cannot exceed precision, $2->left() 
                    *SqlParser_Diags << DgSqlCode(-3015)
		      << DgInt0($2->right()) << DgInt1($2->left()); 
                    delete $2;
                    YYABORT;
                }
                if ($2->left() > 9 AND NOT $3/*unsigned*/) {
                    // Precision of $0~string0 UNSIGNED data type,
                    // $1~int0, cannot exceed 9. 
                    *SqlParser_Diags << DgSqlCode(-3008)
                                     << DgString0("LSDECIMAL")
                                     << DgInt0($2->left())
				     << DgInt1(9);
                    delete $2;
                    YYABORT;
                }
		$$ = new (PARSERHEAP())
		  LSDecimal(PARSERHEAP(), $2->left(), $2->right(), $3);
                delete $2;
             }
	 | TOK_LSDECIMAL signed_option 
             {
	       // Default (precision,scale) for DECIMAL is (9,0)
	       $$ = new (PARSERHEAP()) LSDecimal(PARSERHEAP(),9, 0, $2);
	     }
	 | TOK_DECIMAL left_uint_uint_right signed_option
             {
                if ($2->left() > 18) {
		  // Precision of a Decimal, " << $2->left()
                  // may not exceed 18.
		  *SqlParser_Diags << DgSqlCode(-3016) << DgInt0($2->left());
		  delete $2;
		  YYABORT;
		}
                if (! ($2->left() > 0 ))  {
		  // Precision must be > 0.
                    *SqlParser_Diags << DgSqlCode(-3003) << DgInt0($2->left());
                    delete $2;
                    yyerror("");
                    YYABORT;
                   }
                if ($2->right() > $2->left()) {
		  // Scale, $2->right()  cannot exceed 
		  // precision, $2->left() 
                    *SqlParser_Diags << DgSqlCode(-3015) << DgInt0($2->right()) << DgInt1($2->left()); 
                    delete $2;
                    YYABORT;
                }
                if ($2->left() > 9 AND NOT $3/*unsigned*/) {
                    // Precision of $0~string0 UNSIGNED data type,
                    // $1~int0, cannot exceed 9. 
                    *SqlParser_Diags << DgSqlCode(-3008)
                                     << DgString0("DECIMAL")
                                     << DgInt0($2->left())
				     << DgInt1(9);
                    delete $2;
                    YYABORT;
                }
		$$ = new (PARSERHEAP())
		  SQLDecimal(PARSERHEAP(), $2->left(), $2->right(), $3);
                delete $2;
             }
	 | TOK_DECIMAL signed_option
             {
	       // Default (precision,scale) for DECIMAL is (9,0)
	       $$ = new (PARSERHEAP()) SQLDecimal(PARSERHEAP(),9, 0, $2);
	     }
float_type : TOK_FLOAT
             {
               //               $$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, SQL_DOUBLE_PRECISION, TRUE);
               $$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0, TRUE);
             }
	 | TOK_FLOAT left_unsigned_right
             {
               $$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, $2, TRUE);

               if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_OFF)
                 {
                   if (! ((SQLDoublePrecision *)$$)->checkValid(SqlParser_Diags))
                     YYERROR;
                 }
             }
	 | TOK_REAL
             {
		$$ = new (PARSERHEAP()) SQLReal(PARSERHEAP(), TRUE); 
             }
	 | TOK_DOUBLE TOK_PRECISION
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_SQL_DOUBLE
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0);
             }

/* na type for the ieee or tandem floats as PROCEDURE argument in mdf.
   In here, REAL, FLOAT and DOUBLE PRECISION become TANDEM floats and
   not IEEE floats. This is for upward compatibility from pre R2 releases */
proc_arg_float_type : TOK_FLOAT_IEEE
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_FLOAT_IEEE left_unsigned_right
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, $2);
                if (! ((SQLDoublePrecision *)$$)->checkValid(SqlParser_Diags))
                   YYERROR;
             }
	 | TOK_REAL_IEEE
             {
		$$ = new (PARSERHEAP()) SQLReal(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_DOUBLE_IEEE
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_FLOAT
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_FLOAT left_unsigned_right
             {
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE, $2);
                if (! ((SQLDoublePrecision *)$$)->checkValid(SqlParser_Diags))
                   YYERROR;
             }
	 | TOK_REAL
             {
	       // For upward compatability, 
	       // REAL is IEEE real on NT, tandem real on NSK.
		$$ = new (PARSERHEAP()) SQLReal(PARSERHEAP(), TRUE, 0);
             }
	 | TOK_DOUBLE TOK_PRECISION
             {
	       // For upward compatability, 
	       // DOUBLE is IEEE double on NT, tandem double on NSK.
		$$ = new (PARSERHEAP()) SQLDoublePrecision(PARSERHEAP(), TRUE);
             }

/* na_type */
pic_type : TOK_PICTURE char_set collation_option pic_tail pic_notcasespecific_option
             {
                NABoolean    isStringType;
                UInt32     precision;  // for string, means "length"
                UInt32     scale;      // for string, meaningless
                NABoolean    hasSign;    // for string, meaningless

                NABoolean result =
                  parsePicClause($1,&isStringType,&precision,&scale,&hasSign);

		if(result == FALSE)
                { 
		  *SqlParser_Diags << DgSqlCode(-EXE_NUMERIC_OVERFLOW);
                  yyerror("");
                  YYABORT;
                }
                  /* We cast to DISPLAY_STYLE so as to let type of $2 be
                   * longint, so as not to expose DISPLAY_STYLE to the world
                   * as it would be were it in the "%union" declaration above.
                   */
                if (! (precision > 0 ))  {
		  // Precision must be > 0.
                    *SqlParser_Diags << DgSqlCode(-3003) << DgInt0(precision);
                    yyerror("");
                    YYABORT;
                   }

		if ((NOT isStringType) && ($5))
		  {
                    yyerror("");
                    YYABORT;
		  }

		if ((NOT isStringType) &&
		    (precision > 9) &&
		    (NOT hasSign))
		  {
                    // $1~int0, cannot exceed 9. 
                    *SqlParser_Diags << DgSqlCode(-3008)
                                     << DgString0("DECIMAL")
                                     << DgInt0(precision)
				     << DgInt1(9);
                    yyerror("");
                    YYABORT;
		  }

		NABoolean caseInsensitive = $5;
		if ((isStringType) &&
		    (SqlParser_CurrentParser->modeSpecial1()))
		  caseInsensitive = TRUE;

                // picNAType assert fails if precision is 0
                $$ = picNAType(isStringType, (DISPLAY_STYLE)$4,
                               precision, scale, hasSign,
			       $2, $3.collation_, $3.coercibility_,
                               *$1/*picClauseBuffer*/, caseInsensitive);
                delete $1;
                if ($$ == NULL) YYABORT;
	        if (checkError3179($$)) YYERROR;
             }

/* longint */
pic_tail :    { /* default case */ $$ = STYLE_DISPLAY; }
         | TOK_DISPLAY
              { $$ = STYLE_DISPLAY; }
         | TOK_DISPLAY TOK_SIGN TOK_IS TOK_LEADING
              { $$ = STYLE_LEADING_SIGN; }
         | TOK_DISPLAY TOK_UPSHIFT
              { $$ = STYLE_UPSHIFT; }
         | TOK_UPSHIFT
              { $$ = STYLE_UPSHIFT; }
         | TOK_COMP
              { $$ = STYLE_COMP; }


/* type boolean */
signed_option :   { $$ = TRUE; // default is SIGNED
		  }
     | TOK_SIGNED  { $$ = TRUE; }
     | TOK_UNSIGNED { $$ = FALSE; }

/* type na_type */
string_type : tok_char_or_character_or_byte new_optional_left_charlen_right char_set collation_option upshift_flag notcasespecific_option
            {
              CharInfo::CharSet eCharSet = $3; // char_set
              if ((NOT $2/*new_optional_left_charlen_right*/->isCharLenUnitSpecified()) &&
                  (eCharSet EQU CharInfo::UTF8) &&
                  (in_col_defn) &&
                  (CmpCommon::getDefault(TRAF_COL_LENGTH_IS_CHAR) == DF_OFF))
                {
                  $2->setCharLenUnit(ParAuxCharLenSpec::eBYTES);
                }

               ParAuxCharLenSpec::ECharLenUnit parCLU = $2/*new_optional_left_charlen_right*/->getCharLenUnit();

               if (( $2/*new_optional_left_charlen_right*/->isCharLenUnitSpecified() AND
                     $1/*tok_char_or_character_or_byte*/ EQU TOK_BYTE )  OR
                   ( eCharSet EQU CharInfo::UCS2 AND parCLU EQU ParAuxCharLenSpec::eBYTES ) )
                 {
                   emitError3435( $1, eCharSet, parCLU ); // BYTE[S] not allowed with UCS2 or type BYTE
                   YYERROR;
                 }
               Int32 specifiedLength = $2/*new_optional_left_charlen_right*/->getCharLen();
               if (parCLU EQU ParAuxCharLenSpec::eBYTES OR eCharSet EQU CharInfo::UTF8 /* OR eCharSet EQU CharInfo::SJIS */)
               { // SeaQuest Unicode
                 if ( $1/*tok_char_or_character_or_byte*/ EQU TOK_BYTE )
                 {
                   emitError3435( $1, eCharSet, parCLU ); // BYTE type not allowed with UTF8 or SJIS
                   YYERROR;
                 }
                 else if ( eCharSet EQU CharInfo::ISO88591 AND parCLU EQU ParAuxCharLenSpec::eBYTES )
                   parCLU = ParAuxCharLenSpec::eCHAR_LEN_UNIT_NOT_SPECIFIED; // Ignore BYTES specifier!
                 if (eCharSet EQU CharInfo::SJIS) // not yet supported
                 {
	           *SqlParser_Diags << DgSqlCode(-3010) << DgString0("SJIS");
                   YYERROR;
                 }
                 CharInfo::CharSet eEncodingCharSet = eCharSet;
                 Int32 maxLenInBytes = specifiedLength;
                 Int32 characterLimit = specifiedLength;
                 Int32 maxBytesPerChar = CharInfo::maxBytesPerChar(eEncodingCharSet);
                 if ( parCLU NEQ ParAuxCharLenSpec::eBYTES )
                 {
                   maxLenInBytes = characterLimit * maxBytesPerChar;
                 }
                 $$ = new (PARSERHEAP()) SQLChar ( PARSERHEAP(), CharLenInfo(characterLimit, maxLenInBytes), TRUE,
                                                   $5, $6, FALSE, eCharSet, $4.collation_,
                                                   $4.coercibility_, eEncodingCharSet );
                 NAString ddt("CHAR", PARSERHEAP());
                 ((SQLChar *)$$)->generateTextThenSetDisplayDataType ( eCharSet , ddt );
               }
               else // keep the old behavior
               $$ = new (PARSERHEAP()) SQLChar
			(PARSERHEAP(), specifiedLength, TRUE, $5, $6, FALSE, 
			 eCharSet, $4.collation_, $4.coercibility_);
	       if (checkError3179($$)) YYERROR;

            }
     | TOK_ANSIVARCHAR left_charlen_right char_set collation_option upshift_flag notcasespecific_option
            {
               $$ = new (PARSERHEAP()) ANSIChar
	       		(PARSERHEAP(), $2, TRUE, $5, TRUE,
			 $3, $4.collation_, $4.coercibility_);
	       if (checkError3179($$)) YYERROR;
            }
     | tok_char_or_character_or_byte TOK_VARYING toggled_optional_left_charlen_right char_set 
       collation_option upshift_flag notcasespecific_option
            {
              CharInfo::CharSet eCharSet = $4; // char_set
              if ((NOT $3/*new_optional_left_charlen_right*/->isCharLenUnitSpecified()) &&
                  (eCharSet EQU CharInfo::UTF8) &&
                  (in_col_defn) &&
                  (CmpCommon::getDefault(TRAF_COL_LENGTH_IS_CHAR) == DF_OFF))
                {
                  $3->setCharLenUnit(ParAuxCharLenSpec::eBYTES);
                }

               ParAuxCharLenSpec::ECharLenUnit parCLU = $3/*toggled_optional_left_charlen_right*/->getCharLenUnit();

               if ( $3/*toggled_optional_left_charlen_right*/->isCharLenUnitSpecified()  AND
                    $1/*tok_char_or_character_or_byte*/ EQU TOK_BYTE )
               {
                 emitError3435( $1, eCharSet, parCLU ); // BYTES/CHARS not allowed with BYTE VARYING
                 YYERROR;
               }
               if ( eCharSet EQU CharInfo::UCS2 AND parCLU EQU ParAuxCharLenSpec::eBYTES )
               {
                 emitError3435( $1, eCharSet, parCLU ); // BYTE[S] not allowed with UCS2
                 YYERROR;
               }
               Int32 specifiedLength = $3/*toggled_optional_left_charlen_right*/->getCharLen();
               if (eCharSet EQU CharInfo::UTF8 OR eCharSet EQU CharInfo::SJIS)
               { // SeaQuest Unicode
                 if ( $1/*tok_char_or_character_or_byte*/ EQU TOK_BYTE )
                   YYERROR;
                 if (eCharSet EQU CharInfo::SJIS) // not support in SeaQuest M4
                 {
	           *SqlParser_Diags << DgSqlCode(-3010) << DgString0("SJIS");
                   YYERROR;
                 }
                 CharInfo::CharSet eEncodingCharSet = eCharSet;
                 Int32 maxLenInBytes  = specifiedLength;
                 Int32 characterLimit = specifiedLength;
                 Int32 maxBytesPerChar   = CharInfo::maxBytesPerChar(eEncodingCharSet);
                 if ( parCLU NEQ ParAuxCharLenSpec::eBYTES )
                 {
                   maxLenInBytes = characterLimit * maxBytesPerChar; 
                 }
                 $$ = new (PARSERHEAP()) SQLVarChar ( PARSERHEAP(), CharLenInfo(characterLimit, maxLenInBytes),
                                                      TRUE, $6, $7, eCharSet, $5.collation_,
                                                      $5.coercibility_, eEncodingCharSet );
                 NAString ddt("VARCHAR", PARSERHEAP());
                 ((SQLVarChar *)$$)->generateTextThenSetDisplayDataType ( eCharSet , ddt );
               }
               else // keep the old behavior
               $$ = new (PARSERHEAP()) SQLVarChar
			(PARSERHEAP(), specifiedLength, TRUE, $6, $7,
			 eCharSet, $5.collation_, $5.coercibility_);
	       if (checkError3179($$)) YYERROR;
 
            }
     | TOK_VARCHAR toggled_optional_left_charlen_right char_set collation_option upshift_flag notcasespecific_option
            {
              CharInfo::CharSet eCharSet = $3; // char_set
              if ((NOT $2/*new_optional_left_charlen_right*/->isCharLenUnitSpecified()) &&
                  (eCharSet EQU CharInfo::UTF8) &&
                  (in_col_defn) &&
                  (CmpCommon::getDefault(TRAF_COL_LENGTH_IS_CHAR) == DF_OFF))
                {
                  $2->setCharLenUnit(ParAuxCharLenSpec::eBYTES);
                }

               ParAuxCharLenSpec::ECharLenUnit parCLU = $2/*toggled_optional_left_charlen_right*/->getCharLenUnit();

               if ( eCharSet EQU CharInfo::UCS2 AND parCLU EQU ParAuxCharLenSpec::eBYTES )
               {
                 emitError3435( TOK_VARCHAR, eCharSet, parCLU ); // BYTE[S] not allowed with UCS2
                 YYERROR;
               }
               Int32 specifiedLength = $2/*toggled_optional_left_charlen_right*/->getCharLen();
               if (eCharSet EQU CharInfo::UTF8 OR eCharSet EQU CharInfo::SJIS)
               { // Seaquest Unicode
                 if (eCharSet EQU CharInfo::SJIS) // not yet supported
                 {
	           *SqlParser_Diags << DgSqlCode(-3010) << DgString0("SJIS");
                   YYERROR;
                 }
                 CharInfo::CharSet eEncodingCharSet = eCharSet;
                 Int32 maxLenInBytes  = specifiedLength;
                 Int32 characterLimit = specifiedLength;
                 Int32 maxBytesPerChar   = CharInfo::maxBytesPerChar(eEncodingCharSet);
                 if ( parCLU NEQ ParAuxCharLenSpec::eBYTES )
                 {
                   maxLenInBytes = characterLimit * maxBytesPerChar;
                 }
                 $$ = new (PARSERHEAP()) SQLVarChar (PARSERHEAP(),  CharLenInfo(characterLimit, maxLenInBytes), TRUE,
                                                      $5, $6, eCharSet, $4.collation_,
                                                      $4.coercibility_, eEncodingCharSet );
                 NAString ddt("VARCHAR", PARSERHEAP());
                 ((SQLVarChar *)$$)->generateTextThenSetDisplayDataType ( eEncodingCharSet , ddt );
               }
               else // keep the old behavior
               $$ = new (PARSERHEAP()) SQLVarChar
			(PARSERHEAP(), specifiedLength, TRUE, $5, $6,
			 eCharSet, $4.collation_, $4.coercibility_);
	       if (checkError3179($$)) YYERROR;

            }
     | TOK_LONG TOK_VARCHAR char_set collation_option upshift_flag notcasespecific_option
       {
         // odbc SQL_LONGVARCHAR is LONG VARCHAR: variable length character
         // data. Maximum length is data source-dependent (can be specified
         // by control query default MAX_LONG_VARCHAR_DEFAULT_SIZE).
         //
         // 2010/6/6  Assume that the specified maximum length is in bytes
         //           (until the Seaquest Unicode ES says otherwise).

         CharInfo::CharSet eCharSet = $3; // char_set
         Int32 maxLenInBytes = getDefaultMaxLengthForLongVarChar(eCharSet);

         if (eCharSet EQU CharInfo::UTF8 OR eCharSet EQU CharInfo::SJIS)
         { // SeaQuest
           if (eCharSet EQU CharInfo::SJIS) // not support in SeaQuest M4
           {
	     *SqlParser_Diags << DgSqlCode(-3010) << DgString0("SJIS");
             YYERROR;
           }
           CharInfo::CharSet eEncodingCharSet = eCharSet;
           Int32 maxBytesPerChar = CharInfo::maxBytesPerChar(eCharSet);
           // compute the length in UCS4 characters for the worse case scenarios
           Int32 characterLimit = maxLenInBytes ;
           $$ = new (PARSERHEAP()) SQLLongVarChar ( PARSERHEAP(), (characterLimit, maxLenInBytes),
                                                    FALSE, TRUE,
                                                    $5, $6, eCharSet, $4.collation_,
                                                    $4.coercibility_, eEncodingCharSet );
           
           NAString ddt("LONG VARCHAR", PARSERHEAP());
           ((CharType *)$$)->generateTextThenSetDisplayDataType ( eCharSet , ddt );
         }
         else // keep the old behavior
         $$ = new (PARSERHEAP()) SQLLongVarChar
           (PARSERHEAP(), maxLenInBytes, FALSE, TRUE, $5, $6,
            eCharSet, $4.collation_, $4.coercibility_);
         if (checkError3179($$)) YYERROR;

       }

     | TOK_LONG TOK_VARCHAR new_left_charlen_right char_set collation_option upshift_flag notcasespecific_option
       {
         CharInfo::CharSet eCharSet = $4; // char_set
         if ((NOT $3/*new_optional_left_charlen_right*/->isCharLenUnitSpecified()) &&
             (eCharSet EQU CharInfo::UTF8) &&
             (in_col_defn) &&
             (CmpCommon::getDefault(TRAF_COL_LENGTH_IS_CHAR) == DF_OFF))
           {
             $3->setCharLenUnit(ParAuxCharLenSpec::eBYTES);
           }

         Int32 maxLenInBytes = $3/*new_left_charlen_right*/->getCharLen();
         ParAuxCharLenSpec::ECharLenUnit parCLU = $3/*new_left_charlen_right*/->getCharLenUnit();

         Int32 maxSize = getDefaultMaxLengthForLongVarChar(eCharSet);
         if (maxLenInBytes > maxSize) {
           *SqlParser_Diags << DgSqlCode(-3213) << DgInt0(maxSize);
           YYABORT;
         }
         Int32 minSize = getDefaultMinLengthForLongVarChar(eCharSet);
         if (maxLenInBytes < minSize) {
           *SqlParser_Diags << DgSqlCode(-3214) << DgInt0(minSize);
           YYABORT;
         }

         if (eCharSet EQU CharInfo::UTF8 OR eCharSet EQU CharInfo::SJIS)
         { // SeaQuest
           if (eCharSet EQU CharInfo::SJIS) // not yet support
           {
	     *SqlParser_Diags << DgSqlCode(-3010) << DgString0("SJIS");
             YYERROR;
           }
           if (parCLU EQU ParAuxCharLenSpec::eCHARACTERS)
           {
             emitError3435( TOK_LONG, eCharSet, parCLU ); // CHAR[S] not allowed with LONG VARCHAR
             YYERROR;
           }
           CharInfo::CharSet eEncodingCharSet = eCharSet;
           Int32 maxBytesPerChar = CharInfo::maxBytesPerChar(eCharSet);
           // compute the length in UCS4 characters for the worse case scenarios
           Int32 characterLimit = maxLenInBytes ;
           $$ = new (PARSERHEAP()) SQLVarChar ( PARSERHEAP(), CharLenInfo ( characterLimit , maxLenInBytes)
                                              , TRUE // allowSQLnull
                                              , $6   // isUpShifted
                                              , $7   // isCaseInsensitive
                                              , eCharSet
                                              , $5.collation_
                                              , $5.coercibility_
                                              , eEncodingCharSet
                                              );
           NAString ddt("LONG VARCHAR", PARSERHEAP());
           ((CharType *)$$)->generateTextThenSetDisplayDataType ( eEncodingCharSet , ddt );
         }
         else // keep the old behavior
         // KLUDGE begin: fix cases 10-040511-5169, 10-040610-2860, 
         // soln 10-040610-6863 by temporarily mapping
         //   "create table t(c long varchar, w longwvarchar)" into
         //   "create table t(c varchar(n),   w varwchar(m))".
         $$ = new (PARSERHEAP()) SQLVarChar
           (PARSERHEAP(), maxLenInBytes, TRUE, $6, $7, eCharSet, $5.collation_, $5.coercibility_);
         // end KLUDGE.
	       if (checkError3179($$)) YYERROR;

       }
     | nchar optional_left_charlen_right collation_option upshift_flag notcasespecific_option
            {
               $$ = new (PARSERHEAP()) SQLChar
		 	(PARSERHEAP(), $2, TRUE, $4, $5, FALSE,
			 SqlParser_NATIONAL_CHARSET,
			 $3.collation_, $3.coercibility_);
	       if (checkError3179($$)) YYERROR;
            }
     | nchar_varying left_charlen_right collation_option upshift_flag notcasespecific_option
            {
               $$ = new (PARSERHEAP()) SQLVarChar
		 	(PARSERHEAP(), $2, TRUE, $4, $5,
			 SqlParser_NATIONAL_CHARSET,
			 $3.collation_, $3.coercibility_);
	       if (checkError3179($$)) YYERROR;
            }
     | TOK_WCHAR left_unsigned_right collation_option upshift_flag notcasespecific_option
       {
         // odbc SQL_WCHAR is WCHAR(n): Unicode character string
         // of fixed string length n.
         $$ = new (PARSERHEAP()) SQLChar
           (PARSERHEAP(), $2, TRUE, $4, $5, FALSE, CharInfo::UNICODE, 
            $3.collation_, $3.coercibility_);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_VARWCHAR left_unsigned_right collation_option upshift_flag notcasespecific_option
       {
         // odbc SQL_WVARCHAR is VARWCHAR(n): Unicode variable-length
         // character string with a maximum string length n.
         $$ = new (PARSERHEAP()) SQLVarChar
           (PARSERHEAP(), $2, TRUE, $4, $5, CharInfo::UNICODE, 
            $3.collation_, $3.coercibility_);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_LONGWVARCHAR collation_option upshift_flag notcasespecific_option
       {
         // odbc SQL_WLONGVARCHAR is LONGWVARCHAR: Unicode variable-length
         // character data. Maximum length is data source-dependent (can be
         // set by control query default MAX_LONG_WVARCHAR_DEFAULT_SIZE).
         $$ = new (PARSERHEAP()) SQLLongVarChar
           (PARSERHEAP(), getDefaultMaxLengthForLongVarChar(CharInfo::UNICODE), 
            FALSE, TRUE, $3, $4, CharInfo::UNICODE, 
            $2.collation_, $2.coercibility_);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_LONGWVARCHAR left_unsigned_right collation_option upshift_flag notcasespecific_option
       {
         Lng32 maxSize = getDefaultMaxLengthForLongVarChar(CharInfo::UNICODE);

         if ($2 > maxSize) {
           *SqlParser_Diags << DgSqlCode(-3209) << DgInt0(maxSize);
           YYABORT;
         }
         Lng32 minSize = getDefaultMinLengthForLongVarChar(CharInfo::UNICODE);

         if ($2 < minSize) {
           *SqlParser_Diags << DgSqlCode(-3210) << DgInt0(minSize);
           YYABORT;
         }
         $$ = new (PARSERHEAP()) SQLLongVarChar
           (PARSERHEAP(), $2, TRUE, TRUE, $4, $5, CharInfo::UNICODE, 
            $3.collation_, $3.coercibility_);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_BINARY left_unsigned_right
       {
         // odbc SQL_BINARY is BINARY(n). Binary data of fixed length n.
         $$ = new (PARSERHEAP()) SQLChar(PARSERHEAP(), $2, TRUE, FALSE, FALSE);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_VARBINARY left_unsigned_right
       {
         // odbc SQL_VARBINARY is VARBINARY(n). Variable length binary data 
         // of maximum length n. The maximum length is set by the user.
         $$ = new (PARSERHEAP()) SQLVarChar(PARSERHEAP(), $2);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_LONG TOK_VARBINARY
       {
         // odbc SQL_LONGVARBINARY is LONG VARBINARY(n). Variable length 
         // binary data. Maximum length is data source-dependent.
         $$ = new (PARSERHEAP()) SQLLongVarChar(PARSERHEAP(), 0, FALSE);
         if (checkError3179($$)) YYERROR;
       }
     | TOK_LONG TOK_VARBINARY left_unsigned_right
       {
         Lng32 maxSize = getDefaultMaxLengthForLongVarChar(CharInfo::ISO88591);
         if ($3 > maxSize) {
           *SqlParser_Diags << DgSqlCode(-3211) << DgInt0(maxSize);
           YYABORT;
         }
         Lng32 minSize = getDefaultMinLengthForLongVarChar(CharInfo::ISO88591);
         if ($3 < minSize) {
           *SqlParser_Diags << DgSqlCode(-3212) << DgInt0(minSize);
           YYABORT;
         }
         // KLUDGE begin: fix cases 10-040511-5169, 10-040610-2860, 
         // soln 10-040610-6863 by temporarily mapping
         //   "create table t(b long varbinary(n))" into
         //   "create table t(b varchar(n))".
         $$ = new (PARSERHEAP()) SQLVarChar(PARSERHEAP(), $3);
         // end KLUDGE.
         if (checkError3179($$)) YYERROR;
       }

tok_char_or_character : TOK_CHAR | TOK_CHARACTER

/* For TD compatibility - we map BYTE to CHAR */
tok_char_or_character_or_byte : TOK_CHAR | TOK_CHARACTER
                              | TOK_BYTE
                                {
                                  CheckModeSpecial1();
                                }

/* type na_type */
blob_type : TOK_BLOB blob_optional_left_len_right 
            {
	      if (CmpCommon::getDefault(TRAF_BLOB_AS_VARCHAR) == DF_ON)
		{
		  $$ = new (PARSERHEAP()) SQLVarChar(PARSERHEAP(), $2);
                  ((SQLVarChar*)$$)->setClientDataType("BLOB");
		}
	      else
		{
    		  $$ = new (PARSERHEAP()) SQLBlob (PARSERHEAP(),  $2 );
		}
            }
          | TOK_CLOB clob_optional_left_len_right
            {
	      if (CmpCommon::getDefault(TRAF_CLOB_AS_VARCHAR) == DF_ON)
		{
		  $$ = new (PARSERHEAP()) SQLVarChar(PARSERHEAP(), $2);
                  ((SQLVarChar*)$$)->setClientDataType("CLOB");
		}
	      else
		{
                  $$ = new (PARSERHEAP()) SQLClob (PARSERHEAP(),  $2 );
		}
            }
 

blob_optional_left_len_right: '(' NUMERIC_LITERAL_EXACT_NO_SCALE optional_lob_unit ')'
        {
	 
	  Int64 longIntVal = atoInt64($2->data());
	  if (longIntVal < 0)
	  {
	    // Error: Expected an unsigned integer
	    *SqlParser_Diags << DgSqlCode(-3017) 
			     << DgString0(*$2);
	  }
	  
	  longIntVal = longIntVal * $3;

	  $$ = (Int64)longIntVal;
	  delete $2;
	 
	}

	| empty
	{ 

	  if (CmpCommon::getDefault(TRAF_BLOB_AS_VARCHAR) == DF_ON)
	    {
	      $$ = (Int64)CmpCommon::getDefaultNumeric(TRAF_MAX_CHARACTER_COL_LENGTH );
	    }
	  else
	    {
	 
	      $$ = (Int64)CmpCommon::getDefaultNumeric(LOB_MAX_SIZE)*1024*1024;

	    }
        }

/* type int64 */
optional_lob_unit :   TOK_K {$$ = 1024;}
                     | TOK_M {$$ = 1024*1024;}
                     | TOK_G {$$ = 1024*1024*1024;}
                     | empty {$$ = 1;}

clob_optional_left_len_right: '(' NUMERIC_LITERAL_EXACT_NO_SCALE optional_lob_unit ')'
        {
	  Int64 longIntVal = atoInt64($2->data());
	  if (longIntVal < 0)
	  {
	    // Error: Expected an unsigned integer
	    *SqlParser_Diags << DgSqlCode(-3017)
			     << DgString0(*$2);
	  }
	  longIntVal = longIntVal * $3;

	  $$ = (Int64)longIntVal;
	  delete $2;
	}

	| empty
	{

	  if (CmpCommon::getDefault(TRAF_CLOB_AS_VARCHAR) == DF_ON)
	    {
	      $$ = (Int64)CmpCommon::getDefaultNumeric(TRAF_MAX_CHARACTER_COL_LENGTH );
	    }
	  else
	    {
	      $$ = (Int64)CmpCommon::getDefaultNumeric(LOB_MAX_SIZE)*1024*1024;

	    }
        }

/* type na_type */
boolean_type : TOK_BOOLEAN
            {
              $$ = new (PARSERHEAP()) SQLBooleanNative (PARSERHEAP(), TRUE);
            }

/* type pCharLenSpec */
toggled_optional_left_charlen_right: new_left_charlen_right
	| empty
	{ 
          if ( empty_charlen_specifier_allowed == FALSE ) { 
            YYERROR; 
          } else
            $$ = new(PARSERHEAP()) ParAuxCharLenSpec ( DEFAULT_STRING_SIZE
                                                     , ParAuxCharLenSpec::eCHAR_LEN_UNIT_NOT_SPECIFIED
                                                     );
        }

optional_left_charlen_right: left_charlen_right
	| empty
	{ 
          $$ = DEFAULT_STRING_SIZE; 
        }

/* type pCharLenSpec */
new_optional_left_charlen_right: new_left_charlen_right
        | empty
        {
          $$ = new(PARSERHEAP()) ParAuxCharLenSpec ( DEFAULT_STRING_SIZE
                                                   , ParAuxCharLenSpec::eCHAR_LEN_UNIT_NOT_SPECIFIED
                                                   );
        }

nchar: TOK_NATIONAL tok_char_or_character { cast_target_cs_specified = TRUE; }
       | TOK_NCHAR                        { cast_target_cs_specified = TRUE; }

nchar_varying: TOK_NATIONAL tok_char_or_character TOK_VARYING { cast_target_cs_specified = TRUE; }
               | TOK_NCHAR TOK_VARYING                        { cast_target_cs_specified = TRUE; }

/* type charSetVal */
char_set :	
           { 
             if ((in_col_defn) &&
                 (SqlParser_CurrentParser->defaultColCharset() != CharInfo::UnknownCharSet))
               $$ = SqlParser_CurrentParser->defaultColCharset();
             else
               $$ = SqlParser_DEFAULT_CHARSET; 
           }
      | TOK_CHARACTER TOK_SET character_set 
	  	{
	  	  $$ = $3;
	  	  cast_target_cs_specified = TRUE;
	  	}

/* type charSetVal */
CHAR_FUNC_character_set : IDENTIFIER 
        { 
	  $1->toUpper();
	  $$ = CharInfo::getCharSetEnum(*$1);
	  if (!CharInfo::isCharSetFullySupported($$)) {
	    // 3010 Character set $0~string0 is not yet supported.
	    if ($$ != CharInfo::UnknownCharSet) {
	      *SqlParser_Diags << DgSqlCode(-3010) << DgString0(*$1);
	       YYERROR;
	    } else {
              if (!Get_SqlParser_Flags(ALLOW_UNKNOWN_CHARSET)) {
	        yyerror("");
	        YYERROR;
              }
            }
	  }
          delete $1;
        } 

/* type charSetVal */
character_set : IDENTIFIER 
        { 
	  $1->toUpper();
	  $$ = CharInfo::getCharSetEnum(*$1);
	  if (!CharInfo::isCharSetFullySupported($$)) {
	    // 3010 Character set $0~string0 is not yet supported.
	    if ($$ != CharInfo::UnknownCharSet) {
	      *SqlParser_Diags << DgSqlCode(-3010) << DgString0(*$1);
	       YYERROR;
	    } else {
              if (!Get_SqlParser_Flags(ALLOW_UNKNOWN_CHARSET)) {
	        yyerror("");
	        YYERROR;
              }
            }
	  }
          delete $1;
        } 

/* type boolean */
upshift_flag :	    { $$ = FALSE; }
      | TOK_UPSHIFT { $$ = TRUE; }
      | TOK_UPPERCASE { $$ = TRUE; }

/* type boolean */
notcasespecific_option : empty 
                           { 
			     if (SqlParser_CurrentParser->modeSpecial1())
			       $$ = TRUE;
			     else
			       $$ = FALSE; 
			   }
      | TOK_NOT_CASESPECIFIC   
                           { 
			     $$ = TRUE; 
			   }
      | TOK_CASESPECIFIC   
                           { 
			     $$ = FALSE; 
			   }

/* type boolean */
pic_notcasespecific_option : empty 
                           { 
			     $$ = FALSE; 
			   }
      | TOK_NOT_CASESPECIFIC   
                           { 
			     $$ = TRUE; 
			   }

/* type uint */
unsigned_integer : NUMERIC_LITERAL_EXACT_NO_SCALE
    {
      Lng32 longIntVal = atol(*$1);
      if (longIntVal < 0)
      {
        // Error: Expected an unsigned integer
        // *$1.
         *SqlParser_Diags << DgSqlCode(-3017) << DgString0(*$1);
      }
      delete $1;
      $$ = (UInt32)longIntVal;
    }

/* type usmallint */
unsigned_smallint : NUMERIC_LITERAL_EXACT_NO_SCALE
    {
      Lng32 longIntVal = atol(*$1);
      if (longIntVal < 0 AND longIntVal > USHRT_MAX)
      {
	// *** Error *** Expected an unsigned smallint
        // $1.
        *SqlParser_Diags << DgSqlCode(-3018) << DgString0(*$1);
      }
      delete $1;
      $$ = (UInt16)longIntVal;
    }

/* type Int64 */
left_largeint_right : '(' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
    {
      NAString *theValue = new (PARSERHEAP()) NAString($2->data(), PARSERHEAP());
      ItemExpr *returnValue = literalOfNumericNoScale(theValue);
      if (!returnValue) YYERROR;
      $$ = returnValue;
      assert( $$ == returnValue );
      SqlParser_CurrentParser->collectItem4HQC($$);
      delete $2;
    }

/* type uint */
ts_left_unsigned_right : '(' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
    {
      Lng32  theValue = atol($2->data());
      if (theValue < 0)
      { // time_precision can be 0
        // Parse Error: Expected an unsigned number
        // between the pair of parentheses --.

        *SqlParser_Diags << DgSqlCode(-3017) << DgString0(*$2);
        yyerror("");
        YYABORT;
      }
      $$ = (UInt32) theValue;
      assert($$ == (UInt32) theValue);
      delete $2;
    }

/* type uint */
left_charlen_right : left_unsigned optional_charlen_unit ')'
	{ $$ = $1; }

/* type tokval */
optional_charlen_unit : TOK_CHARACTERS
	| TOK_CHAR      { $$ =  TOK_CHARACTERS ; }
	| TOK_CHARS     { $$ =  TOK_CHARACTERS ; }
	| TOK_CHARACTER { $$ =  TOK_CHARACTERS ; } 
	|
	empty;

/* type pCharLenSpec */
new_left_charlen_right : left_unsigned new_optional_charlen_unit ')'
    {
      ParAuxCharLenSpec::ECharLenUnit eUnit = 
        ParAuxCharLenSpec::eCHAR_LEN_UNIT_NOT_SPECIFIED;
      switch ( $2 /*new_optional_charlen_unit */ )
      {
      case 0:
        eUnit = ParAuxCharLenSpec::eCHAR_LEN_UNIT_NOT_SPECIFIED;
        break;
      case TOK_CHAR: case TOK_CHARS: case TOK_CHARACTER: case TOK_CHARACTERS:
        eUnit = ParAuxCharLenSpec::eCHARACTERS;
        break;
      case TOK_BYTE: case TOK_BYTES:
        eUnit = ParAuxCharLenSpec::eBYTES;
        break;
      default:
        YYERROR;
        break;
      }
      $$ = new(PARSERHEAP()) ParAuxCharLenSpec ( $1 // left_unsigned
                                               , eUnit
                                               );
    }

/* type tokval */
new_optional_charlen_unit : TOK_CHAR | TOK_CHARS | TOK_CHARACTER | TOK_CHARACTERS
	| TOK_BYTE | TOK_BYTES
	| empty

/* type uint */
left_unsigned_right : left_unsigned ')'
	{ $$ = $1; }

/* type uint */
left_unsigned: '(' NUMERIC_LITERAL_EXACT_NO_SCALE 
    {
      const char *numStr = $2->data();
      Lng32 strLen = (Lng32)($2->length());
      Lng32  theValue;
      Lng32 convErrFlag = ex_conv_clause::CONV_RESULT_OK;      

      /* for char(n), we limit the value of n to be no more than
         2^31-1, so convert it to 32bit signed first, then check 
	 to make sure the converted value is not negative. */

      ex_expr::exp_return_type result = 
         convDoIt((char *)numStr,       /*source*/
	          strLen,               /*sourceLen*/
		  REC_BYTE_F_ASCII,     /*sourceType*/
		  0,                    /*sourcePrecision*/
		  0,                    /*sourceScale*/
	          (char *)&theValue,    /*target*/
	          sizeof(theValue),     /*targetLen*/
	          REC_BIN32_SIGNED,     /*targetType*/
	          0,                    /*targetPrecision*/
	          0,                    /*targetScale*/
                  NULL,                 /*varCharLen*/
                  0,                    /*varCharLenSize*/
	          PARSERHEAP(),         /*heap*/
	          &SqlParser_Diags,     /*diagsArea*/
		  CONV_ASCII_BIN32S,    /*index*/
                  &convErrFlag,         /*dataConversionErrorFlag*/
	          0                     /*flags*/);

      switch(convErrFlag){
      case ex_conv_clause::CONV_RESULT_ROUNDED_DOWN:
      case ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX:
      case ex_conv_clause::CONV_RESULT_ROUNDED_UP:
      case ex_conv_clause::CONV_RESULT_ROUNDED_UP_TO_MIN:
      case ex_conv_clause::CONV_RESULT_ROUNDED:
        *SqlParser_Diags << DgSqlCode(-EXE_NUMERIC_OVERFLOW);
	break;
      default:
        break;
      }

      if( (result != ex_expr::EXPR_OK) ||
          (convErrFlag != ex_conv_clause::CONV_RESULT_OK) ) 
      {
        yyerror("");
        YYABORT;
      }

      if (! (theValue > 0))
        // Normally, we come here to parse unsigned positive numbers
        // used for precision and length values in SQL statements. 
        //
        // We have now encountered a precision or length value
        // that is zero or negative.
        //
        // We do allow a length value of 0 for character data types
        // for columns in UDR Result Set proxy statements to support
        // returning empty strings as part of Result Set columns.
        //
        // All other scenarios are errors. 
        //

         if (! ((theValue == 0) && inRSProxyStmt))
         { 
           *SqlParser_Diags << DgSqlCode(-3003) << DgString0(*$2);
           // Parse Error 3003: Length or precision must be greater than zero.
           yyerror("");
           YYABORT;
         }
      $$ = (UInt32) theValue;
      assert($$ == (UInt32) theValue);
      delete $2;
    }

/* type pairPtr */
left_uint_uint_right: '(' NUMERIC_LITERAL_EXACT_NO_SCALE ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
    {
      UInt32  theLeftValue,theRightValue;
      Lng32  theValue = atol($2->data());
      if (theValue < 0)
      {
        // Parse Error: Expected an unsigned number 
        // as the first number within the parentheses --  $2 
        *SqlParser_Diags << DgSqlCode(-3020) << DgString0(*$2);
      }
      theLeftValue = (UInt32) theValue;
      assert(theLeftValue == (UInt32)theValue);

      theValue = atol($4->data());
      if (theValue < 0)
      {
        // Parse Error: Expected an unsigned number 
        // as the second number within the parentheses -- $4;
        *SqlParser_Diags << DgSqlCode(-3021) << DgString0(*$4);
      }
      theRightValue = (UInt32) theValue;
      assert(theRightValue == (UInt32)theValue);

      $$ = new (PARSERHEAP())
	PairOfUnsigned(theLeftValue,theRightValue);
      assert($$);
    }
   | left_unsigned_right
      { $$ = new (PARSERHEAP()) PairOfUnsigned($1,0);
        assert($$);
      }


/* type na_type */
date_time_type : TOK_DATE disableCharsetInference format_attributes
                          {
                            $$ = new (PARSERHEAP()) SQLDate(PARSERHEAP(), TRUE);
                            SQLDate *pDate = (SQLDate *)$$;
                            // Leave the field blank if FORMAT clause not
                            // specified to leave SHOWDDL output remain
                            // unchanged so we don't need to update
                            // expected results in regression test suites
                            if ($3 /*format_attributes*/ != NULL) 
                              {
                                NAString format (*$3 /*format_attributes*/, PARSERHEAP());
                                NAStringUpshiftASCII(format);
                                pDate->setDisplayFormat(format);
                                delete $3 /*format_attributes*/;
                              }
                            restoreInferCharsetState();
                          }
               | TOK_TIME
                          {
                              $$ = new (PARSERHEAP()) SQLTime(PARSERHEAP(), TRUE, 
                                                              SQLTime::DEFAULT_FRACTION_PRECISION);
                          }
               | TOK_TIME ts_left_unsigned_right
                          {
                              $$ = new (PARSERHEAP()) SQLTime(PARSERHEAP(), TRUE,
                                                              $2);

                              if (! ((SQLTime *)$$)->checkValid(SqlParser_Diags)) YYERROR;
                          }
	       | TOK_TIMESTAMP disableCharsetInference  format_attributes
                          {
                              $$ = new (PARSERHEAP()) 
                                SQLTimestamp(PARSERHEAP(), TRUE, 
                                             SQLTimestamp::DEFAULT_FRACTION_PRECISION); 
                              restoreInferCharsetState();
                          }
	       | TOK_TIMESTAMP ts_left_unsigned_right disableCharsetInference format_attributes
                          {
                              $$ = new (PARSERHEAP()) SQLTimestamp(PARSERHEAP(), TRUE, $2);
                              if (! ((SQLTimestamp *)$$)->checkValid(SqlParser_Diags)) YYERROR;
                              restoreInferCharsetState();
                          }

               | TOK_DATETIME  datetime_qualifier
                          {
                              $$ = DatetimeType::constructSubtype(  // This call is necessary to insure that we return
                               TRUE,                                // a standard DateTime, if possible.
                               $2->getStartField(),
                               $2->getEndField(),
                               $2->getFractionPrecision(),
                               PARSERHEAP()
                               );
                              delete $2;
                              if ($$ == NULL) 
                              {
                               *SqlParser_Diags << DgSqlCode(-3158) << DgString0(""); // Error - invalid datetime
                               YYERROR;
                              } 
			      // Create table with data type DATETIME not supported
			      ((DatetimeType *)$$)->setDTIFlag(DatetimeType::UNSUPPORTED_DDL_DATA_TYPE);
                              if (! ((DatetimeType *)$$)->checkValid(SqlParser_Diags)) YYERROR;
                          }

datetime_qualifier : datetime_start_field
                          {
                             $$ = $1;
                          } 
                | datetime_start_field TOK_TO datetime_end_field
                          {
                             $$ = new (PARSERHEAP())
                                DatetimeQualifier($1->getStartField(),
                                                $3->getEndField(),
                                                $3->getFractionPrecision());
                           delete $1;
                           delete $3;
                          }
                | fraction_only_datetime
                          {
                             $$ = $1;
                          } 

/* type datetimeField */
datetime_start_field : non_second_datetime_field
                {
                        $$ = new (PARSERHEAP()) DatetimeQualifier($1);
                }
                | TOK_SECOND
                {
                        $$ = new (PARSERHEAP()) DatetimeQualifier(REC_DATE_SECOND);
                }

datetime_end_field : non_second_datetime_field
                {
                        $$ = new (PARSERHEAP()) DatetimeQualifier($1);
                }
                | TOK_SECOND
                {
                        $$ = new (PARSERHEAP()) DatetimeQualifier(REC_DATE_SECOND);
                }
                | datetime_fraction_field
                {                                  
                        $$ = $1;
                }
fraction_only_datetime : datetime_fraction_field
                {                                  
                   $$ = new (PARSERHEAP())
                        DatetimeQualifier(REC_DATE_FRACTION_MP,
                                          REC_DATE_FRACTION_MP,
                                         $1->getFractionPrecision());
                    delete $1;
                }
                | TOK_FRACTION TOK_TO datetime_fraction_field
                {
                   $$ = new (PARSERHEAP())
                      DatetimeQualifier(REC_DATE_FRACTION_MP,
                                      REC_DATE_FRACTION_MP,
                                      $3->getFractionPrecision());
                 delete $3;
                }
datetime_fraction_field  : TOK_FRACTION                            // returned in MP mode only
                {                                  
                   $$ = new (PARSERHEAP()) DatetimeQualifier(REC_DATE_SECOND, SQLTimestamp::MAX_FRACTION_PRECISION );
                }
                | TOK_FRACTION ts_left_unsigned_right     // returned in MP mode only
                {                                  
                   $$ = new (PARSERHEAP()) DatetimeQualifier(REC_DATE_SECOND, $2);
                }

/* type na_type */
interval_type : TOK_INTERVAL interval_qualifier
              {
                $$ = new (PARSERHEAP())
		  SQLInterval(PARSERHEAP(), TRUE,
			      $2->getStartField(),
			      $2->getLeadingPrecision(),
			      $2->getEndField(),
			      $2->getFractionPrecision());

		// Check to see if FRACTION used, pass along to new object
		if($2->getDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE))
		{
		  ((SQLInterval *)$$)->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);
		}
                delete $2;
                if (! ((SQLInterval *)$$)->checkValid(SqlParser_Diags)) YYERROR;
              }

/* type intervalQualifier */
interval_qualifier : start_field TOK_TO end_field
                   {
                      $$ = new (PARSERHEAP())
	              IntervalQualifier(PARSERHEAP(), $1->getStartField(),
                                        $1->getLeadingPrecision(),
					$3->getEndField(),
				        $3->getFractionPrecision());

		      // Check to see if FRACTION used, pass along to new object
		      if($3->getDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE))
		      {
		      $$->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);
		      }

                      delete $1;
                      delete $3;
                      if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                   }
                   | single_datetime_field
                   {
                     $$ = $1;
                   }
                   | TOK_SECOND TOK_TO interval_fraction_field
                   {
                       $$ = new (PARSERHEAP()) 
                           IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                                     SQLInterval::DEFAULT_LEADING_PRECISION,
                                     REC_DATE_SECOND,
                                     $3);

                      if (! $$->checkValid(SqlParser_Diags)) YYERROR;

	              // Create table with data type INTERVAL FRACTION not supported
		      $$->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);
                   }
                   | TOK_SECOND ts_left_unsigned_right TOK_TO interval_fraction_field
                   {
                        $$ = new (PARSERHEAP())
                          IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                                    $2,
                                    REC_DATE_SECOND,
                                    $4);

                        if (! $$->checkValid(SqlParser_Diags)) YYERROR;
			
			// Create table with data type INTERVAL FRACTION not supported
			$$->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);
                    }
                   | TOK_SECOND TOK_TO TOK_SECOND
                   {
                        $$ = new (PARSERHEAP()) 
                            IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                                              IntervalQualifier::DEFAULT_LEADING_PRECISION);
                   }

                   | TOK_SECOND ts_left_unsigned_right TOK_TO TOK_SECOND
                   {
                        $$ = new (PARSERHEAP())
                          IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                                   $2,
                                   REC_DATE_SECOND,
                                   0);
                        if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                    }
                    | fraction_only_interval
                    {
                      $$ = $1;

		      // Create table with data type INTERVAL FRACTION not supported
		      $$->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);

                    }
/* type intervalQualifier */
start_field : non_second_datetime_field
            {
              $$ = new (PARSERHEAP()) IntervalQualifier(PARSERHEAP(), $1, IntervalQualifier::DEFAULT_LEADING_PRECISION);
            }
            | non_second_datetime_field ts_left_unsigned_right
            {
              $$ = new (PARSERHEAP()) IntervalQualifier(PARSERHEAP(), $1, $2);
            }

fraction_only_interval :  TOK_FRACTION                           // returned in MP mode only
                {                                  
                   $$ = new (PARSERHEAP())
                        IntervalQualifier(PARSERHEAP(), REC_DATE_FRACTION_MP,
                                      SQLInterval::DEFAULT_LEADING_PRECISION,
                                      REC_DATE_FRACTION_MP,
                                      SQLInterval::MAX_FRACTION_PRECISION);
                }
                | TOK_FRACTION ts_left_unsigned_right   
                {                                  
                   $$ = new (PARSERHEAP())
                        IntervalQualifier(PARSERHEAP(), REC_DATE_FRACTION_MP,
                                      $2,
                                      REC_DATE_FRACTION_MP,
                                      SQLInterval::MAX_FRACTION_PRECISION);
                   if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                }
                | TOK_FRACTION TOK_TO interval_fraction_field
                {
                   $$ = new (PARSERHEAP())
                        IntervalQualifier(PARSERHEAP(), REC_DATE_FRACTION_MP,
                                      SQLInterval::DEFAULT_LEADING_PRECISION,
                                      REC_DATE_FRACTION_MP,
                                      $3);

                   if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                }
                | TOK_FRACTION ts_left_unsigned_right  TOK_TO interval_fraction_field
                {
                   $$ = new (PARSERHEAP())
                        IntervalQualifier(PARSERHEAP(), REC_DATE_FRACTION_MP,
                                      $2,
                                      REC_DATE_FRACTION_MP,
                                      $4);

                   if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                }
interval_fraction_field  : TOK_FRACTION                            // returned in MP mode only
                {                                  
                   $$ = SQLInterval::MAX_FRACTION_PRECISION ; 
                }
                | TOK_FRACTION ts_left_unsigned_right     
                {                                  
                   $$ = $2;
                }

/* type intervalQualifier */
end_field : non_second_datetime_field
          {
            $$ = new (PARSERHEAP()) IntervalQualifier(PARSERHEAP(), $1, IntervalQualifier::DEFAULT_LEADING_PRECISION);
          }
          | TOK_SECOND
          {
            $$ = new (PARSERHEAP()) IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND, IntervalQualifier::DEFAULT_LEADING_PRECISION);
          }
          | TOK_SECOND ts_left_unsigned_right
          {
             $$ = new (PARSERHEAP())
	       IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                            SQLInterval::DEFAULT_LEADING_PRECISION,
                            REC_DATE_SECOND,
                            $2);

             if (! $$->checkValid(SqlParser_Diags)) YYERROR;
          }
          | interval_fraction_field
            {
             $$ = new (PARSERHEAP())
	       IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                            SQLInterval::DEFAULT_LEADING_PRECISION,
                            REC_DATE_SECOND,
                            $1);

             if (! $$->checkValid(SqlParser_Diags)) YYERROR;

	     // Create table with data type INTERVAL FRACTION not supported
	     $$->setDTIFlag(IntervalType::UNSUPPORTED_DDL_DATA_TYPE);
            }

/* type intervalQualifier */
single_datetime_field : start_field
                      {
                        $$ = $1;
                      }
                      | TOK_SECOND
                      {
                        $$ = new (PARSERHEAP())
			  IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
                                            IntervalQualifier::DEFAULT_LEADING_PRECISION);
                      }
                      | TOK_SECOND ts_left_unsigned_right
                      {
                        $$ = new (PARSERHEAP())
			  IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND, $2);
                        if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                      }
                      | TOK_SECOND '(' unsigned_integer ',' unsigned_integer ')'
                      {
                        //
                        // Don't use the left_uint_uint_right production here.
                        // In that production, the second uint defaults to 0
                        // if omitted.  We want the default fraction precision
                        // to be 6.
                        //
                        $$ = new (PARSERHEAP())
			  IntervalQualifier(PARSERHEAP(), REC_DATE_SECOND,
					    $3,
					    REC_DATE_SECOND,
					    $5);
                        if (! $$->checkValid(SqlParser_Diags)) YYERROR;
                      }

/* type datetimeField */
non_second_datetime_field : TOK_YEAR
                          {
                            $$ = REC_DATE_YEAR;
                          }
                          | TOK_MONTH
                          {
                            $$ = REC_DATE_MONTH;
                          }
                          | TOK_DAY
                          {
                            $$ = REC_DATE_DAY;
                          }
                          | TOK_HOUR
                          {
                            $$ = REC_DATE_HOUR;
                          }
                          | TOK_MINUTE
                          {
                            $$ = REC_DATE_MINUTE;
                          }
new_non_second_datetime_field:
                          TOK_CENTURY
                          {
                            $$ = REC_DATE_CENTURY;
                          }
                          | TOK_DECADE
                          {
                            $$ = REC_DATE_DECADE;
                          }
                          | TOK_WEEK
                          {
                            $$ = REC_DATE_WEEK;
                          }
                          | TOK_QUARTER
                          {
                            $$ = REC_DATE_QUARTER;
                          }
                          | TOK_EPOCH
                          {
                            $$ = REC_DATE_EPOCH;
                          }
                          | TOK_DOW
                          {
                            $$ = REC_DATE_DOW;
                          }
                          | TOK_DOY
                          {
                            $$ = REC_DATE_DOY;
                          }
                          | TOK_WOM
                          {
                            $$ = REC_DATE_WOM;
                          }

/* type datetimeField */
datetime_field : non_second_datetime_field
               {
                 $$ = $1;
               }
               | new_non_second_datetime_field
               {
                 $$ = $1;
               }
               | TOK_SECOND
               {
                 $$ = REC_DATE_SECOND;
               }

/* type item */
dynamic_parameter : PARAMETER
		      {
			if (CmpCommon::context()->GetMode() == STMT_STATIC)
			  {
			    // 3048 Dyn params not allowed in static compile.
			    // CR 10-010608-3272 			    
			    if (*$1 == "") 
			      {
				*SqlParser_Diags << DgSqlCode(-3048) << DgString0("?");
			      }
			    else 
			      {
				*SqlParser_Diags << DgSqlCode(-3048) << DgString0(*$1);
			      }
			    YYERROR;
			  }
			else
			  {
			    $$ = new (PARSERHEAP()) DynamicParam(*$1, PARSERHEAP());
			    TheHostVarRoles->addARole(HV_IS_DYNPARAM);
			    AllHostVars->insert($$);
			    setHVorDPvarIndex ( $$, $1 );
			    delete $1;
			    $1 = NULL;
                            SqlParser_CurrentParser->collectItem4HQC($$);
			  }
		      }

/******************************** ## implement later (ANSI 6.15 SR2)
                  | PARAMETER interval_qualifier
		      {
		      }
********************************/

dynamic_parameter_array : PARAMETER '[' unsigned_integer ']' 
			    {
				if (CmpCommon::context()->GetMode() == STMT_STATIC)
				{
				    // 3048 Dyn params not allowed in static compile.
				    // CR 10-010608-3272 			    
				    if (*$1 == "") 
				    {
					*SqlParser_Diags << DgSqlCode(-3048) << DgString0("?");
				    }
				    else 
				    {
					*SqlParser_Diags << DgSqlCode(-3048) << DgString0(*$1);
				    }
				    YYERROR;
				}
				else
				{
				    if ($3 > 0) {
					$$ = new (PARSERHEAP()) DynamicParam(*$1, PARSERHEAP());
					((DynamicParam *) $$)->setRowsetSize($3);
					TheHostVarRoles->addARole(HV_IS_DYNPARAM);
					AllHostVars->insert($$);
					setHVorDPvarIndex ( $$, $1 );
                                       delete $1;
                                       $1 = NULL;
				    }
				    else {
					*SqlParser_Diags << DgSqlCode(-30016) ;
					YYERROR;
				    }

				}
			    }

// Host Variable Expression Formats
// --------------------------------
// Host variable expressions, in general, come in four varieties,
// depending on whether an indicator and/or prototype value is present
// (indicators may have a prototype value if the main host variable
// may have a prototype).  We denote these (), (I), (P), and (IP),
// which mean "no prototype, no indicator", "with indicator, but no
// prototype", and so on.
//
// Here are the uses of host variable expressions, then:
//   (P)   table names
//   (IP)  currently unused (candidate would for certain input host variables)
//   (I)   output host variables (which can't have prototype values)
//   ()    strings (i.e., prepare stmt), simple value spec, simple target
//           spec, and entity names (i.e., extended dynamic cursor)

// This non-terminal provides for host variable expressions of format "()"
// as given above.

/* item */
simple_host_variable : HOSTVAR
	{
          if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_ON) 
            {
              $$ = new (PARSERHEAP()) DynamicParam(*$1, PARSERHEAP());
              TheHostVarRoles->addARole(HV_IS_DYNPARAM);
              AllHostVars->insert($$);
              setHVorDPvarIndex ( $$, $1 );
              delete $1;
            }
          else
            {
              $$ = makeHostVar($1,NULL);
              delete $1;  // okay to delete, we made a copy in makeHostVar
              AllHostVars->insert($$);
              TheHostVarRoles->addUnassigned();
            }
	}

// This production is for a host variable, with a prototype required,
// and with no indicator.  This is according to format "(P)" given above.
// Such host variable expressions always supply input values.
//
// Prototype values disallow date, time, and interval literals
// for reasons of syntactic complexity.  If we were to allow such literals,
// then there would be a conflict at the INSERT statement.

/* item */
hostvar_and_prototype : HOSTVAR TOK_PROTOTYPE mvs_umd_option character_string_literal 
	{ 
          // DEFAULT_CHARSET has no effect on character_string_literal in this context
          HostVar *hv = makeHostVar($1,NULL);
          $$ = hv;
	  delete $1;  // okay to delete, we made a copy in makeHostVar

          hv->setPrototypeValue(*$4);
	  delete $4;  // okay to delete, we just made a copy

	  // Remove leading/trailing blanks from string literal --
	  // the token(s) within the literal is the real proto value
	  TrimNAStringSpace(hv->getPrototypeValue());
	  if (hv->getPrototypeValue().isNull())
	    {
	      yyerror("");	// emits syntax error 15001
	      YYERROR;
	    }

          if (TRUE == $3) //MVS
            hv->setSpecialType(ExtendedQualName::MVS_UMD);
	  
	  AllHostVars->insert($$);
          TheHostVarRoles->addARole(HV_IS_INPUT);
	}

param_and_prototype : PARAMETER TOK_PROTOTYPE character_string_literal 
	{ 
          // DEFAULT_CHARSET has no effect on character_string_literal in this context
	  if (CmpCommon::context()->GetMode() == STMT_STATIC)
	    {
	      // 3048 Dyn params not allowed in static compile.
	      if (*$1 == "") 
		{
		  *SqlParser_Diags << DgSqlCode(-3048) << DgString0("?");
		}
	      else 
		{
		  *SqlParser_Diags << DgSqlCode(-3048) << DgString0(*$1);
		}
	      YYERROR;
	    }

          HostVar *hv = makeHostVar($1,NULL, TRUE);
          $$ = hv;
	  delete $1;  // okay to delete, we made a copy in makeHostVar
	  
	  hv->setPrototypeValue(*$3);
	  delete $3;  // okay to delete, we just made a copy

	  // Remove leading/trailing blanks from string literal --
	  // the token(s) within the literal is the real proto value
	  TrimNAStringSpace(hv->getPrototypeValue());
	  if (hv->getPrototypeValue().isNull())
	    {
	      yyerror("");	// emits syntax error 15001
	      YYERROR;
	    }
	  
	  AllHostVars->insert($$);
          TheHostVarRoles->addARole(HV_IS_DYNPARAM);
	}


mvs_umd_option: empty 
				{
					$$ = FALSE;
				}
				| TOK_MVS_UMD
				{
					$$ = TRUE;
				}
	//////////////////////////////////////////////////////////////////////////
 /*
	|  HOSTVAR  TOK_PROTOTYPE TOK_MVS_UMD character_string_literal
	{ 
          // DEFAULT_CHARSET has no effect on character_string_literal in this context
          HostVar *hv = makeHostVar($1,NULL);
          $$ = hv;
	  delete $1;  // okay to delete, we made a copy in makeHostVar

	  if ((RecompLateNameInfoList *)CmpCommon::context()->recompLateNameInfoList())
	    {
	      char * newPtype = 
		getPrototypeFromLateNameInfoList
		((RecompLateNameInfoList *)CmpCommon::context()->recompLateNameInfoList(),
		 hv->getName(),
		 *$4);

	      hv->setPrototypeValue(NAString(newPtype));
	    }
	  else
	    {
	      hv->setPrototypeValue(*$4);
	    }

	  delete $4;  // okay to delete, we just made a copy
	  // Remove leading/trailing blanks from string literal --
	  // the token(s) within the literal is the real proto value
	  TrimNAStringSpace(hv->getPrototypeValue());
	  if (hv->getPrototypeValue().isNull())
	    {
	      yyerror("");	// emits syntax error 15001
	      YYERROR;
	    }

//      if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
      if (1) // XXXXXXXXMVSXXXXXXXXX
   		hv->setSpecialType(ExtendedQualName::MVS_UMD);
      else
      { 
		  yyerror(""); YYERROR; //internal syntax only!
	  }

	  AllHostVars->insert($$);
          TheHostVarRoles->addARole(HV_IS_INPUT);
	}
	//////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
*/

// This non-terminal provides for host variable expressions of format
// "(IP)" as described above.

/* item */
input_hostvar_expression :  HOSTVAR
                 {
                   if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_ON) 
                     {
                       $$ = new (PARSERHEAP()) DynamicParam(*$1, PARSERHEAP());
                       TheHostVarRoles->addARole(HV_IS_DYNPARAM);
                       AllHostVars->insert($$);
                       setHVorDPvarIndex ( $$, $1 );
                       delete $1;
                     }
                   else
                     {
                       $$ = makeHostVar($1,NULL);
                       delete $1;
                       
                       AllHostVars->insert($$);
                       TheHostVarRoles->addUnassigned();
                       
                       // If we are in an Assignment statement of a 
                       //Compound Statement, and this
                       // is a host variable on the left-hand side of 
                       //the statement, we store it.
                       
                       if (InAssignmentSt) {
                         AssignmentHostVars->insert($$);  
                       }
                     }
		   }
                 
	      | HOSTVAR HOSTVAR
                 {
		   $$ = makeHostVar($1,$2);
		   delete $1;
		   delete $2;
		   AllHostVars->insert($$);
		   TheHostVarRoles->addUnassigned();
		   TheHostVarRoles->add_indicator();
		   if (InAssignmentSt) {
		     AssignmentHostVars->insert($$);  
		   }
          }
	      | HOSTVAR TOK_INDICATOR HOSTVAR
                 {
		   $$ = makeHostVar($1,$3);
		   delete $1;
		   delete $3;
		   AllHostVars->insert($$);
		   TheHostVarRoles->addUnassigned();
		   TheHostVarRoles->add_indicator();
		   if (InAssignmentSt) {
		     AssignmentHostVars->insert($$);  
		   }

           }

// This non-terminal exists strictly to eliminate some shift/reduce and reduce/reduce errors
// 
/* type na_type */
Set_Cast_Global_False_and_data_type: {cast_target_cs_specified=FALSE;} data_type
                         { $$ = $2; }

// This non-terminal provide for host variable expressions of format
// "(I)" as described above.

/* item */
hostvar_expression : input_hostvar_expression
              | TOK_CAST '(' HOSTVAR  TOK_AS  Set_Cast_Global_False_and_data_type ')'
                     {
                   $$ = makeHostVar($3,NULL);
                   delete $3;
                   AllHostVars->insert($$);
                   TheHostVarRoles->addUnassigned();
                   $$ = new (PARSERHEAP()) Cast($$, $5);
                   if ( cast_target_cs_specified )
                   {
                      ((Cast *)$$)->setTgtCSSpecified(TRUE);
                      cast_target_cs_specified = FALSE ;
                   }
				   if (InAssignmentSt) {
				     /* Syntax error */
				     *SqlParser_Diags << DgSqlCode(1000);
                     YYABORT;
				   } 
                 }
              | TOK_CAST '(' HOSTVAR  TOK_AS  Set_Cast_Global_False_and_data_type  ')'  HOSTVAR
                 {
                   $$ = makeHostVar($3,$7);
                   delete $3;
                   delete $7;
                   AllHostVars->insert($$);
                   TheHostVarRoles->addUnassigned();
                   TheHostVarRoles->add_indicator();
                   $$ = new (PARSERHEAP()) Cast($$, $5);
                   if ( cast_target_cs_specified )
                   {
                      ((Cast *)$$)->setTgtCSSpecified(TRUE);
                      cast_target_cs_specified = FALSE ;
                   }
				   if (InAssignmentSt) {
				     /* Syntax error */
				     *SqlParser_Diags << DgSqlCode(1000);
                     YYABORT;
				   } 

                 }
              | TOK_CAST '(' HOSTVAR  TOK_AS  Set_Cast_Global_False_and_data_type  ')'  TOK_INDICATOR  HOSTVAR
                 {
                   $$ = makeHostVar($3,$8);
                   delete $3;
                   delete $8;
                   AllHostVars->insert($$);
                   TheHostVarRoles->addUnassigned();
                   TheHostVarRoles->add_indicator();
                   $$ = new (PARSERHEAP()) Cast($$, $5);
                   if ( cast_target_cs_specified )
                   {
                      ((Cast *)$$)->setTgtCSSpecified(TRUE);
                      cast_target_cs_specified = FALSE ;
                   }
				   if (InAssignmentSt) {
				     /* Syntax error */
				     *SqlParser_Diags << DgSqlCode(1000);
                     YYABORT;
				   } 
                 }

/* type item */
internal_arith_placeholder : ARITH_PLACEHOLDER
				{
				  $$ = $1;
				}

/* type item */
internal_bool_placeholder : 
                            BOOL_PLACEHOLDER
				{
				  $$ = $1;
				}
                            | TOK_TRUE '(' value_expression ')'
                                {
                                  $$ =
				    new (PARSERHEAP()) 
				    BoolVal(ITM_RETURN_TRUE, $3);
				}
                            | TOK_FALSE '(' value_expression ')'
                                {
                                  $$ =
				    new (PARSERHEAP()) 
				    BoolVal(ITM_RETURN_FALSE, $3);
				}

// left recursion for insert statement values fix.
				  
insert_value_expression_list :	  insert_value_expression						
			  | insert_value_expression_list_comma	%prec ','
			  | insert_value_expression_list_paren	%prec ','
 	    				
insert_value_expression_list_comma : insert_value_expression ',' insert_value_expression
				{							  
					$$ = new (PARSERHEAP()) ItemList( $3, $1 );
				}	
		      	| insert_value_expression_list_comma ',' insert_value_expression  
				{
					$$ = new (PARSERHEAP()) ItemList( $3, $1 );
				}
							
insert_value_expression_list_paren : '(' insert_value_expression_list_comma ')'
				{
				    $$ = $2;
				}
			    | '(' insert_value_expression_list_paren ')'
				{
				    $$ = $2;
				}
				  		
insert_value_expression : value_expression 
                          | insert_obj_to_lob_function
                          | insert_empty_blob_clob

insert_obj_to_lob_function : 
			    TOK_STRINGTOLOB '(' value_expression ')'
			        {
				  $$ = new (PARSERHEAP()) LOBinsert( $3, NULL, LOBoper::STRING_, FALSE);
				}			       
			  | TOK_BUFFERTOLOB '(' TOK_LOCATION  value_expression',' TOK_SIZE value_expression')'
			        {
				  ItemExpr *bufAddr = $4;
				  ItemExpr *bufSize = $7;
				  bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE,FALSE));
				  bufSize = new (PARSERHEAP())
				    Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE, FALSE));
				  $$ = new (PARSERHEAP()) LOBinsert( bufAddr, bufSize, LOBoper::BUFFER_, FALSE);
				}
                          | TOK_FILETOLOB '(' character_literal_sbyte ')'
			        {
                                  
                                  $$ = new (PARSERHEAP()) LOBinsert( $3, NULL, LOBoper::FILE_, FALSE);
				}
			  | TOK_LOADTOLOB '(' literal ')'
			        {
                                  YYERROR;
                                  $$ = new (PARSERHEAP()) LOBinsert( $3, NULL, LOBoper::LOAD_);
				}
			  | TOK_EXTERNALTOLOB '(' literal ')'
			        {
                         
                                  $$ = new (PARSERHEAP()) LOBinsert( $3, NULL, LOBoper::EXTERNAL_);
				}
			  | TOK_EXTERNALTOLOB '(' literal ',' literal ')'
			        {
                                  
                                  $$ = new (PARSERHEAP()) LOBinsert( $3, $5, LOBoper::EXTERNAL_);
				}
insert_empty_blob_clob : TOK_EMPTY_BLOB '(' ')' 
                    {
                      $$ = new (PARSERHEAP()) LOBinsert(NULL,NULL,LOBoper::EMPTY_LOB_);
                    }
                 | TOK_EMPTY_CLOB '(' ')'
                    {
                      $$ = new (PARSERHEAP()) LOBinsert(NULL,NULL,LOBoper::EMPTY_LOB_);
                    }
update_obj_to_lob_function : 
			    TOK_STRINGTOLOB '(' value_expression ')'
			        {
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::STRING_, FALSE);
				}
			  | TOK_STRINGTOLOB '(' value_expression ',' TOK_APPEND ')'
			        {
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL,NULL, LOBoper::STRING_, TRUE);
				}
                          | TOK_FILETOLOB '('character_literal_sbyte ')'
			        {
				 
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL,NULL,LOBoper::FILE_, FALSE);
				}
                          | TOK_FILETOLOB '('character_literal_sbyte ',' TOK_APPEND ')'
			        {
				 
				  $$ = new (PARSERHEAP()) LOBupdate( $3,NULL, NULL,LOBoper::FILE_, TRUE);
				}
			  | TOK_BUFFERTOLOB '(' TOK_LOCATION  value_expression ',' TOK_SIZE value_expression ')'
			        {
				  ItemExpr *bufAddr = $4;
				  ItemExpr *bufSize = $7;
				  bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE,FALSE));
				  bufSize = new (PARSERHEAP())
				    Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE, FALSE));
				  $$ = new (PARSERHEAP()) LOBupdate( bufAddr, NULL,bufSize, LOBoper::BUFFER_, FALSE);
				}
			  | TOK_BUFFERTOLOB '(' TOK_LOCATION value_expression ',' TOK_SIZE value_expression ',' TOK_APPEND')'
			        {
				  ItemExpr *bufAddr = $4;
				  ItemExpr *bufSize = $7;
				  bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE,FALSE));
				  bufSize = new (PARSERHEAP())
				    Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE, FALSE));
				  $$ = new (PARSERHEAP()) LOBupdate( bufAddr, NULL,bufSize, LOBoper::BUFFER_, TRUE);
				}

			  | TOK_EXTERNALTOLOB '(' literal ')'
			        {
                                  
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::EXTERNAL_, FALSE);
                                }
                                  | TOK_EXTERNALTOLOB '(' literal ',' TOK_APPEND ')'
			        {
                                  YYERROR;
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::EXTERNAL_, TRUE);
				}
			  | TOK_EXTERNALTOLOB '(' literal ',' literal ')'
			        {
                                  YYERROR;
				  $$ = new (PARSERHEAP()) LOBupdate( $3, $5, NULL,LOBoper::EXTERNAL_, FALSE);
				}
			  | TOK_LOADTOLOB '(' literal ',' TOK_APPEND ')'
			        {
				  YYERROR;
				  $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::LOAD_, TRUE);
				}
                          | TOK_EMPTY_BLOB '(' ')' 
                               {
                                 ItemExpr *dummy = new (PARSERHEAP())ConstValue(0);                              
                                  $$ = new (PARSERHEAP()) LOBupdate(dummy,NULL,NULL,LOBoper::EMPTY_LOB_,FALSE);
                               }
                          | TOK_EMPTY_CLOB '(' ')'
                              {
                                ItemExpr *dummy = new (PARSERHEAP())ConstValue(0);                                
                                 $$ = new (PARSERHEAP()) LOBupdate(dummy,NULL,NULL,LOBoper::EMPTY_LOB_,FALSE);
                               }
 
                                
select_lob_to_obj_function : TOK_LOBTOFILE '(' value_expression ',' literal ')'
			        {
				  
				  $$ = new (PARSERHEAP()) LOBselect( $3, $5, LOBoper::FILE_);
				  
				}
                         
			  | TOK_LOBTOSTRING '(' value_expression ')'
			        {
				  
				  $$ = new (PARSERHEAP()) LOBconvert( $3,LOBoper::STRING_);
				 
				}
			  | TOK_LOBTOSTRING '(' value_expression ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
			        {
				 
				  Int64 tgtSize = atoInt64($5->data());
				  $$ = new (PARSERHEAP()) LOBconvert( $3,  LOBoper::STRING_, (Lng32)tgtSize);
				  
				}
			  | TOK_LOBTOSTRING '(' value_expression ',' TOK_EXTRACT ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
			        {
				  
				  Int64 rowSize = atoInt64($10->data());
				  $$ = new (PARSERHEAP()) LOBextract( $3, (Lng32)rowSize);
				  
				}
			  | TOK_LOBTOSTRING '(' value_expression ',' TOK_EXTRACT ')'
			        {
				  
				  Int64 rowSize = 1000;
				  $$ = new (PARSERHEAP()) LOBextract( $3, (Lng32)rowSize);
				  
				}
                           


table_value_constructor : TOK_VALUES '(' insert_value_expression_list ')' 
				{
					$$ = new (PARSERHEAP()) Tuple($3->reverseTree());
				}
                | TOK_VALUES '(' insert_value_expression_list ')' ',' list_of_values
				{
				  ItemList * il = new (PARSERHEAP()) 
				    ItemList(new(PARSERHEAP())Convert($3->reverseTree()), $6->reverseTree());
				  $$ = new (PARSERHEAP()) TupleList(il);
				}

// NB: Beware of using right recursive production here
//   list_of_values : '(' insert_value_expression_list ')' ',' list_of_values
// causes parser stack overflow when processing a long IN predicate
//   <col> IN (values(1),(2),...,(999))
// of 996 elements or longer. Trying to workaround the parser stack overflow
// by bumping bison's YYMAXDEPTH beyond 4,000 does NOT work on NSK.
// Right recursive productions are the root cause of the problems reported in
// solutions: 10-070627-5883, 10-100524-0557.
list_of_values : '(' insert_value_expression_list ')'
				{								
					$$ = new(PARSERHEAP()) Convert($2->reverseTree());
				}
               | list_of_values ',' '(' insert_value_expression_list ')'
				{					
					$$ = new (PARSERHEAP()) 
						 ItemList(new(PARSERHEAP()) Convert($4->reverseTree()), $1);
				}

// end of fix: left recursion for insert statement values.		  

		  
table_expression : from_clause where_clause sample_clause
                   cond_transpose_clause_list sequence_by_clause
                   group_by_clause_non_empty qualify_clause
                   {
		     $$ = 
		       getTableExpressionRelExpr($1, 
                                                 $2, 
                                                 $3, 
                                                 $4, 
                                                 $5, 
                                                 $6, 
                                                 NULL, 
                                                 $7,
                                                 SqlParser_CurrentParser->topHasTDFunctions(), 
                                                 SqlParser_CurrentParser->topHasOlapFunctions());
		                                 
                       if (SqlParser_CurrentParser->topHasTDFunctions() && $5)
                       {
                          SqlParser_CurrentParser->setTopHasTDFunctions(FALSE);
                       }
		       
		   }

                | from_clause where_clause sample_clause
                   cond_transpose_clause_list sequence_by_clause
                   having_clause_non_empty
                   {
		     $$ = 
		       getTableExpressionRelExpr($1, 
		                                 $2, 
		                                 $3, 
		                                 $4, 
		                                 $5, 
		                                 NULL, 
		                                 $6,
		                                 NULL,
		                                 FALSE, 
                                                 SqlParser_CurrentParser->topHasOlapFunctions());
                     SqlParser_CurrentParser->setTopHasTDFunctions(FALSE);
		   }
		   
                | from_clause where_clause sample_clause
                   cond_transpose_clause_list sequence_by_clause
                   qualify_clause
                   {
                     $$ = 
		        getTableExpressionRelExpr($1, 
                                                  $2, 
                                                  $3, 
                                                  $4, 
                                                  $5, 
                                                  NULL, 
                                                  NULL,
                                                  $6,
                                                  SqlParser_CurrentParser->topHasTDFunctions(), 
                                                  SqlParser_CurrentParser->topHasOlapFunctions() );
                                                  
                     if (SqlParser_CurrentParser->topHasTDFunctions() && $5)
                      {
                        SqlParser_CurrentParser->setTopHasTDFunctions(FALSE);
                      }
		   }


                | from_clause where_clause sample_clause
                   cond_transpose_clause_list sequence_by_clause
                   group_by_clause_non_empty having_clause_non_empty
                   {
		     $$ = 
		       getTableExpressionRelExpr($1, 
		                                 $2, 
		                                 $3, 
		                                 $4, 
		                                 $5, 
		                                 $6, 
		                                 $7,
		                                 NULL,
		                                 FALSE,
		                                 SqlParser_CurrentParser->topHasOlapFunctions());
                     SqlParser_CurrentParser->setTopHasTDFunctions(FALSE);
		   }

                 | from_clause where_clause sample_clause
                   cond_transpose_clause_list sequence_by_clause
                   having_clause_non_empty group_by_clause_non_empty
                   {
		     $$ = 
		       getTableExpressionRelExpr($1, 
		                                 $2, 
		                                 $3, 
		                                 $4, 
		                                 $5, 
		                                 $7, 
		                                 $6,
		                                 NULL,
		                                 FALSE,
		                                 SqlParser_CurrentParser->topHasOlapFunctions());
                     SqlParser_CurrentParser->setTopHasTDFunctions(FALSE);
		   }

/* type relx */
from_clause : TOK_FROM global_hint table_reference { $$ = $3; }
	    | from_clause ',' table_reference
			      {
				$$ = new (PARSERHEAP()) Join($1, $3, REL_JOIN);
			      }

/* type item */
join_specification : join_condition
	     // | named_columns_join  // TOK_USING '(' value_expression_list ')'

/* type item */
join_condition : TOK_ON search_condition
			      { $$ = $2; }

/* type item */
where_clause : { $$ = NULL; }
             | TOK_WHERE search_condition
			      { $$ = $2; }

group_by_clause_non_empty : TOK_GROUP TOK_BY value_expression_list 
			      { $$ = $3; }
                          | TOK_GROUP TOK_BY TOK_ROLLUP '(' value_expression_list ')'
			      { 
                                $5->setIsGroupByRollup(TRUE);
                                $$ = $5; 
                              }

/* type item */
having_clause_non_empty : TOK_HAVING search_condition
			      { $$ = $2; }
			      

qualify_clause : { $$ = NULL; }
               | TOK_QUALIFY search_condition
                  { 
                    if (SqlParser_CurrentParser->modeSpecial1()	|| 
                        CmpCommon::getDefault(COMP_BOOL_200) == DF_ON) 
                        $$ = $2;    
                    else
                        YYERROR;
                  }
					
/* item */
sort_by_value_expression : value_expression
            | value_expression ordering_spec
              {
                $$ = $1;
                if ($2 == TOK_DESC || $2 == TOK_DESCENDING)
                {
                  $$ = new (PARSERHEAP()) InverseOrder($$);
                }
                else
                {
                  //To that ASC sort order was specified explicitely we use insevreOrder of inversOrder
                  //this is needed to deal with the default order for TD rank which is by default descending
                   if (SqlParser_CurrentParser->modeSpecial1()	|| 
                        CmpCommon::getDefault(COMP_BOOL_200) == DF_ON) 
                        $$ =new (PARSERHEAP()) InverseOrder( new (PARSERHEAP()) InverseOrder($$));
                }
              }

/* item */
sort_by_value_expression_list : sort_by_value_expression
   | sort_by_value_expression ',' sort_by_value_expression_list
           {
              $$ = new (PARSERHEAP()) ItemList( $1, $3);
           }
			      

/* item */
sort_by_key : dml_column_reference
            | dml_column_reference ordering_spec
              {
		$$ = $1;
		if ($2 == TOK_DESC || $2 == TOK_DESCENDING)
		  {
		    $$ = new (PARSERHEAP()) InverseOrder($$);
		  }
              }

/* item */
sort_by_key_list : sort_by_key
   | sort_by_key ',' sort_by_key_list
           {
              $$ = new (PARSERHEAP()) ItemList( $1, $3);
           }

/* type item */
sort_by_clause : { $$ = NULL; }
               | TOK_SORT TOK_BY sort_by_key_list
			      { $$ = $3; }

/* type item */
sequence_by_clause : { $$ = NULL; }
                   | TOK_SEQUENCE_BY sort_by_key_list
                     { $$ = $2; }


/* type item */
transpose_value : value_expression
                | value_expression_list_paren

transpose_item_list : transpose_value
                    {
		      // Create a NULL terminated list,
		      // to make it easier to traverse in Transpose::bindNode()
		      //
		      $$ = new (PARSERHEAP()) ItemList($1,NULL);
		    }
                    | transpose_value ',' transpose_item_list
                    {
		      $$ = new (PARSERHEAP()) ItemList($1,$3);
		    }

transpose_col_list : identifier
                   {
		     $$ = new (PARSERHEAP())
		       ColReference(new (PARSERHEAP())
				    ColRefName(*$1, PARSERHEAP()));
		     delete $1;
		   }
                   | '(' column_list ')'
                   {
		     $$ = $2;
		   }

/* type item */
transpose_set : transpose_item_list TOK_AS transpose_col_list
              {
		$$ = new (PARSERHEAP()) ItemList($1, $3);
	      }

/* type item */
transpose_list : transpose_set
               {
		 // Create a NULL terminated list.
		 // This make it easier to traverse in Transpose::bindNode()
		 //
		 $$ = new (PARSERHEAP()) ItemList($1,NULL);
	       }
               | transpose_set transpose_list
               {
		 $$ = new (PARSERHEAP()) ItemList($1,$2);
	       }

/* type relx */
transpose_clause : TOK_TRANSPOSE transpose_list TOK_KEY TOK_BY identifier
                 {

		   ItemExpr *keyCol = new (PARSERHEAP()) 
		     ColReference (new (PARSERHEAP()) ColRefName(*$5, PARSERHEAP()));
		   delete $5;
				  
		   $$ = new (PARSERHEAP()) Transpose($2,keyCol);
                 }
                 | TOK_TRANSPOSE transpose_list
                 {
		   $$ = new (PARSERHEAP()) Transpose($2, (ItemExpr *)NULL);
                 }

/* type relx */
cond_transpose_clause_list : { $$ = NULL; }
                           | transpose_clause_list

/* type relx */
transpose_clause_list : transpose_clause
                      | transpose_clause_list transpose_clause
                      {
			$2->setChild(0,$1);
			$$ = $2;
		      }

/* type relx */
sample_clause : sample_clause_x
                  { if ($1 != NULL && Get_SqlParser_Flags(PARSING_IUS_WHERE_CLAUSE))
                      {
                        *SqlParser_Diags << DgSqlCode(-9237) << DgString0("SAMPLE");
                        YYERROR;
                      }
                    else
                      $$ = $1; 
                  }

/* type relx */
sample_clause_x : { $$ = NULL; }
            | TOK_SAMPLE_FIRST sample_size_expr sort_by_clause
              {
                $$ = new (PARSERHEAP()) RelSample ((RelExpr *)NULL,
                                                   RelSample::FIRSTN,
                                                   $2,
                                                   $3);
              }
            | TOK_SAMPLE_PERIODIC sample_size_expr TOK_EVERY
              sample_size_numeric sample_absolute_rows sort_by_clause
              {
                $2->setChild(3, $4);
                ((ItmBalance *)$2)->setSkipAbs($5);
                $$ = new (PARSERHEAP()) RelSample ((RelExpr *)NULL,
                                                   RelSample::PERIODIC,
                                                   $2,
                                                   $6);
              }
            | TOK_SAMPLE_RANDOM sample_size_expr
              {
                $$ = new (PARSERHEAP()) RelSample ((RelExpr *)NULL,
                                                RelSample::RANDOM, $2);
              }
            | TOK_SAMPLE_RANDOM sample_cluster_expr
              {
                $$ = new (PARSERHEAP()) RelSample ((RelExpr *)NULL,
                                                RelSample::CLUSTER, $2);
              }

/* type item */
sample_clusters : TOK_CLUSTERS TOK_OF NUMERIC_LITERAL_EXACT_NO_SCALE TOK_BLOCKS
               {
                 $$ = literalOfNumericNoScale($3);
                 if (! $$) YYERROR;
               }                

/* type boolean */
sample_absolute :  { $$ = TRUE; }
                | TOK_PERCENT { $$ = FALSE; }

/* type boolean */
sample_absolute_rows : TOK_ROWS    { $$ = TRUE; }
                     | TOK_PERCENT { $$ = FALSE; }
                     | TOK_PERCENT TOK_ROWS { $$ = FALSE; }

/* type item */
sample_size_numeric : NUMERIC_LITERAL_EXACT_NO_SCALE
                    {
                      $$ = literalOfNumericNoScale($1);
                      if (! $$) YYERROR;
                    }
                    | NUMERIC_LITERAL_EXACT_WITH_SCALE
                    {
                      $$ = literalOfNumericWithScale($1);
                      if (! $$) YYERROR;
                    }

/* type item */
sample_cluster_expr : sample_size_numeric sample_absolute sample_clusters
                {
                  $$ = new (PARSERHEAP()) 
                       ItmBalance(new (PARSERHEAP()) BoolVal(ITM_RETURN_TRUE),
                       $1,
                       NULL, 
                       $3, 
                       $2,
                       FALSE);
                }

/* type item */
sample_size_expr : sample_size_numeric sample_absolute_rows
                {
                  $$ = new (PARSERHEAP()) 
                       ItmBalance(new (PARSERHEAP()) BoolVal(ITM_RETURN_TRUE),
                       $1,
                       NULL, 
                       NULL,
                       $2,
                       FALSE);
                }
              | balance_expr

/* type item */
balance_expr : TOK_BALANCE balance_when_then_list TOK_END
                {
                  $$ = $2;
                }

/* NB: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 *  Beware of adding clauses with a closing END like balance_expr above.
 *  They can mislead arkcmp/StaticCompiler.cpp's isEndOfStmt() and 
 *  sqlci/InputStmt.cpp's findBlockStmt() into finding the wrong END
 *  of a compound statement. For example:
 *     exec sql begin 
 *       insert into t values(7);
 *       select a into :h from m 
 *         sample first balance when a < 10 then 5 rows
 *                              when a >=10 then 7 rows
 *                      end sort by a;
 *     end;
 *  used to get a false syntax error due to a prematurely ENDed 
 *  compound statement. This is a consequence of SQLMX having 
 *  multiple parsers recognizing partially overlapping languages. To be
 *  more precise, both tdm_arkcmp and sqlci do only a partial scan of 
 *  their input looking for the beginning and ending of SQL statements 
 *  (among the input languages they recognize), ignore everything in
 *  between while buffering the statement, then passing it here 
 *  (sqlparser.y) for parsing. Therefore, the ending of SQLMX statements
 *  should be unambiguously distinguishable from the ending of compound
 *  statements. In case expressions "case .... end", we got away with it
 *  rather easily because "case" is an ANSI reserved word. But, for
 *  balance_expr, we had to solve the problem by considering "balance when" 
 *  as starting a new nesting level. But, "balance when" must be ignored 
 *  in "case balance when ... end" because "balance" here is an identifier
 *  and not a keyword. So, if you add any new clause with an "END" in it,
 *  please fix StaticCompiler.cpp and InputStmt.cpp also if your new 
 *  clause can appear inside a compound statement.
 */

/* type item */
balance_when_then_list : balance_when_then balance_when_then_list
                {
                  $1->setChild(2, $2);
                  $$ = $1;
                }
              | balance_when_then balance_else
                {
                  $1->setChild(2, $2);
                  $$ = $1;
                }

/* type item */
balance_when_then : TOK_WHEN search_condition TOK_THEN sample_size_numeric
                    sample_absolute_rows
                {
                  $$ = new (PARSERHEAP())
                       ItmBalance($2,
                       $4,
                       NULL, 
                       NULL, 
                       $5,
                       FALSE);
                }

/* type item */
balance_else : TOK_ELSE sample_size_numeric sample_absolute_rows
                {
                  $$ = new (PARSERHEAP())
                       ItmBalance(new (PARSERHEAP()) BoolVal(ITM_RETURN_TRUE),
                       $2,
                       NULL, 
                       NULL, 
                       $3, 
                       FALSE);
                }
              | /* empty */
                {
                  $$ = NULL;
                }

/* TD-style LOCKING <table> FOR ACCESS list -- ignore them! */
optional_locking_stmt_list : empty 
                               {$$ = NULL;}
                           | locking_stmt_list 
                               {$$ = NULL;}
locking_stmt_list : locking_stmt
                      {
			CheckModeSpecial1();
		      }

                    | locking_stmt_list locking_stmt

locking_stmt : TOK_LOCKING actual_table_name TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCKING TOK_TABLE actual_table_name TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCK actual_table_name TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCK TOK_TABLE actual_table_name TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCK_ROW TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCKING TOK_ROW TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }
               | TOK_LOCKING TOK_FOR TOK_ACCESS
                  { 
		    $$ = NULL; 
		  }

/* type tokval */
select_token : TOK_SELECT 
		{ 
		  SqlParser_CurrentParser->pushHasOlapFunctions (FALSE);
		  SqlParser_CurrentParser->pushHasTDFunctions (FALSE);
		}
               | TOK_SEL
                {
		  CheckModeSpecial1();
		  SqlParser_CurrentParser->pushHasOlapFunctions(FALSE);
		  SqlParser_CurrentParser->pushHasTDFunctions(FALSE);
		}
               | TOK_SELECT TOK_BEGIN_HINT ignore_ms4_hints TOK_END_HINT
                {
                  CheckModeSpecial4;

		  SqlParser_CurrentParser->pushHasOlapFunctions(FALSE);
		  SqlParser_CurrentParser->pushHasTDFunctions(FALSE);
		}

/* type hint */
ignore_ms4_hints : identifier '(' NUMERIC_LITERAL_EXACT_NO_SCALE  ')'
                              { $$ = NULL; }
                          | identifier 
                               { $$ = NULL; }

/* type relx */
query_specification :select_token set_quantifier query_spec_body 
    { 
       if ($2) {
         $$ = new (PARSERHEAP())
           RelRoot(new (PARSERHEAP())
                   GroupByAgg($3
                              ,REL_GROUPBY
                              ,new (PARSERHEAP())
                              ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP()))
                                        )
                         );
           assert($3->getOperatorType() == REL_ROOT);
           RelRoot *root1 = (RelRoot *) $$;
           RelRoot *root2 = (RelRoot *) $3;
           root1->assignmentStTree() = root2->assignmentStTree();
           root2->assignmentStTree() = NULL;
           }
       else
         $$ = $3;

       if (CmpCommon::getDefault(MVQR_LOG_QUERY_DESCRIPTORS) == DF_DUMP ||
           CmpCommon::getDefault(MVQR_LOG_QUERY_DESCRIPTORS) == DF_DUMP_MV)
         ((RelRoot*)$$)->setAnalyzeOnly();

    }

query_specification : exe_util_maintain_object 
                                {
				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($1, REL_ROOT);
                                }

query_specification : exe_util_aqr
                                {
				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($1, REL_ROOT);
                                }

query_specification : exe_util_get_qid
                                {
				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($1, REL_ROOT);
                                }

query_specification : exe_util_get_lob_info
                                {
				  RelRoot *root = new (PARSERHEAP())
				    RelRoot($1, REL_ROOT);
                                }
/* type relx */
query_specification : select_token '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']' set_quantifier query_spec_body
	{
	  if ($6) {
	    $$ = new (PARSERHEAP())
	      RelRoot(new (PARSERHEAP())
		      GroupByAgg($7
				 ,REL_GROUPBY
				 ,new (PARSERHEAP())
				 ColReference(new (PARSERHEAP()) 
					      ColRefName(TRUE, PARSERHEAP())))
		      );
	   assert($7->getOperatorType() == REL_ROOT);
	   RelRoot *root1 = (RelRoot *) $$;
	   RelRoot *root2 = (RelRoot *) $7;
	   root1->assignmentStTree() = root2->assignmentStTree();
	   root2->assignmentStTree() = NULL;
	   }
	  else
	    $$ = $7;

	  assert($$->getOperatorType() == REL_ROOT);
	  
	  RelRoot * rootNode = (RelRoot *)$$;
	  Int64 numRows = atoInt64($4->data());
	  if (($3 == TOK_LAST) && 
	      ((numRows < 0) || (numRows > 1)))
	    {
	      yyerror("Number of rows must be 0 or 1 with LAST option. \n");
	      YYERROR;
	    }

	  if ($3 == TOK_LAST)
	    {
	      // last 0 is -2.  last 1 is -3.
	      rootNode->setFirstNRows((numRows == 0) ? -2 : -3);
	    }
	  else
	    {
	      rootNode->setFirstNRows(numRows);
	    }

	  rootNode->needFirstSortedRows() = (($3 == TOK_FIRST) ? TRUE : FALSE);
	  delete $4;
         
          if (CmpCommon::getDefault(MVQR_LOG_QUERY_DESCRIPTORS) == DF_DUMP ||
              CmpCommon::getDefault(MVQR_LOG_QUERY_DESCRIPTORS) == DF_DUMP_MV)
            ((RelRoot*)$$)->setAnalyzeOnly();
           } 

/* type tokval */
firstn_sorted : TOK_ANY    {$$ = TOK_ANY;}
              | TOK_FIRST  {$$ = TOK_FIRST;}
              | TOK_LAST   {$$ = TOK_LAST;}

/* For set_quantifier, the $$ value is TRUE if it is DISTINCT, and
 * FALSE for ALL, which is also the default value (ALL,FALSE = default).
 *
 * type boolean */
set_quantifier : { $$ = FALSE; /* by default, set quantifier is ALL */
		 }
          | TOK_ALL
             {
                $$ = FALSE;
             }
          | TOK_DISTINCT
             {
                $$ = TRUE;
             }
          | TOK_UNIQUE
             {
                $$ = TRUE;
             }

/* type relx */
query_spec_body : query_select_list table_expression access_type  optional_lock_mode
			{
			  // use a compute node to attach select list
			  RelRoot *temp=  new (PARSERHEAP())
                            RelRoot($2, $3, $4, REL_ROOT, $1);
			    // set relroot olap here
			    if (SqlParser_CurrentParser->topHasOlapFunctions()) {
			      temp->setHasOlapFunctions(TRUE);
			    }
			    //pop the last element which was pushed when we eneterd a new select  
			    SqlParser_CurrentParser->popHasOlapFunctions();
			    
			    // do the same for TD functions
			    if (SqlParser_CurrentParser->topHasTDFunctions()) {
			      temp->setHasTDFunctions(TRUE);
			    }
			    //pop the last element which was pushed when we eneterd a new select  
			    SqlParser_CurrentParser->popHasTDFunctions();			    
			    
			    $$=temp;			    
			}
		| query_select_list into_clause table_expression access_type optional_lock_mode
			{
			  // use a compute node to attach select list
  			  RelRoot *temp = new (PARSERHEAP())
			    RelRoot($3, $4, $5, REL_ROOT, $1);
			  
			  if (SqlParser_CurrentParser->topHasOlapFunctions()) {
			    temp->setHasOlapFunctions(TRUE);
			  }
			  //pop the last element which was pushed when we eneterd a new select  
			  SqlParser_CurrentParser->popHasOlapFunctions();
			  
			  if (SqlParser_CurrentParser->topHasTDFunctions()) {
			     temp->setHasTDFunctions(TRUE);
			  }
			  //pop the last element which was pushed when we eneterd a new select  
			  SqlParser_CurrentParser->popHasTDFunctions();
			  
			  // If we are in a compound statement,
			  // then the variables in an INTO clause
			  // should behave like those in an assignment stmt,
			  // so we store them in the area in the root
			  // reserved for such variables
			  CollIndex varcnt = AssignmentHostVars->entries();
			  for (CollIndex i = 0; i < varcnt; i++) {
			    temp->addAssignmentStTree((*AssignmentHostVars)[i]);
			  }

			  AssignmentHostVars->clear();
			  $$ = temp;
			}

//++ MV OZ
// type item 
query_select_list : select_list
{
  if(TRUE == WeAreInACreateMVStatement && TRUE == ThisIsTheFirstMVQuerySelect)
  {
    // Set a global variable to the (minimal) position
    // of the end of the "select column list" (For MV use !!)
    // we only want to mark the first SELECT in a 
    // "SELECT FROM (SELECT FROM (SELECT ..." structure
    ParSetEndOfSelectColumnListPos(ParNameLocListPtr);
    ThisIsTheFirstMVQuerySelect = FALSE;
  }
  

  $$ = $1;
}



/* type accesstype */
access_type:
	        TOK_REPEATABLE_READ TOK_ACCESS		
                {
                  *SqlParser_Diags << DgSqlCode(-1719)
                                   << DgString0("REPEATABLE READ");
                  YYERROR;
                  
                  $$ = TransMode::REPEATABLE_READ_ACCESS_;
                }
	      | TOK_SERIALIZABLE_ACCESS			
                {
                  *SqlParser_Diags << DgSqlCode(-1719)
                                   << DgString0("SERIALIZABLE");
                  YYERROR;

                  $$ = TransMode::REPEATABLE_READ_ACCESS_;
                }
	      | TOK_FOR_REPEATABLE TOK_READ TOK_ACCESS	
                {
                  *SqlParser_Diags << DgSqlCode(-1719)
                                   << DgString0("REPEATABLE READ");
                  YYERROR;

                  $$ = TransMode::REPEATABLE_READ_ACCESS_;
                }
	      | TOK_FOR_SERIALIZABLE TOK_ACCESS		
                {
                  *SqlParser_Diags << DgSqlCode(-1719)
                                   << DgString0("SERIALIZABLE");
                  YYERROR;

                  $$ = TransMode::REPEATABLE_READ_ACCESS_;
                }
              | TOK_READ TOK_UNCOMMITTED TOK_ACCESS	
                {
                  $$ = TransMode::READ_COMMITTED_ACCESS_;
                }
	      | TOK_READ TOK_COMMITTED TOK_ACCESS	
                {
                  $$ = TransMode::READ_COMMITTED_ACCESS_;
                }
	      | TOK_FOR_READ TOK_UNCOMMITTED TOK_ACCESS	
                {
                  $$ = TransMode::READ_COMMITTED_ACCESS_;
                }
	      | TOK_FOR_READ TOK_COMMITTED TOK_ACCESS	
                {
                  $$ = TransMode::READ_COMMITTED_ACCESS_;
                }
	      | TOK_FOR_SKIP TOK_CONFLICT TOK_ACCESS 	
                {
                  $$ = TransMode::SKIP_CONFLICT_ACCESS_;
                }
	      | TOK_SKIP_CONFLICT_ACCESS             	
                {
                  $$ = TransMode::SKIP_CONFLICT_ACCESS_;
                }

	      | /* empty */
		{
                  $$ = TransMode::ACCESS_TYPE_NOT_SPECIFIED_;
                }


/* The following production is an "okay"  way to do things
 * from a yacc point of view. But it would be better to have a left-recursive
 * production such as  select_list : select_list ',' select_list_item.
 * That way, yacc's stack wouldn't have to first fill up with each item
 * from the list.  However, we would also have to build our ItemList
 * trees to be "left heavy" instead of "right heavy."  This isn't such a
 * BAD situation anyway.  For a future upgrade if we ever so desire...
 */

// QSTUFF

                 
/* type item */
return_list : TOK_RETURN 
	      {
		Set_SqlParser_Flags(ALLOW_OLD_AND_NEW_KEYWORD);  
	      } 
              select_list
              {
		Reset_SqlParser_Flags(ALLOW_OLD_AND_NEW_KEYWORD); 
		$$ = $3;
	      } 
// QSTUFF

/* type item */
select_list :   select_list_item 
              | select_list_item ',' select_list
                           {
                             $$ = new (PARSERHEAP()) ItemList($1, $3);
                           } 
/* type item */
select_list_item :
                derived_column
              | '*'
                      {
                        ColRefName *starName
                          = new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP());
                        if (CmpCommon::getDefault(MV_ALLOW_SELECT_SYSTEM_ADDED_COLUMNS) == DF_ON) 
                        {
			  starName->setStarWithSystemAddedCols(); // ++MV
                        }
                        $$ = new (PARSERHEAP()) ColReference(starName);
                        ParInsertNameLocForStar(starName);
                      }
              | actual_table_name2 TOK_DOT_STAR
                      {
                        ColRefName *starName
                          = new (PARSERHEAP()) ColRefName(TRUE, CorrName(*$1, PARSERHEAP()), PARSERHEAP());
                        $$ = new (PARSERHEAP()) ColReference(starName);
                        ParUpdateNameLocForDotStar(starName);
                        delete $1;
                      }

/* type item */
derived_column : value_expression
	      | value_expression as_clause
                      {
                        $$ = new (PARSERHEAP())
                          RenameCol($1, new (PARSERHEAP()) ColRefName(*$2, PARSERHEAP()));
                        delete $2;
                      }

/* type stringval */
as_clause : TOK_AS correlation_name     { $$ = $2; }
            | correlation_name



/* type stmt_ptr */
starting_production:
		 // Anonymous rule: Initialize static variables for everyone.
		 //
		 // As a matter of convention, SqlParserGlobals.h globals aren't
		 // initialized here, but instead in caller (Parser::parseDML).
		 {
		   inJoinSpec->reset();
		 }
	       starting_production2 ';'
	       	      { 
			// 3178 External data type(s) $0 found in query.
			if (externalDataTypeCnt_) {
			  ComASSERT(externalDataTypeCnt_ > 0);
			  PrettifySqlText(*externalDataTypeNames_);
			  *SqlParser_Diags << DgSqlCode(-3178)
			    << DgString0(*externalDataTypeNames_);
			  YYERROR;
			}
		        TheParseTree = $2;	// $2 since anonymous rule is $1
		      }

/* type stmt_ptr */
starting_production2:
		 // This interpolated anonymous rule performs initialization
		 // of globals/statics for the sql_statement that follows.
		 //
		 // These inits are done here instead of in caller
		 // (Parser::parseDML) because it makes more sense here.
		 {
		   resetHostVars();
		   in3GL_ = 0;
		   externalDataTypeCnt_ = 0;
		   if ( externalDataTypeNames_ == NULL )
		        externalDataTypeNames_ = new NAString("");
		   else
		       *externalDataTypeNames_ = "";
		   inCallStmt = FALSE;
                   InIfCondition = FALSE;
		   inRSProxyStmt = FALSE;
                   empty_charlen_specifier_allowed = FALSE;
		   NumOfScalars = NumOfArrays = 0;
		   currVarIndex = 0;
		   ParBeginingOfMVQueryPos = 0;
		   ParBeginingOfFileOptionsListPos = 0;
		   disableMakeQuotedStringISO88591Mechanism();
                   NonISO88591LiteralEncountered = FALSE;
		   turnUnknownCharSetToISO88591 = FALSE;
		   HexStringLiteralNotAllowed = FALSE; 
		   WeAreInACreateMVStatement = FALSE;
		   WeAreInAnEmbeddedInsert = FALSE;
		   ParNameSavedLocListPtr = NULL;
		   ParEndOfCreateTableAsAttrList = 0;
		   ParEndOfSelectColumnListPos = 0 ;
		   ParEndOfOptionalColumnListPos = 0 ;
		   ParEndOfFileOptionsListPos = 0;
		   WeAreInALRUOperation = FALSE;
                   ParNameCTLocListPtr = NULL;

		   /* Reset Trigger parsing state globals */
		   RowOrTableClause1 = ParTRIG_SCOPE_NONE;
		   RowOrTableClause2 = ParTRIG_SCOPE_NONE;
	           InsideTriggerDefinition = FALSE;
		   CSInsideTriggerDefinition = FALSE;
                   SqlParser_CurrentParser->clearHasOlapFunctions();			
                   SqlParser_CurrentParser->clearHasTDFunctions();
		   cast_target_cs_specified = FALSE;

                   in_col_defn = FALSE;
		 }
	       sql_statement
	       	      { 
		        $$ = $2;		// $2 since anonymous rule is $1
		      }
	     | TOK_INTERNAL_EXPR any_expression
		      {
		        $$ = (StmtNode *)$2;	// fake out yacc; see caller
		      }
	     | TOK_INTERNAL_COLUMN_DEFINITION column_definition
		      {
		        $$ = (StmtNode *)$2;	// just to make yacc happy
		      }

/* type item */
any_expression : value_expression_list
	       | search_condition

/* type item */
rowset_input_size : TOK_INPUT TOK_SIZE rowset_size
           {
		if ($3->getOperatorType() == ITM_HOSTVAR) {
		    ((HostVar *) $3)->setHVRowsetForInputSize();
		}
		else if ($3->getOperatorType() == ITM_DYN_PARAM) {
		    ((DynamicParam *) $3)->setDPRowsetForInputSize();
		}	
		$$ = $3;
           }

/* type item */
rowset_output_size : TOK_OUTPUT TOK_SIZE rowset_size
           {
		if (CmpCommon::context()->GetMode() == STMT_DYNAMIC) {
		    *SqlParser_Diags << DgSqlCode(-30017);  // ROWSET FOR OUTPUT SIZE not supported for dynamic SQL
	            YYERROR;
		}
		else {
		    if ($3->getOperatorType() == ITM_HOSTVAR) {
			((HostVar *) $3)->setHVRowsetForOutputSize();
		    }
		    $$ = $3;
		}
           }

/* type item */
rowset_index : TOK_KEY TOK_BY identifier
          {
            $$ = new (PARSERHEAP())
                     ColReference (new (PARSERHEAP()) ColRefName(*$3));
            delete $3;
          }            	    

/* type relx */
rowset_for_output : TOK_ROWSET TOK_FOR rowset_input_size ',' rowset_output_size ',' rowset_index
	   {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		RowsetFor(NULL, $3, $5, $7);
		$$ = rowsetfor;
           }
	| TOK_ROWSET TOK_FOR rowset_input_size ',' rowset_output_size
           {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		RowsetFor(NULL, $3, $5);
		$$ = rowsetfor;
           }
	| TOK_ROWSET TOK_FOR rowset_output_size ',' rowset_index
           {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		RowsetFor(NULL, NULL, $3, $5);
		$$ = rowsetfor;
           }
	| TOK_ROWSET TOK_FOR rowset_output_size
           {
             RelExpr *rowsetfor = new (PARSERHEAP()) 
               RowsetFor(NULL, NULL, $3);
             $$ = rowsetfor;
           }

/* type relx */
rowset_for_input : TOK_ROWSET TOK_FOR rowset_input_size ',' rowset_index
	    {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		  RowsetFor(NULL, $3, NULL, $5);
		$$ = rowsetfor;
	   }
	| TOK_ROWSET TOK_FOR rowset_input_size
	   {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		  RowsetFor(NULL, $3);
		$$ = rowsetfor;
	   }
	| TOK_ROWSET TOK_FOR rowset_index
	   {
		RelExpr *rowsetfor = new (PARSERHEAP()) 
		  RowsetFor(NULL, NULL, NULL, $3);
		$$ = rowsetfor;
	   }

/* type relx */
rowset_for : rowset_for_input 
	   |  rowset_for_output

rowwise_rowset_info : '(' TOK_MAX TOK_ROWSET TOK_SIZE literal ','
                          TOK_INPUT TOK_ROWSET TOK_SIZE dynamic_parameter ','
                          TOK_INPUT TOK_ROW TOK_MAX TOK_LENGTH dynamic_parameter ','
                          TOK_ROWSET TOK_BUFFER dynamic_parameter
                      ')' 
                      {
			ItemExpr * mrs  = $5;
			ItemExpr * irs  = $10;
			ItemExpr * irml = $16;
			ItemExpr * rrb  = $20;

			// if input values are params, 
			// type them as 'long'.
			if (irs->getOperatorType() == ITM_DYN_PARAM)
			  {
			    ((DynamicParam*)irs)->setDPRowsetForInputSize();
			    irs = new (PARSERHEAP()) 
			      Cast(irs, new (PARSERHEAP()) SQLInt(PARSERHEAP(), TRUE, FALSE));
			  }
			else
			  YYERROR;

			if (irml->getOperatorType() == ITM_DYN_PARAM)
			  {
			    ((DynamicParam*)irml)->setRowwiseRowsetInputMaxRowlen();
			    irml = new (PARSERHEAP()) 
			      Cast(irml, new (PARSERHEAP()) SQLInt(PARSERHEAP(), TRUE, FALSE));
			  }
			else
			  YYERROR;

			if (rrb->getOperatorType() == ITM_DYN_PARAM)
			  {
			    ((DynamicParam *)rrb)->setRowwiseRowsetInputBuffer();
			    rrb = new (PARSERHEAP()) 
			      Cast(rrb, new (PARSERHEAP()) SQLLargeInt(PARSERHEAP(), TRUE, FALSE));
			  }
			else
			  YYERROR;

			RowsetFor *rowsetfor = new (PARSERHEAP()) 
			  RowsetFor(NULL, irs, NULL, NULL, mrs, irml, rrb, NULL);
			rowsetfor->rowwiseRowset() = TRUE;

			$$ = rowsetfor;
		      }

/* type stmt_ptr */
sql_statement : interactive_query_expression
		   {
		      $$ = new (PARSERHEAP()) StmtQuery($1);
		   }
	       | TOK_DISPLAY 
                 {
                   SqlParser_CurrentParser->hiveDDLInfo_->essd_ = Parser::HiveDDLInfo::DISPLAY_;                   
                 }
                 interactive_query_expression
		   {
		      ((RelRoot *)$3)->setDisplayTree(TRUE);
		      $$ = new (PARSERHEAP()) StmtQuery($3);
		   }
	       | TOK_BEGIN TOK_DECLARE TOK_SECTION
		   {
		      $$ = new (PARSERHEAP()) StmtNode(STM_BEGIN_DECLARE);
		   }
	       | TOK_END TOK_DECLARE TOK_SECTION
		   {
		      $$ = new (PARSERHEAP()) StmtNode(STM_END_DECLARE);
		   }
	       | alloc_desc_statement 
	       | alloc_static_desc_stmt
	       | close_statement
	       | dealloc_desc_statement
	       | dealloc_stmt_statement
	       | declare_dynamic_cursor
	       | declare_static_cursor
	       | describe_statement
	       | dynamic_prepare
	       | dynamic_execute
	       | execute_immediate
	       | fetch_cursor
	       | get_conddiags_statement
	       | get_desccount_statement
	       | get_rowsetsize_statement
	       | get_descitem_statement
	       | get_stmtdiags_statement
	       | module_statement
	       | source_file_statement
	       | module_timestamp
	       | open_cursor
	       | procedure_stmt
	       | set_desccount_statement
	       | set_rowsetsize_statement
	       | set_descitem_statement
	       | whenever_statement
               | explain_stmt_finalized

/* type stmt_ptr */
explain_stmt_finalized : exe_util_display_explain
                            {
                               RelExpr *temp = finalize($1);
                               $$ = new (PARSERHEAP()) StmtQuery(temp);
                            }

/* type stmt_ptr */

set_transaction_statement : TOK_SET TOK_TRANSACTION transaction_mode_list
                            {
                               $$ = new (PARSERHEAP()) StmtDMLSetTransaction($3);
                            }

transaction_mode_list :   transaction_mode
                          | transaction_mode_list ',' transaction_mode
                            {
                               $$ = new (PARSERHEAP()) ItemList($1,$3);
                            }

transaction_mode :   isolation_level
                   | transaction_access_mode
                   | diagnostics_size
		   | rollback_mode_on_off
		   | autoabort_interval_stmt
		   | multi_commit_mode

isolation_level :    TOK_ISOLATION TOK_LEVEL isolation_level_enum
                     {
                        $$ = new (PARSERHEAP()) TxnIsolationItem($3);
                     }

isolation_level_enum : TOK_READ TOK_UNCOMMITTED { $$ = TransMode::READ_UNCOMMITTED_; }
                     | TOK_READ TOK_COMMITTED	{ $$ = TransMode::READ_COMMITTED_; }
                     | TOK_REPEATABLE_READ	
                     { 
                       *SqlParser_Diags << DgSqlCode(-1720)
                                        << DgString0("REPEATABLE READ");
                       YYERROR;
                       
                       $$ = TransMode::REPEATABLE_READ_; 
                     }
                     | TOK_SERIALIZABLE		
                     { 
                       *SqlParser_Diags << DgSqlCode(-1720)
                                        << DgString0("SERIALIZABLE");
                       YYERROR;

                       $$ = TransMode::SERIALIZABLE_; 
                     }

transaction_access_mode : transaction_access
                          {
                            $$ = new (PARSERHEAP()) TxnAccessModeItem($1);
                          }

transaction_access :    TOK_READ TOK_ONLY	{ $$ = TransMode::READ_ONLY_SPECIFIED_BY_USER_; }
		   |    TOK_READ TOK_WRITE	{ $$ = TransMode::READ_WRITE_; }

diagnostics_size :    TOK_DIAGNOSTICS TOK_SIZE number_of_conditions
                      {
                         $$ = new (PARSERHEAP()) DiagnosticSizeItem ($3);
                      }

number_of_conditions :   literal
                       | simple_host_variable
			 { 
                           if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_OFF) 
                             {
                               TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT); 
                               $$ = $1 ;
                             }
                         }
                       | dynamic_parameter
		      
rollback_mode_on_off : TOK_NO TOK_ROLLBACK on_off
	      {
		if ($3)
		  $$ = new (PARSERHEAP()) TxnRollbackModeItem(TransMode::NO_ROLLBACK_);
		 else
		  $$ = new (PARSERHEAP()) TxnRollbackModeItem(TransMode::ROLLBACK_MODE_WAITED_);
	      }
autoabort_interval_stmt  : TOK_AUTOABORT autoabort_interval
              {
		$$ = new (PARSERHEAP()) TxnAutoabortIntervalItem($2);
              }
              
multi_commit_mode  : TOK_MULTI TOK_COMMIT on_or_empty TOK_EVERY unsigned_integer TOK_ROWS 
              {
		if($5 == 0)
		  *SqlParser_Diags << DgSqlCode(-3240); // commit size must be greater than zero.
		
		$$ = new (PARSERHEAP()) TxnMultiCommitItem($5, $3);
              }
              | TOK_MULTI TOK_COMMIT on_off
              {
	       $$ = new (PARSERHEAP()) TxnMultiCommitItem($3);
              }

sql_schema_statement_prologue :
                { HexStringLiteralNotAllowed = TRUE; 
                  turnUnknownCharSetToISO88591 = TRUE;
                  disableMakeQuotedStringISO88591Mechanism();
                } 

/* type pStmtDDL */
sql_schema_statement : sql_schema_statement_prologue
                    sql_schema_definition_statement
                         { 
                           $$ = $2; 
                           HexStringLiteralNotAllowed = FALSE; 
                           turnUnknownCharSetToISO88591 = FALSE ;
                           disableMakeQuotedStringISO88591Mechanism();
                         }

              |  sql_schema_statement_prologue sql_schema_manipulation_statement
                         { 
                           $$ = $2; 
                           HexStringLiteralNotAllowed = FALSE; 
                           turnUnknownCharSetToISO88591 = FALSE ;
                           disableMakeQuotedStringISO88591Mechanism();
                         }

/* type pStmtDDL */
sql_schema_definition_statement :

                schema_definition
				{
				}
              | create_synonym_stmt
                                {
                                }
                                
              | create_library_stmt
                                {
                                }
                                
	      | table_definition
				{
				}

              | view_definition
				{
				}

              | grant_statement
                                {
                                }
                           
              | grant_component_privilege_stmt
                                {
                                }
              | create_component_privilege_stmt
                                {
                                }
              | drop_component_privilege_stmt
                                {
                                }

              | register_component_statement
                                {
                                }
              | register_user_statement
                                {
                                }
              | unregister_component_statement
                                {
                                }
              | unregister_user_statement
                                {
                                }

              | catalog_definition
                                {
                                  // Tandem extension
                                }

	      | index_definition
				{
                                  // Tandem extension
                                }

	      | populate_index_definition
				{
                                  // Tandem extension
                                }

	      | initialize_sql_statement
				{
                                  // Tandem extension
                                }
	      | create_mvrgroup_statement
		  {
						// MV - RG
						// Tandem extension
		  }
	      | trigger_definition
				{
                                }
	      | mv_definition
				{
                                }
	      | routine_definition
                                {
                                }

	      | grant_schema_statement
                                {
                                }

	      | grant_role_statement
                                {
                                }

	      | create_role_statement
                                {
                                }
              | create_sequence_statement
	                        {
				}                        
              | alter_sequence_statement
	                        {
				}                        
              | cleanup_objects_statement
                                {
                                }
              | register_hive_statement
                                {
                                }
              | unregister_hive_statement
                                {
                                }
              | register_hbase_statement
                                {
                                }
              | unregister_hbase_statement
                                {
                                }
              | comment_on_statement
                                {
                                }
				
/* type pStmtDDL */
sql_schema_manipulation_statement :

                drop_schema_statement
				{
				}
                                
	      | alter_audit_config_statement
				{
				}
                                
	      | alter_catalog_statement
				{
				}

	      | alter_schema_statement
				{
				}

              | alter_index_statement
				{
				}

              | alter_function_statement
				{
				}

              | alter_library_statement
				{
				}

              | alter_table_statement
				{
				}
			  | alter_mv_refresh_group_statement
			  {
					// MV - RG
			  }
              | alter_synonym_statement
                                {
                                }
              | alter_trigger_statement
				{
				}

              | alter_mv_statement
				{
				}

              | alter_user_statement
				{
				}

              | alter_view_statement
				{
				}

              | drop_synonym_stmt
                                {
                                }
                                
              | drop_exception_stmt
                                {
                                }
                                
              | drop_all_exception_stmt
                                {
                                }
              | drop_sql
                                {
                                  // Tandem extension
                                }

              | drop_table_statement
				{
				}

	      |	drop_mvrgroup_statement
              | drop_trigger_statement
				{
				}

              | drop_mv_statement
				{
				}

              | drop_index_statement
                                {
                                   // Tandem extension
                                }

              | drop_library_statement
				{
				}

              | drop_routine_statement
				{
				}

              | drop_view_statement
				{
				}

              | give_statement
                {
                }

              | revoke_component_privilege_stmt
                                {
                                }
              | revoke_statement
				{
				}
	      
	      | revoke_schema_statement
                                {
                                }


	      | revoke_role_statement
                                {
                                }

              | drop_catalog_statement
                                {
                                   // Tandem extension
                                }

              | drop_module
                                {
                                   // Tandem extension
                                }

              | drop_role_statement
                                {
                                }
              | drop_sequence_statement
	                        {
				}                        

/* type item */
item_signal_statement : 
/*
     TOK_SIGNAL TOK_SQLSTATE QUOTED_STRING '(' QUOTED_STRING ')'
     {
     // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
       if (isInvalidSignalSqlstateValue($3)) 
	 {
	   *SqlParser_Diags << DgSqlCode(-3184) << DgString0(*$3);
	   YYERROR;
	 } 
       else 
	 {
	   $$ = new (PARSERHEAP()) RaiseError(ComDiags_SignalSQLCODE,*$3, *$5);
	 }
     }
    | 
*/
    TOK_SIGNAL TOK_SQLSTATE  QUOTED_STRING '(' value_expression ')'
     {
       // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
       if (isInvalidSignalSqlstateValue($3)) 
	 {
	   *SqlParser_Diags << DgSqlCode(-3184) << DgString0(*$3);
	   YYERROR;
	 } 
       else 
	 {
	   $$ = new (PARSERHEAP()) RaiseError(ComDiags_SignalSQLCODE, *$3, $5);
	 }
     }

/* type relx */
signal_statement : item_signal_statement
     {
       ItemExpr *fakeList = new (PARSERHEAP()) Convert($1); // convert error
       $$ = new (PARSERHEAP()) TupleList(fakeList);
     }

/* type relx */
interactive_query_expression:
                rowset_for dml_statement
				{
				    // Make sure the root is on top of the rowsetfor node
				    // the parse tree is root->rowsetfor->previous child of root
				    $1->setChild(0, $2->child(0));
				    $2->setChild(0, $1);
				  $$ = $2;
				}

	      | locking_stmt_list dml_statement
				{
				  $$ = $2;
				}
	      | dml_statement
				{
				  $$ = $1;
				}

              | front_of_insert no_check_log no_rollback TOK_INTO
                TOK_TABLE '(' TOK_EXTRACT_TARGET '(' extract_type ','
                unsigned_integer ')' ')' '(' dml_query ')'
                  {
		    if (CmpCommon::getDefault(IS_DB_TRANSPORTER) == DF_OFF)
		      YYERROR;

                    // Raise a parse error if the LOG or ROLLBACK
                    // clause is specified. It will not be a
                    // user-friendly error but this syntax is for
                    // internal use only, so for now that's OK.
                    if ($2 == TRUE || $3 == TRUE)
                      YYERROR;

                    // The number of streams cannot be 0 or 1. Let the
                    // binder catch this. Change a value of 0 to 1,
                    // otherwise the binder won't even know this is a
                    // parallel extract.
                    ComUInt32 numStreams = $11;
                    if (numStreams < 1)
                      numStreams = 1;

                    // The dml_query production returns a "finalized"
                    // RelRoot instance. All we need to do is mark
                    // that root for parallel extract and return it.
                    $$ = $15;
                    ((RelRoot*)$$)->setNumExtractStreams(numStreams);
                  } 
	      | control_statement
				{
				  $$ = finalize($1);
				}
              |  osim_statement
                                {
                                  $$ = finalize($1);
                                }
              | set_statement
				{ 
				  $$ = finalize($1);
				}
	      | transaction_statement
				{
				  $$ = finalize($1);
				}
	      | lock_unlock_statement
				{
				  $$ = finalize($1);
				}
	      | sql_schema_statement
                {
		  CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		  NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
		                                  , PARSERHEAP() // in  - NAMemory * heapUsedForOutputBuffers
		                                  );
		  // If we can not get a variable-width multi-byte or single-byte string here, report error 
		  if ( stmt == NULL )
		  {
		    *SqlParser_Diags <<  DgSqlCode(-3406);
		    YYERROR;
		  }

		  if (($1->castToStmtDDLNode()) &&
		      ($1->castToStmtDDLCreateTable()) &&
		      ($1->castToStmtDDLCreateTable()->getQueryExpression()))
		    {
		      // CREATE TABLE AS query.
		      // Use ExeUtil to implement this.
		      ExeUtilCreateTableAs * eue = 
			new(PARSERHEAP()) ExeUtilCreateTableAs
			(CorrName($1->castToStmtDDLCreateTable()->getTableNameAsQualifiedName(), 
				  PARSERHEAP()),
			 $1,
			 (char*)stmt->data(),
			 stmtCharSet,
			 PARSERHEAP());
		      $$ = finalize(eue);
		    }
		  else if (($1->castToStmtDDLNode()) &&
			   ($1->castToStmtDDLNode()->isVolatile()) &&
			   ($1->castToStmtDDLNode()->processAsExeUtil()))
		    {
		      // CREATE VOLATILE table
		      // Use ExeUtil to implement this.
		      ExeUtilProcessVolatileTable * eue = 
			new(PARSERHEAP()) ExeUtilProcessVolatileTable
			($1,
			 (char*)stmt->data(),
			 stmtCharSet,
			 PARSERHEAP());
		      $$ = finalize(eue);
		    }
		  else if (($1->castToStmtDDLNode()) &&
			   ($1->castToStmtDDLNode()->castToStmtDDLCreateExceptionTable()) &&
			   ($1->castToStmtDDLNode()->processAsExeUtil()))
		    {
		      // CREATE EXCEPTION table
		      // Use ExeUtil to implement this.
		      ExeUtilProcessExceptionTable * eue = 
			new(PARSERHEAP()) ExeUtilProcessExceptionTable
			($1,
			 (char*)stmt->data(),
			 stmtCharSet,
			 PARSERHEAP());
		      $$ = finalize(eue);
		    }
		  else if (($1->castToRelExpr()) &&
			   ($1->castToRelExpr()->getOperatorType() == REL_EXE_UTIL) &&
			   (((ExeUtilExpr*)$1->castToRelExpr())->getExeUtilType()
			    == ExeUtilExpr::HBASE_DDL_))
		    {
		      $$ = finalize($1->castToRelExpr());		      
		    }
		  else
		    {
		      $$ = finalize(new (PARSERHEAP())
				    DDLExpr($1, (char*)stmt->data(), 
                                            stmtCharSet, PARSERHEAP()));
		    }

                  delete stmt;
                }
	      | psm_3gl_statement
				{
				  --in3GL_;
                                  if ( in3GL_ == 0 && $1 == NULL )
                                    $1 = getEmptyCSRelTree(); 

				  $$ = finalize($1);
				}
              | assignment_statement
				{
				  $$ = finalize($1);
				}
	      | show_statement
				{
				  $$ = finalize($1);
				}
              | TOK_EXIT
                                { 
				  if (in3GL_ <= 0) 
				    NAExit(0);
				  else {
				    *SqlParser_Diags << DgSqlCode(-3172);
				    $$ = NULL;
				  }
				}
              | signal_statement 
		  		{
				  $$ = finalize($1, FALSE);
		  		}
	      | internal_refresh_command
		  {
			$$ = finalize($1); 
		  }
	      | mvlog_command
		  {
			$$ = finalize($1);
		  }
              | standalone_call_statement
              | exe_util_statement
              | exe_util_cleanup_volatile_tables
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_volatile_info
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_error_info
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_statistics
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_metadata_info
                                {
				  $$ = finalize($1);
				}

              | exe_util_get_version_info
                                {
				  $$ = finalize($1);
				}
              | query_suspend_safe
                                {
				  $$ = finalize($1);
				}
              | query_suspend_forced
                                {
				  $$ = finalize($1);
				}
              | query_activate
                                {
				  $$ = finalize($1);
				}
              | query_cancel_optional_comment
                                {
				  $$ = finalize($1);
				}
              | truncate_table
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_uid
                                {
				  $$ = finalize($1);
				}
              | exe_util_populate_in_memory_statistics
                                {
				  $$ = finalize($1);
				}
              | exe_util_lob_extract
                                {
				  $$ = finalize($1);
				}
              | unload_statement 
                                {
				  $$ = finalize($1);
				}
              | exe_util_lob_update
                                {
                                  $$ = finalize($1);
                                }
              | exe_util_init_hbase
                                {
				  $$ = finalize($1);
				}
              | exe_util_get_region_access_stats
                                {
				  $$ = finalize($1);
				}
              | exe_util_hive_query
                                {
				  $$ = finalize($1);
				}

dml_query : query_expression order_by_clause access_type
            optional_lock_mode for_update_spec optional_limit_spec
              {
#ifndef NDEBUG	// To test packing.
                char* env = getenv("PACKING_FACTOR");
                if ($2 == NULL && // no ORDER BY specified
                    $3 == TransMode::ACCESS_TYPE_NOT_SPECIFIED_ &&
                    $4 == LOCK_MODE_NOT_SPECIFIED_ &&
                    env && atol(env) > 0)
                {
                  Pack* pack =
                    new(PARSERHEAP()) Pack(atol(env),$1);
                  $$ = finalize(pack);
                }
                else
#endif
                {
                  $$ = finalize($1);

                  ((RelRoot *)$$)->addOrderByTree($2);
                  if (!finalizeAccessOptions($$, $3, $4))
                    YYERROR;
                  $5->finalizeUpdatability($$);

		  if ($6)
		    {
		      // limit clause was specified. 
		      RelRoot * rr = (RelRoot*)$$;
		      if (rr->getFirstNRows() >= 0)
			{
			  // cannot specify LIMIT and FIRST N clauses together.
			  YYERROR;
			}
		      else
			{
                          NABoolean negate;
                          if ($6->castToConstValue(negate))
                            {
                              ConstValue * limit = (ConstValue*)$6;
                              Lng32 scale = 0;
                              rr->setFirstNRows(limit->getExactNumericValue(scale));
                              rr->setFirstNRowsParam(NULL);
                            }
                          else
                            {
                              rr->setFirstNRowsParam($6);
                              rr->setFirstNRows(-1);
                            }

                          if ($2 != NULL) // ORDER BY specified
                            rr->needFirstSortedRows() = TRUE;
			}
		    } // LIMIT clause was specified
                }
              }
          | query_expression order_by_clause_non_empty
            group_by_clause_non_empty access_type optional_lock_mode
            for_update_spec optional_limit_spec
              {
                CheckModeSpecial1();
                
                ItemExpr * compExpr = NULL;
                RelExpr * childNode = NULL;
                if ($1->getOperatorType() == REL_ROOT)
                {
                  compExpr = 
                    ((RelRoot*)($1->castToRelExpr()))->
                    getCompExprTree();
                  childNode = 
                    $1->child(0)->castToRelExpr();
                }
                else
                {
                  childNode = $1;
                }
                
                RelExpr * gbyPtr =
                  getTableExpressionRelExpr
                  (childNode,
                   NULL, NULL, NULL, NULL,
                   $3, // group by
                   NULL);

                // save FIRST N settings 
                NABoolean needFirstSortedRows = ((RelRoot *)$$)->needFirstSortedRows();
                Int64 firstNRows = ((RelRoot *)$$)->getFirstNRows();
                
                $$ = finalize(gbyPtr);
                
                // restore FIRST N settings 
                ((RelRoot *)$$)->needFirstSortedRows() = needFirstSortedRows;
                ((RelRoot *)$$)->setFirstNRows(firstNRows);
                
                ((RelRoot *)$$)->addOrderByTree($2);
                if (compExpr)
                  ((RelRoot*)$$)->addCompExprTree(compExpr);
                if (!finalizeAccessOptions($$, $4, $5))
                  YYERROR;
                $6->finalizeUpdatability($$);
              }

optional_limit_spec : TOK_LIMIT NUMERIC_LITERAL_EXACT_NO_SCALE
                   {
		     Int64 rows = atoInt64($2->data());

                     ConstValue * limit = new(PARSERHEAP()) ConstValue(rows);

		     $$ = limit;
		   }
                 | TOK_LIMIT dynamic_parameter
                 {
                   $$ = $2;
                 }
                 | /* empty */
                   {
		     $$ = NULL;
		   }

dml_statement : dml_query { $$ = $1; }

               | with_clause dml_query
                 {
                   $$ = $2;  
                 }

	       | front_of_insert_with_rwrs   rowwise_rowset_info Rest_Of_insert_statement 
		    {
                      if ($1 != Insert::UPSERT_INSERT)
                        YYERROR;
                      
                      Insert * ie = (Insert *)$3;
                      if ((ie->child(0) == NULL) ||
                          (ie->child(0)->getOperatorType() != REL_TUPLE))
                        YYERROR;
                      
                      ie->setInsertType($1);
                      
                      $2->child(0) = ie;
                      $$ = finalize($2);
                    }

	      |	front_of_insert Rest_Of_insert_statement 
				{
				  ((Insert *)$2)->setInsertType($1);
				  $$ = finalize($2);
				}

	      |	front_of_insert Rest_Of_insert_wo_INTO_statement 
				{
				  ((Insert*)$2)->setInsertType($1);
				  $$ = finalize($2);
				}

	      | update_statement_searched access_type
				{
				  $$ = finalize($1);
	       			  if (!finalizeAccessOptions($$, $2)) YYERROR;
				}
	      | merge_statement
				{
				  $$ = finalize($1);
				}
	      | delete_statement access_type
				{
				  $$ = finalize($1);
	       			  if (!finalizeAccessOptions($$, $2)) YYERROR;
				}
	      | load_statement
                  {
                    $$ = finalize($1);
                  }

exe_util_statement: TOK_INSERT TOK_USING TOK_ALTER TOK_INTO table_name query_expression
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
		                                 , PARSERHEAP() // in  - NAMemory * heapUsedForOutputBuffers
		                                 );
		 // If we can not get a variable-width multi-byte or single-byte string here, report error 
		 if ( stmt == NULL )
		 {
		   *SqlParser_Diags <<  DgSqlCode(-3406);
		   YYERROR;
		 }

		 UInt32 pos = 
		   stmt->index(" into ", 0, NAString::ignoreCase);
		 pos = pos + strlen(" into ");
		 // skip blanks to reach start of tablename
		 while (stmt->data()[pos] == ' ')
		   pos++;
		 
		 // skip tablename
		 while (stmt->data()[pos] != ' ')
		   pos++;

		 ExeUtilCreateTableAs * eue = 
		   new(PARSERHEAP()) ExeUtilCreateTableAs
		   (CorrName(*$5, PARSERHEAP()),
		    NULL,
		    (char*)&(stmt->data()[pos]),
		    stmtCharSet,
		    PARSERHEAP());
		
		 $$ = finalize(eue);
 
		 delete $5 /*ddl_qualified_name*/;


	       }

exe_util_cleanup_volatile_tables : TOK_CLEANUP_OBSOLETE TOK_VOLATILE TOK_TABLES
               {
		 ExeUtilCleanupVolatileTables * volSch =
		    new (PARSERHEAP ()) ExeUtilCleanupVolatileTables
		   (ExeUtilCleanupVolatileTables::OBSOLETE_TABLES_IN_DEFAULT_CAT,
		    "",
		    PARSERHEAP ());

		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 volSch->xnNeeded() = FALSE;

		 $$ = volSch;
	       }
              | TOK_CLEANUP_OBSOLETE TOK_VOLATILE TOK_TABLES TOK_IN TOK_ALL TOK_CATALOGS
               {
		 ExeUtilCleanupVolatileTables * volSch =
		    new (PARSERHEAP ()) ExeUtilCleanupVolatileTables
		   (ExeUtilCleanupVolatileTables::OBSOLETE_TABLES_IN_ALL_CATS,
		    "",
		    PARSERHEAP ());

		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 volSch->xnNeeded() = FALSE;

		 $$ = volSch;
	       }
              | TOK_CLEANUP_OBSOLETE TOK_VOLATILE TOK_TABLES TOK_IN TOK_CATALOG character_string_literal
               {
                 // DEFAULT_CHARSET has no effect on character_string_literal in this context
		 ExeUtilCleanupVolatileTables * volSch =
		    new (PARSERHEAP ()) ExeUtilCleanupVolatileTables
		   (ExeUtilCleanupVolatileTables::OBSOLETE_TABLES_IN_SPECIFIED_CAT,
		    *$6,
		    PARSERHEAP ());

		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 volSch->xnNeeded() = FALSE;

		 $$ = volSch;
	       }

/* type relx */
exe_util_get_error_info : TOK_GET TOK_TEXT TOK_FOR TOK_ERROR NUMERIC_LITERAL_EXACT_NO_SCALE 
               {
		 ExeUtilGetErrorInfo * errInfo =
		    new (PARSERHEAP ()) ExeUtilGetErrorInfo
		   (atol($5->data()),
		    PARSERHEAP ());

		 $$ = errInfo;
	       }

/* type relx */
exe_util_get_volatile_info : TOK_GET TOK_ALL TOK_VOLATILE TOK_SCHEMAS
               {
		 ExeUtilGetVolatileInfo * volSch =
		    new (PARSERHEAP ()) ExeUtilGetVolatileInfo
		   (ExeUtilGetVolatileInfo::ALL_SCHEMAS,
		    "",
		    PARSERHEAP ());

		 $$ = volSch;
	       }
             | TOK_GET TOK_ALL TOK_VOLATILE TOK_TABLES
               {
		 ExeUtilGetVolatileInfo * volSch =
		    new (PARSERHEAP ()) ExeUtilGetVolatileInfo
		   (ExeUtilGetVolatileInfo::ALL_TABLES,
		    "",
		    PARSERHEAP ());

		 $$ = volSch;
	       }
             | TOK_GET TOK_VOLATILE TOK_TABLES TOK_FOR TOK_SESSION QUOTED_STRING
               {
                 // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		 ExeUtilGetVolatileInfo * volSch =
		    new (PARSERHEAP ()) ExeUtilGetVolatileInfo
		   (ExeUtilGetVolatileInfo::ALL_TABLES_IN_A_SESSION,
		    *$6,
		    PARSERHEAP ());

		 $$ = volSch;
	       }

explain_starting_tokens : TOK_EXPLAIN optional_options
                                {
                                  ParNameLocListPtr = new (PARSERHEAP()) 
                                    ParNameLocList ( SQLTEXT()
                                                   , (CharInfo::CharSet)SQLTEXTCHARSET()
                                                   , SQLTEXTW()
                                                   , PARSERHEAP()
                                                   );
                                  ParSetTextStartPosForDisplayExplain(
                                        ParNameLocListPtr);
				  $$ = $2;

                                  SqlParser_CurrentParser->hiveDDLInfo_->essd_ = Parser::HiveDDLInfo::EXPLAIN_;	
                                  if ($2)
                                    SqlParser_CurrentParser->hiveDDLInfo_->essdOptions_ = *$2;
                                  StringPos start;
                                  StringPos end;
                                  ParGetTextStartEndPosForDisplayExplain(
                                       ParNameLocListPtr, start, end);
                                  SqlParser_CurrentParser->hiveDDLInfo_->essdQueryStartPos_ = start;
                                }

/* type relx */
exe_util_get_statistics : TOK_GET TOK_STATISTICS stats_merge_clause get_statistics_optional_options
               {
		 ExeUtilGetStatistics * stats =
		    new (PARSERHEAP ()) ExeUtilGetStatistics
		   ("", ($4 ? (char*)$4->data() : NULL),
		    PARSERHEAP (), SQLCLI_STATS_REQ_STMT, (short)$3);

		 $$ = stats;
	       }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_STATEMENT identifier stats_merge_clause get_statistics_optional_options
               {
		 ExeUtilGetStatistics * stats =
		    new (PARSERHEAP ()) ExeUtilGetStatistics
		   (*$5, ($7 ? (char*)$7->data() : NULL),
		    PARSERHEAP (), SQLCLI_STATS_REQ_STMT, (short)$6);

		 $$ = stats;
	       }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_QID qid_identifier stats_merge_clause get_statistics_optional_options
                {
                  ExeUtilGetStatistics *stats = NULL;
                  if (*$5 == "CURRENT")
                  {
                     stats =
                      new (PARSERHEAP ()) ExeUtilGetStatistics
                    (*$5, ($7 ? (char*)$7->data() : NULL),
                      PARSERHEAP (), SQLCLI_STATS_REQ_QID_CURRENT, (short)$6, -1); /*RtsQueryId::ANY_QUERY_*/
                  }
                  else
                  {
                    stats =
                      new (PARSERHEAP ()) ExeUtilGetStatistics
                    (*$5, ($7 ? (char*)$7->data() : NULL),
                      PARSERHEAP (), SQLCLI_STATS_REQ_QID, (short)$6, -1); /*RtsQueryId::ANY_QUERY_*/
                  }
                  $$ = stats;
                }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_QID_INTERNAL qid_internal_identifier qid_internal_stats_merge_clause
                {
                  ExeUtilGetStatistics *stats =
                     new (PARSERHEAP ()) ExeUtilGetStatistics
                     (*$5, NULL,
                       PARSERHEAP (), SQLCLI_STATS_REQ_QID_INTERNAL, (short)$6, -1); /*RtsQueryId::ANY_QUERY_*/
                  $$ = stats;
                }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_PID pid_identifier stats_active_clause stats_merge_clause
                {
                  ExeUtilGetStatistics * stats =
                      new (PARSERHEAP ()) ExeUtilGetStatistics
                    (*$5, NULL,
                      PARSERHEAP (), SQLCLI_STATS_REQ_PID, (short)$7, (short)$6);
                  $$ = stats;
                }
              | TOK_GET TOK_PROCESS TOK_STATISTICS TOK_FOR pid_identifier
                {
                  ExeUtilGetProcessStatistics * stats =
                      new (PARSERHEAP ()) ExeUtilGetProcessStatistics
                    (*$5, NULL,
                      PARSERHEAP ());
                  $$ = stats;
                }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_CPU cpu_identifier stats_active_clause stats_merge_clause
                {
                  ExeUtilGetStatistics * stats =
                      new (PARSERHEAP ()) ExeUtilGetStatistics
                    (*$5, NULL,
                      PARSERHEAP (), SQLCLI_STATS_REQ_CPU, (short)$7, (short)$6);

                  $$ = stats;
                }
              | TOK_GET TOK_STATISTICS TOK_FOR TOK_RMS cpu_identifier_with_all reset_clause
                {
                  ExeUtilGetStatistics * stats =
                      new (PARSERHEAP ()) ExeUtilGetStatistics
                    (*$5, NULL,
                      PARSERHEAP (), SQLCLI_STATS_REQ_RMS_INFO, SQLCLI_SAME_STATS, (short)($6*-1));
                  $$ = stats;
                }
                
get_statistics_optional_options : /* empty */
                                  { $$ = NULL; }
                                | ',' TOK_OPTIONS QUOTED_STRING
                                  /* DEFAULT_CHARSET has no effect on QUOTED_STRING in this context */
                                  { $$ = $3; }
procedure_or_function : TOK_PROCEDURES 
                        | TOK_FUNCTIONS 
                        | TOK_TABLE_MAPPING TOK_FUNCTIONS {$$ = $1; }

exe_util_get_metadata_info : 
          TOK_GET get_info_aus_clause objects_identifier 
                  get_info_io_clause object_identifier table_name 
                  optional_no_header_and_match_pattern_clause
          {
            NABoolean getVersion = FALSE;
            NAString aus(*$2);
            if (*$2 == "VERSION_USER")
            {
              getVersion = TRUE;
              aus = "USER";
            }
            else if (*$2 == "VERSION_ALL")
            {
              getVersion = TRUE;
              aus = "ALL";
            }
            else if (*$2 == "VERSION_SYSTEM")
            {
              getVersion = TRUE;
              aus = "SYSTEM";
            }
            else if (*$2 == "NONE")
              aus = "USER";

            PtrPlaceHolder * pph = $7;
            NAString * noHeader       = (NAString *)pph->ptr1_;
            NAString * pattern        = (NAString *)pph->ptr2_;
            NAString * fullyQualNames = (NAString *)pph->ptr3_;

            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP ()) ExeUtilGetMetadataInfo
                   (aus, *$3, *$4, *$5, *$6, pattern, (fullyQualNames ? TRUE : FALSE),
                    getVersion, NULL, PARSERHEAP ());

            if (noHeader)
              gmi->setNoHeader(TRUE);
            else if (NOT ((CmpCommon::getDefault(IS_SQLCI) == DF_ON) ||
                          (CmpCommon::getDefault(NVCI_PROCESS) == DF_ON)))
            {
              gmi->setNoHeader(TRUE);
            }

            $$ = gmi;
          }
        | TOK_GET get_info_aus_clause objects_identifier 
                  optional_no_header_and_match_pattern_clause
          {
            NABoolean getVersion = FALSE;
            NAString aus(*$2);
            if (*$2 == "VERSION_ALL")
            {
              getVersion = TRUE;
              aus = "ALL";
            }
            else if (*$2 == "VERSION_USER")
            {
              getVersion = TRUE;
              aus = "USER";
            }
            else if (*$2 == "VERSION_SYSTEM")
            {
              getVersion = TRUE;
             aus = "SYSTEM";
            }
            else if (*$2 == "NONE")
              aus = "USER";

            PtrPlaceHolder * pph = $4;
            NAString * noHeader = (NAString *)pph->ptr1_;
            NAString * pattern = (NAString *)pph->ptr2_;
            NAString * fullyQualNames = (NAString *)pph->ptr3_;
            CorrName cn("DUMMY");
            NAString nas("");
            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP ()) ExeUtilGetMetadataInfo
                    (aus, *$3, nas, nas, cn, pattern, (fullyQualNames ? TRUE : FALSE), 
                     getVersion, NULL, PARSERHEAP());

            if (noHeader)
              gmi->setNoHeader(TRUE);

            $$ = gmi;
          }
        | TOK_GET get_info_aus_clause procedure_or_function TOK_FOR TOK_LIBRARY table_name
        {
           NAString aus("ALL");    
           NAString infoType;
           NAString iof("FOR");
           NAString objType("LIBRARY"); 
           CorrName cn("");
           // we want an empty get_info_aus_clause;  it is just there to make the
           // production symetric with other GET statements and please the parser
           if (*$2 != "NONE")
             YYERROR;
           if ($3 == TOK_PROCEDURES)
             infoType = "PROCEDURES" ;
           else if ($3 == TOK_FUNCTIONS)
             infoType = "FUNCTIONS" ;
           else
             infoType = "TABLE_FUNCTIONS" ;

           ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP ()) 
                    ExeUtilGetMetadataInfo(
                             aus,            // NAString &
                             infoType,       // NAString & 
                             iof,            // NAString & 
                             objType,        // NAString & objectType
                             *($6),          // CorrName &
                             NULL,           // NAString * pattern
                             TRUE,           // return fully qualified names
                             FALSE,          // getVersion 
                             NULL,             // param1 -- the library name
                             PARSERHEAP ()); // ColHeap  * oHeap 
                     
           //gmi->setNoHeader(TRUE);
           $$ = gmi;          
        } 
        | TOK_GET get_info_aus_clause obj_priv_identifier 
          TOK_FOR user_or_role authorization_identifier  
          optional_no_header_and_match_pattern_clause
          {
            NAString aus(*$2);
            if (aus == "CURRENT_USER") YYERROR;
            if (aus == "NONE")
              aus = "USER";

            if ((*$3 != "SEQUENCES" ) && (*$3 != "INDEXES"   ) && 
                (*$3 != "PRIVILEGES") && (*$3 != "PROCEDURES") && 
                (*$3 != "FUNCTIONS" ) && (*$3 != "TABLE_MAPPING FUNCTIONS") && 
                (*$3 != "SCHEMAS"   ) && (*$3 != "TABLES"  ) && 
                (*$3 != "VIEWS"     ) && (*$3 != "USERS"     ) &&
                (*$3 != "ROLES"     ) && (*$3 != "LIBRARIES"     )) YYERROR;

            NAString infoType(*$3);

            NAString iof("FOR");

            NAString objType("USER");
            if ($5 == TOK_ROLE)
              objType = "ROLE";

            PtrPlaceHolder * pph      = $7;
            NAString * noHeader       = (NAString *)pph->ptr1_;
            NAString * pattern        = (NAString *)pph->ptr2_;
            NABoolean  fullyQualNames = (pph->ptr3_) ? TRUE : FALSE; 

            NABoolean getVersion = FALSE;

            CorrName cnm("");

            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP ()) ExeUtilGetMetadataInfo
                    (aus, infoType, iof, objType, cnm, pattern, fullyQualNames, 
                     getVersion, $6, PARSERHEAP ());

            if (noHeader ||
                (NOT ((CmpCommon::getDefault(IS_SQLCI) == DF_ON) ||
                      (CmpCommon::getDefault(NVCI_PROCESS) == DF_ON))))
              gmi->setNoHeader(TRUE);

            $$ = gmi;
          }

        | TOK_GET get_info_aus_clause TOK_PRIVILEGES TOK_ON object_identifier 
          table_name optional_for_user_clause 
          optional_no_header_and_match_pattern_clause
          {
            NAString aus("ALL");

            NAString infoType("PRIVILEGES");
            NABoolean getVersion = FALSE;
            PtrPlaceHolder * pph = $8;
            NAString * noHeader = (NAString *)pph->ptr1_;
            NAString * pattern = (NAString *)pph->ptr2_;
            NAString * fullyQualNames = (NAString *)pph->ptr3_;

            NAString iof("ON");
            NAString nas("");
            ExeUtilGetMetadataInfo * gmi =
              new (PARSERHEAP ()) ExeUtilGetMetadataInfo
              (aus, infoType, iof, *$5, 
               *$6, pattern,
               (fullyQualNames ? TRUE : FALSE),
               getVersion,
               $7,
               PARSERHEAP ());
		 
            if (noHeader)
              gmi->setNoHeader(TRUE);
            else if (NOT ((CmpCommon::getDefault(IS_SQLCI) == DF_ON) ||
                 (CmpCommon::getDefault(NVCI_PROCESS) == DF_ON)))
              {
               gmi->setNoHeader(TRUE);
              }

            $$ = gmi;
          }
    
      // Created a special production for getting privileges on procedures
      // TOK_PROCEDURE as an object_identifier causes lots of parser conflicts
      | TOK_GET get_info_aus_clause TOK_PRIVILEGES TOK_ON TOK_PROCEDURE
        table_name optional_for_user_clause
        optional_no_header_and_match_pattern_clause
        {
          NAString aus("ALL");
          NAString infoType("PRIVILEGES");
          NABoolean getVersion = FALSE;
          PtrPlaceHolder * pph = $8;
          NAString * noHeader = (NAString *)pph->ptr1_;
          NAString * pattern = (NAString *)pph->ptr2_;
          NAString * fullyQualNames = (NAString *)pph->ptr3_;

          NAString iof("ON");
          NAString nas("");
          NAString ptype("PROCEDURE");
          ExeUtilGetMetadataInfo * gmi =
            new (PARSERHEAP ()) ExeUtilGetMetadataInfo
            (aus, infoType, iof, ptype,
             *$6, pattern,
             (fullyQualNames ? TRUE : FALSE),
             getVersion,
             $7,
             PARSERHEAP ());

          if (noHeader)
            gmi->setNoHeader(TRUE);
          else if (NOT ((CmpCommon::getDefault(IS_SQLCI) == DF_ON) ||
                        (CmpCommon::getDefault(NVCI_PROCESS) == DF_ON)))
            {
              gmi->setNoHeader(TRUE);
            }

          $$ = gmi;
        }

      | TOK_GET get_info_aus_clause TOK_COMPONENTS 
          optional_no_header_and_match_pattern_clause
          // GET COMPONENTS
          {
            NAString aus(*$2);
            if (*$2 == "ALL")
              aus = "ALL";
            else if (*$2 == "USER")
              aus = "USER";
            else if (*$2 == "CURRENT_USER")
              aus = "USER";
            else if (*$2 == "NONE")
              aus = "ALL";
            else
              YYERROR;

            NAString infoType("COMPONENTS");  // COMPONENT TBD
            NAString iof;
            NAString objectType;
            CorrName objectName;
            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP())
              ExeUtilGetMetadataInfo
              ( aus          // NAString &
              , infoType     // NAString &
              , iof          // NAString &
              , objectType   // NAString & objectType
              , objectName   // CorrName &
              , NULL         // NAString * pattern
              , FALSE        // NABoolean returnFullyQualNames
              , FALSE        // NABoolean getVersion
              , NULL         // NAString * param1
              , PARSERHEAP() // CollHeap * oHeap
              );

            PtrPlaceHolder * pph      = $4;
            NAString * noHeader       = (NAString *)pph->ptr1_;
            if (noHeader)
              gmi->setNoHeader(TRUE);

            $$ = gmi;
          }
  
        | TOK_GET get_info_aus_clause TOK_COMPONENT TOK_PRIVILEGES 
          TOK_ON component_name optional_authid_clause 
          optional_drop_behavior optional_no_header_and_match_pattern_clause 
          {
            NAString aus(*$2);
            if (*$2 == "ALL")
              aus = "ALL";
            else if (*$2 == "USER")
              aus = "USER";
            else if (*$2 == "CURRENT_USER")
              aus = "USER";
            else if (*$2 = "NONE")
              aus = "ALL";
            else
              YYERROR;

            NAString infoType("PRIVILEGES");
            NAString iof("ON");       
            NAString objectType("COMPONENT");
            CorrName objectName(*$6);

            PtrPlaceHolder * pph = $9;
            NAString * noHeader = (NAString *)pph->ptr1_;
            NAString * pattern = (NAString *)pph->ptr2_;
            NAString * fullyQualNames = (NAString *)pph->ptr3_;

            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP())
              ExeUtilGetMetadataInfo
              ( aus          // NAString & 
              , infoType     // NAString &
              , iof          // NAString &
              , objectType   // NAString &
              , objectName   // CorrName &
              , pattern         // NAString * pattern
              , (fullyQualNames ? TRUE : FALSE)  // NABoolean returnFullyQualNames
              , FALSE        // NABoolean getVersion
              , $7           // NAString * param1
              , PARSERHEAP() // CollHeap * oHeap
              );

            if (noHeader)
              gmi->setNoHeader(TRUE);
            
            if ($8 == COM_CASCADE_DROP_BEHAVIOR)
               gmi->setCascade(TRUE);

            $$ = gmi;
            delete $6; // component_name
            delete $7; // user_name
          }

        | TOK_GET get_info_aus_clause TOK_PRIVILEGES
          TOK_ON TOK_COMPONENT component_name optional_authid_clause
          optional_drop_behavior optional_no_header_and_match_pattern_clause

          // GET [CURRENT_USER] PRIVILEGES ON COMPONENT <name> or
          // GET [CURRENT_USER] PRIVILEGES ON COMPONENT <name> FOR <authid>
          {
            NAString aus(*$2);
            if (*$2 == "ALL")
              aus = "ALL";
            else if (*$2 == "USER")
              aus = "USER";
            else if (*$2 == "CURRENT_USER")
              aus = "USER";
            else if (*$2 == "NONE")
              aus = "ALL";
            else
              YYERROR;

            NAString infoType("PRIVILEGES");
            NAString iof("ON");
            NAString objectType("COMPONENT");
            CorrName objectName(*$6);

            PtrPlaceHolder * pph = $9;
            NAString * noHeader = (NAString *)pph->ptr1_;
            NAString * pattern = (NAString *)pph->ptr2_;
            NAString * fullyQualNames = (NAString *)pph->ptr3_;

            ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP())
              ExeUtilGetMetadataInfo
              ( aus          // NAString & 
              , infoType     // NAString &
              , iof          // NAString &
              , objectType   // NAString &
              , objectName   // CorrName &
              , pattern         // NAString * pattern
              , (fullyQualNames ? TRUE : FALSE)  // NABoolean returnFullyQualNames
              , FALSE        // NABoolean getVersion
              , $7           // NAString * param1
              , PARSERHEAP() // CollHeap * oHeap
              );

            if (noHeader)
              gmi->setNoHeader(TRUE);

            if ($8 == COM_CASCADE_DROP_BEHAVIOR)
               gmi->setCascade(TRUE);

            $$ = gmi;
            delete $6; // component_name
            delete $7; // user_name
          }
       | TOK_GET get_info_aus_clause TOK_HBASE TOK_OBJECTS
         {
           NAString ausStr(*$2);
           if (*$2 == "NONE")
             ausStr = "USER";

           NAString infoType("HBASE_OBJECTS");
           NAString iofStr;
           NAString objectType;
           CorrName objectName("DUMMY");
           NAString pattern;

           ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP())
             ExeUtilGetMetadataInfo
             ( ausStr          // NAString & 
               , infoType      // NAString &
               , iofStr          // NAString &
               , objectType   // NAString &
               , objectName   // CorrName &
               , NULL         // NAString * pattern
               , FALSE  // NABoolean returnFullyQualNames
               , FALSE        // NABoolean getVersion
               , NULL           // NAString * param1
               , PARSERHEAP() // CollHeap * oHeap
               );

           $$ = gmi;
         }
       | TOK_GET get_info_aus_clause TOK_HBASE TOK_OBJECTS ',' TOK_MATCH QUOTED_STRING
         {
           NAString ausStr(*$2);
           if (*$2 == "NONE")
             ausStr = "USER";

           NAString infoType("HBASE_OBJECTS");
           NAString iofStr;
           NAString objectType;
           CorrName objectName("DUMMY");
           NAString pattern(*$7);

           ExeUtilGetMetadataInfo * gmi = new (PARSERHEAP())
             ExeUtilGetMetadataInfo
             ( ausStr          // NAString & 
               , infoType      // NAString &
               , iofStr          // NAString &
               , objectType   // NAString &
               , objectName   // CorrName &
               , &pattern         // NAString * pattern
               , FALSE  // NABoolean returnFullyQualNames
               , FALSE        // NABoolean getVersion
               , NULL           // NAString * param1
               , PARSERHEAP() // CollHeap * oHeap
               );

           $$ = gmi;
         }

user_or_role : TOK_USER | TOK_ROLE

optional_for_user_clause : empty { $$ = NULL; }
                         | TOK_FOR authorization_identifier
                         {
                           $$ = new(PARSERHEAP()) NAString(*$2);
                         }
                         | TOK_FOR TOK_USER authorization_identifier
                         {
                           $$ = new(PARSERHEAP()) NAString(*$3);
                         }

optional_authid_clause : empty { $$ = NULL; }
                       | TOK_FOR authorization_identifier
                       {
                           $$ = new(PARSERHEAP()) NAString(*$2);
                       }

get_info_aus_clause :  empty { $$ = new (PARSERHEAP()) NAString("NONE"); }
                     | TOK_ALL { $$ = new (PARSERHEAP()) NAString("ALL"); }
                     | TOK_USER { $$ = new (PARSERHEAP()) NAString("USER"); }
                     | TOK_CURRENT_USER { $$ = new (PARSERHEAP()) NAString("CURRENT_USER"); }
                     | TOK_IUDLOG   { $$ = new (PARSERHEAP()) NAString("IUDLOG");}
                     | TOK_RANGELOG   { $$ = new (PARSERHEAP()) NAString("RANGELOG");}
                     | TOK_TEMP_TABLE   { $$ = new (PARSERHEAP()) NAString("TRIGTEMP");}
                     | TOK_SYSTEM { $$ = new (PARSERHEAP()) NAString("SYSTEM"); }
                     | TOK_EXTERNAL { $$ = new (PARSERHEAP()) NAString("EXTERNAL"); }

object_identifier : 
                    TOK_CATALOG  { $$ = new (PARSERHEAP()) NAString("CATALOG"); }
                  | TOK_CONSTRAINT{ $$ = new (PARSERHEAP()) NAString("CONSTRAINT"); }
                  | TOK_INDEX    { $$ = new (PARSERHEAP()) NAString("INDEX"); }
                  | TOK_LIBRARY  { $$ = new (PARSERHEAP()) NAString("LIBRARY"); }
                  | TOK_TABLE_MAPPING TOK_FUNCTION  { $$ = new (PARSERHEAP()) NAString("ROUTINE"); }
                  | TOK_FUNCTION  { $$ = new (PARSERHEAP()) NAString("ROUTINE"); }
                  | TOK_MV       { $$ = new (PARSERHEAP()) NAString("MV"); }
                  | TOK_SCHEMA   { $$ = new (PARSERHEAP()) NAString("SCHEMA"); }
                  | TOK_SYNONYM  { $$ = new (PARSERHEAP()) NAString("SYNONYM"); }
                  | TOK_TABLE    { $$ = new (PARSERHEAP()) NAString("TABLE"); }
                  | TOK_TRIGGER  { $$ = new (PARSERHEAP()) NAString("TRIGGER"); }
                  | TOK_VIEW     { $$ = new (PARSERHEAP()) NAString("VIEW"); }
                  | TOK_SEQUENCE     { $$ = new (PARSERHEAP()) NAString("SEQUENCE"); }

objects_identifier : 
                    TOK_CATALOGS { $$ = new (PARSERHEAP()) NAString("CATALOGS"); }
                  | TOK_CONSTRAINTS{ $$ = new (PARSERHEAP()) NAString("CONSTRAINTS"); }
                  | TOK_INDEXES  { $$ = new (PARSERHEAP()) NAString("INDEXES"); }
                  | TOK_LIBRARIES { $$ = new (PARSERHEAP()) NAString("LIBRARIES"); }
                  | TOK_MVS      { $$ = new (PARSERHEAP()) NAString("MVS"); }
                  | TOK_MVGROUPS { $$ = new (PARSERHEAP()) NAString("MVGROUPS"); }
                  | TOK_OBJECTS  { $$ = new (PARSERHEAP()) NAString("OBJECTS"); }
                  | TOK_PARTITIONS { $$ = new (PARSERHEAP()) NAString("PARTITIONS"); }
                  | TOK_PROCEDURES { $$ = new (PARSERHEAP()) NAString("PROCEDURES"); }
                  | TOK_ROLES    { $$ = new (PARSERHEAP()) NAString("ROLES"); }  // get roles
                  | TOK_SCHEMAS  { $$ = new (PARSERHEAP()) NAString("SCHEMAS"); }
                  | TOK_SEQUENCES  { $$ = new (PARSERHEAP()) NAString("SEQUENCES"); }
                  | TOK_SYNONYMS { $$ = new (PARSERHEAP()) NAString("SYNONYMS"); }
                  | TOK_TABLES   { $$ = new (PARSERHEAP()) NAString("TABLES"); }
                  | TOK_TRIGGERS { $$ = new (PARSERHEAP()) NAString("TRIGGERS"); }
                  | TOK_USERS    { $$ = new (PARSERHEAP()) NAString("USERS"); }  // get users
                  | TOK_VIEWS    { $$ = new (PARSERHEAP()) NAString("VIEWS"); }
                  | TOK_INVALID TOK_VIEWS { $$ = new (PARSERHEAP()) NAString("INVALID_VIEWS"); }
                  | TOK_FUNCTIONS { $$ = new (PARSERHEAP()) NAString("FUNCTIONS"); }
                  | TOK_TABLE_MAPPING TOK_FUNCTIONS { $$ = new (PARSERHEAP()) NAString("TABLE_FUNCTIONS"); }
                  | TOK_HIVE TOK_REGISTERED TOK_TABLES { $$ = new (PARSERHEAP()) NAString("HIVE_REG_TABLES"); }
                  | TOK_HIVE TOK_REGISTERED TOK_VIEWS { $$ = new (PARSERHEAP()) NAString("HIVE_REG_VIEWS"); }
                  | TOK_HIVE TOK_REGISTERED TOK_SCHEMAS { $$ = new (PARSERHEAP()) NAString("HIVE_REG_SCHEMAS"); }
                  | TOK_HIVE TOK_REGISTERED TOK_OBJECTS { $$ = new (PARSERHEAP()) NAString("HIVE_REG_OBJECTS"); }
                  | TOK_HIVE TOK_EXTERNAL TOK_TABLES { $$ = new (PARSERHEAP()) NAString("HIVE_EXT_TABLES"); }
                  | TOK_HBASE TOK_REGISTERED TOK_TABLES { $$ = new (PARSERHEAP()) NAString("HBASE_REG_TABLES"); }


privileges_identifier :
                    TOK_PRIVILEGES { $$ = new (PARSERHEAP()) NAString("PRIVILEGES"); }

obj_priv_identifier :
                    objects_identifier | privileges_identifier

/* type stringval */
get_info_io_clause : TOK_IN  { $$ = new (PARSERHEAP()) NAString("IN"); }
                   | TOK_ON  { $$ = new (PARSERHEAP()) NAString("ON"); }

optional_no_header_and_match_pattern_clause : 
                           empty 
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     NULL, NULL, NULL);
			    }
                          | ',' TOK_NO TOK_HEADER 
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     (new(PARSERHEAP()) NAString()), NULL, NULL);
			    }
                          | ',' TOK_MATCH QUOTED_STRING 
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     NULL, $3, NULL);
			    }
                          | ',' TOK_RETURN TOK_FULL TOK_NAMES
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     NULL, NULL, (new(PARSERHEAP()) NAString()));
			    }
                          | ',' TOK_NO TOK_HEADER ',' TOK_MATCH QUOTED_STRING 
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     (new(PARSERHEAP()) NAString()), $6, NULL);
			    }
                          | ',' TOK_NO TOK_HEADER ',' TOK_RETURN TOK_FULL TOK_NAMES
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     (new(PARSERHEAP()) NAString()), NULL, (new(PARSERHEAP()) NAString()) );
			    }
                          | ',' TOK_NO TOK_HEADER ',' TOK_RETURN TOK_FULL TOK_NAMES ',' TOK_MATCH QUOTED_STRING 
                            { 
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     (new(PARSERHEAP()) NAString()), $10, (new(PARSERHEAP()) NAString()) );
			    }

/* type relx */
exe_util_get_version_info :   TOK_GET TOK_VERSION TOK_OF TOK_METADATA
                               {
				 ExeUtilMetadataUpgrade * mu =
				   new(PARSERHEAP()) ExeUtilMetadataUpgrade(PARSERHEAP());
				 mu->setGetMDVersion(TRUE);

				 $$ = mu;
			       }
                         | TOK_GET TOK_VERSION TOK_OF TOK_SOFTWARE
                               {
				 ExeUtilMetadataUpgrade * mu =
				   new(PARSERHEAP()) ExeUtilMetadataUpgrade(PARSERHEAP());
				 mu->setGetSWVersion(TRUE);

				 $$ = mu;
			       }
                          | TOK_GET TOK_VPROC TOK_OF TOK_SYSTEM TOK_MODULES
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VPROC TOK_OF TOK_MODULE QUOTED_STRING
                               {
		 YYERROR;
			       }

                            | TOK_GET TOK_VERSION TOK_OF TOK_PROCEDURE '(' QUOTED_STRING ',' QUOTED_STRING ')'
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_STATEMENT explain_identifier
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_SYSTEM
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_SYSTEM nsk_node_name
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_MODULE QUOTED_STRING
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_SYSTEM TOK_SCHEMA
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_SYSTEM TOK_SCHEMA nsk_node_name
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_PROCEDURE actual_routine_name
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_VERSION TOK_OF TOK_STORED TOK_PROCEDURE actual_routine_name
                               {
		 YYERROR;
			       }
                           | TOK_GET TOK_VERSION TOK_OF object_identifier table_name 
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_NAMES TOK_OF TOK_RELATED objects_identifier TOK_FOR table_name 
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_NAMES TOK_OF TOK_RELATED TOK_NODES TOK_FOR nsk_node_name
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_NAMES TOK_OF TOK_RELATED TOK_NODES 
                               {
		 YYERROR;
			       }
                            | TOK_GET TOK_SYSTEM TOK_NAME
                               {
		 YYERROR;
			       }
/* type relx */
exe_util_get_uid : TOK_GET TOK_UID TOK_OF maintain_object_token table_name
               {
                 YYERROR;
	       }

/* type relx */
exe_util_get_qid : TOK_GET TOK_QID TOK_FOR TOK_STATEMENT IDENTIFIER
               {
                 if ( ($5==NULL) || transformIdentifier(*$5)) 
                   YYERROR;

                 $$ = new(PARSERHEAP()) ExeUtilGetQID(*$5, PARSERHEAP());
	       }

/* type relx */
exe_util_populate_in_memory_statistics : TOK_GENERATE TOK_STATISTICS TOK_FOR TOK_TABLE table_name TOK_LIKE table_name optional_from_schema
               {
		 YYERROR;
	       }

/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_LOBLENGTH '(' TOK_LOB QUOTED_STRING  ')' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		 Int64 returnLengthAddr = atoInt64($8->data());
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_LENGTH_,
		    returnLengthAddr, 0, 0, 0);

		 $$ = lle;
	       }
/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_LOBLENGTH '(' TOK_LOB QUOTED_STRING  ')' 
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_LENGTH_,
		    -1, 0, 0, 0);

		 $$ = lle;
	       }
/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_NAME '(' TOK_LOB QUOTED_STRING  ')' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		 Int64 returnFilenameAddr = atoInt64($8->data());
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_HDFSFILENAME_,
		    returnFilenameAddr, 0, 0, 0);

		 $$ = lle;
	       }
/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_NAME '(' TOK_LOB QUOTED_STRING  ')' 
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_HDFSFILENAME_,
		    -1, 0, 0, 0);

		 $$ = lle;
	       }
/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_OFFSET'(' TOK_LOB QUOTED_STRING  ')' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		 Int64 returnOffsetAddr = atoInt64($8->data());
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_OFFSET_,
		    returnOffsetAddr, 0, 0, 0);

		 $$ = lle;
	       }
/* type relx */
exe_util_lob_extract : TOK_EXTRACT TOK_OFFSET '(' TOK_LOB QUOTED_STRING  ')' 
               {
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);
		
		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::RETRIEVE_OFFSET_,
		    -1, 0, 0, 0);

		 $$ = lle;
	       }


               | TOK_EXTRACT TOK_LOBTOSTRING '(' TOK_LOB QUOTED_STRING ',' TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
		 YYERROR;
		 /*
		  Int64 rowSize = atoInt64($8->data());

		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, 0);

		 $$ = lle;
		 */
	       }

              | TOK_EXTRACT TOK_LOBTOBUFFER '(' TOK_LOB QUOTED_STRING ',' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
		 /* TOK_LOCATION points to a user allocated data buffer ehich needs to be enough to hold alreast TOK_SIZE worth of data .
TOK_SIZE points to the address of an Int64 container This size is the input specified by user for length to extract. One return, it will give the caller the size that was extracted */

		 Int64 bufAddr = atoInt64($8->data());
		 Int64 sizeAddr = atoInt64($11->data());
		 
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_BUFFER_,
		    bufAddr, sizeAddr, 0, 0);

		 $$ = lle;
	       }

              
            | TOK_EXTRACT TOK_LOBTOFILE '(' TOK_LOB QUOTED_STRING  ','  QUOTED_STRING ')'
               {
                 // if file exists, error . if file doesn't exist, create
                 // extract lobtofile (lob 'abc',  'file');

		  ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_FILE_,
		    0, 0, 
		    0, 
		    0,
		    (char*)$7->data());

		 $$ = lle;
	       }
              | TOK_EXTRACT TOK_LOBTOFILE '(' TOK_LOB QUOTED_STRING ',' QUOTED_STRING ',' TOK_TRUNCATE  ')'
               {
                 // if file exists, truncate and replace contents. if file doesn't exist error
                 // extract lobtofile (lob 'abc',  'file', truncate);

		  ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_FILE_,
		    0, 0, 
		    ExeUtilLobExtract::ERROR_IF_NOT_EXISTS, 
		    ExeUtilLobExtract::TRUNCATE_EXISTING,
		    (char*)$7->data());

		 $$ = lle;
	       }
| TOK_EXTRACT TOK_LOBTOFILE '(' TOK_LOB QUOTED_STRING ',' QUOTED_STRING ',' TOK_CREATE ',' TOK_TRUNCATE  ')'
               {
                 // if file exists, truncate and replace contents. if file doesn't exist, create
                 // extract lobtofile (lob 'abc',  'file', create);

		  ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_FILE_,
		    0, 0, 
		    0, 
		    ExeUtilLobExtract::TRUNCATE_EXISTING ,
		    (char*)$7->data());

		 $$ = lle;
	       }
               | TOK_EXTRACT TOK_LOBTOFILE '(' TOK_LOB QUOTED_STRING ','  QUOTED_STRING ',' TOK_CREATE ',' TOK_APPEND  ')'
               {
                 // if file exists, append. if file doesn't exist, create
                 // extract lobtofile (lob 'abc',  'file', create);

		  ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_FILE_,
		    0, 0, 
		    0,
		    ExeUtilLobExtract::APPEND_OR_CREATE,
		    (char*)$7->data());

		 $$ = lle;
	       }

              | TOK_EXTRACT TOK_LOBTOFILE '(' TOK_LOB QUOTED_STRING ',' QUOTED_STRING ',' TOK_APPEND ')'
               {
                 // if file exists, append. if file doesn't exist, error
                 // extract lobtofile (lob 'abc',  'file', append);

		  ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, 
		    ExeUtilLobExtract::TO_FILE_,
		    0, 0, 
		    ExeUtilLobExtract::ERROR_IF_NOT_EXISTS, 
		    0,
		    (char*)$7->data(),FALSE);

		 $$ = lle;
	       }

               | TOK_EXTRACT TOK_LOBTOSTRING '(' TOK_LOB QUOTED_STRING ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_LOB TOK_BUFFER TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 rowSize = atoInt64($10->data());
		 Int64 bufSize = atoInt64($15->data());

		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$5);

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (handle, //(char*)$5->data(), 
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, bufSize); 
                    $$ = lle;
                 */
	       }

           | TOK_EXTRACT TOK_EXTERNALTOSTRING '(' QUOTED_STRING ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 rowSize = atoInt64($9->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, 0,
		    (char*)$4->data());

		 $$ = lle;
                 */
	       }

          | TOK_EXTRACT TOK_EXTERNALTOSTRING '(' QUOTED_STRING ',' QUOTED_STRING ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		  Int64 rowSize = atoInt64($11->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, 0,
		    (char*)$4->data(), (char*)$6->data());

		 $$ = lle; 
                 */
	       }

          | TOK_EXTRACT TOK_EXTERNALTOSTRING '(' QUOTED_STRING ',' QUOTED_STRING ',' TOK_BUFFER TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 rowSize = atoInt64($15->data());
		 Int64 bufSize = atoInt64($10->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, bufSize,
		    (char*)$4->data(), (char*)$6->data());

		 $$ = lle;
                 */
	       }

          | TOK_EXTRACT TOK_EXTERNALTOSTRING '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING ',' TOK_OUTPUT TOK_ROW TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 rowSize = atoInt64($13->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_STRING_,
		    0, 0, rowSize, 0,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 $$ = lle;
                 */
	       }

          | TOK_LOAD TOK_STRINGTOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 offset = atoInt64($10->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_STRING_,
		    0, 0, offset, 0,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 $$ = lle;
                 */
	       }

         | TOK_LOAD TOK_STRINGTOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_WITH TOK_CREATE ')'
               {
                 YYERROR;
                 /*
		  Int64 offset = atoInt64($10->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_STRING_,
		    0, 0, offset, 0,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 lle->withCreate() = TRUE;

		 $$ = lle;
                 */
	       }

          | TOK_LOAD TOK_FILETOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 offset = atoInt64($10->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_FILE_,
		    0, 0, offset, 0,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 $$ = lle;
                 */
	       }

         | TOK_LOAD TOK_FILETOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_WITH  TOK_CREATE ')'
               {
                 YYERROR;
                 /*
		  Int64 offset = atoInt64($10->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_FILE_,
		    0, 0, offset, 0,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 lle->withCreate() = TRUE;

		 $$ = lle;
                 */
	       }
          | TOK_LOAD TOK_FILETOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
               {
                 YYERROR;
                 /*
		 Int64 offset = atoInt64($10->data());
		 Int64 bufSize = atoInt64($12->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_FILE_,
		    0, 0, offset, bufSize,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 $$ = lle;
                 */
	       }

         | TOK_LOAD TOK_FILETOEXTERNAL '(' QUOTED_STRING ',' QUOTED_STRING ',' QUOTED_STRING  ',' NUMERIC_LITERAL_EXACT_NO_SCALE ',' NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_WITH  TOK_CREATE ')'
               {
                 YYERROR;
                 /*
		  Int64 offset = atoInt64($10->data());
		 Int64 bufSize = atoInt64($12->data());

		 ExeUtilLobExtract * lle =
		   new (PARSERHEAP ()) ExeUtilLobExtract
		   (NULL,
		    ExeUtilLobExtract::TO_EXTERNAL_FROM_FILE_,
		    0, 0, offset, bufSize,
		    (char*)$4->data(), (char*)$6->data(), (char*)$8->data());

		 lle->withCreate() = TRUE;

		 $$ = lle;
                 */
	       }

exe_util_lob_update :   TOK_UPDATE_LOB '(' TOK_LOB QUOTED_STRING ',' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE  ')' 
               {
                 /* TOK_LOCATION points to a caller allocated data buffer with 
                 LOB data . TOK_SIZE is the  size is the input specified by 
                 user for length to update. On return, it will give the caller 
                 the size that was updated */
                 Int64 bufAddr = atoInt64($7->data());
		 Int64 size = atoInt64($10->data());
		 
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$4);
                 ExeUtilLobUpdate *llu =  
                   new (PARSERHEAP ()) ExeUtilLobUpdate
		   (handle, 
		    ExeUtilLobUpdate::FROM_BUFFER_,
		    bufAddr, size, ExeUtilLobUpdate::REPLACE_,0);

		 $$ = llu;
               } 
              |  TOK_UPDATE_LOB '(' TOK_LOB QUOTED_STRING ',' TOK_LOCATION NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_SIZE NUMERIC_LITERAL_EXACT_NO_SCALE ',' TOK_APPEND')'    
               {
                 /* TOK_LOCATION points to a caller allocated data buffer with 
                 LOB data . TOK_SIZE is the  size is the input specified by 
                 user for length to update. On return, it will give the caller 
                 the size that was updated */
                 Int64 bufAddr = atoInt64($7->data());
		 Int64 size = atoInt64($10->data());
		 
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$4);
                 ExeUtilLobUpdate *llu =  
                   new (PARSERHEAP ()) ExeUtilLobUpdate
		   (handle, 
		    ExeUtilLobUpdate::FROM_BUFFER_,
		    bufAddr, size, ExeUtilLobUpdate::APPEND_,0);

		 $$ = llu;
               }
              | TOK_UPDATE_LOB '(' TOK_LOB QUOTED_STRING ',' TOK_EMPTY_BLOB '(' ')'')' 
               {
                 /* Truncate and insert empty_blob */
                 
		 
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$4);
                 ExeUtilLobUpdate *llu =  
                   new (PARSERHEAP ()) ExeUtilLobUpdate
		   (handle, 
		    ExeUtilLobUpdate::FROM_BUFFER_,
		    0, 0, ExeUtilLobUpdate::TRUNCATE_EXISTING_,0);

		 $$ = llu;
               }
          | TOK_UPDATE_LOB '(' TOK_LOB QUOTED_STRING ',' TOK_EMPTY_CLOB '(' ')' ')' 
               {
                 /* Truncate and insert empty_blob */
                 
		 
		 ConstValue * handle = new(PARSERHEAP()) ConstValue(*$4);
                 ExeUtilLobUpdate *llu =  
                   new (PARSERHEAP ()) ExeUtilLobUpdate
		   (handle, 
		    ExeUtilLobUpdate::FROM_BUFFER_,
		    0, 0, ExeUtilLobUpdate::TRUNCATE_EXISTING_,0);

		 $$ = llu;
               }
             

/* type pSchema */
optional_from_schema : /* empty */
               {
		 $$ = NULL;
	       }
               | TOK_FROM TOK_SCHEMA schema_name
               {
		 $$ = $3;
	       }

/* type relx */
exe_util_init_hbase :TOK_INITIALIZE TOK_TRAFODION 
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setInitHbase(TRUE);
                 de->setCreateMDViews(TRUE);
                 de->setReturnStatus(TRUE);

		 $$ = de;
	       }

           | TOK_INITIALIZE TOK_TRAFODION ',' TOK_MINIMAL
               {
 		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setInitHbase(TRUE);
                 de->setCreateMDViews(TRUE);
                 de->setMinimal(TRUE);
                 de->setReturnStatus(TRUE);

		 $$ = de;                
               }

          | TOK_INITIALIZE TOK_TRAFODION ',' TOK_NO TOK_RETURN TOK_STATUS
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setInitHbase(TRUE);
                 de->setCreateMDViews(TRUE);

		 $$ = de;
	       }
          | TOK_INITIALIZE TOK_TRAFODION ',' TOK_MINIMAL ',' TOK_NO TOK_RETURN TOK_STATUS
               {
 		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setInitHbase(TRUE);
                 de->setCreateMDViews(TRUE);
                 de->setMinimal(TRUE);

		 $$ = de;                
               }


             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_DROP
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setDropHbase(TRUE);
                 de->setDropMDViews(TRUE);

		 $$ = de;
	       }

           | TOK_INITIALIZE TOK_TRAFODION ',' TOK_CREATE TOK_METADATA TOK_VIEWS
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setCreateMDViews(TRUE);

		 $$ = de;
	       }

           | TOK_INITIALIZE TOK_TRAFODION ',' TOK_DROP TOK_METADATA TOK_VIEWS
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setDropMDViews(TRUE);

		 $$ = de;
	       }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_UPGRADE
               {
		 ExeUtilMetadataUpgrade * mu =
		   new(PARSERHEAP()) ExeUtilMetadataUpgrade(PARSERHEAP());
		 $$ = mu;
	       }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_CREATE TOK_SCHEMA TOK_OBJECTS
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setAddSchemaObjects(TRUE);

                 $$ = de;

               }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_CREATE TOK_LIBRARY TOK_MANAGEMENT
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
					         , PARSERHEAP() 
	                                         );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
                                                          (char*)stmt->data(),
                                                          stmtCharSet,
                                                          PARSERHEAP());
                 de->setCreateLibmgr(TRUE);

                 $$ = de;

               }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_DROP TOK_LIBRARY TOK_MANAGEMENT
               {
                 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
                 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
                                                 , PARSERHEAP()
                                                 );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
                                                          (char*)stmt->data(),
                                                          stmtCharSet,
                                                          PARSERHEAP());

                 de->setDropLibmgr(TRUE);

                 $$ = de;

               }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_UPGRADE TOK_LIBRARY TOK_MANAGEMENT
               {
                 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
                 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
                                                 , PARSERHEAP()
                                                 );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
                                                          (char*)stmt->data(),
                                                          stmtCharSet,
                                                          PARSERHEAP());

                 de->setUpgradeLibmgr(TRUE);

                 $$ = de;

               }

            | TOK_INITIALIZE TOK_TRAFODION ',' TOK_CREATE TOK_REPOSITORY
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());

                 de->setCreateRepos(TRUE);

                 $$ = de;
               }

           | TOK_INITIALIZE TOK_TRAFODION ',' TOK_DROP TOK_REPOSITORY
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());

                 de->setDropRepos(TRUE);

                 $$ = de;
               }

           | TOK_INITIALIZE TOK_TRAFODION ',' TOK_UPGRADE TOK_REPOSITORY
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());

                 de->setUpgradeRepos(TRUE);

                 $$ = de;
               }

             | TOK_INITIALIZE TOK_AUTHORIZATION
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

                 DDLExpr * de = new(PARSERHEAP()) DDLExpr
                   (NULL,
                    (char*)stmt->data(), 
                    stmtCharSet,
                    PARSERHEAP());

                 de->setInitAuth(TRUE);

                 $$ = de;

               }

             | TOK_INITIALIZE TOK_AUTHORIZATION ',' TOK_CLEANUP
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());

                 de->setCleanupAuth(TRUE);
                 $$ = de;

               }

             | TOK_INITIALIZE TOK_AUTHORIZATION ',' TOK_DROP
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());
                 de->setDropAuth(TRUE);

                 $$ = de;

               }

             | TOK_INITIALIZE TOK_TRAFODION ',' TOK_UPDATE TOK_SOFTWARE TOK_VERSION
               {
		 CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		 NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						   , PARSERHEAP() 
	                                       );

		 DDLExpr * de = new(PARSERHEAP()) DDLExpr(NULL,
							  (char*)stmt->data(),
							  stmtCharSet,
                                                          PARSERHEAP());
                 de->setUpdateVersion(TRUE);

		 $$ = de;
	       }

/* type relx */
exe_util_get_region_access_stats : TOK_GET TOK_REGION stats_or_statistics TOK_FOR TOK_TABLE table_name
               {
                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(*$6, FALSE, FALSE, TRUE, FALSE, NULL, PARSERHEAP());
	       } 
             | TOK_GET TOK_REGION stats_or_statistics TOK_FOR TOK_INDEX table_name
               {
                 $6->setSpecialType(ExtendedQualName::INDEX_TABLE);

                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(*$6, FALSE, TRUE, TRUE, FALSE, NULL, PARSERHEAP());
	       } 
             | TOK_GET TOK_REGION stats_or_statistics TOK_FOR rel_subquery 
               {
                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(
                        CorrName("DUMMY"), FALSE, TRUE, TRUE, FALSE, $5, PARSERHEAP());
	       } 
             | TOK_GET TOK_REGION stats_or_statistics TOK_FOR TOK_TABLE table_name ',' TOK_SUMMARY
               {
                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(*$6, TRUE, FALSE, TRUE, FALSE, NULL, PARSERHEAP());
	       } 
             | TOK_GET TOK_REGION stats_or_statistics TOK_FOR TOK_INDEX table_name ',' TOK_SUMMARY
               {
                 $6->setSpecialType(ExtendedQualName::INDEX_TABLE);

                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(*$6, TRUE, TRUE, TRUE, FALSE, NULL, PARSERHEAP());
	       } 
             | TOK_GET TOK_REGION stats_or_statistics TOK_FOR rel_subquery ',' TOK_SUMMARY
               {
                 $$ = new (PARSERHEAP()) 
                   ExeUtilRegionStats(
                        CorrName("DUMMY"), TRUE, TRUE, TRUE, FALSE, $5, PARSERHEAP());
	       } 

stats_or_statistics : TOK_STATS
                      {
                        $$ = TRUE;
                      }
                    | TOK_STATISTICS
                      {
                        $$ = TRUE;
                      }
 
exe_util_get_lob_info : TOK_GET TOK_LOB stats_or_statistics TOK_FOR TOK_TABLE table_name
               {
                 $$ = new (PARSERHEAP()) 
                   ExeUtilLobInfo(*$6, FALSE,NULL,  PARSERHEAP());
	       } 

exe_util_hive_query : TOK_PROCESS TOK_HIVE TOK_STATEMENT QUOTED_STRING
                      {
                        $$ = new (PARSERHEAP()) 
                          ExeUtilHiveQuery(*$4, ExeUtilHiveQuery::FROM_STRING,
                                           PARSERHEAP());
                      } 
                    | TOK_PROCESS TOK_HIVE TOK_DDL QUOTED_STRING
                      {
                        SqlParser_CurrentParser->hiveDDLInfo_->
                          setValues(TRUE, StmtDDLonHiveObjects::PASSTHRU_DDL_, StmtDDLonHiveObjects::UNKNOWN_TYPE_);

                        SqlParser_CurrentParser->hiveDDLInfo_->userSpecifiedStmt_ = *$4;
                        SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_ = TRUE;

                        // error out. Caller will handle this stmt.
                        YYERROR;
                        $$ = NULL;
                    }
                    | TOK_PROCESS TOK_HIVE TOK_STATEMENT TOK_FROM TOK_FILE QUOTED_STRING
                      {
                        $$ = new (PARSERHEAP()) 
                          ExeUtilHiveQuery(*$6, ExeUtilHiveQuery::FROM_FILE,
                                           PARSERHEAP());
                      } 
/*
 * The purpose of dummy_token_lookahead is to force the lexer to look
 * one token ahead.  This may be necessary in cases where the parser
 * has reduced before reaching a trailing semicolon.  In those cases,
 * ParGetTextStartEndPosForDisplayExplain() will not work correctly so
 * we force an extra token to be evaluated.  The intention of
 * dummy_token_lookahead is not to affect the grammar, but just
 * modify how bison works so more of the statement will be parsed when
 * ParGetTextStartEndPosForDisplayExplain() is called.  TOK_EXIT is not
 * expected to be seen in this location.  It was chosen because the
 * user probably won't accidentally place it at the end of an explain
 * command.
 */
dummy_token_lookahead: empty | TOK_EXIT
               ;

exe_util_display_explain: explain_starting_tokens explain_identifier
               {
		 ExeUtilDisplayExplain * eue = 
		   new (PARSERHEAP ()) ExeUtilDisplayExplain
		   (ExeUtilExpr::DISPLAY_EXPLAIN_,
		    (char*)NULL, CharInfo::UnknownCharSet,
		    NULL,
		    (char*)$2->data(),
		    ($1 ? (char*)$1->data() : NULL),
		    NULL,
		    PARSERHEAP());
		 //$$ = finalize(eue);
		 
		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 eue->xnNeeded() = FALSE;
		 
                 $$ = eue;
	       }

/* type stringval */
explain_identifier : IDENTIFIER
                       {
			 if ( ($1==NULL) || transformIdentifier(*$1)) 
			   YYERROR;
			 $$ = $1;
		       }
                     | DELIMITED_IDENTIFIER
                       {
			 if ( ($1==NULL) || transformIdentifier(*$1)) 
			   YYERROR;
			 $$ = $1;
		       }
                     | nonreserved_word_for_explain
                       {
                         NAString temp = *(unicodeToChar
                                          (ToTokvalPlusYYText(&$1)->yytext,
                                           ToTokvalPlusYYText(&$1)->yyleng,
                                           (CharInfo::CharSet) (
                                                                ComGetNameInterfaceCharSet()
                                                                ),
                                           PARSERHEAP()) );
                         temp.toUpper();
                         $$ = new (PARSERHEAP())NAString(temp);
                       }


exe_util_display_explain: explain_starting_tokens TOK_PROCEDURE '(' QUOTED_STRING ',' QUOTED_STRING ')'
               {
                 // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		 ExeUtilDisplayExplain * eue = 
		   new (PARSERHEAP ()) ExeUtilDisplayExplain
		   (ExeUtilExpr::DISPLAY_EXPLAIN_,
		    (char*)NULL, CharInfo::UnknownCharSet,
		    (char*)$4->data(),
		    (char*)$6->data(),
		    ($1 ? (char*)$1->data() : NULL),
		    NULL,
		    PARSERHEAP());
		 //$$ = finalize(eue);
		 
		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 eue->xnNeeded() = FALSE;
		 
                 $$ = eue;
	       }
exe_util_display_explain: explain_starting_tokens TOK_FOR TOK_QID qid_identifier
              {
                char * tmpString =
                          new (PARSERHEAP()) char[$4->length() + 5];
                strcpy(tmpString, "QID=");
                strncpy(tmpString+4, $4->data(), $4->length());
                tmpString[$4->length()+4] = '\0';
                ExeUtilDisplayExplain * eue =
                   new (PARSERHEAP ()) ExeUtilDisplayExplain
                   (ExeUtilExpr::DISPLAY_EXPLAIN_,
                    (char*)NULL, CharInfo::UnknownCharSet,
                    NULL,
                    tmpString,
                    ($1 ? (char*)$1->data() : NULL),
                    NULL,
                    PARSERHEAP());
                 //$$ = finalize(eue);

                 // xn will be started, if needed, when the exeutilstmt stmt
                 // is processed.
                 eue->xnNeeded() = FALSE;

                 $$ = eue;
              }
exe_util_display_explain: explain_starting_tokens TOK_QID qid_identifier TOK_FROM TOK_RMS
              {
                char * tmpString = 
			  new (PARSERHEAP()) char[$3->length() + 5];
	        strcpy(tmpString, "QID=");
	        strncpy(tmpString+4, $3->data(), $3->length());
	        tmpString[$3->length()+4] = '\0';
                ExeUtilDisplayExplain * eue = 
		   new (PARSERHEAP ()) ExeUtilDisplayExplain
		   (ExeUtilExpr::DISPLAY_EXPLAIN_,
		    (char*)NULL, CharInfo::UnknownCharSet,
		    NULL,
		    tmpString,
		    ($1 ? (char*)$1->data() : NULL),
		    NULL,
		    PARSERHEAP());
		 //$$ = finalize(eue);
		 
		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 eue->xnNeeded() = FALSE;
		 
                 $$ = eue;
              }
exe_util_display_explain: explain_starting_tokens TOK_QID qid_identifier TOK_FROM TOK_REPOSITORY
              {
                Int32 prefixLen = strlen("EXPLAIN_QID=");
                char * tmpString = 
			  new (PARSERHEAP()) char[$3->length() + prefixLen + 1];
	        strcpy(tmpString, "EXPLAIN_QID=");
	        strncpy(tmpString+prefixLen, $3->data(), $3->length());
	        tmpString[$3->length()+prefixLen] = '\0';
                ExeUtilDisplayExplain * eue = 
		   new (PARSERHEAP ()) ExeUtilDisplayExplain
		   (ExeUtilExpr::DISPLAY_EXPLAIN_,
		    (char*)NULL, CharInfo::UnknownCharSet,
		    NULL,
		    tmpString,
		    ($1 ? (char*)$1->data() : NULL),
		    NULL,
		    PARSERHEAP());

		 eue->xnNeeded() = FALSE;
		 
                 $$ = eue;
              }
exe_util_display_explain: explain_starting_tokens interactive_query_expression dummy_token_lookahead
                {
		  StringPos start;
		  StringPos end;
		  if (ParGetTextStartEndPosForDisplayExplain(
		       ParNameLocListPtr,start, end))
		    { yyerror(""); YYERROR; }
		  
		  char *inputStr = SQLTEXT();
		  CharInfo::CharSet inputStrCharSet = (CharInfo::CharSet)SQLTEXTCHARSET();

		  NAString * stmt = new(PARSERHEAP ()) NAString(PARSERHEAP ());
		  stmt->append(&inputStr[start], (end-start));
		  
		  NABoolean complexExplain = FALSE;
		  ExprNode * nodeToExplainComplex = NULL;

		  // Find out if a DDL or complex ExeUtil is being explained.
		  // A 'complex' statement requires multiple explains on each
		  // of the statements executed on behalf of the user query.
		  // For example: explain create table as select ...
		  // will require 2 explains to be issued internally. 
		  // One, to explain the
		  // 'create' and the other to explain the 'insert...select'.
		  // If it is, then create DisplayExplainComplex node. This node will
		  // cause multiple explains to be issued at runtime.
		  
		  
		  // Find out if this is a supported DDL explain.
		  if (($2->getOperatorType() == REL_DDL) ||
		      (($2->getOperatorType() == REL_ROOT) &&
		       ($2->castToRelExpr()->child(0)) && 
		       ($2->castToRelExpr()->child(0)->getOperatorType() == REL_DDL)))
		    {
		      DDLExpr * ddlExpr = NULL;
		      if ($2->getOperatorType() == REL_DDL)
			ddlExpr = (DDLExpr*)$2;
		      else
			ddlExpr = (DDLExpr*)($2->castToRelExpr()->child(0)->castToRelExpr());
		      if ((ddlExpr->showddlExplain()) &&
			  (NOT ddlExpr->showddlExplainInt()))
			{
			  complexExplain = TRUE;
			  nodeToExplainComplex = ddlExpr;
			}
		      else if (ddlExpr->getDDLNode() && ddlExpr->getDDLNode()->castToStmtDDLNode())
			{
			  complexExplain = ddlExpr->getDDLNode()->castToStmtDDLNode()->explainSupported();
			  if (complexExplain)
			    nodeToExplainComplex = ddlExpr;
			}
		    }
		  
		  // ExeUtil where explain is supported.
		  if (($2->getOperatorType() == REL_EXE_UTIL) ||
		      (($2->getOperatorType() == REL_ROOT) &&
		       ($2->castToRelExpr()->child(0)) && 
		       ($2->castToRelExpr()->child(0)->getOperatorType() == REL_EXE_UTIL)))
		    {
		      ExeUtilExpr * exeUtilExpr = NULL;
		      if ($2->getOperatorType() == REL_EXE_UTIL)
			exeUtilExpr = (ExeUtilExpr*)$2;
		      else
			exeUtilExpr = (ExeUtilExpr*)($2->castToRelExpr()->child(0)->castToRelExpr());

		      if (exeUtilExpr->explainSupported())
			{
			  complexExplain = TRUE;
			  nodeToExplainComplex = exeUtilExpr;
			}
		    }

		  ExeUtilDisplayExplain * eue = NULL;
		  if ((complexExplain) &&
		      (CmpCommon::getDefault(DDL_EXPLAIN) == DF_ON))
		    {
		      eue =
			new (PARSERHEAP ()) ExeUtilDisplayExplainComplex
			((char*)stmt->data(), inputStrCharSet,
			 ($1 ? (char*)$1->data() : NULL),
			 nodeToExplainComplex,
			 PARSERHEAP());
		    }
		  else
		    {
		      eue = 
			new (PARSERHEAP ()) ExeUtilDisplayExplain
			(ExeUtilExpr::DISPLAY_EXPLAIN_,
			 (char*)stmt->data(), inputStrCharSet,
			 NULL, NULL,
			 ($1 ? (char*)$1->data() : NULL),
			 $2,
			 PARSERHEAP());
		    }

		  // xn will be started, if needed, when the exeutilstmt stmt
		  // is processed.
		  eue->xnNeeded() = FALSE;

		  $$ = eue;
		  
		  delete stmt;
		}

/* type stringval */
optional_options : /* empty */
             { $$ = NULL; }
         | TOK_OPTION QUOTED_STRING
           /* DEFAULT_CHARSET has no effect on QUOTED_STRING in this context */
             { $$ = $2; }
         | TOK_OPTIONS QUOTED_STRING
           /* DEFAULT_CHARSET has no effect on QUOTED_STRING in this context */
             { $$ = $2; }

quoted_string_list : QUOTED_STRING
		 {
		  $$ = new (PARSERHEAP()) ConstStringList(PARSERHEAP ());
		  $$->insert($1);
		 }
		 | quoted_string_list ',' QUOTED_STRING
		 {
		  $1->insert($3);
		  $$ = $1;
		 }

col_fam_quoted_string_list : TOK_COLUMN TOK_FAMILY QUOTED_STRING
		 {
		  $$ = new (PARSERHEAP()) ConstStringList(PARSERHEAP ());
		  $$->insert($3);
		 }
		 | col_fam_quoted_string_list ',' TOK_COLUMN TOK_FAMILY QUOTED_STRING
		 {
		  $1->insert($5);
		  $$ = $1;
		 }

exe_util_maintain_object : TOK_MAINTAIN maintain_object_token table_name maintain_object_options
             {
	       ExeUtilMaintainObject::MaintainObjectType ot;
	       if ($2 == 1)
		 ot = ExeUtilMaintainObject::TABLE_;
	       else if ($2 == 2)
		 ot = ExeUtilMaintainObject::INDEX_;
	       else if ($2 == 3)
		 ot = ExeUtilMaintainObject::MV_;
	       else if ($2 == 4)
		 ot = ExeUtilMaintainObject::MVGROUP_;
	       else if ($2 == 5)
		 ot = ExeUtilMaintainObject::SCHEMA_;
	       else if ($2 == 6)
		 ot = ExeUtilMaintainObject::CATALOG_;
	       else  
		 ot = ExeUtilMaintainObject::MV_INDEX_;
	           
	       CorrName cn;
	       if (ot == ExeUtilMaintainObject::SCHEMA_)
		 {
		   if (NOT $3->getQualifiedNameObj().getCatalogName().isNull())
		     YYERROR;

		   cn = CorrName("DUMMY_OBJECT", PARSERHEAP(),
				 $3->getQualifiedNameObj().getObjectName(),
				 $3->getQualifiedNameObj().getSchemaName());
		 }
	       else if (ot == ExeUtilMaintainObject::CATALOG_)
		 {
		   if ((NOT $3->getQualifiedNameObj().getCatalogName().isNull()) ||
		       (NOT $3->getQualifiedNameObj().getSchemaName().isNull()))
		     YYERROR;

		   cn = CorrName("DUMMY_OBJECT", PARSERHEAP(),
				 "DUMMY_SCHEMA",
				 $3->getQualifiedNameObj().getObjectName());
		 }
	       else
		 cn = CorrName(*$3, PARSERHEAP());

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ot,
		      cn, //CorrName(*$3, PARSERHEAP()),
		      NULL,
		      $4,
		      PARSERHEAP());
	       
	       // xn will be started, if needed, when the exeutilstmt stmt
	       // is processed.
	       eue->xnNeeded() = FALSE;
	       
	       $$ = eue;
	       
	       delete $4;
	     }
            | TOK_MAINTAIN TOK_DATABASE maintain_object_options
             {
	       ExeUtilMaintainObject::MaintainObjectType ot;
	       ot = ExeUtilMaintainObject::DATABASE_;
	           
	       CorrName cn;
	       cn = CorrName("DUMMY_OBJECT", PARSERHEAP(),
			     "DUMMY_SCHEMA", "DUMMY_CATALOG");

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ot,
		      cn, 
		      NULL,
		      $3,
		      PARSERHEAP());
	       
	       // xn will be started, if needed, when the exeutilstmt stmt
	       // is processed.
	       eue->xnNeeded() = FALSE;
	       
	       $$ = eue;
	     }
            | TOK_MAINTAIN TOK_TABLES '(' pipeline_mv_name_list ')' maintain_object_options
             {
	       ExeUtilMaintainObject::MaintainObjectType ot;
	       ot = ExeUtilMaintainObject::TABLES_;
	           
	       CorrName cn;
	       cn = CorrName("DUMMY_OBJECT", PARSERHEAP(),
			     "DUMMY_SCHEMA", "DUMMY_CATALOG");

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ot,
		      cn,
		      $4,
		      $6,
		      PARSERHEAP());
	       
	       // xn will be started, if needed, when the exeutilstmt stmt
	       // is processed.
	       eue->xnNeeded() = FALSE;
	       
	       $$ = eue;
	     }
             | TOK_INITIALIZE_MAINTAIN
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());

	       ExeUtilMaintainObject::MaintainObjectOption * mto = 
		 new (PARSERHEAP ()) 
		 ExeUtilMaintainObject::MaintainObjectOption
		 (ExeUtilMaintainObject::INITIALIZE_,
		  0, NULL);
			    
	       mtol->insert(mto);

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ExeUtilMaintainObject::NOOP_,    // no-op
		      CorrName("DUMMY", PARSERHEAP()), // no-op
		      NULL,
		      mtol,
		      PARSERHEAP());
	       
	       eue->xnNeeded() = FALSE;

	       $$ = eue;
	     }
             | TOK_REINITIALIZE_MAINTAIN
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());

	       ExeUtilMaintainObject::MaintainObjectOption * mto = 
		 new (PARSERHEAP ()) 
		 ExeUtilMaintainObject::MaintainObjectOption
		 (ExeUtilMaintainObject::REINITIALIZE_,
		  0, NULL);
			    
	       mtol->insert(mto);

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ExeUtilMaintainObject::NOOP_,    // no-op
		      CorrName("DUMMY", PARSERHEAP()), // no-op
		      NULL,
		      mtol,
		      PARSERHEAP());
	       
	       eue->xnNeeded() = FALSE;

	       $$ = eue;
	     }
             | TOK_REINITIALIZE_MAINTAIN ',' TOK_DROP TOK_ONLY
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());

	       ExeUtilMaintainObject::MaintainObjectOption * mto = 
		 new (PARSERHEAP ()) 
		 ExeUtilMaintainObject::MaintainObjectOption
		 (ExeUtilMaintainObject::DROP_,
		  0, NULL);
			    
	       mtol->insert(mto);

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ExeUtilMaintainObject::NOOP_,    // no-op
		      CorrName("DUMMY", PARSERHEAP()), // no-op
		      NULL,
		      mtol,
		      PARSERHEAP());
	       
	       eue->xnNeeded() = FALSE;

	       $$ = eue;
	     }
             | TOK_REINITIALIZE_MAINTAIN ',' TOK_CREATE TOK_VIEW
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());

	       ExeUtilMaintainObject::MaintainObjectOption * mto = 
		 new (PARSERHEAP ()) 
		 ExeUtilMaintainObject::MaintainObjectOption
		 (ExeUtilMaintainObject::CREATE_VIEW_,
		  0, NULL);
			    
	       mtol->insert(mto);

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ExeUtilMaintainObject::NOOP_,    // no-op
		      CorrName("DUMMY", PARSERHEAP()), // no-op
		      NULL,
		      mtol,
		      PARSERHEAP());
	       
	       eue->xnNeeded() = FALSE;

	       $$ = eue;
	     }
             | TOK_REINITIALIZE_MAINTAIN ',' TOK_DROP TOK_VIEW
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());

	       ExeUtilMaintainObject::MaintainObjectOption * mto = 
		 new (PARSERHEAP ()) 
		 ExeUtilMaintainObject::MaintainObjectOption
		 (ExeUtilMaintainObject::DROP_VIEW_,
		  0, NULL);
			    
	       mtol->insert(mto);

	       ExeUtilMaintainObject * eue = 
		 new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ExeUtilMaintainObject::NOOP_,    // no-op
		      CorrName("DUMMY", PARSERHEAP()), // no-op
		      NULL,
		      mtol,
		      PARSERHEAP());
	       
	       eue->xnNeeded() = FALSE;

	       $$ = eue;
	     }
	     | TOK_MAINTAIN TOK_CLEAN maintain_object_options
             {
	       ExeUtilMaintainObject::MaintainObjectType ot;
	       
		   ot = ExeUtilMaintainObject::CLEAN_MAINTAIN_;
           
	       ExeUtilMaintainObject * eue = 
		     new (PARSERHEAP ()) ExeUtilMaintainObject(
		      ot,
		      CorrName("DUMMY", PARSERHEAP()), // information only
		      NULL,
		      $3,
		      PARSERHEAP());
	       
	       // xn will be started, if needed, when the exeutilstmt stmt
	       // is processed.
	       eue->xnNeeded() = FALSE;
	       
	       $$ = eue;
	       
	       delete $3;
	     }

maintain_object_token :  TOK_TABLE
                           {
			     $$ = 1;
			   }
                         | TOK_INDEX
                           {
			     $$ = 2;
			   }
                         | TOK_MV
                           {
			     $$ = 3;
			   }
                         | TOK_MVGROUP
                           {
			     $$ = 4;
			   }
                         | TOK_SCHEMA
                           {
			     $$ = 5;
			   }
                         | TOK_CATALOG
                           {
			     $$ = 6;
			   }

maintain_object_options : empty
             {
	       $$ = NULL;
	     }
        | ',' maintain_object_options_list
             {
	       $$ = $2;
	     }
;

maintain_object_options_list : maintain_object_option
             {
	       NAList<ExeUtilMaintainObject::MaintainObjectOption*> * mtol =
		 new (PARSERHEAP ()) NAList<ExeUtilMaintainObject::MaintainObjectOption*>(PARSERHEAP ());
	       mtol->insert($1);
	       $$ = mtol;
	     }
        | maintain_object_option ',' maintain_object_options_list
             {
	       $3->insert($1);
	       $$ = $3;
	     }
;

maintain_object_option : TOK_ALL 
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::ALL_,
			       0, NULL);
			    
			    $$ = mto;
			  }

                      | TOK_UPDATE TOK_STATISTICS optional_mt_options
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::UPD_STATS_TABLE_,
			       0, ($3 ? (char*)$3->data() : NULL));
			    
			    $$ = mto;
			  }

                      | TOK_REFRESH optional_mt_options
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::REFRESH_,
			       0, ($2 ? (char*)$2->data() : NULL));
			    
			    $$ = mto;
			  }

                      | TOK_REFRESH TOK_ALL TOK_MVS optional_mt_options
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::REFRESH_ALL_MVS_,
			       0, ($4 ? (char*)$4->data() : NULL));
			    
			    $$ = mto;
			  }

// Next maintain task options are not externalized.
                      | TOK_UPDATE TOK_MVLOG TOK_STATISTICS optional_mt_options
                          {
			    if (CmpCommon::getDefault(ALLOW_UNEXTERNALIZED_MAINTAIN_OPTIONS) == DF_OFF)
			      {
				YYERROR;
			      }

			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::UPD_STATS_MVLOG_,
			       0, ($4 ? (char*)$4->data() : NULL));
			    
			    $$ = mto;
			  }

                      | TOK_REFRESH TOK_MVGROUPS TOK_ONLY optional_mt_options
                          {
			    if (CmpCommon::getDefault(ALLOW_UNEXTERNALIZED_MAINTAIN_OPTIONS) == DF_OFF)
			      {
				YYERROR;
			      }

			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::REFRESH_MVGROUP_,
			       0, ($4 ? (char*)$4->data() : NULL));
			    
			    $$ = mto;
			  }

                      | TOK_REFRESH TOK_MVS TOK_ONLY optional_mt_options
                          {
			    if (CmpCommon::getDefault(ALLOW_UNEXTERNALIZED_MAINTAIN_OPTIONS) == DF_OFF)
			      {
				YYERROR;
			      }

			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::REFRESH_MVS_,
			       0, ($4 ? (char*)$4->data() : NULL));
			    
			    $$ = mto;
			  }
			  
	   	      | TOK_UPDATE TOK_STATISTICS TOK_ALL TOK_MVS optional_mt_options
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::UPD_STATS_ALL_MVS_,
			       0, ($5 ? (char*)$5->data() : NULL));
			    
			    $$ = mto;
			  }

// end unexternalized maintain task options

                       | TOK_GET TOK_DETAILS
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_DETAILS_,
			       0, "sf");
			    
			    $$ = mto;
			  }

                      | TOK_GET TOK_DETAILS TOK_OPTIONS QUOTED_STRING
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_DETAILS_,
			       0, (char*)$4->data());
			    
			    $$ = mto;
			  }

                      | TOK_GET TOK_STATUS
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_STATUS_,
			       0, "sf");
			    
			    $$ = mto;
			  }

                      | TOK_GET TOK_STATUS TOK_OPTIONS QUOTED_STRING
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_STATUS_,
			       0, (char*)$4->data());
			    
			    $$ = mto;
			  }
                      | TOK_GET TOK_LABEL TOK_STATISTICS 
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_LABEL_STATS_,
			       0, NULL);
			    
			    $$ = mto;
			  }
			  
                      | TOK_GET TOK_LABEL TOK_STATISTICS TOK_ALL TOK_INDEXES
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_LABELSTATS_INC_INDEXES_,
			       0, NULL);
			    
			    $$ = mto;
			  }

                      | TOK_GET TOK_LABEL TOK_STATISTICS TOK_ALL TOK_INTERNAL
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_LABELSTATS_INC_INTERNAL_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_GET TOK_LABEL TOK_STATISTICS TOK_ALL TOK_RELATED
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::GET_LABELSTATS_INC_RELATED_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                     
                      | TOK_RUN run_from run_to run_for
                          {
			    char * fromStr = (char*)($2 ? $2->data() : NULL);
			    char * toStr = (char*)($3 ? $3->data() : NULL);

			    UInt32 fractionPrec1;
			    UInt32 fractionPrec2;
			    DatetimeValue * from = NULL;
			    DatetimeValue * to = NULL;
			    Int64 * fromJTS = NULL;
			    Int64 * toJTS = NULL;
			    Int64 forVal = $4;

			    if (fromStr)
			      {
				from = 
				  new (PARSERHEAP()) DatetimeValue(fromStr, REC_DATE_YEAR, REC_DATE_SECOND, fractionPrec1, FALSE);
			      }

			    if (toStr && (forVal > 0))
			      YYERROR;

			    if (toStr)
			      {
				to = 
				  new (PARSERHEAP()) DatetimeValue(toStr, REC_DATE_YEAR, REC_DATE_SECOND, fractionPrec2, FALSE);
			      }

			    if ((from && (! from->isValid())) ||
				(to && (! to->isValid())))
			      YYERROR;

			    if (from)
			      {
				fromJTS = (Int64 *)(new (PARSERHEAP()) char[sizeof(Int64)]);
				*fromJTS = DatetimeType::julianTimestampValue
				  ((char*)from->getValue(), from->getValueLen(), fractionPrec1);
				if (*fromJTS <= 0)
				  YYERROR;
			      }

			    toJTS = (Int64 *)(new (PARSERHEAP()) char [sizeof(Int64)]);
			    if (to)
			      {
				*toJTS = DatetimeType::julianTimestampValue
				  ((char*)to->getValue(), to->getValueLen(), fractionPrec2);

				if (*toJTS <= 0)
				  YYERROR;
			      }
				
			    if (forVal > 0)
			      {
				if (! from)
				  {
				    *toJTS = CONVERTTIMESTAMP(JULIANTIMESTAMP(0,0,0,-1),0,-1,0);
				  }
				*toJTS = *toJTS + forVal * 1000000;
			      }

			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::RUN_,
			       (fromJTS ? sizeof(Int64) : 0),
			       (fromJTS ? (char*)fromJTS : NULL),
			       (toJTS ? sizeof(Int64) : 0),
			       (toJTS ? (char*)toJTS : NULL));
			    
			    $$ = mto;
			  }

                      | TOK_IF TOK_NEEDED
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::IF_NEEDED_,
			       0, NULL, 0, NULL);

			    $$ = mto;
			  }

                      | TOK_MAX NUMERIC_LITERAL_EXACT_NO_SCALE TOK_TABLES
                        {
			  ExeUtilMaintainObject::MaintainObjectOption * mto = 
			    new (PARSERHEAP ()) 
			    ExeUtilMaintainObject::MaintainObjectOption
			    (ExeUtilMaintainObject::MAX_TABLES_,
			     atol($2->data()), NULL);
			  
			  $$ = mto;
			}

                      | TOK_ENABLE
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::ENABLE_,
			       0, NULL);
			    
			    $$ = mto;
			  }

                      | TOK_DISABLE
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::DISABLE_,
			       0, NULL);
			    
			    $$ = mto;
			  }

                      | TOK_RESET
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::RESET_,
			       0, NULL);
			    
			    $$ = mto;
			  }

                      | TOK_CONTINUE TOK_ON TOK_ERROR
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::CONTINUE_ON_ERROR_,
			       1, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_STOP TOK_ON TOK_ERROR
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::CONTINUE_ON_ERROR_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_RETURN TOK_SUMMARY
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::RETURN_SUMMARY_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_RETURN TOK_SUMMARY TOK_OPTIONS QUOTED_STRING
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::RETURN_SUMMARY_,
			       0, (char*)$4->data());
			    
			    $$ = mto;
			  }
                      | TOK_RETURN TOK_DETAIL TOK_OUTPUT
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::RETURN_DETAIL_OUTPUT_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_DISPLAY
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::DISPLAY_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_DISPLAY TOK_DETAIL
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::DISPLAY_DETAIL_,
			       0, NULL);
			    
			    $$ = mto;
			  }
                      | TOK_NO TOK_OUTPUT
                          {
			    ExeUtilMaintainObject::MaintainObjectOption * mto = 
			      new (PARSERHEAP ()) 
			      ExeUtilMaintainObject::MaintainObjectOption
			      (ExeUtilMaintainObject::NO_OUTPUT_,
			       0, NULL);
			    
			    $$ = mto;
			  }

/* type stringval */
run_from    :  TOK_FROM TOK_TIMESTAMP QUOTED_STRING 
                      {
			$$ = $3;
		      }
                   | /* empty */
                     {
		       $$ = NULL;
		     }

/* type stringval */
run_to      :  TOK_TO TOK_TIMESTAMP QUOTED_STRING 
                      {
			$$ = $3;
		      }
                   | /* empty */
                     {
		       $$ = NULL;
		     }

/* type longint */
run_for :  TOK_FOR_MAXRUNTIME maxruntime_interval
                      {
			$$ = $2;
		      }
                | /* empty */
                     {
		       $$ = 0;
		     }

/* stringval */
optional_mt_options :   QUOTED_STRING
                     {
                       // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		       $$ = $1;
		     }
                   | /* empty */
                     {
		       $$ = NULL;
		     }

/* type corrName */
truncate_table_name : TOK_PURGEDATA optional_if_exists_clause table_name 
                        {
                          $$ = new(PARSERHEAP()) 
                            PtrPlaceHolder($3, 
                                           ($2 ? new(PARSERHEAP()) NAString() 
                                            : NULL));
                        }
                        | TOK_TRUNCATE optional_if_exists_clause 
                        {
                          SqlParser_CurrentParser->hiveDDLInfo_->
                            setValues(TRUE, StmtDDLonHiveObjects::TRUNCATE_, StmtDDLonHiveObjects::TABLE_, $2);
                        }
                        ddl_qualified_name
                        {
                          CorrName * cn = new(PARSERHEAP()) CorrName(*$4, PARSERHEAP());
                          $$ = new(PARSERHEAP()) 
                            PtrPlaceHolder(cn, 
                                           ($2 ? new(PARSERHEAP()) NAString() 
                                            : NULL));
                        }
                        | TOK_TRUNCATE TOK_TABLE optional_if_exists_clause 
                        {
                          SqlParser_CurrentParser->hiveDDLInfo_->
                            setValues(TRUE, StmtDDLonHiveObjects::TRUNCATE_, StmtDDLonHiveObjects::TABLE_, $3);
                        }
                        ddl_qualified_name
                        {
                          CorrName * cn = new(PARSERHEAP()) CorrName(*$5, PARSERHEAP());
                          $$ = new(PARSERHEAP()) 
                            PtrPlaceHolder(cn, 
                                           ($3 ? new(PARSERHEAP()) NAString() 
                                            : NULL));
                        }

truncate_table :  truncate_table_name 
		     {
                       PtrPlaceHolder *pph = $1;

		       CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
		       NAString * stmt = getSqlStmtStr ( stmtCharSet
		                                       , PARSERHEAP()
		                                       );
		       if ( stmt == NULL )
		       {
		         *SqlParser_Diags <<  DgSqlCode(-3406);
		         YYERROR;
		       }
                       CorrName *cn = (CorrName*) pph->ptr1_;
                       NABoolean ifExists = (pph->ptr2_ != NULL);

                       DDLExpr * ddlExpr = new(PARSERHEAP()) 
                         DDLExpr(NULL,
                                 (char*)stmt->data(),
                                 CharInfo::UnknownCharSet,
                                 CmpCommon::statementHeap());
                       ddlExpr->setPurgedata(TRUE);
                       ddlExpr->setPurgedataTableName(*cn);
                       ddlExpr->setPurgedataIfExists(ifExists);
                       
                       $$ = ddlExpr;
                     }

exe_util_aqr: TOK_GET TOK_ALL TOK_AQR TOK_ENTRIES
               {
		 ExeUtilAQR * eua = 
		   new (PARSERHEAP ()) ExeUtilAQR(
			ExeUtilAQR::GET_,
			NULL,
			PARSERHEAP());
		 
		 $$ = eua;
	       }

exe_util_aqr: TOK_SET TOK_AQR TOK_CLEAR TOK_ALL TOK_ENTRIES
               {
		 ExeUtilAQR * eua = 
		   new (PARSERHEAP ()) ExeUtilAQR(
			ExeUtilAQR::CLEAR_,
			NULL,
			PARSERHEAP());
		 
		 $$ = eua;
	       }

exe_util_aqr: TOK_SET TOK_AQR TOK_RESET TOK_ALL TOK_ENTRIES
               {
		 ExeUtilAQR * eua = 
		   new (PARSERHEAP ()) ExeUtilAQR(
			ExeUtilAQR::RESET_,
			NULL,
			PARSERHEAP());
		 
		 $$ = eua;
	       }

exe_util_aqr: TOK_SET TOK_AQR TOK_ENTRY aqr_task aqr_options_list
               {
		 ExeUtilAQR::AQRTask task;
		 if ($4 == 1)
		   task = ExeUtilAQR::ADD_;
		 else if ($4 == 2)
		   task = ExeUtilAQR::DELETE_;
		 else if ($4 == 3)
		   task = ExeUtilAQR::UPDATE_;
		 else
		   task = ExeUtilAQR::NONE_;

		 ExeUtilAQR * eua = 
		   new (PARSERHEAP ()) ExeUtilAQR(
			task,
			$5,
			PARSERHEAP());
		 
		 $$ = eua;
		 
		 delete $5;
	       }

aqr_task :   TOK_ADD { $$ = 1; }
           | TOK_DELETE { $$ = 2; }
           | TOK_UPDATE { $$ = 3; }

aqr_options_list : aqr_option
                      {
			NAList<ExeUtilAQR::AQROption*> * o =
			  new (PARSERHEAP ()) NAList<ExeUtilAQR::AQROption*>(PARSERHEAP ());
			o->insert($1);
			$$ = o;
		      }
                  | aqr_option ',' aqr_options_list
                      {
			$3->insert($1);
			$$ = $3;
		      }
;

aqr_option : TOK_SQLCODE '=' NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
		 Lng32 longIntVal = atol(*$3);
			if (longIntVal < 0)
			  {
			    // Error: Expected an unsigned integer
			    *SqlParser_Diags << DgSqlCode(-3017) 
					     << DgString0(*$3);
			  }
			
			ExeUtilAQR::AQROption * o = 
			  new (PARSERHEAP ()) ExeUtilAQR::AQROption
			  (ExeUtilAQR::SQLCODE_,
			   longIntVal, NULL);
			
			$$ = o;
		      }
             | TOK_NSK_CODE '=' NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
		 Lng32 longIntVal = atol(*$3);
			if (longIntVal < 0)
			  {
			    // Error: Expected an unsigned integer
			    *SqlParser_Diags << DgSqlCode(-3017) 
					     << DgString0(*$3);
			  }
			
			ExeUtilAQR::AQROption * o = 
			  new (PARSERHEAP ()) ExeUtilAQR::AQROption
			  (ExeUtilAQR::NSKCODE_,
			   longIntVal, NULL);
			
			$$ = o;
		      }
             | TOK_NUMBER TOK_OF TOK_RETRIES '=' NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
		 Lng32 longIntVal = atol(*$5);
			if (longIntVal < 0)
			  {
			    // Error: Expected an unsigned integer
			    *SqlParser_Diags << DgSqlCode(-3017) 
					     << DgString0(*$5);
			  }
			
			ExeUtilAQR::AQROption * o = 
			  new (PARSERHEAP ()) ExeUtilAQR::AQROption
			  (ExeUtilAQR::RETRIES_,
			   longIntVal, NULL);
			
			$$ = o;
		      }
             | TOK_DELAY '=' NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
		 Lng32 longIntVal = atol(*$3);
			if (longIntVal < 0)
			  {
			    // Error: Expected an unsigned integer
			    *SqlParser_Diags << DgSqlCode(-3017) 
					     << DgString0(*$3);
			  }
			
			ExeUtilAQR::AQROption * o = 
			  new (PARSERHEAP ()) ExeUtilAQR::AQROption
			  (ExeUtilAQR::DELAY_,
			   longIntVal, NULL);
			
			$$ = o;
		      }
             | TOK_TYPE '=' NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
		 Lng32 longIntVal = atol(*$3);
			if (longIntVal < 0)
			  {
			    // Error: Expected an unsigned integer
			    *SqlParser_Diags << DgSqlCode(-3017) 
					     << DgString0(*$3);
			  }
			
			ExeUtilAQR::AQROption * o = 
			  new (PARSERHEAP ()) ExeUtilAQR::AQROption
			  (ExeUtilAQR::TYPE_,
			   longIntVal, NULL);
			
			$$ = o;
		      }

/* type relx */
//HBASE LOAD 
load_statement : TOK_LOAD TOK_TRANSFORM load_sample_option TOK_INTO table_name query_expression optional_limit_spec
                  {
                    //disabled by default in 0.8.0 release 
                    if (CmpCommon::getDefault(COMP_BOOL_226) != DF_ON)
                      YYERROR; 

                    //limit clause
                    if ($7)
                    {
                      RelExpr *query = $6;
          
                      if (query->getFirstNRows() >= 0)
                        {
                          // cannot specify LIMIT and FIRST N clauses together.
                          YYERROR;
                        }
                      else
                        {
                          NABoolean negate;
                          if ($7->castToConstValue(negate))
                            {
                              ConstValue * limit = (ConstValue*)$7;
                              Lng32 scale = 0;
                              query->setFirstNRows(limit->getExactNumericValue(scale));
                            }
                        }
                    }

                    $$ = new (PARSERHEAP())
                          HBaseBulkLoadPrep(CorrName(*$5, PARSERHEAP()),
                                            NULL,
                                            REL_HBASE_BULK_LOAD,
                                            $6,
                                            $3//,
                                            //NULL
                                            );  
                    }
                   | TOK_LOAD optional_hbbload_options TOK_INTO table_name query_expression optional_limit_spec
                    {
                      CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
                      NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
                                                      , PARSERHEAP() // in  - NAMemory * 
                                                      );

                      // If we can not get a variable-width multi-byte or single-byte string here, report error 
                      if ( stmt == NULL )
                      {
                        *SqlParser_Diags <<  DgSqlCode(-3406);
                        YYERROR;
                      }
                      UInt32 pos = 
                          stmt->index(" into ", 0, NAString::ignoreCase);
                       
                      RelRoot *top = finalize($5);
                      //limit clause
                      if ($6)
                      {
                        if (top->getFirstNRows() >= 0)
                          {
                            // cannot specify LIMIT and FIRST N clauses together.
                            YYERROR;
                          }
                        else
                          {
                            NABoolean negate;
                            if ($6->castToConstValue(negate))
                              {
                                ConstValue * limit = (ConstValue*)$6;
                                Lng32 scale = 0;
                                top->setFirstNRows(limit->getExactNumericValue(scale));
                                top->setFirstNRowsParam(NULL);
                              }
                          }
                      }

                      ExeUtilHBaseBulkLoad * eubl = new (PARSERHEAP()) 
                                        ExeUtilHBaseBulkLoad(CorrName(*$4, PARSERHEAP()),
                                        NULL,
                                        NULL,
                                        stmtCharSet,
                                        top,
                                        PARSERHEAP());
                      if (eubl->setOptions($2, SqlParser_Diags))
                             YYERROR; 

                      NAString stmt1;
                      if (eubl->getUpsertUsingLoad())
                      {
                        stmt1 = "UPSERT USING LOAD ";
                        stmt1.append((char*)&(stmt->data()[pos])); 
                        eubl->setStmtText((char*)stmt1.data(), stmtCharSet);
                      }
                      else
                      {
                        stmt1 = "LOAD TRANSFORM ";
                        if (eubl->getUpdateStats())
                          stmt1.append("WITH SAMPLE ");
                        stmt1.append((char*)&(stmt->data()[pos])); 
                        eubl->setStmtText((char*)stmt1.data(), stmtCharSet);
                      }
                      $$ = finalize(eubl);
                    
                    }
                                            
                    //delete $3;
                    //delete $4;
                  //}

                    |   TOK_LOAD  TOK_COMPLETE TOK_FOR TOK_TABLE table_name
                      {
                        //disabled by default in 0.8.0 release 
                        if (CmpCommon::getDefault(COMP_BOOL_226) != DF_ON)
                          YYERROR; 
                          
                          ExeUtilHBaseBulkLoadTask::TaskType tt = ExeUtilHBaseBulkLoadTask::COMPLETE_BULK_LOAD_;
                          if (CmpCommon::getDefault(TRAF_LOAD_PREP_KEEP_HFILES) == DF_ON)
                            tt = ExeUtilHBaseBulkLoadTask::COMPLETE_BULK_LOAD_N_KEEP_HFILES_;
                            
                          ExeUtilHBaseBulkLoadTask * hblt = new (PARSERHEAP())   
                                              ExeUtilHBaseBulkLoadTask(CorrName(*$5, PARSERHEAP()),
                                              NULL,
                                              NULL,
                                              CharInfo::UnknownCharSet,
                                              tt,
                                              PARSERHEAP());
                          $$ = finalize(hblt);         
                          
                      }
                    |   TOK_LOAD  TOK_CLEANUP TOK_FOR TOK_TABLE table_name
                      {
                        //disabled by default in 0.8.0 release 
                        if (CmpCommon::getDefault(COMP_BOOL_226) != DF_ON)
                          YYERROR; 
                          
                          ExeUtilHBaseBulkLoadTask::TaskType tt = ExeUtilHBaseBulkLoadTask::PRE_LOAD_CLEANUP_;
                            
                          ExeUtilHBaseBulkLoadTask * hblt = new (PARSERHEAP())   
                                              ExeUtilHBaseBulkLoadTask(CorrName(*$5, PARSERHEAP()),
                                              NULL,
                                              NULL,
                                              CharInfo::UnknownCharSet,
                                              tt,
                                              PARSERHEAP());
                          $$ = finalize(hblt);         
                          
                      }   

load_sample_option : TOK_WITH TOK_SAMPLE
                            {
                              if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                              {
                                yyerror("");
                                YYERROR;     /*internal syntax only!*/
                              }
                              $$ = TRUE;
                            }
                            | empty
                            {
                              $$ = FALSE;
                            }

optional_hbbload_options : TOK_WITH hbbload_option_list
                            {
                               $$ = $2;
                            }
                            | empty /* empty */
                            {
                                $$ = NULL;
                            }
                            
hbbload_option_list : hbbload_option
                      {
                        NAList<ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*> * hbol =
			  new (PARSERHEAP ()) NAList<ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*>(PARSERHEAP ());
                        hbol->insert($1);
                        $$ = hbol;
                      }
                      | hbbload_option ',' hbbload_option_list
                      {
                          $3->insert($1);
                          $$ = $3;
                      }
                      | hbbload_option  hbbload_option_list
                      {
                          $2->insert($1);
                          $$ = $2;
                      }

hbbload_option :  hbb_no_recovery_option
                | hbb_truncate_option
                | hbb_update_stats_option
                | hbb_continue_on_error
                | hbb_stop_after_n_error_rows
                | hbb_log_error_rows
                | hbb_no_duplicate_check
                | hbb_no_output
                | hbb_rebuild_indexes
                | hbb_constraints
                | hbb_index_table_only
                | hbb_upsert_using_load
                
              
hbb_no_recovery_option : TOK_NO TOK_RECOVERY
                    {
                    //NO ROLLBACK
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::NO_ROLLBACK_,
                                          0,
                                          NULL);
                      $$ = op;
                    }
hbb_truncate_option : TOK_TRUNCATE TOK_TABLE
                    {
                      //TRUNCATE
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::TRUNCATE_TABLE_,
                                          0,
                                          NULL);
                      $$ = op;
                    }
hbb_update_stats_option : TOK_UPDATE TOK_STATISTICS
                    {
                      //UPDATE STATISTICS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::UPDATE_STATS_,
                                          0,
                                          NULL);
                      $$ = op;
                    }
hbb_index_table_only :   TOK_INDEX TOK_TABLE TOK_ONLY
                    {
                      if (!Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                        YYERROR;
                      //the target table is index table in this case
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::INDEX_TABLE_ONLY_,
                                          0,
                                          NULL);
                      $$ = op;
                    }                   
hbb_no_duplicate_check   : TOK_NO TOK_DUPLICATE TOK_CHECK
                    { //NO DUPLICATES
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::NO_DUPLICATE_CHECK_, 
                                          0, 
                                          NULL);
                      $$ = op;
                    }
hbb_continue_on_error : TOK_CONTINUE TOK_ON TOK_ERROR
                    { //LOG_ERRORS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::CONTINUE_ON_ERROR_, 0, NULL);
                      $$ = op;
                    }
hbb_log_error_rows : TOK_LOG TOK_ERROR TOK_ROWS
                    { //LOG_ERRORS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::LOG_ERROR_ROWS_, 0, NULL);
                      $$ = op;
                    }                    
                    | TOK_LOG TOK_ERROR TOK_ROWS  TOK_TO QUOTED_STRING
                    { //LOG_ERRORS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::LOG_ERROR_ROWS_, 0, (char*)$5->data());
                      $$ = op;
                    }                    
hbb_stop_after_n_error_rows: TOK_STOP TOK_AFTER unsigned_integer TOK_ERROR TOK_ROWS                
                    { //LOG_ERRORS
                    
                    // need to give error if unsigned_integer ==0
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::STOP_AFTER_N_ERROR_ROWS_, $3, NULL);
                      $$ = op;
                    }      
hbb_no_output :  TOK_NO TOK_OUTPUT
                    { //INDEXES
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::NO_OUTPUT_, 
                                           0, 
                                           NULL);
                      $$ = op;
                    }                     
hbb_rebuild_indexes   : TOK_REBUILD TOK_INDEXES
                    { //INDEXES
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::REBUILD_INDEXES_,
                                           0, 
                                           NULL);
                      $$ = op;
                    } 
hbb_constraints   : TOK_CONSTRAINTS
                    {//CONSTRAINTS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::CONSTRAINTS_,
                                           0,
                                           NULL);
                      $$ = op;
                    }    

hbb_upsert_using_load : TOK_UPSERT TOK_USING TOK_LOAD 
                    {//CONSTRAINTS
                      ExeUtilHBaseBulkLoad::HBaseBulkLoadOption*op = 
                              new (PARSERHEAP ()) ExeUtilHBaseBulkLoad::HBaseBulkLoadOption
                                          (ExeUtilHBaseBulkLoad::UPSERT_USING_LOAD_,
                                           0,
                                           NULL);
                      $$ = op;
                    }    

//url_string : QUOTED_STRING

 unload_statement : TOK_UNLOAD optional_hbb_unload_options TOK_INTO std_char_string_literal query_expression 
                {
                  CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
                  NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
                                                  , PARSERHEAP() // in  - NAMemory * 
                                                  );
                  // If we can not get a variable-width multi-byte or single-byte string here, report error 
                  if ( stmt == NULL )
                  {
                    *SqlParser_Diags <<  DgSqlCode(-3406);
                    YYERROR;
                  }
               
                  RelRoot *top = finalize($5);

                  ExeUtilHBaseBulkUnLoad * eubl = new (PARSERHEAP()) 
                                    ExeUtilHBaseBulkUnLoad(CorrName("DUMMY", PARSERHEAP()),
                                    NULL,
                                    (char*)stmt->data(),
                                    $4,
                                    stmtCharSet,
                                    top,
                                    PARSERHEAP());
                  if (eubl->setOptions($2, SqlParser_Diags))
                    YYERROR; 
                  $$ = finalize(eubl);    
                
                }
                | TOK_UNLOAD TOK_EXTRACT optional_hbb_unload_options TOK_TO std_char_string_literal  query_expression 
                {
                  if (CmpCommon::getDefault(COMP_BOOL_226) != DF_ON)
                    YYERROR;
                  FastExtract* fastExt = 
                    new (PARSERHEAP()) FastExtract($6, $5, 
                                      FastExtract::FILE, 
                                      PARSERHEAP());
                  if (fastExt->setOptions($3, SqlParser_Diags))
                  YYERROR;
                  $$ = fastExt;
                  delete $5;
                  delete $3;
                }

optional_hbb_unload_options : TOK_WITH hbb_unload_option_list
                {
                    $$ = $2;
                }
                | empty
                {
                    $$ = NULL;
                }
                            
hbb_unload_option_list : hbb_unload_option
                {
                   NAList<UnloadOption*> * hbol =
		     new (PARSERHEAP ()) NAList<UnloadOption*>(PARSERHEAP ());
                   hbol->insert($1);
                   $$ = hbol;
                }
                | hbb_unload_option  hbb_unload_option_list
                {
                   $2->insert($1);
                   $$ = $2;
                }

hbb_unload_option:   hbb_unload_empty_target
                | hbb_unload_compress
                | hbb_unload_one_file
                | hbb_unload_no_output
                | hbb_unload_delimiter
                | hbb_unload_record_separator
                | hbb_unload_null_string
                | hbb_unload_header
                | hbb_unload_append
                | hbb_unload_snapshot


 hbb_unload_empty_target: TOK_PURGEDATA TOK_FROM TOK_TARGET
                {
                //purge target folder
                  UnloadOption *op = 
                        new (PARSERHEAP ()) UnloadOption(UnloadOption::EMPTY_TARGET_,0,NULL);
                  $$ = op;
                }
                | TOK_TRUNCATE TOK_FROM TOK_TARGET
                {
                //purge target folder
                  UnloadOption *op = 
                        new (PARSERHEAP ()) UnloadOption(UnloadOption::EMPTY_TARGET_,0,NULL);
                  $$ = op;
                }
                
 hbb_unload_compress: TOK_COMPRESSION TOK_GZIP
                {
                  //COMPRESSION
                  UnloadOption *op = 
                        new (PARSERHEAP ()) UnloadOption(UnloadOption::COMPRESS_,1,NULL);
                  $$ = op;
                }

 hbb_unload_one_file: TOK_MERGE TOK_FILE std_char_string_literal hbb_unload_optional_overwrite
                {
                //merge files
                  UnloadOption *op = 
                      new (PARSERHEAP ()) UnloadOption(UnloadOption::ONE_FILE_, $4 ? 1 : 0 ,(char *)$3->data());
                  $$ = op;
                }
 hbb_unload_no_output: TOK_NO TOK_OUTPUT
                {
                  //NO OUTPUT
                   UnloadOption *op = 
                        new (PARSERHEAP ()) UnloadOption(UnloadOption::NO_OUTPUT_,0,NULL);
                  $$ = op;
                }
                                  
 hbb_unload_delimiter : TOK_DELIMITER std_char_string_literal
                {
                   UnloadOption *op = 
                          new (PARSERHEAP ()) UnloadOption(UnloadOption::DELIMITER_,0,(char *)$2->data());
                   $$ = op;
                }
                | TOK_DELIMITER unsigned_smallint
                {
                //only 1-255 are supported
                  if ($2 > 0 && $2 < 256 )
                  {
                    char * charVal = new (PARSERHEAP()) char[2];
                    charVal[0] = (char)$2;
                    charVal[1] = 0;
                    UnloadOption *op = 
                              new (PARSERHEAP ()) UnloadOption(UnloadOption::DELIMITER_,1,charVal);
                    $$ = op;
                  }
                  else
                    YYERROR;
                }   
 hbb_unload_record_separator: TOK_RECORD_SEPARATOR  std_char_string_literal
                {
                  UnloadOption *op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::RECORD_SEP_,0,(char *)$2->data());
                  $$ = op;
                }
                | TOK_RECORD_SEPARATOR unsigned_smallint
                {
                  //only 1-255 are supported
                  if ($2 > 0 && $2 < 256)
                  {
                    char * charVal = new (PARSERHEAP()) char[2];
                    charVal[0] = (char)$2;
                    charVal[1] = 0;
                    UnloadOption *op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::RECORD_SEP_,1,charVal);
                    $$ = op;
                  }
                  else
                  YYERROR;
                }     
hbb_unload_null_string : TOK_NULL_STRING std_char_string_literal
                {
                  UnloadOption *op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::NULL_STRING_,0,(char *)$2->data());
                  $$ = op;
                }      

hbb_unload_header: TOK_NO TOK_HEADER
                {
                  UnloadOption *op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::HEADER_,0,NULL);
                  $$ = op;
                }
        
hbb_unload_append: TOK_APPEND
                {
                   UnloadOption*op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::APPEND_,1,NULL);
                   $$ = op;
                } 
 hbb_unload_snapshot: hbb_unload_existing_snap TOK_SNAPSHOT  TOK_HAVING TOK_SUFFIX QUOTED_STRING 
                {
                   ExeUtilHBaseBulkUnLoad::ScanType scanType = ($1 == FALSE) ? ExeUtilHBaseBulkUnLoad::SNAPSHOT_SCAN_CREATE_ : 
                                                                                    ExeUtilHBaseBulkUnLoad::SNAPSHOT_SCAN_EXISTING_;
                   char * suffix = NULL;
                   if ($5 != NULL) 
                      suffix = (char *)$5->data();
                   UnloadOption*op = 
                                  new (PARSERHEAP ()) UnloadOption(UnloadOption::USE_SNAPSHOT_SCAN_,(int)scanType,suffix);
                   $$ = op;                
                }
hbb_unload_existing_snap: TOK_NEW 
                          { 
                           $$ = FALSE;
                          }
                        | TOK_EXISTING
                          {
                            $$ = TRUE;
                          }

hbb_unload_optional_overwrite : TOK_OVERWRITE
         {
            $$ = TRUE;
         }
         | empty
         {
             $$ = FALSE;
         }        

// Raj P - 7/2000
// CALL <proc-name>	
standalone_call_statement: TOK_CALL {beginCallStmtParsing();} routine_invocation
				{
				  $$ = finalize($3);
				}
			   | '{' TOK_CALL {beginCallStmtParsing();} routine_invocation '}'
				{
				  $$ = finalize($4);
			        }

// Raj P - 7/2000
// Type relx
// We only support CallSP for now, but it will be extended to support
// other types of UDR's in the future
routine_invocation: routine_name '(' routine_arg_list ')'
                                {
	CallSP	      *expr = NULL;
	QualifiedName *qualifiedProcName;

	if ( in3GL_ > 0 && InsideTriggerDefinition == FALSE )
	{
	  *SqlParser_Diags <<  DgSqlCode(-4306);
	  $$ = NULL;
	  return NULL;	  
	}
	
	// Support for C/COBOL preprocessor
        if (CmpCommon::context()->GetMode() == STMT_STATIC)
	  TheHostVarRoles->setAllAssignedInputTo (HV_IS_INPUT_OUTPUT);
	
	switch ( $1->numParts ())
	{
	    case 1:
	    case 2:
	    case 3:
                qualifiedProcName = qualifiedNameFromStrings($1);
		break;
	  default:
	  {
	    // Error
	    NAString errName;
	    errName.append($1->extract (0)->data ());
	    for (Int32 i=1; i < $1->numParts (); i++)
	    {
	      errName.append (".");
	      errName.append ($1->extract (i)->data ());
	    }
	    
            *SqlParser_Diags << DgSqlCode(-3011) << DgString0 (errName);
	    $$ = NULL;
            return NULL;
	  }
          break;
		
	}

	expr = new (PARSERHEAP ())CallSP ( *qualifiedProcName,
					   PARSERHEAP () );
	if ( $3 )
	{
	    // expr->setChild ( 0, paramTuple );
	  expr->setProcAllParamsTree ( $3 );
	}
	
        $$ = (RelExpr *) expr;
                                }

// Raj P - 7/2000
routine_name: qualified_name
              {
                 // helps with computing trigger text
                 //
                 ParInsertNameLoc($1->getPosition(), $1->getNameLength());
  	         $$ = $1;
              }

// Raj P - 7/2000
routine_arg_list: /* empty */
                {
		    $$ = NULL;
                }
                | value_expression_list
                {
		    $$ = $1;
                }

/* type relx */
query_expression : non_join_query_expression
/***             | joined_table			***/

/* type relx */
query_term	 : non_join_query_term
/***		 | joined_table			***/

query_primary	 : non_join_query_primary
/***		 | joined_table			***/

/* type relx */
non_join_query_expression : non_join_query_term

         | query_expression TOK_UNION query_term
         {
          Union *dUnion = new (PARSERHEAP()) Union($1, $3);
          dUnion->setDistinctUnion();	

          $$ = new (PARSERHEAP())
                RelRoot(new (PARSERHEAP())
                    GroupByAgg(new (PARSERHEAP()) RelRoot(dUnion),
                              REL_GROUPBY, new (PARSERHEAP()) 
							  ColReference(new (PARSERHEAP())
                              ColRefName(TRUE, PARSERHEAP()))));

          // Make sure that all variables associated with an assignment are in
          // the top root
          if ($1->getOperatorType() == REL_ROOT) {
            RelRoot *root1 = (RelRoot *) $1;
            if (root1->assignmentStTree()) {
              ((RelRoot *)$$)->assignmentStTree() = root1->removeAssignmentStTree();
            }
          }
           
          if ($3->getOperatorType() == REL_ROOT) {
            RelRoot *root3 = (RelRoot *) $3;
            if (root3->assignmentStTree()) {
              ((RelRoot *)$$)->assignmentStTree() = root3->removeAssignmentStTree();
            }
          }
        }
	| query_expression TOK_UNION TOK_ALL query_term
        {
	  Union *unionNode = new (PARSERHEAP()) Union($1, $4);
          $$ = new (PARSERHEAP()) RelRoot(unionNode);


          // Make sure that all variables associated with an assignment are in
          // the top root
          if ($1->getOperatorType() == REL_ROOT) {
            RelRoot *root1 = (RelRoot *) $1;
            if (root1->assignmentStTree()) {
              ((RelRoot *)$$)->assignmentStTree() = root1->removeAssignmentStTree();
            }
          }
           
          if ($4->getOperatorType() == REL_ROOT) {
            RelRoot *root4 = (RelRoot *) $4;
            if (root4->assignmentStTree()) {
              ((RelRoot *)$$)->assignmentStTree() = root4->removeAssignmentStTree();
            }
          }
        }

	      | query_expression TOK_EXCEPT query_term
		{
  	            $$ = new (PARSERHEAP())
  	                     RelRoot(new (PARSERHEAP())
  				  GroupByAgg(
  					     new (PARSERHEAP())
  					     Except($1,$3),
  					     REL_GROUPBY,
  					     new (PARSERHEAP())
  					     ColReference(new (PARSERHEAP())
  					       ColRefName(TRUE, PARSERHEAP())
  					     )));
		}
  
	      | query_expression TOK_EXCEPT TOK_ALL query_term
		{
		  // EXCEPT is not yet supported
		  *SqlParser_Diags << DgSqlCode(-3022) << DgString0("EXCEPT ALL");
		  YYERROR;
		}

/* type relx */
non_join_query_term : non_join_query_primary
  		    | query_term TOK_INTERSECT distinct_sugar query_primary
  		      {
  			$$ = new (PARSERHEAP())
  			  RelRoot(new (PARSERHEAP())
  				  GroupByAgg(
  					     new (PARSERHEAP())
  					     Intersect($1,$4),
  					     REL_GROUPBY,
  					     new (PARSERHEAP())
  					     ColReference(new (PARSERHEAP())
  					       ColRefName(TRUE, PARSERHEAP())
  					     )));
  		      }
  		    | query_term TOK_INTERSECT TOK_ALL query_primary
  				      {
					*SqlParser_Diags << DgSqlCode(-3022) << DgString0("INTERSECT ALL");
					YYERROR;
  				      }

distinct_sugar: TOK_DISTINCT
| 
/* type relx */
non_join_query_primary : simple_table
	      | rel_subquery				// ## this line ...
//	      | '(' non_join_query_expression ')'	// ## should be replaced
//				{			// ## with these lines,
//				  $$ = $2;		// ## per Ansi 7.10,
//				}			// ## but it's too hard!

/* type relx */
simple_table  : query_specification
              | table_value_constructor
              | TOK_TABLE table_name
		{
                     // same as "SELECT * FROM qualified_name"
		     $$ = new (PARSERHEAP())
		       RelRoot(new (PARSERHEAP())
			       Scan(*$2),
			       REL_ROOT,
			       new (PARSERHEAP())
			       ColReference(new (PARSERHEAP())
					    ColRefName(TRUE, PARSERHEAP())));
                     delete $2;
		}


/* type relx */
rel_subquery : '(' query_expression order_by_clause optional_limit_spec ')'
				{
                                  if (InIfCondition) {
                                     *SqlParser_Diags << DgSqlCode(-3176);
		                     yyerror("");
		                     YYERROR;
                                  }

                                  RelExpr *temp = $2;

                                  if ( temp->getOperatorType() != REL_ROOT )
                                    temp = new (PARSERHEAP()) RelRoot($2);

                                  if (CmpCommon::getDefault(ALLOW_ORDER_BY_IN_SUBQUERIES) == DF_OFF) 
                                    {
                                      if ($3)
                                        {
                                          yyerror("");	// emits syntax error 15001
                                          YYERROR;
                                        }
                                    }
                                  else
                                    {
                                      if ($3)
                                        ((RelRoot *)temp)->addOrderByTree($3);
                                    }

                                  $$ = temp;
                  if ($4)
                    {
                      RelExpr *query = $2;
                      if (query->getFirstNRows() >= 0)
                        {
                          YYERROR;
                        }
                      else
                        {
                          NABoolean negate;
                          if ($4->castToConstValue(negate))
                            {
                              ConstValue *limit = (ConstValue *)$4;
                              Lng32 scale = 0;
                              query->setFirstNRows(limit->getExactNumericValue(scale));
                            }
                        }
                    }
				}
/* type item */
predicate : directed_comparison_predicate
        | key_comparison_predicate
	  | between_predicate predicate_selectivity_hint 
          {
              if ($2)
              { 
                ((ItemExpr *)$1)->setSelectivityFactor($2);
                ((ItemExpr *)$1)->setSelectivitySetUsingHint();
              }
          }
	  | quantified_predicate predicate_selectivity_hint
          {
              if ($2)
              { 
                ((ItemExpr *)$1)->setSelectivityFactor($2);
                ((ItemExpr *)$1)->setSelectivitySetUsingHint();
              }
          }
	  | in_predicate predicate_selectivity_hint
          {
              if ($2)
              { 
                ((ItemExpr *)$1)->setSelectivityFactor($2);
                ((ItemExpr *)$1)->setSelectivitySetUsingHint();
              }
          }
	  | like_predicate predicate_selectivity_hint
          {
              if ($2)
              { 
                ((ItemExpr *)$1)->setSelectivityFactor($2);
                ((ItemExpr *)$1)->setSelectivitySetUsingHint();
              }
          }
	  | exists_predicate
	  | null_predicate predicate_selectivity_hint
          {
              if ($2)
              { 
                ((ItemExpr *)$1)->setSelectivityFactor($2);
                ((ItemExpr *)$1)->setSelectivitySetUsingHint();
              }
          }
	  | internal_bool_placeholder

predicate_selectivity_hint : empty { $$ = NULL; }
        | TOK_BEGIN_HINT TOK_SELECTIVITY selectivity_number TOK_END_HINT
          {
            $$ = $3;
          }

selectivity_number : number
         {
              // If selectivity is not between 0 and 1, we issue a warning 
              //  and disregard the user specified selectivity.
              if($1 < 0 || $1 > 1)
              {
                NAString wrnMsg = "Only values between 0 and 1 are acceptable for predicate selectivity hints. Specified selectivity hint has been ignored.";
                *SqlParser_Diags << DgSqlCode(3066) << DgString0(wrnMsg);
                $$ = NULL;
              }
              else
                $$ = $1;
         }
	  //
	  // Predicates still to be implemented:
	  //   UNIQUE, MATCH, OVERLAPS
	  //
	  // The former two will need to set their result type's canBeSQLUnknown
	  // to FALSE, as they (like IS [NOT] NULL and EXISTS) can only return
	  // Sql True or False but not Unknown.
	  //
	  // The latter two will need to satisfy Genesis 10-971028-7413
	  // (see checkForNULLchildren in BindItemExpr.cpp).


/* type item*/
null_predicate :
       value_expression_list TOK_IS TOK_NULL
                      { $$ = new (PARSERHEAP()) UnLogic(ITM_IS_NULL, $1); }
     | value_expression_list TOK_IS TOK_NOT TOK_NULL
                      { $$ = new (PARSERHEAP()) UnLogic(ITM_IS_NOT_NULL, $1); }

/* type operator_type */
comparison_operator :	'='		  { $$ = ITM_EQUAL; }
		    |	'<'		  { $$ = ITM_LESS; }
		    |	'>'		  { $$ = ITM_GREATER; }
		    |	TOK_NOT_EQUAL	  { $$ = ITM_NOT_EQUAL; }
		    |	TOK_LESS_EQUAL	  { $$ = ITM_LESS_EQ; }
		    |	TOK_GREATER_EQUAL { $$ = ITM_GREATER_EQ; }

/* type tokval */
between_operator    : TOK_BETWEEN
		    | TOK_NOT_BETWEEN

/* type tokval */
quantifier	    : TOK_ALL
	   	    | TOK_ANY
	   	    | TOK_SOME	{ $$ = TOK_ANY; }

//
// The fix for Genesis 10-971104-1441:
// each side of a comparison op must use the same syntax, i.e.
//	v1=v2		v1=(v2)		((v1))=v2	etc... [Ansi]
//	(j,k)=(m,n)	(j,k)=((m,n))	(((j,k)))=(m,n)	etc... [Ansi]
//	a,b=c,d    BUT NOT  a,b=(c,d)  or  (a,b)=c,d	[Tandem extension!]
//
// The latter cases still cause ambiguity parsing
//	select * from t1 join t2 on t1.a,t1.b = t2.aa,t2.bb, t3;
// but that is due to our non-Ansi extension; what we've fixed here is that
//	select * from t1 join t2 on t1.a = t2.aa, t3;
// will be parsed correctly per Ansi, as will
//	select * from t1 join t2 on (t1.a,t1.b) = (t2.aa,t2.bb), t3; -- Ansi
//	select * from t1 join t2 on (t1.a,t1.b = t2.aa,t2.bb), t3;   -- Tdm ext.
//
// The upshot in this set of rules is not to allow any bare
// <value_expression_list> on a RHS; instead, to clone each comparison operator
// rule with each of the three <value_expression, ve_list_comma, ve_list_paren>.
// Vive la balance!
//
// Do note that <row_subquery> is a <value_expression> of unknown degree, so we
// must allow it also wherever <ve_list_comma> or <ve_list_paren> may appear.
// 
// UDF added 1/8/10: Before UDF, only the first eight rules existed
// for this predicate.  Note that row_subquery is part of the
// value_expression rule, and the rule value_expression_list is made
// up of value_expression, value_expression_list_comma, and
// value_expression_list_paren.  Because of this you would think that
// only one rule would be needed:
//
//    value_expression_list comparison operator value_expression_list
//
// The beginning of this comment explains why this cannot be.  Since
// the first eight rules exist, and we cannot add rules like
//
//    value_expression comparison_operator value_expression_list_comma
//
// we must add explicit rules for multi-valued functions.  These are
// (co = comparison_operator):
//
//     value_expression_list_comma co '(' function ')'
//     value_expression_list_paren co '(' function ')'
//     '(' function ')' co value_expression_list_comma
//     '(' function ')' co value_expression_list_paren
//
// Unfortunately, we must also add the following as well:
//     value_expression co '(' function ')'
//     '(' function ')' co value_expression
//     row_subquery     co '(' function ')'

/* type pBiRelat */
comparison_predicate :  
       value_expression comparison_operator value_expression
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | row_subquery comparison_operator value_expression
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | value_expression_list_comma comparison_operator value_expression_list_comma
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | value_expression_list_comma comparison_operator row_subquery
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | row_subquery comparison_operator value_expression_list_comma
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | value_expression_list_paren comparison_operator value_expression_list_paren
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | value_expression_list_paren comparison_operator row_subquery
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }
     | row_subquery comparison_operator value_expression_list_paren
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $3); }

     // BEGIN rules added for UDF
/* COMMENTED OUT FOR R2.5. CAUSES GRAMMAR CONFLICTS.
     | value_expression            comparison_operator '(' value_function ')'
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $4); }
     | row_subquery                comparison_operator '(' value_function ')'
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $4); }
     | value_expression_list_comma comparison_operator '(' value_function ')'
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $4); }
     | value_expression_list_paren comparison_operator '(' value_function ')'
		      { $$ = new (PARSERHEAP()) BiRelat($2, $1, $4); }
     | '(' value_function ')' comparison_operator value_expression
		      { $$ = new (PARSERHEAP()) BiRelat($4, $2, $5); }
     | '(' value_function ')'comparison_operator value_expression_list_comma
		      { $$ = new (PARSERHEAP()) BiRelat($4, $2, $5); }
     | '(' value_function ')' comparison_operator value_expression_list_paren
		      { $$ = new (PARSERHEAP()) BiRelat($4, $2, $5); }
*/
     // END rules added for UDF

/* type boolean */
scan_key_hint : empty { $$ = FALSE; }
    | TOK_BEGIN_HINT TOK_PREFER_FOR_SCAN_KEY TOK_END_HINT 
      { $$ = TRUE;}

/* type item */
key_comparison_predicate : TOK_KEY_RANGE_COMPARE '(' partitioning_key_type comparison_operator '(' value_expression_list ')' pkey_access_path ')'
{
  $$ = new (PARSERHEAP()) KeyRangeCompare(*$8,  
					  $4,  
					  $3, 
					  $6
					  );
			  delete $8;
}
  | TOK_KEY_RANGE_COMPARE '(' TOK_CLUSTERING TOK_KEY comparison_operator '(' value_expression_list ')' ckey_access_path ')'
{
  $$ = new (PARSERHEAP()) KeyRangeCompare(*$9,  
					  $5,  
					  NULL, // to indicate that there is no column_list
					  $7
					  );
			  delete $9;
}
/* item */
partitioning_key_type : TOK_PARTITIONING TOK_KEY '(' value_expression_list ')'
{
  $$ = $4;
}

/* corrName */
pkey_access_path : TOK_ON TOK_TABLE actual_table_name
{
  $$ = $3;
}
| TOK_ON TOK_INDEX_TABLE actual_table_name
{

  $3->setSpecialType(ExtendedQualName::INDEX_TABLE);
  $$ = $3;

}

/* corrName */
ckey_access_path : pkey_access_path
{
  $$ = $1;
}
| TOK_ON special_regular_table_name
{
  $$ = $2;
}
| TOK_ON special_index_table_name
{
  $$ = $2;
}
|
{
  $$ = new (PARSERHEAP()) CorrName(); // empty Corrname 
}

/* type item */
directed_comparison_predicate : 
      comparison_predicate scan_key_hint
      { 
	$$ = $1;
	if ($1->isARangePredicate() && $2 == TRUE) $1->setPreferForSubsetScanKey();
      }
      |
      comparison_predicate TOK_BEGIN_HINT TOK_SELECTIVITY selectivity_number TOK_END_HINT
      { 
        $$ = $1;

        if($4)
        { 
          ((ItemExpr *)$1)->setSelectivityFactor($4);
          ((ItemExpr *)$1)->setSelectivitySetUsingHint();
        }
      } 
      |
      comparison_predicate TOK_DIRECTEDBY direction_vector
      {
	if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
        {
	  $1->setDirectionVector($3);
	  $$ = $1;
	}
	else
	{ 
	  yyerror(""); YYERROR; /*internal syntax only!*/
	}
      }

/* type pIntegerList */
direction_vector : '(' direction_vector_comma_list ')'
      {
	$$ = $2;
      }

/* type pIntegerList */
direction_vector_comma_list: 
      direction_literal 
      {
	$$ = new (PARSERHEAP()) IntegerList();
	$$->insert($1);
      }
      |
      direction_vector_comma_list ',' direction_literal
      {
	$$ = $1;
	$$->insert($3);
      }

/* type tokval */
direction_literal : ddl_ordering_spec
      {
	if ($1 == COM_ASCENDING_ORDER)
	  $$ = 1;
	else
	  $$ = -1;
      }

/* type item */
//
// Although there is no "balancing" necessary here as was needed in
// the comparison_predicate rules for the Genesis 10-971104-1441 fix,
// since here we use the same operators ('=' '<' etc) as comparison_predicate,
// we are forced to clone subrules here just like there.
//
quantified_predicate :
	  value_expression comparison_operator quantifier rel_subquery
				      { $$ = makeQuantifiedComp($1,$2,$3,$4); }
	| row_subquery comparison_operator quantifier rel_subquery
				      { $$ = makeQuantifiedComp($1,$2,$3,$4); }
	| value_expression_list_comma comparison_operator quantifier rel_subquery
				      { $$ = makeQuantifiedComp($1,$2,$3,$4); }
	| value_expression_list_paren comparison_operator quantifier rel_subquery
				      { $$ = makeQuantifiedComp($1,$2,$3,$4); }

/* type item */
in_predicate :
	  value_expression_list TOK_IN rel_subquery
			  {
			    $$ = makeQuantifiedComp($1, ITM_EQUAL, TOK_ANY, $3);
			  }
	| value_expression_list TOK_NOT_IN rel_subquery
			  {
			    $$ = new (PARSERHEAP())
			      UnLogic(ITM_NOT,
				makeQuantifiedComp($1, ITM_EQUAL, TOK_ANY, $3));
			  }
	| value_expression_list TOK_IN '(' value_expression_list_lr ')'
              {
		$$ = processINlist($1, $4);
	      }
	| value_expression_list TOK_NOT_IN '(' value_expression_list_lr ')'
              {
		$$ = new (PARSERHEAP())
		  UnLogic(ITM_NOT, 
			  processINlist($1, $4));
              }
	| value_expression_list TOK_IN literal
	      {
		CheckModeSpecial1();
		
		// special1 mode extension
		$$ = processINlist($1, $3);
	      }

/* type item */
// See preceding remarks about Genesis 10-971104-1441 problem and solution.
between_predicate : 
       value_expression between_operator 
       value_expression TOK_AND
       value_expression
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       value_expression TOK_AND
       value_expression
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       row_subquery TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }

     | value_expression_list_comma between_operator 
       value_expression_list_comma TOK_AND
       value_expression_list_comma
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_comma between_operator 
       value_expression_list_comma TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_comma between_operator 
       row_subquery TOK_AND
       value_expression_list_comma
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_comma between_operator 
       row_subquery TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       value_expression_list_comma TOK_AND
       value_expression_list_comma
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       value_expression_list_comma TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       row_subquery TOK_AND
       value_expression_list_comma
		      { $$ = makeBetween($1, $3, $5, $2); }

     | value_expression_list_paren between_operator 
       value_expression_list_paren TOK_AND
       value_expression_list_paren
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_paren between_operator 
       value_expression_list_paren TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_paren between_operator 
       row_subquery TOK_AND
       value_expression_list_paren
		      { $$ = makeBetween($1, $3, $5, $2); }
     | value_expression_list_paren between_operator 
       row_subquery TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       value_expression_list_paren TOK_AND
       value_expression_list_paren
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       value_expression_list_paren TOK_AND
       row_subquery
		      { $$ = makeBetween($1, $3, $5, $2); }
     | row_subquery between_operator 
       row_subquery TOK_AND
       value_expression_list_paren
		      { $$ = makeBetween($1, $3, $5, $2); }

/* type tokval */
not_like   : TOK_LIKE
	   | TOK_NOT TOK_LIKE

/* type item */
like_predicate : value_expression not_like value_expression
				{
				  $$ = new (PARSERHEAP()) Like($1, $3);
				  if ($2 == TOK_NOT)
				    $$ = new (PARSERHEAP()) UnLogic(ITM_NOT,$$);
				}
	      | value_expression not_like value_expression TOK_ESCAPE value_expression
				{
				  $$ = new (PARSERHEAP()) Like($1, $3, $5);
				  if ($2 == TOK_NOT)
				    $$ = new (PARSERHEAP()) UnLogic(ITM_NOT,$$);
				}
	      | value_expression not_like value_expression '{' TOK_ESCAPE value_expression '}'
				{
				  $$ = new (PARSERHEAP()) Like($1, $3, $6);
				  if ($2 == TOK_NOT)
				    $$ = new (PARSERHEAP()) UnLogic(ITM_NOT,$$);
				}
              | value_expression TOK_REGEXP value_expression
                                {
                                  //TODO
                                  $$ = new (PARSERHEAP()) Regexp($1,$3);
				  if ($2 == TOK_NOT)
				    $$ = new (PARSERHEAP()) UnLogic(ITM_NOT,$$);
                                } 

/* type item */
exists_predicate : TOK_EXISTS rel_subquery
				{
				  $$ = new (PARSERHEAP()) Exists($2);
				}

/* type item */
search_condition : boolean_term
				;
              | search_condition TOK_OR boolean_term
				{
				  $$ = new (PARSERHEAP())
				    BiLogic(ITM_OR,
					    $1,
					    $3);
				}

/* type item */
boolean_term : boolean_factor
				;
              | boolean_term TOK_AND boolean_factor
				{
				  $$ = new (PARSERHEAP())
				    BiLogic(ITM_AND,
					    $1,
					    $3);
				}

/* type item */
boolean_factor : TOK_NOT boolean_test
				{
				  $$ = new (PARSERHEAP())
				    UnLogic(ITM_NOT,
					    $2);
				}
              | boolean_test
				;

/* type item */
boolean_test : boolean_primary TOK_IS TOK_NOT truth_value
				{
				  OperatorTypeEnum op = NO_OPERATOR_TYPE;
				  switch ($4)
				    {
				    case TOK_TRUE:
				      op = ITM_IS_TRUE;
				      break;
				    case TOK_FALSE:
				      op = ITM_IS_FALSE;
				      break;
				    case TOK_UNKNOWN:
				      op = ITM_IS_UNKNOWN;
				      break;
				    }
				    $$ = new (PARSERHEAP())
				      UnLogic(ITM_NOT,
					      new (PARSERHEAP())
					      UnLogic(op,
						      $1));
				}
              | boolean_primary TOK_IS truth_value
				{
				  OperatorTypeEnum op = NO_OPERATOR_TYPE;
				  switch ($3)
				    {
				    case TOK_TRUE:
				      op = ITM_IS_TRUE;
				      break;
				    case TOK_FALSE:
				      op = ITM_IS_FALSE;
				      break;
				    case TOK_UNKNOWN:
				      op = ITM_IS_UNKNOWN;
				      break;
				    }
				    $$ = new (PARSERHEAP())
				      UnLogic(op,
					      $1);
				}
              | boolean_primary

/* type tokval */
truth_value   : TOK_TRUE
              | TOK_FALSE
              | TOK_UNKNOWN

/* type item */
boolean_primary : predicate
              | '(' search_condition ')'
				{
				  $$ = $2;
				}
              | '(' search_condition ')' TOK_BEGIN_HINT TOK_SELECTIVITY selectivity_number TOK_END_HINT
              { 
                 $$ = $2;

                 if($6)
                 { 
                   ((ItemExpr *)$2)->setSelectivityFactor($6);
                   ((ItemExpr *)$2)->setSelectivitySetUsingHint();
                 }
              } 

/* type relx */
Rest_Of_insert_statement : no_check_log no_rollback TOK_INTO table_name query_expression order_by_clause access_type optional_limit_spec
        {
          if (!finalizeAccessOptions($5, $7)) YYERROR;

          //limit clause
          if ($8)
          {
	     RelExpr *query = $5;

            if (query->getFirstNRows() >= 0)
              {
                // cannot specify LIMIT and FIRST N clauses together.
                YYERROR;
              }
            else
              {
                NABoolean negate;
                if ($8->castToConstValue(negate))
                  {
                    ConstValue * limit = (ConstValue*)$8;
                    Lng32 scale = 0;
                    query->setFirstNRows(limit->getExactNumericValue(scale));
                  }
              }
          }
		  
          // insert into all columns
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$4, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $5,
               NULL,
               $6);
               

	   if (($1 == 1) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoLogOperation();	
	     }
	   
	   if (($1 == 2) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoCheck(TRUE);
	     }

	   if(TRUE == $2)
	     {
	       ((Insert*)$$)->setNoRollbackOperation();
	     }
	   delete $4;
	   
	   
        }
        |
     no_check_log no_rollback TOK_INTO TOK_TABLE table_name query_expression order_by_clause access_type optional_limit_spec
        {
          if (!finalizeAccessOptions($6, $8)) YYERROR;

          //limit clause
          if ($9)
          {
	     RelExpr *query = $6;

            if (query->getFirstNRows() >= 0)
              {
                // cannot specify LIMIT and FIRST N clauses together.
                YYERROR;
              }
            else
              {
                NABoolean negate;
                if ($9->castToConstValue(negate))
                  {
                    ConstValue * limit = (ConstValue*)$9;
                    Lng32 scale = 0;
                    query->setFirstNRows(limit->getExactNumericValue(scale));
                  }
              }
          }
  
          // insert into all columns
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$5, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $6,
               NULL,
               $7);

	   if (($1 == 1) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoLogOperation();	
	     }
	   
	   if (($1 == 2) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoCheck(TRUE);
	     }

	   if(TRUE == $2)
	     {
	       ((Insert*)$$)->setNoRollbackOperation();
	     }
	   delete $5;
        }
        |
        TOK_OVERWRITE TOK_TABLE table_name query_expression order_by_clause access_type optional_limit_spec
        {
          if (!finalizeAccessOptions($4, $6)) YYERROR;

          //limit clause
          if ($7)
          {
	     RelExpr *query = $4;

            if (query->getFirstNRows() >= 0)
              {
                // cannot specify LIMIT and FIRST N clauses together.
                YYERROR;
              }
            else
              {
                NABoolean negate;
                if ($7->castToConstValue(negate))
                  {
                    ConstValue * limit = (ConstValue*)$7;
                    Lng32 scale = 0;
                    query->setFirstNRows(limit->getExactNumericValue(scale));
                  }
              }
          }

          // insert into all columns
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$3, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $4,
               NULL,
               $5);
          
          ((Insert*)$$)->setOverwriteHiveTable(TRUE);

          delete $3;
        }  

          | no_check_log no_rollback TOK_INTO  table_name '(' '*' ')' query_expression order_by_clause access_type optional_limit_spec
        {
          if (!finalizeAccessOptions($8, $10)) YYERROR;

          //limit clause
          if ($11)
          {
	     RelExpr *query = $8;

            if (query->getFirstNRows() >= 0)
              {
                // cannot specify LIMIT and FIRST N clauses together.
                YYERROR;
              }
            else
              {
                NABoolean negate;
                if ($11->castToConstValue(negate))
                  {
                    ConstValue * limit = (ConstValue*)$11;
                    Lng32 scale = 0;
                    query->setFirstNRows(limit->getExactNumericValue(scale));
                  }
              }
          }

          // insert into all columns --
          // Tandem extension to INSERT statement;
          // just ignore the redundant "(*)" columnlist.
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$4, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $8,
               NULL,
               $9);

	  if (($1 == 1) || ($1 == 3))
	    {
	      ((Insert*)$$)->setNoLogOperation();	
	    }
	  
	  if (($1 == 2) || ($1 == 3))
	    {
	      ((Insert*)$$)->setNoCheck(TRUE);
	    }

	  if (TRUE == $2)
	    {
              ((Insert*)$$)->setNoRollbackOperation();
	    }
	  
          delete $4;
        }
          | no_check_log no_rollback TOK_INTO table_name TOK_DEFAULT TOK_VALUES 
                {
		  // insert defaults into all columns
		  Insert * insert = new (PARSERHEAP())
		    Insert(CorrName(*$4, PARSERHEAP()),
			   NULL,
			   REL_UNARY_INSERT);
		  
		  if (($1 == 1) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoLogOperation();	
		    }
		  
		  if (($1 == 2) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoCheck(TRUE);
		    }
	
                  if(TRUE == $2)
                   {
                      insert->setNoRollbackOperation();
                   }
	
		  $$ = insert;
	  
		  delete $4;
		}
              |	no_check_log no_rollback TOK_INTO table_name '(' '*' ')' TOK_DEFAULT TOK_VALUES
		{
		  // insert defaults into all columns --
		  // Tandem extension to INSERT statement;
		  // just ignore the redundant "(*)" columnlist.
		  $$ = new (PARSERHEAP())
                    Insert(CorrName(*$4, PARSERHEAP()),
			   NULL,
			   REL_UNARY_INSERT);

		  if (($1 == 1) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoLogOperation();	
		    }
	   
		  if (($1 == 2) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoCheck(TRUE);
		    }
		  
		  if (TRUE == $2)
		    {
		      ((Insert*)$$)->setNoRollbackOperation();
		    }
		  
                  delete $4;
                }
          | no_check_log no_rollback TOK_INTO table_name '(' column_list ')' query_expression order_by_clause optional_limit_spec
                {
                  //limit clause
                  if ($10)
                    {
          	        RelExpr *query = $8;
                      if (query->getFirstNRows() >= 0)
                        {
                          // cannot specify LIMIT and FIRST N clauses together.
                          YYERROR;
                        }
                      else
                        {
                          NABoolean negate;
                          if ($10->castToConstValue(negate))
                            {
                              ConstValue * limit = (ConstValue*)$10;
                              Lng32 scale = 0;
                              query->setFirstNRows(limit->getExactNumericValue(scale));
                            }
                        }
                    }
                
                  // insert into specified columns
                  $$ = new (PARSERHEAP())
                    Insert(CorrName(*$4, PARSERHEAP()),
                       NULL,
                       REL_UNARY_INSERT,
                       $8,
                       $6,
                       $9);

		  if (($1 == 1) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoLogOperation();	
		    }
		  
		  if (($1 == 2) || ($1 == 3))
		    {
		      ((Insert*)$$)->setNoCheck(TRUE);
		    }

		  if (TRUE == $2)
		    {
		      ((Insert*)$$)->setNoRollbackOperation();
		    }
                  delete $4;
                }
        |no_check_log no_rollback TOK_INTO table_name table_value_constructor atomic_clause
        {
          // insert into all columns
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$4, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $5,
               NULL,
               NULL);

          $$->setTolerateNonFatalError($6);

	   if (($1 == 1) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoLogOperation();	
	     }
	   
	   if (($1 == 2) || ($1 == 3))
	     {
	       ((Insert*)$$)->setNoCheck(TRUE);
	     }

	  if (TRUE == $2)
	    {
	      ((Insert*)$$)->setNoRollbackOperation();
	    }
          delete $4;
        }
          | no_check_log no_rollback TOK_INTO  table_name '(' '*' ')' table_value_constructor atomic_clause
        {
          // insert into all columns --
          // Tandem extension to INSERT statement;
          // just ignore the redundant "(*)" columnlist.
          $$ = new (PARSERHEAP())
            Insert(CorrName(*$4, PARSERHEAP()),
               NULL,
               REL_UNARY_INSERT,
               $8,
               NULL,
               NULL);

          $$->setTolerateNonFatalError($9);

	  if (($1 == 1) || ($1 == 3))
	    {
	      ((Insert*)$$)->setNoLogOperation();	
	    }
	  
	  if (($1 == 2) || ($1 == 3))
	    {
	      ((Insert*)$$)->setNoCheck(TRUE);
	    }

	  if (TRUE == $2)
	    {
	      ((Insert*)$$)->setNoRollbackOperation();
	    }

          delete $4;
        }
        | no_check_log no_rollback TOK_INTO table_name '(' column_list ')' table_value_constructor atomic_clause
          {
            // insert into specified columns
            $$ = new (PARSERHEAP())
              Insert(CorrName(*$4, PARSERHEAP()),
                 NULL,
                 REL_UNARY_INSERT,
                 $8,
                 $6,
                 NULL);

            $$->setTolerateNonFatalError($9);

	    if (($1 == 1) || ($1 == 3))
	      {
		((Insert*)$$)->setNoLogOperation();	
	      }
	    
	    if (($1 == 2) || ($1 == 3))
	      {
		((Insert*)$$)->setNoCheck(TRUE);
	      }

	    if (TRUE == $2)
	      {
		((Insert*)$$)->setNoRollbackOperation();
	      }
            delete $4;
          } 
Rest_Of_insert_wo_INTO_statement: table_name query_expression order_by_clause access_type
	  {
	    CheckModeSpecial1();
	    
	    if (!finalizeAccessOptions($2, $4)) YYERROR;
	    
	    // insert into all columns
	    $$ = new (PARSERHEAP())
	      Insert(CorrName(*$1, PARSERHEAP()),
		     NULL,
		     REL_UNARY_INSERT,
		     $2,
		     NULL,
		     $3);
	    
	    delete $1;
	  }

	 | table_name '(' column_list ')' query_expression order_by_clause
	  {
	    CheckModeSpecial1();
	    
	    // insert into specified columns
	    $$ = new (PARSERHEAP())
	      Insert(CorrName(*$1, PARSERHEAP()),
		     NULL,
		     REL_UNARY_INSERT,
		     $5,
		     $3,
		     $6);
	    
	    delete $1;
	  } 

/* insertType */
Front_Of_Insert : TOK_INSERT 
                      {
                         $$ = Insert::SIMPLE_INSERT;                                   
                      }
              | TOK_UPSERT
                      {
			$$ = Insert::UPSERT_INSERT;
                      }
              | TOK_INSERT TOK_USING TOK_VSBB 
                      {
                         $$ = Insert::VSBB_INSERT_SYSTEM;
                      }
              | TOK_INSERT TOK_USING TOK_LOAD 
                      {
                         $$ = Insert::VSBB_LOAD_AUDITED;
                      }
              | TOK_UPSERT TOK_USING TOK_LOAD 
                      {
                         $$ = Insert::UPSERT_LOAD;
                      }

front_of_insert_with_rwrs :  TOK_UPSERT TOK_USING TOK_ROWSET
                      {
                        $$ = Insert::UPSERT_INSERT;
                      }

front_of_insert: TOK_INS
                      {
			CheckModeSpecial1();
			
			$$ = Insert::SIMPLE_INSERT;
                      }

              | Front_Of_Insert
                { $$ = $1; }

/* type uint */
/*returning_clause : TOK_RETURN TOK_LASTSYSKEY
                      {
			$$ = 1;
		      }
                 | TOK_RETURN output_hostvar_list
                      {
			TheHostVarRoles->setLastNunassignedTo($2,HV_IS_OUTPUT);
			$$ = 2;
		      }
                 | empty
                      {
			$$ = 0; //$$ = NULL;
		      }
		      */

/* type atomicityType	*/					 
atomic_clause : TOK_ATOMIC
		{
			$$ = RelExpr::ATOMIC_;
		}
		| TOK_NOT TOK_ATOMIC
		{
			$$ = RelExpr::NOT_ATOMIC_;
		}
              
/* type item */
column_list : identifier
				{
				  $$ = new (PARSERHEAP())
				    ColReference
				      (new (PARSERHEAP())
				       ColRefName(*$1, PARSERHEAP()));
				  delete $1;
				}
	      | identifier ',' column_list
				{
				  $$ = new (PARSERHEAP())
				    ItemList(
					     new (PARSERHEAP())
					     ColReference(
					        new (PARSERHEAP())
						    ColRefName(*$1, PARSERHEAP())), $3);
				  delete $1;
				}

/* type relx */
merge_statement : merge_stmt_start_tokens TOK_INTO table_name merge_stmt_using_clause merge_stmt_on_condition merge_stmt_when_clause
		  {
		    PtrPlaceHolder * pph = $6;
		    NABoolean isUpdate = (pph->ptr1_ != NULL);
		    ItemExpr * setClause = 
		      (ItemExpr*)pph->ptr2_;
		    ItemExpr * insertColList =
		      (ItemExpr *)pph->ptr3_;
		    ItemExpr * insertValueList =
		      (ItemExpr *)pph->ptr4_;
		    ItemExpr *where = (ItemExpr*)pph->ptr5_;
		    
		    Scan * inputScan =
		      new (PARSERHEAP())
		      Scan(CorrName(*$3, PARSERHEAP()));
		    inputScan->addSelPredTree($5);
		    
		    RelExpr * re = NULL;
		    if (isUpdate)
		      {
			re = new (PARSERHEAP())
			  MergeUpdate(CorrName(*$3, PARSERHEAP()),
				      NULL,
				      REL_UNARY_UPDATE,
				      inputScan,
				      setClause,
				      insertColList,
				      insertValueList,
				      PARSERHEAP(),
				      where);
		      }
		    else
		      {
			re = new (PARSERHEAP())
			  MergeDelete(CorrName(*$3, PARSERHEAP()),
				      NULL,
				      REL_UNARY_DELETE,
				      inputScan,
				      insertColList,
				      insertValueList);
		      }

		    if ($4)
		      {
			re = new(PARSERHEAP()) Join
			  ($4, re, REL_TSJ_FLOW, NULL);
			((Join*)re)->doNotTransformToTSJ();

			((Join*)re)->setTSJForMerge(TRUE);
			
			if (insertValueList)
			  ((Join*)re)->setTSJForMergeWithInsert(TRUE);

			((Join*)re)->setTSJForWrite(TRUE);
		      }
		    
		    $$ = re;
		  }

merge_stmt_start_tokens : TOK_MERGE 
                                        {
					  $$ = 0;
					}

/* type relx */
merge_stmt_using_clause : empty
                            {
			      $$ = NULL;
			    }
                          | TOK_USING rel_subquery as_clause
                            {
			      $$ = new (PARSERHEAP())
				RenameTable($2, *$3);
			      delete $3;
			    }
                          | TOK_USING rel_subquery as_clause '(' derived_column_list ')'
                            {
			      $$ = new (PARSERHEAP())
				RenameTable($2, *$3, $5);
			      delete $3;
			    }

/* type item */
merge_stmt_on_condition : TOK_ON search_condition
                            {
			      $$ = $2;
			    }

merge_stmt_when_clause :   merge_stmt_when_matched
                            {
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder
                                ($1->ptr1_, $1->ptr2_, NULL, NULL, $1->ptr3_);
			    }
                         | merge_stmt_when_not_matched
                            {
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder(
				     (new(PARSERHEAP()) NAString()), NULL, 
				     $1->ptr1_, $1->ptr2_);
			    }
                         | merge_stmt_when_matched merge_stmt_when_not_matched 
                            {
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder
				($1->ptr1_, $1->ptr2_, $2->ptr1_, $2->ptr2_,
				 $1->ptr3_);
			    }
                         | merge_stmt_when_not_matched merge_stmt_when_matched 
                            {
			      $$ = 
				new(PARSERHEAP()) PtrPlaceHolder
                                ($2->ptr1_, $2->ptr2_, $1->ptr1_, $1->ptr2_,
                                 $2->ptr3_);
			    }

/* type ptr_placeholder */
merge_stmt_when_matched     : TOK_WHEN TOK_MATCHED TOK_THEN TOK_UPDATE TOK_SET merge_stmt_set_clause where_clause
                            {
			      $$ = new(PARSERHEAP()) 
				PtrPlaceHolder((new(PARSERHEAP()) NAString()), $6, $7);
			    }
                            | TOK_WHEN TOK_MATCHED TOK_THEN TOK_UPD TOK_SET merge_stmt_set_clause where_clause
                            {
			      CheckModeSpecial1();

			      $$ = new(PARSERHEAP()) 
				PtrPlaceHolder((new(PARSERHEAP()) NAString()), $6, $7);
			    }
                            | TOK_WHEN TOK_MATCHED TOK_THEN TOK_DELETE
                            {
			      if (CmpCommon::getDefault(COMP_BOOL_174) == DF_OFF)
				{
				  YYERROR;
				}
			      
			      $$ = new(PARSERHEAP()) PtrPlaceHolder(NULL, NULL);
			    }

/* type item */
merge_stmt_set_clause       : set_update_commit_list

/* type ptr_placeholder */
merge_stmt_when_not_matched : TOK_WHEN TOK_NOT TOK_MATCHED TOK_THEN TOK_INSERT merge_insert_with_values
                            {
			      $$ = $6;
			    }
                            | TOK_WHEN TOK_NOT TOK_MATCHED TOK_THEN TOK_INS merge_insert_with_values
                            {
			      CheckModeSpecial1();

			      $$ = $6;
			    }
 
/* type ptr_placeholder */
merge_insert_with_values : '(' column_list ')' TOK_VALUES '(' value_expression_list ')'
                            {
			      $$ = new(PARSERHEAP()) PtrPlaceHolder($2, $6);
			    }
                           | TOK_VALUES '(' value_expression_list ')'
                            {
			      $$ = new(PARSERHEAP()) PtrPlaceHolder(NULL,$3);
			    }


/* type relx */
update_statement_searched : TOK_UPDATE update_statement_searched_body
                {
                  $$ = $2;
                }

// QSTUFF + Mv
/* type relx */
update_statement_searched_body : update_statement_target_table set_update_list where_clause
                {
                  // attach the WHERE clause to the input scan
                  $1->addSelPredTree($3);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($1->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $1,
                           $2);
                }

		| update_statement_target_table as_clause set_update_list where_clause
                {
                  $1->getTableName().setCorrName(*$2); 
                  // attach the WHERE clause to the input scan
                  $1->addSelPredTree($4);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($1->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $1,
                           $3);
                  delete $2;
                }

		| TOK_WITH TOK_NO TOK_ROLLBACK update_statement_target_table set_update_list where_clause
                {
                  // attach the WHERE clause to the input scan
                  $4->addSelPredTree($6);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($4->getTableName(), PARSERHEAP()),
                       NULL,
                       REL_UNARY_UPDATE,
                       $4,
                       $5);
		   ((Update*)$$)->setNoRollbackOperation();
                }

		| TOK_WITH TOK_NO TOK_ROLLBACK update_statement_target_table as_clause set_update_list where_clause
                {
                  $4->getTableName().setCorrName(*$5); 
                  // attach the WHERE clause to the input scan
                  $4->addSelPredTree($7);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($4->getTableName(), PARSERHEAP()),
                       NULL,
                       REL_UNARY_UPDATE,
                       $4,
                       $6);
                  ((Update*)$$)->setNoRollbackOperation();

                  delete $5;
                }

                | update_statement_target_table set_update_list TOK_WHERE TOK_CURRENT TOK_OF entity_name_as_item
                {
                  $$ = new (PARSERHEAP())
                    Update(CorrName($1->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $1,
                           $2,
                           $6);
                }

                | update_statement_target_table as_clause set_update_list TOK_WHERE TOK_CURRENT TOK_OF entity_name_as_item
                {
                  $1->getTableName().setCorrName(*$2); 
                  $$ = new (PARSERHEAP())
                    Update(CorrName($1->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $1,
                           $3,
                           $7);
                  delete $2;
                }

                | table_as_stream_any set_update_list where_clause
                {
                  if ($3 != NULL) {
                    // attach the WHERE clause to the input scan
                    $1->addSelPredTree($3);
                  }
                  $$ = new (PARSERHEAP())
                    Update(((Scan *)$1)->getTableName(),
                           NULL,
                           REL_UNARY_UPDATE,
                           $1,
                           $2);
                }

                | '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']' update_statement_target_table set_update_list
                       where_clause
                {
                  Int64 numRows = atoInt64($3->data());
                  if ($2 == TOK_LAST)
                    {
                      yyerror("LAST option not supported with UPDATE statement. \n");
                      YYERROR;
                    }

                  // attach the WHERE clause to the input scan
                  $5->addSelPredTree($7);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($5->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $5,
                           $6);
                  $$->setFirstNRows(numRows);
                }
                | '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']' update_statement_target_table as_clause set_update_list
                            where_clause
                {
                  $5->getTableName().setCorrName(*$6); 
                  Int64 numRows = atoInt64($3->data());
                  if ($2 == TOK_LAST)
                    {
                      yyerror("LAST option not supported with UPDATE statement. \n");
                      YYERROR;
                    }

                  // attach the WHERE clause to the input scan
                  $5->addSelPredTree($8);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($5->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $5,
                           $7);
                  $$->setFirstNRows(numRows);
                  delete $6;
                }

		| TOK_WITH TOK_NO TOK_ROLLBACK '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']'
                       update_statement_target_table set_update_list where_clause
                {
		  Int64 numRows = atoInt64($6->data());
                  if ($5 == TOK_LAST)
                    {
                      yyerror("LAST option not supported with UPDATE statement. \n");
                      YYERROR;
                    }

                  // attach the WHERE clause to the input scan
                  $8->addSelPredTree($10);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($8->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $8,
                           $9);
                  ((Update*)$$)->setNoRollbackOperation();

                  $$->setFirstNRows(numRows);
                }

		| TOK_WITH TOK_NO TOK_ROLLBACK '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']'
                       update_statement_target_table as_clause set_update_list where_clause
                {
                  $8->getTableName().setCorrName(*$9); 

		  Int64 numRows = atoInt64($6->data());
                  if ($5 == TOK_LAST)
                    {
                      yyerror("LAST option not supported with UPDATE statement. \n");
                      YYERROR;
                    }

                  // attach the WHERE clause to the input scan
                  $8->addSelPredTree($11);
                  $$ = new (PARSERHEAP())
                    Update(CorrName($8->getTableName(), PARSERHEAP()),
                           NULL,
                           REL_UNARY_UPDATE,
                           $8,
                           $10);

                  ((Update*)$$)->setNoRollbackOperation();
                  $$->setFirstNRows(numRows);

                  delete $9;
                }

update_statement_target_table: table_name optimizer_hint
                {
                  Scan * inputScan = new (PARSERHEAP())
                    Scan(CorrName(*$1, PARSERHEAP()));
                  if ($2)
                    inputScan->setHint($2);
                  delete $1;
                  $$=inputScan;
                }

/* type item */
set_delete_list : TOK_SET TOK_ON TOK_ROLLBACK  set_delete_rollback_list
					   {
						  $$ = $4;
					   }
/* type item */
set_delete_rollback_list : set_clause
				   {
					((Assign *) $1)->setOnRollback(TRUE);
				   }
				  | set_clause ',' set_delete_rollback_list
				  {
				    ((Assign *) $1)->setOnRollback(TRUE);
				    $$ = new (PARSERHEAP()) ItemList($1, $3);
				  }
				

/* type item */
set_update_list : TOK_SET  set_update_commit_list
                 {
				   $$ = $2;
				 }

/* 				| TOK_SET TOK_ON TOK_ROLLBACK set_update_rollback_list
				 {
				   $$ = $4
				 }
*/

/* type item */
set_update_commit_list : set_clause
				;
	      | set_clause ',' set_update_commit_list
				{
				  $$ = new (PARSERHEAP()) ItemList($1, $3);
				}
	      | set_clause TOK_SET TOK_ON TOK_ROLLBACK set_update_rollback_list
		     {
			    $$ = new (PARSERHEAP()) ItemList($1, $5);
			 }
				 
/* type item */
set_update_rollback_list : set_clause
				{
				  ((Assign *) $1)->setOnRollback(TRUE);
				}
	            | set_clause ',' set_update_rollback_list
			 	{

				  ((Assign *) $1)->setOnRollback(TRUE);
				  $$ = new (PARSERHEAP()) ItemList($1, $3);

				}

// QSTUFF + Mv


/* You will see that the set_clause uses, in its right side, a reference
 * to a row_val_constructor_elmnt.  This is not exactly the way
 * ANSI expresses it.  But the grammar is the same.  We are re-using
 * row_val_constructor_elmnt rather than create an identical, but differently
 * named new non-terminal just to support the set_clause non-terminal.
 */

set_clause : identifier '=' value_expression
				{
				  $$ = new (PARSERHEAP())
				    Assign(new (PARSERHEAP())
					   ColReference(
					     new (PARSERHEAP()) ColRefName(*$1, PARSERHEAP())),
					   $3);
				  delete $1;
				}
                              | '(' column_list ')' '=' '(' value_expression_list ')'
				{
				  $$ = new (PARSERHEAP())
				    Assign($2, $6);
				}
                              | '(' column_list ')' '=' rel_subquery
				{
				  RowSubquery * rs = 
				    new (PARSERHEAP()) RowSubquery($5);

				  $$ = new (PARSERHEAP())
				    Assign($2, rs);
				}
                              | identifier '=' update_obj_to_lob_function
				{
				    ItemExpr * rc = $3;
				  if (rc->getOperatorType() == ITM_LOBUPDATE)
				    {
				      LOBupdate * lu = (LOBupdate*)rc;
				    
				      ColReference * cr = 
					new (PARSERHEAP())
					ColReference(new (PARSERHEAP()) ColRefName(*$1, PARSERHEAP()));
				      
				      LOBupdate * nlu = 
					new (PARSERHEAP()) LOBupdate(lu->child(0), cr, lu->child(2),
								     lu->getObj(), lu->isAppend());
				      
				      rc = nlu;
				    }

				  $$ = new (PARSERHEAP())
				    Assign(new (PARSERHEAP())
					   ColReference(
					     new (PARSERHEAP()) ColRefName(*$1, PARSERHEAP())),
					   rc);
				  delete $1;
				}
                         

/* type relx */
delete_start_tokens : TOK_DELETE no_check_log TOK_FROM table_name optimizer_hint
               {
                 TransMode *transMode = CmpCommon::transMode();

                 // Multi Commit must extract the where clause part
                 // of the query text for use at runtime.
                 // So mark the start of the WHERE clause here in
                 // case this DELETE is in fact an MULTI COMMIT Delete.
                 if (transMode->multiCommit() == TransMode::MC_ON_)
                   {
                     if(!ParNameLocListPtr) {
                       ParNameLocListPtr = new (PARSERHEAP()) 
                         ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     }
                     ParSetTextStartPosForMultiCommit(ParNameLocListPtr);
                   }

                 Scan * inputScan =
                   new (PARSERHEAP()) Scan(CorrName(*$4, PARSERHEAP()));
   
                 $$ = new (PARSERHEAP())
                   Delete(CorrName(*$4, PARSERHEAP()),
                          NULL,
                          REL_UNARY_DELETE,
                          inputScan,
                          NULL);
   
                 if (($2 == 1) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoLogOperation();	
                   }
   
                  if (($2 == 2) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoCheck(TRUE);
                   }

                  if ($5)
                   {
                     inputScan->setHint($5);
                   }
   
                 delete $4;
               }
          | TOK_DELETE no_check_log TOK_FROM table_name TOK_AS correlation_name optimizer_hint 
               {
                 TransMode *transMode = CmpCommon::transMode();

                 // Multi Commit must extract the where clause part
                 // of the query text for use at runtime.
                 // So mark the start of the WHERE clause here in
                 // case this DELETE is in fact an MULTI COMMIT Delete.
                 if (transMode->multiCommit() == TransMode::MC_ON_)
                   {
                     if(!ParNameLocListPtr) {
                       ParNameLocListPtr = new (PARSERHEAP()) 
                         ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     }
                     ParSetTextStartPosForMultiCommit(ParNameLocListPtr);
                   }

                 $4->setCorrName(*$6); 
                 Scan * inputScan =
                   new (PARSERHEAP()) Scan(CorrName(*$4, PARSERHEAP()));
   
                 $$ = new (PARSERHEAP())
                   Delete(CorrName(*$4, PARSERHEAP()),
                          NULL,
                          REL_UNARY_DELETE,
                          inputScan,
                          NULL);
   
                 if (($2 == 1) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoLogOperation();	
                   }

                  if (($2 == 2) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoCheck(TRUE);
                   }
    
                  if ($7)
                   {
                     inputScan->setHint($7);
                   }
   
                 delete $4;
                 delete $6;
               }

delete_statement : TOK_DELETE TOK_COLUMNS '(' quoted_string_list ')' TOK_FROM table_name optimizer_hint where_clause
               {
                 Scan * inputScan =
                   new (PARSERHEAP()) Scan(CorrName(*$7, PARSERHEAP()));

		 // attach the WHERE clause to the input scan
		 inputScan->addSelPredTree($9);
    
                 $$ = new (PARSERHEAP())
                   Delete(CorrName(*$7, PARSERHEAP()),
                          NULL,
                          REL_UNARY_DELETE,
                          inputScan,
                          NULL, NULL,
			  $4);
   
                  if ($8)
                    inputScan->setHint($8);

                 delete $7;
               }

delete_statement : delete_start_tokens where_clause
				{
                                  Delete *del = (Delete *)$1;
                                  ComASSERT(del);

                                  Scan * inputScan = (Scan *)(del->child(0)->castToRelExpr());
                                  ComASSERT(inputScan);

                                  // Is this Delete a MULTI COMMIT DELETE?
				  TransMode *transMode = CmpCommon::transMode();
                                  if (transMode->multiCommit() == TransMode::MC_ON_)
                                  {
                                    // If it is a MULTI-COMMIT Delete, do some error checking,
                                    // grab the string representation of the WHERE clause from
                                    // the query text and create the LongRunning operator.
                                    // The DELETE/SCAN created by the 'delete_start_tokens'
                                    // rule can be thrown away.

				    // Make sure the transaction modes are compatible
				    if (transMode->invalidMultiCommitCompatibility())
				    {
				      *SqlParser_Diags <<  DgSqlCode(-4352);
				      YYERROR;
				    }
                                    char *stmt = SQLTEXT();

                                     // If we can not get a single-byte string here, report error
                                     if ( stmt == NULL ) {
                                       *SqlParser_Diags <<  DgSqlCode(-3406);
                                       YYERROR;
                                     }
                    
				     // the WHERE clause cannot have a parameter or host varaible
				     if (($2 != NULL ) && ($2->containsOpType(ITM_DYN_PARAM) ||
							   $2->containsOpType(ITM_HOSTVAR)))
				       {
					 *SqlParser_Diags << DgSqlCode(-3426);
					 YYABORT;
				       } 

                                     StringPos start = 0;
                                     StringPos end = 0;
                                     char *where = NULL;
                                     ULng32 whereLen = 0;

                                     // Find the end of the WHERE clause if one exists.
                                     //
                                     if($2 != NULL) {

                                       if (ParGetTextStartEndPosForMultiCommit(ParNameLocListPtr,start, end))
                                         { yyerror(""); YYERROR; }

                                       ComASSERT(start > 0 && end > start);

                                       // Identify the where clause for use by the
                                       // ExeUtilLongRunning operator.
                                       //
                                       where = &stmt[start];
                                       whereLen = end-start;
                                     }

                                     WeAreInALRUOperation = TRUE;

                                     ExeUtilLongRunning * eue =
                                       new (PARSERHEAP ()) ExeUtilLongRunning(
                                            del->getTableName(),
                                            where,
                                            whereLen,
                                            ExeUtilLongRunning::LR_DELETE,
                                            0, // user did not specify the Multi Commit Size
                                            PARSERHEAP());
                    
                                      // attach the WHERE clause to LongRunning
                                      eue->addPredicateTree($2);

                                      // set the NOMVLOG MV option if specified
                                      eue->setNoLogOperation (del->isNoLogOperation() != FALSE);
                    
                                     // xn will be started, if needed, when the exeutilstmt stmt
                                     // is processed.
                                     eue->xnNeeded() = FALSE;

                                     // We got everything we need from the Delete and Scan operators,
                                     // so they can be deleted now.
                                     delete del;

                                     $$ = eue;
                                  }
                                  else
                                  {

                                    // attach the WHERE clause to the input scan
                                    inputScan->addSelPredTree($2);
                                    
                                    $$ = del;
                                  }
				}

/* type relx */
delete_statement : TOK_DELETE no_check_log TOK_WITH TOK_NO TOK_ROLLBACK TOK_FROM table_name optimizer_hint where_clause 
                {
                  Scan * inputScan =
                    new (PARSERHEAP()) Scan(CorrName(*$7, PARSERHEAP()));

                  // attach the WHERE clause to the input scan
                  inputScan->addSelPredTree($9);
                  $$ = new (PARSERHEAP())
                    Delete(CorrName(*$7, PARSERHEAP()),
                       NULL,
                       REL_UNARY_DELETE,
                       inputScan,
                       NULL);

                  if (($2 == 1) || ($2 == 3))
                  {
                    ((Delete*)$$)->setNoLogOperation();	
                  }

		    ((Delete*)$$)->setNoRollbackOperation();

                  if (($2 == 2) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoCheck(TRUE);
                   }
 
                  if ($8)
                    inputScan->setHint($8);

                  delete $7;
                }
		| TOK_DELETE no_check_log TOK_WITH TOK_NO TOK_ROLLBACK TOK_FROM table_name TOK_AS correlation_name
                             optimizer_hint where_clause 
                {
                  $7->setCorrName(*$9); 
                  Scan * inputScan =
                    new (PARSERHEAP()) Scan(CorrName(*$7, PARSERHEAP()));

                  // attach the WHERE clause to the input scan
                  inputScan->addSelPredTree($11);
                  $$ = new (PARSERHEAP())
                    Delete(CorrName(*$7, PARSERHEAP()),
                       NULL,
                       REL_UNARY_DELETE,
                       inputScan,
                       NULL);

                  if (($2 == 1) || ($2 == 3))
                  {
                    ((Delete*)$$)->setNoLogOperation();	
                  }

		    ((Delete*)$$)->setNoRollbackOperation();

                  if (($2 == 2) || ($2 == 3))
                   {
                     ((Delete*)$$)->setNoCheck(TRUE);
                   }
 
                  if ($10)
                    inputScan->setHint($10);

                  delete $7;
                  delete $9;
                }

delete_statement : TOK_DELETE no_check_log ignore_triggers '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']' TOK_FROM table_name optimizer_hint where_clause
				{
				  Scan * inputScan =
                                    new (PARSERHEAP()) Scan(CorrName(*$9, PARSERHEAP()));

				  Int64 numRows = atoInt64($6->data());
				  if ($5 == TOK_LAST)
				    {
				      yyerror("LAST option not supported with DELETE statement. \n");
				      YYERROR;
				    }

				  // attach the WHERE clause to the input scan
                                  inputScan->addSelPredTree($11);
				  $$ = new (PARSERHEAP())
				    Delete(CorrName(*$9, PARSERHEAP()),
					   NULL,
					   REL_UNARY_DELETE,
					   inputScan,
					   NULL);

				  if (($2 == 1) || ($2 == 3))
				    {
				      ((Delete*)$$)->setNoLogOperation();	
				    }
				  
				  if (TRUE == $3)
				    {
				      ((Delete*)$$)->setIgnoreTriggers(TRUE);
				    }

                                  if ($10)
                                    inputScan->setHint($10);

				  $$->setFirstNRows(numRows);

				  delete $9;
				}
		| TOK_DELETE no_check_log TOK_WITH TOK_NO TOK_ROLLBACK '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']'
                             TOK_FROM table_name optimizer_hint where_clause
                {
                  Scan * inputScan =
                    new (PARSERHEAP()) Scan(CorrName(*$11, PARSERHEAP()));

                    Int64 numRows = atoInt64($8->data());
                  if ($7 == TOK_LAST)
                    {
                      yyerror("LAST option not supported with DELETE statement. \n");
                      YYERROR;
                    }

                  // attach the WHERE clause to the input scan
                  inputScan->addSelPredTree($13);
                  $$ = new (PARSERHEAP())
                    Delete(CorrName(*$11, PARSERHEAP()),
                       NULL,
                       REL_UNARY_DELETE,
                       inputScan,
                       NULL);

                  if (($2 == 1) || ($2 == 3))
                    {
                      ((Delete*)$$)->setNoLogOperation();
                    }

                  ((Delete*)$$)->setNoRollbackOperation();

                  if ($12)
                    inputScan->setHint($12);

                  $$->setFirstNRows(numRows);

                  delete $11;
                }

                | delete_start_tokens TOK_WHERE TOK_CURRENT TOK_OF entity_name_as_item 
                                {
                                  Delete *del = (Delete *)$1;
                                  ComASSERT(del);
                                  
                                  del->currOfCursorName() = $5;

				  $$ = del;

                                }
                // QSTUFF + Mv
	        | TOK_DELETE no_check_log TOK_FROM table_as_stream_any where_clause
				{
		                  if ($5 != NULL) {
				    // attach the WHERE clause to the input scan
		  		    $4->addSelPredTree($5);
		                  }
				  $$ = new (PARSERHEAP())
				    Delete(((Scan *)$4)->getTableName(),
					   NULL,
					   REL_UNARY_DELETE,
					   $4,
					   NULL);
				  if (($2 == 1) || ($2 == 3))
				  {
					((Delete*)$$)->setNoLogOperation();	
				  }
				}

                | TOK_DELETE no_check_log TOK_FROM table_name set_delete_list where_clause
				{
                                  // Note: Hints not supported with SET ON ROLLBACK clause
				  Scan * inputScan =
				    new (PARSERHEAP()) Scan(CorrName(*$4, PARSERHEAP()));

		                  if ($6 != NULL) {
				    // attach the WHERE clause to the input scan
				    inputScan->addSelPredTree($6);
		                  }

				  $$ = new (PARSERHEAP())
				    Delete(CorrName(*$4, PARSERHEAP()),
					   NULL,
					   REL_UNARY_DELETE,
					   inputScan,
					   $5);
				  if (($2 == 1) || ($2 == 3))
				  {
					((Delete*)$$)->setNoLogOperation();	
				  }
				  delete $4; 
				}
        | TOK_DELETE no_check_log TOK_FROM table_name set_delete_list TOK_WHERE TOK_CURRENT TOK_OF entity_name_as_item
                    {
                                  // Note: Hints not supported with SET ON ROLLBACK clause
				  $$ = new (PARSERHEAP())
				    Delete(CorrName(*$4, PARSERHEAP()),
					   NULL,
					   REL_UNARY_DELETE,
					   new (PARSERHEAP()) Scan(CorrName(*$4, PARSERHEAP())),
					   $5,
					   $9);
				  if (($2 == 1) || ($2 == 3))
				  {
					((Delete*)$$)->setNoLogOperation();	
				  }
				  delete $4;
		   }

	       | TOK_DELETE no_check_log TOK_FROM table_as_stream_any set_delete_list where_clause
				{
                                  // Note: Hints not supported with SET ON ROLLBACK clause
		                  if ($6 != NULL) {
				    // attach the WHERE clause to the input scan
				    $4->addSelPredTree($6);
                		  }
				  $$ = new (PARSERHEAP())
				    Delete(((Scan *)$4)->getTableName(),
					   NULL,
					   REL_UNARY_DELETE,
					   $4,
					   $5);
				  if (($2 == 1) || ($2 == 3))
				    {
				      ((Delete*)$$)->setNoLogOperation();	
				    }
				}

              // QSTUFF + Mv
              // Long Running Delete
              | TOK_DELETE no_check_log TOK_WITH TOK_MULTI TOK_COMMIT multi_commit_size TOK_FROM table_name 
              {
		// Make sure the transaction modes are compatible
		if (CmpCommon::transMode()->invalidMultiCommitCompatibility())
		{
		    *SqlParser_Diags <<  DgSqlCode(-4352);
		    YYERROR;
		}

                 WeAreInALRUOperation = TRUE;

 		 ExeUtilLongRunning * eue = 
		   new (PARSERHEAP ()) ExeUtilLongRunning(
			CorrName(*$8, PARSERHEAP()),
                        NULL,      // where clause string
                        0,         // where clause string length
			ExeUtilLongRunning::LR_DELETE,           
			$6, // Multi Commit Size
			PARSERHEAP());

                 ComASSERT(eue->getMultiCommitSize() > 0);

	         eue->addPredicateTree(NULL);

                 // set the NOMVLOG MV option if specified
                 eue->setNoLogOperation ($2 == TRUE);
                    
		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 eue->xnNeeded() = FALSE;
		 
		 $$ = eue;

	       }   
// Long Running Delete
| TOK_DELETE no_check_log TOK_WITH TOK_MULTI TOK_COMMIT multi_commit_size TOK_FROM table_name TOK_WHERE
              {
                // Multi Commit must extract the where clause part
                // of the query text for use at runtime.
                // So mark the start of the WHERE clause here
                if(!ParNameLocListPtr) {
                  ParNameLocListPtr = new (PARSERHEAP()) 
                    ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                }
                ParSetTextStartPosForMultiCommit(ParNameLocListPtr);
              }
  search_condition
              {
		// Make sure the transaction modes are compatible
		if (CmpCommon::transMode()->invalidMultiCommitCompatibility())
		{
		    *SqlParser_Diags <<  DgSqlCode(-4352);
		    YYERROR;
		}

                char *stmt = SQLTEXT();
                 
		 // If we can not get a single-byte string here, report error 
		 if ( stmt == NULL ) {
		   *SqlParser_Diags <<  DgSqlCode(-3406);
		   YYERROR;
		 }

		 // the WHERE clause cannot have a parameter or host varaible
		 if (($11 !=NULL) && ($11->containsOpType(ITM_DYN_PARAM) ||
				     $11->containsOpType(ITM_HOSTVAR)))
		   {
		     *SqlParser_Diags << DgSqlCode(-3426);
		     YYABORT;
		   }

                 StringPos start = 0;
                 StringPos end = 0;
                 char *where = NULL;
                 ULng32 whereLen = 0;

                 // Find the end of the WHERE clause if one exists.
                 //
                 if($11 != NULL) {

                   if (ParGetTextStartEndPosForMultiCommit(ParNameLocListPtr,start, end))
                     { yyerror(""); YYERROR; }

                   ComASSERT(start > 0 && end > start);

                   // Identify the where clause for use by the
                   // ExeUtilLongRunning operator.
                   //
                   where = &stmt[start];
                   whereLen = end-start;
                 }

                 WeAreInALRUOperation = TRUE;

 		 ExeUtilLongRunning * eue = 
		   new (PARSERHEAP ()) ExeUtilLongRunning(
			CorrName(*$8, PARSERHEAP()),
                        where,
                        whereLen,
			ExeUtilLongRunning::LR_DELETE,           
			$6, // Multi Commit Size
			PARSERHEAP());

                 ComASSERT(eue->getMultiCommitSize() > 0);

     	         // attach the WHERE clause to LongRunning
	         eue->addPredicateTree($11);
		 
                 // set the NOMVLOG MV option if specified
                 eue->setNoLogOperation ($2 == TRUE);
                    
		 // xn will be started, if needed, when the exeutilstmt stmt
		 // is processed.
		 eue->xnNeeded() = FALSE;
		 
		 $$ = eue;

	       }     

| TOK_DELETE TOK_ALL TOK_FROM TOK_TABLE '(' TOK_NATABLE_CACHE '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("NATABLECACHEDELETE"
                                          , 0
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }  
| TOK_DELETE TOK_ALL TOK_FROM TOK_TABLE '(' TOK_QUERY_CACHE '(' value_expression_list ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("QUERYCACHEDELETE"
                                          , $8
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
  }  
|  TOK_DELETE TOK_ALL TOK_FROM TOK_TABLE '(' TOK_NAROUTINE_CACHE '(' ')' ')'
  {
    $$ = new (PARSERHEAP()) RelInternalSP("NAROUTINECACHEDELETE"
                                          , 0
                                          , REL_INTERNALSP
                                          , PARSERHEAP()
                                          , RelInternalSP::executeInSameArkcmp);
                                          } 

/* type uint */	       
multi_commit_size : empty
                       {
                        $$ = 0;
                       }
                  | TOK_EVERY unsigned_integer TOK_ROWS 
                       {
			 if($2 == 0)
			   {
			     *SqlParser_Diags << DgSqlCode(-3240); // commit size must be greater than zero		     
			   }
			 
			 // assuming that the user will
			 // always pass a valid unsigned long value (correct
			 // number of digits)
			 $$ = $2; 
                       }
             
 /* type relx */
transaction_statement : TOK_BEGIN
              {
                 $$ = new (PARSERHEAP()) RelTransaction(BEGIN_);
              }
      | TOK_BEGIN TOK_WORK
              {
                 $$ = new (PARSERHEAP()) RelTransaction(BEGIN_);
              }
      | TOK_BT
              {
                 $$ = new (PARSERHEAP()) RelTransaction(BEGIN_);
              }
      | TOK_COMMIT
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_);
              }
      | TOK_COMMIT TOK_WORK
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_);
              }
      | TOK_COMMIT TOK_NO TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_);
              }
      | TOK_COMMIT TOK_WORK TOK_NO TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_);
              }
      | TOK_COMMIT TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_WAITED_);
              }
      | TOK_COMMIT TOK_WORK TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_WAITED_);
              }
      | TOK_ET
              {
		$$ = new (PARSERHEAP()) RelTransaction(COMMIT_);
              }
      | TOK_ROLLBACK
              {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_WAITED_);
              }
      | TOK_ROLLBACK TOK_WORK
              {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_WAITED_);
              }
      | TOK_ROLLBACK TOK_WAITED
	      {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_WAITED_);
              }
      | TOK_ROLLBACK TOK_WORK TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_WAITED_);
              }
      | TOK_ROLLBACK TOK_NO TOK_WAITED
	      {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_);
              }
      | TOK_ROLLBACK TOK_WORK TOK_NO TOK_WAITED
              {
		$$ = new (PARSERHEAP()) RelTransaction(ROLLBACK_);
              }
      | TOK_SET TOK_TRANSACTION TOK_AUTOCOMMIT on_off
              {
		TransMode * m = new (PARSERHEAP()) TransMode();
		m->autoCommit() = $4 ? TransMode::ON_ : TransMode::OFF_;

		$$ = new (PARSERHEAP())
		  RelTransaction(SET_TRANSACTION_, m);
              }

      | TOK_SET TOK_TRANSACTION TOK_AUTOBEGIN on_off
              {
		TransMode * m = new (PARSERHEAP()) TransMode();
		m->setFlags() = $4 ? TransMode::AUTO_BEGIN_ON_ : TransMode::AUTO_BEGIN_OFF_;

		$$ = new (PARSERHEAP())
		  RelTransaction(SET_TRANSACTION_, m);
              }

      | TOK_SET TOK_TRANSACTION TOK_ROLLBACK TOK_WAITED

              {
		TransMode * m = new (PARSERHEAP()) TransMode();
		m->rollbackMode() = TransMode::ROLLBACK_MODE_WAITED_;

		$$ = new (PARSERHEAP())
		  RelTransaction(SET_TRANSACTION_, m);
              }
      | TOK_SET TOK_TRANSACTION TOK_ROLLBACK TOK_NO TOK_WAITED
              {
		TransMode * m = new (PARSERHEAP()) TransMode();
		m->rollbackMode() = TransMode::ROLLBACK_MODE_NOWAITED_;

		$$ = new (PARSERHEAP())
		  RelTransaction(SET_TRANSACTION_, m);
              }

      | set_transaction_statement
		{
		  StmtDMLSetTransaction * st = (StmtDMLSetTransaction *)$1;

		  TransMode * m = new (PARSERHEAP())
		    TransMode(st->getIsolationLevel(), 
			      st->getAccessMode(),
			      TransMode::AC_NOT_SPECIFIED_,
			      st->getRollbackMode(),
			      -1, /* diagnostic area size */
			      st->getAutoAbortInterval(),
			      st->getMultiCommit(),
			      (ULng32)st->getMultiCommitSize());

		  $$ = new (PARSERHEAP())
		    RelTransaction(SET_TRANSACTION_, m, st->getDiagSizeNode());
		}

/* type boolean */
on_off : TOK_OFF
           {
	     $$ = FALSE;
	   }

         | TOK_ON
           {
	     $$ = TRUE;
	   }
         | empty
           {
	     $$ = TRUE;
           }

/* type boolean */
on_or_empty : TOK_OFF
           {
	     YYERROR;
	   }

         | TOK_ON
           {
	     $$ = TRUE;
	   }
         | empty
           {
	     $$ = TRUE;
           }


/* type longint */
autoabort_interval : TOK_RESET 
		     {
			$$ = -3 ;  /* denotes a user specified reset */
		     }
		   | NUMERIC_LITERAL_EXACT_NO_SCALE hour_hours
		   {
		      RemoveLeadingZeros(*$1);
		      short strSize = $1->length();
		      $$ = 3600*atoi(*$1);

		      if ((strSize > 4)||($$ > 21474836) || ($$ < 20))
		      {
		      *SqlParser_Diags << DgSqlCode(-3235) << DgString0(*$1) ;
                        YYERROR;
		      }

		   }
		   | NUMERIC_LITERAL_EXACT_NO_SCALE minute_minutes
		   {
		      RemoveLeadingZeros(*$1);
		      short strSize = $1->length();
		      $$ = 60*atol(*$1);

		      if ((strSize > 6)||($$ > 21474836) || ($$ < 20))
		      {
		      *SqlParser_Diags << DgSqlCode(-3235) << DgString0(*$1) ;
                        YYERROR;
		      }
		   }
		   | NUMERIC_LITERAL_EXACT_NO_SCALE second_seconds
		   {
		      RemoveLeadingZeros(*$1);
		      short strSize = $1->length();
		      $$ = atol(*$1);

		      if ((strSize > 8)||($$ > 21474836) || ($$ < 20))
		      {
		      *SqlParser_Diags << DgSqlCode(-3235) << DgString0(*$1) ;
                        YYERROR;
		      }
		   }
		   | unsigned_integer
		   {
		      if ($1 == 0)
			$$ = -2 ;  /* -2 denotes a 0 specified by the user */
		      else         /* this value cannot be overridden */
		      {
                        YYERROR;
		      }
		   }

/* type longint */
maxruntime_interval : NUMERIC_LITERAL_EXACT_NO_SCALE hour_hours
		   {
		      RemoveLeadingZeros(*$1);
		      short strSize = $1->length();
		      if (strSize > 4)
			{
			  YYERROR;
			}
		      
		      $$ = 3600*atoi(*$1);
		   }
		   | NUMERIC_LITERAL_EXACT_NO_SCALE minute_minutes
		   {
		      RemoveLeadingZeros(*$1);
		      short strSize = $1->length();
		      if (strSize > 6)
			{
			  YYERROR;
			}
		      $$ = 60*atol(*$1);
		   }

hour_hours	  : TOK_HOUR
		  | TOK_HOURS

minute_minutes	  : TOK_MINUTE
		  | TOK_MINUTES

second_seconds	  : TOK_SECOND
		  | TOK_SECONDS

/* type relx */
query_suspend_safe : TOK_CONTROL TOK_QUERY TOK_SUSPEND TOK_QID identifier
                  {
                     $$ = new (PARSERHEAP())
                      ControlRunningQuery(*$5, 
                        ControlRunningQuery::ControlQid,
                        ControlRunningQuery::Suspend, 
                       ControlRunningQuery::Safe);
                  }

/* type relx */
query_suspend_forced : TOK_CONTROL TOK_QUERY TOK_SUSPEND TOK_QID identifier ',' TOK_FORCE
                  {
                     $$ = new (PARSERHEAP())
                      ControlRunningQuery(*$5,
                        ControlRunningQuery::ControlQid,
                        ControlRunningQuery::Suspend, 
                        ControlRunningQuery::Force);
                  }
  
/* type relx */
query_activate : TOK_CONTROL TOK_QUERY TOK_ACTIVATE TOK_QID identifier 
                  {
                     $$ = new (PARSERHEAP())
                      ControlRunningQuery(*$5,
                        ControlRunningQuery::ControlQid,
                        ControlRunningQuery::Activate, 
                        ControlRunningQuery::CancelOrActivateIsAlwaysSafe);
                  }
/* type relx */
query_cancel_qid   : TOK_CONTROL TOK_QUERY TOK_CANCEL TOK_QID identifier
                      {
                      $$ = new (PARSERHEAP())
                        ControlRunningQuery(*$5,
                          ControlRunningQuery::ControlQid,
                          ControlRunningQuery::Cancel,
                          ControlRunningQuery::CancelOrActivateIsAlwaysSafe);
                      }

/* type relx */
query_cancel_pname : TOK_CONTROL TOK_QUERY TOK_CANCEL TOK_PID DOLLAR_IDENTIFIER
                      {
                      $$ = new (PARSERHEAP())
                        ControlRunningQuery(*$5,
                          ControlRunningQuery::ControlPname,
                          ControlRunningQuery::Cancel,
                          ControlRunningQuery::CancelOrActivateIsAlwaysSafe);
                      }

/* type relx */
query_cancel_nid_pid : TOK_CONTROL TOK_QUERY TOK_CANCEL TOK_PID
                       NUMERIC_LITERAL_EXACT_NO_SCALE ',' 
                       NUMERIC_LITERAL_EXACT_NO_SCALE
                      {
                      $$ = new (PARSERHEAP())
                        ControlRunningQuery(atoi($5->data()), 
                                            atoi($7->data()),
                          ControlRunningQuery::ControlNidPid,
                          ControlRunningQuery::Cancel,
                          ControlRunningQuery::CancelOrActivateIsAlwaysSafe);
                      }
/* type relx */
query_cancel_no_comment:  query_cancel_qid 
                        | query_cancel_pname
                        | query_cancel_nid_pid

/* type relx */
query_cancel_optional_comment : query_cancel_no_comment
                              | query_cancel_no_comment 
                                  TOK_COMMENT QUOTED_STRING
                  {
                     ((ControlRunningQuery *)$$)->setComment(*$3);
                  }

/* type relx */
lock_unlock_statement :   lock_statement
                        | unlock_statement

/* type relx */
lock_statement : TOK_LOCK TOK_TABLE table_name lock_mode lock_index_option
			{
			  $$ = new (PARSERHEAP())
			    RelLock(*$3, $4, (NOT $5), REL_LOCK);
			}
                 | TOK_LOCK TOK_TABLE table_name lock_mode lock_index_option TOK_PARALLEL TOK_EXECUTION TOK_ON
			{
			  $$ = new (PARSERHEAP())
			    RelLock(*$3, $4, (NOT $5), REL_LOCK, TRUE);
			}

/* type boolean */
lock_index_option : TOK_NO TOK_INDEX TOK_LOCK { $$ = TRUE; }
                    | empty { $$ = FALSE; }

/* type lockmode */
optional_lock_mode : lock_mode
                    | /* empty */
                    {
		      $$ = LOCK_MODE_NOT_SPECIFIED_;
		    }

/* type lockmode */
lock_mode :   TOK_IN TOK_SHARE TOK_MODE         { $$ = SHARE_;}
            | TOK_IN TOK_EXCLUSIVE TOK_MODE	{ $$ = EXCLUSIVE_;}
            | TOK_IN TOK_PROTECTED TOK_MODE	{ $$ = PROTECTED_;}


/* type relx */
unlock_statement : TOK_UNLOCK TOK_TABLE table_name
			{
			  $$ = new (PARSERHEAP())
			    RelLock(*$3, SHARE_/*no-op in unlock*/, TRUE, REL_UNLOCK);
			}
                   | TOK_UNLOCK TOK_TABLE table_name TOK_PARALLEL TOK_EXECUTION TOK_ON 
			{
			  $$ = new (PARSERHEAP())
			    RelLock(*$3, SHARE_/*no-op in unlock*/, TRUE, REL_UNLOCK, TRUE);
			}

/* type relx */
/* These are all Tandem syntax extensions. */
control_statement : TOK_CONTROL TOK_QUERY TOK_SHAPE query_shape_options query_shape_control
				{
				  if ($5->castToRelExpr() == NULL)
				    {
				      *SqlParser_Diags << DgSqlCode(-3113) <<
					DgString0("Relational expr. expected here.");
				      yyerror("");
				      YYERROR;
				    }
				  else if ($5->castToRelExpr()->getOperatorType() == REL_CONTROL_QUERY_SHAPE)
				    {
				      if ($4 != TOK_FALSE)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Can't combine WITHOUT option and HOLD/RESTORE");
					  yyerror("");
					  YYERROR;
					}
				      else
					{
					  /*					  if ((getenv("SQLMX_REGRESS")) &&
					      (CmpCommon::getDefault(MODE_SEABASE) == DF_ON))
					    {
					      // TEMPTEMP. CQS doesn't work and causes many
					      // regressions failures. Temporarily CUT it.
					      $$ = new (PARSERHEAP()) CutOp(0);
					    }
					    else*/
					  $$ = $5->castToRelExpr();
					}
				    }
				  else
				    {
				      RelExpr * re = $5->castToRelExpr();
				      /*				      if ((getenv("SQLMX_REGRESS")) &&
					  (CmpCommon::getDefault(MODE_SEABASE) == DF_ON))
					{
					  // TEMPTEMP. CQS doesn't work and causes many
					  // regressions failures. Temporarily CUT it.
					  re = new (PARSERHEAP()) CutOp(0);
					}
				      */

				      $$ = new (PARSERHEAP())
					ControlQueryShape(
					     re, //$5->castToRelExpr(),
					     SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(),
					     FALSE,
					     FALSE,
					     ($4 == TOK_EXCHANGE || $4 == TOK_ENFORCERS || $4 == TOK_EXCHANGE_AND_SORT),
					     ($4 == TOK_SORT || $4 == TOK_ENFORCERS || $4 == TOK_EXCHANGE_AND_SORT));
				    }
				}
		  | TOK_CONTROL TOK_QUERY TOK_DEFAULT query_default_control
                                {
				  $$ = $4;
				}
		  | TOK_CQD query_default_control
                                {
				  $$ = $2;
				}
                  | TOK_CONTROL TOK_TABLE table_control
                                {
				  $$ = $3;
				}
                  | TOK_CONTROL TOK_SESSION session_control
                                {
				  $$ = $3;
				}
                  | declare_or_set_cqd
                  | set_session_default_statement

osim_statement : 
                    //control osim capture location '<osim directory path>';
                    //create directory and files, 
                    //begin a session to capture running queries and referred tables/views/statistics.
                   TOK_CONTROL TOK_OSIM TOK_CAPTURE TOK_LOCATION character_string_literal
                   {

                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::CAPTURE, 
                                                                                    *$5,
                                                                                    FALSE,
                                                                                    PARSERHEAP());
                      $$ = osim;
                   }
                   //control osim capture stop;
                   //end osim capture session, dump statistics data of referred tables.
                   |TOK_CONTROL TOK_OSIM TOK_CAPTURE TOK_STOP
                   {
                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::OFF, 
                                                                                    *(new (PARSERHEAP()) NAString("")),
                                                                                    FALSE,
                                                                                    PARSERHEAP());
                      $$ = osim;
                   }
                   //control osim load from '<osim directory path>';
                   //restore table DDLs, constraints, views on dev machine,
                   //using information in <osim directory path>, which is collected from production cluster,
                   //when qualified names of any existing objects conflict with objects to be loaded, 
                   //if ',FORCE' is present, drop the existing objects, otherwise abort.
                   |TOK_CONTROL TOK_OSIM TOK_LOAD TOK_FROM character_string_literal optional_osim_force
                   {
                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::LOAD, 
                                                                                    *$5,
                                                                                    $6,
                                                                                    PARSERHEAP());
                      $$ = osim;
                   }
                   //control osim simulate start;
                   //setup runtime information on dev machine for simulation production cluster in plan generation, 
                   //must run right after "constrol osim load ..." is issued.
                   |TOK_CONTROL TOK_OSIM TOK_SIMULATE TOK_START
                   {
                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::SIMULATE, 
                                                                                    *(new (PARSERHEAP()) NAString("")),
                                                                                    FALSE,
                                                                                    PARSERHEAP());
                      $$ = osim;
                   }
                   //control osim simulate continue '<osim diretory path>';
                   //setup runtime information on dev machine for simulation, 
                   //this command is used to continue a simulation in a new SQL session.
                   |TOK_CONTROL TOK_OSIM TOK_SIMULATE TOK_CONTINUE character_string_literal
                   {
                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::SIMULATE, 
                                                                                    *$5,
                                                                                    FALSE,
                                                                                    PARSERHEAP());
                      $$ = osim;
                   }
                   //control osim unload '<osim directory path>';
                   //cleanup tables created by "control osim load from ..." command, 
                   //the acutal action is to drop tables in <osim directory path>/CREATE_TABLE_DDLS.txt, 
                   //and objects that refer them.
                   |TOK_CONTROL TOK_OSIM TOK_UNLOAD character_string_literal
                   {
                      OSIMControl *osim = new (PARSERHEAP()) OSIMControl( OptimizerSimulator::UNLOAD, 
                                                                                    *$4,
                                                                                    FALSE,
                                                                                    PARSERHEAP());                                                            
                      $$ = osim;
                   }
optional_osim_force: ',' TOK_FORCE
                   {
                       $$ = TRUE;
                   }
                   |empty
                   { 
                       $$ = FALSE; 
                   }
/* type relx */
/* Except where noted (the Ansi flavor of SET CATALOG and of SET SCHEMA),
 * all of these are Tandem syntax extensions.
 */
declare_or_set_cqd: TOK_DECLARE TOK_CATALOG character_string_literal
                                {
				  PARSERASSERT((CharInfo::CharSet)SQLTEXTCHARSET() == CharInfo::UTF8);
				  $$ = new (PARSERHEAP())
				    ControlQueryDefault(
				      SQLTEXT(), CharInfo::UTF8, "CATALOG", *$3/*character_string_literal*/);
				}
                  | TOK_DECLARE TOK_CATALOG sql_mx_catalog_name
                                {
				  *$3 = ToAnsiIdentifier(*$3);
				  $$ = new (PARSERHEAP())
				    ControlQueryDefault(
				      SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "CATALOG", *$3);
				}

		  | TOK_DECLARE TOK_SCHEMA character_string_literal
                                {
				  if (! validateVolatileSchemaName(*$3/*character_string_literal*/))
				    {
				      YYERROR;
				    }
				  
				  PARSERASSERT((CharInfo::CharSet)SQLTEXTCHARSET() == CharInfo::UTF8);
				  $$ = new (PARSERHEAP())
				    ControlQueryDefault(
					 SQLTEXT(), CharInfo::UTF8, "SCHEMA", *$3/*character_string_literal*/);
				}

          | TOK_DECLARE TOK_SCHEMA schema_name
                {
				  
				  NAString tmpSchema($3->getSchemaNameAsAnsiString());
		  if (! validateVolatileSchemaName(tmpSchema))
		    {
		      YYERROR;
		    }
		  
				  $$ = new (PARSERHEAP())
				    ControlQueryDefault(
				      SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(),"SCHEMA", tmpSchema);
				}
                  | TOK_DECLARE TOK_NAMETYPE character_string_literal
                                {
                                  // DEFAULT_CHARSET has no effect on character_string_literal in this context
                                  $$ = new (PARSERHEAP())
                                    ControlQueryDefault(
                                      SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "NAMETYPE", *$3);
				}
                  | TOK_DECLARE TOK_NAMETYPE regular_identifier
                                {
                                  $$ = new (PARSERHEAP())
                                    ControlQueryDefault(
                                      SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "NAMETYPE", *$3);
				}

		  /* The SET flavor is dynamic (the extra TRUE flag).
		  /* See the comments way at the top for when
		  /* normalizeDynamicCQD() needs to be called.
		  /*/
                  | TOK_SET TOK_CATALOG character_string_literal
                                {
				  // ANSI 16.1
				  //## 'literal' needs to be char-expr (hv, etc)
// EJF L4J - CQD dynamic are not allowed in Compound Statements
                      if (beginsWith(SQLTEXT(),"BEGIN"))  {
                        *SqlParser_Diags << DgSqlCode(-3175);
                        YYERROR;
                        }
                      else  { // business as usual
                        PARSERASSERT((CharInfo::CharSet)SQLTEXTCHARSET() == CharInfo::UTF8);
                        $$ = new (PARSERHEAP())
                        ControlQueryDefault(
                        SQLTEXT(), CharInfo::UTF8, "CATALOG", *$3/*character_string_literal*/, TRUE);
			}
                      }
                  | TOK_SET TOK_CATALOG sql_mx_catalog_name
                                {
// EJF L4J - CQD dynamic are not allowed in Compound Statements
                      if (beginsWith(SQLTEXT(),"BEGIN"))  {
                        *SqlParser_Diags << DgSqlCode(-3175);
                        YYERROR;
                        }
                      else  { // business as usual
						// normalizeDynamicDQD requires the catalog in the original charset.
						NAString tmpCatalog(ToAnsiIdentifier(*$3));
				  $$ = normalizeDynamicCQD(
				    "CATALOG", tmpCatalog);
				}
                        }

                  | TOK_SET TOK_SCHEMA character_string_literal
                        {
		       	  // ANSI 16.2
			  //## 'literal' needs to be char-expr (hv, etc)
			  // EJF L4J - CQD dynamic are not allowed in Compound Statements
			  if (beginsWith(SQLTEXT(),"BEGIN"))  {
			    *SqlParser_Diags << DgSqlCode(-3175);
			    YYERROR;
			  }
			  else  { // business as usual
			    if (! validateVolatileSchemaName(*$3/*character_string_literal*/))
			      {
				YYERROR;
			      }
			    
			    PARSERASSERT((CharInfo::CharSet)SQLTEXTCHARSET() == CharInfo::UTF8);
			    $$ = new (PARSERHEAP())
			      ControlQueryDefault(
				   SQLTEXT(), CharInfo::UTF8, "SCHEMA", *$3/*character_string_literal*/, TRUE);
			  }
                        }
                  | TOK_SET TOK_SCHEMA schema_name
                        {
			  // EJF L4J - CQD dynamic are not allowed in Compound Statements
			  if (beginsWith(SQLTEXT(),"BEGIN"))  {
			    *SqlParser_Diags << DgSqlCode(-3175);
			    YYERROR;
			  }
			  else  { // business as usual
				  NAString tmpSchema($3->getSchemaNameAsAnsiString());

				  if (! validateVolatileSchemaName(tmpSchema))
				    {
				      YYERROR;
				    }
				  
				  // normalizeDynamicCQD requires the schema in the original charset.
				  $$ = normalizeDynamicCQD(
				       "SCHEMA", tmpSchema
				       );
			  }
			}
                  | TOK_SET TOK_NAMETYPE character_string_literal
                                {
                                  // DEFAULT_CHARSET has no effect on character_string_literal in this context
                                  $$ = new (PARSERHEAP())
                                    ControlQueryDefault(
                                      SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "NAMETYPE", *$3, TRUE);
                                }
                  | TOK_SET TOK_NAMETYPE regular_identifier
                                {
				  $$ = normalizeDynamicCQD(
				    "NAMETYPE", *$3);
				}

/* type tokval */
query_shape_options : TOK_IMPLICIT TOK_EXCHANGE
                        {
			  $$ = $2;
			}
                      | TOK_WITHOUT TOK_EXCHANGE
                        {
			  $$ = $2;
			}
                      | TOK_IMPLICIT TOK_SORT
                        {
			  $$ = $2;
			}
                      | TOK_WITHOUT TOK_SORT
                        {
			  $$ = $2;
			}
                      | TOK_IMPLICIT TOK_EXCHANGE_AND_SORT
                        {
			  $$ = $2;
			}
                      | TOK_IMPLICIT TOK_ENFORCERS
                        {
			  $$ = $2;
			}
                      | TOK_WITHOUT TOK_EXCHANGE_AND_SORT
                        {
			  $$ = $2;
			}
                      | TOK_WITHOUT TOK_ENFORCERS
                        {
			  $$ = $2;
			}
                      | /* empty */
                        {
			  $$ = TOK_FALSE;
			}

/* type exprnode */
query_shape_control : shape_identifier
				{
				  // tuple, cut, scan and misc. others are nodes
				  // that are allowed without any arguments,
				  // TYPE1 and TYPE2 are allowed as 3rd or 4th
				  // arguments of join plan shapes
				  if (*$1 == "TUPLE")
				    {
				      $$ = new (PARSERHEAP()) Tuple();
				    }
				  else if (*$1 == "CUT" OR
					   *$1 == "ANYTHING" OR
					   *$1 == "OFF" OR
					   *$1 == "INSERT" OR
					   *$1 == "UPDATE" OR
					   *$1 == "UPDATE_UNIQUE" OR
					   *$1 == "DELETE" OR
					   *$1 == "DELETE_UNIQUE"
					   )
				    {
				      $$ = new (PARSERHEAP()) CutOp(0);
				    }
				  else if (*$1 == "SCAN" OR
					   *$1 == "FILE_SCAN" OR
					   *$1 == "INDEX_SCAN" )
				    {
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
				    }
                                  else if (*$1 == "EXPLAIN")
                                    {
                                      $$ = new (PARSERHEAP()) ExplainFunc();
                                    }
				  else if (*$1 == "ISOLATED_SCALAR_UDF" )
				    {
				      $$ = new (PARSERHEAP()) UDFForceWildCard(REL_FORCE_ANY_SCALAR_UDF);
				    }
				  else if (*$1 == "TMUDF" )
				    {
				      $$ = new (PARSERHEAP()) WildCardOp(REL_ANY_LEAF_TABLE_MAPPING_UDF);
				    }
				  else if (*$1 == "FAST_EXTRACT" ||
                                           *$1 == "HIVE_INSERT")
				    {
				      $$ = new (PARSERHEAP()) WildCardOp(REL_ANY_EXTRACT);
				    }
				  else if (*$1 == "FORWARD")
				    {
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::DIRECTION_FORWARD);
				    }
				  else if (*$1 == "REVERSE")
				    {
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::DIRECTION_REVERSED);
				    }
				  // The following 5 cases (DENSE,SPARSE,SYSTEM,TYPE1,and TYPE2)
				  // will be better handled via a new class (derived from ExprNode)
				  // that can pass the information. The problem with passing it 
				  // using ConstValue objects is the possible confusion with
				  // literals passed similarly
				  else if (*$1 == "SPARSE")
				    {
				      $$ = new (PARSERHEAP()) ConstValue(_SPARSE_);
				    }
				  else if (*$1 == "DENSE")
				    {
				      $$ = new (PARSERHEAP()) ConstValue(_DENSE_);
				    }
				  else if (*$1 == "SYSTEM")
				    {
				      $$ = new (PARSERHEAP()) ConstValue(_SYSTEM_);
				    }
				  else if (*$1 == "PLAN0")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("PLAN0");
				    }
				  else if (*$1 == "PLAN1")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("PLAN1");
				    }
				  else if (*$1 == "PLAN2")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("PLAN2");
				    }
				  else if (*$1 == "PLAN3")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("PLAN3");
				    }
				  else if (*$1 == "TYPE1")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("TYPE1");
				    }
				  else if (*$1 == "TYPE2")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("TYPE2");
				    }
                                  else if (*$1 == "INDEXJOIN")
                                    {
                                      $$ = new (PARSERHEAP()) ConstValue("INDEXJOIN");
                                    }
				  else if (*$1 == "GROUP")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("GROUP");
				    }
				  else if (*$1 == "SPLIT")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("SPLIT");
				    }
				  else if (*$1 == "REPART")
				    {
				      $$ = new (PARSERHEAP()) ConstValue("REPART");
				    }
				  else if (*$1 == "HOLD")
				    {
				      $$ = new (PARSERHEAP())
				       ControlQueryShape(
				         NULL, SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), TRUE);
				    }
				  else if (*$1 == "RESTORE")
				    {
				      $$ = new (PARSERHEAP())
				       ControlQueryShape(
				         NULL, SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), FALSE);
				    }
				  else
				    {

				      *SqlParser_Diags << DgSqlCode(-3113) <<
					DgString0(NAString(*$1) +
						  " is not a valid shape directive (at least not when used without arguments).");
				      yyerror("");
				      YYERROR;
				    }
				}
	      | literal
				{
				  // this could be a tablename or another
				  // argument to some node
				  $$ = $1;
				}

	      | shape_identifier literal
				{
				  // this can be a scan option

				  NABoolean dummyNegate = FALSE;
				  ConstValue *cv = $2->castToConstValue(dummyNegate);
                                  const NAType *nat = NULL;

                                  if (cv)
                                    nat = cv->getType();

                                  if (cv && nat->getTypeQualifier() == NA_CHARACTER_TYPE)
                                    {
                                      NAString * tempstr =
                                        charToChar((Lng32)CharInfo::UTF8, // targetCS
                                                   (const char *) cv->getConstValue(),
                                                   cv->getStorageSize(), 
                                                   (Lng32)((CharType *) nat)->getCharSet(), // sourceCS
                                                   PARSERHEAP());
                                      if (tempstr == NULL)
                                        {
                                          *SqlParser_Diags << DgSqlCode(-3113) << 
                                            DgString0("Error converting scan shape argument to UTF-8");
                                          return NULL;
                                        }
                                      cv = new (PARSERHEAP()) ConstValue (*tempstr, CharInfo::UTF8);
                                      delete tempstr;
                                      nat = cv->getType();
                                    }

				  if (*$1 == "TABLE")
				    {
				      if (!cv)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Character constant for table name expected.");
					  return NULL;
					}
				      if (nat->getTypeQualifier() == NA_CHARACTER_TYPE)
					{
					  NAString tableName ((char *) cv->getConstValue(),
                                                              (size_t) cv->getStorageSize());
					  if (tableName != "")
					    {
					      ComObjectName tname ( tableName
					                          , COM_TABLE_NAME
					                          , FALSE // NABoolean createDropAlias - n/a
					                          , PARSERHEAP() // CollHeap * h
					                          , NASTRING_ALLOW_NSK_GUARDIAN_NAME_FORMAT // unsigned short pv_flags
					                          );
					      tableName = tname.getExternalName();
					      if (tableName == "")
						{
						  *SqlParser_Diags << DgSqlCode(-3113) <<
						    DgString0("Table name is not an ANSI name.");
						  return NULL;
						}
					      $$ = new (PARSERHEAP()) ScanForceWildCard(tableName);
					    }						  
					  else
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Expected non Empty String for table name.");
					      return NULL;
					    }
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Character constant for table name expected.");
					  return NULL;
					}
				    }
				  
				  else if ((*$1 == "ACCESS_PATH")||(*$1 == "PATH"))
				    {
				      if (!cv)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for access path.");
					  return NULL;
					}
				      if (nat->getTypeQualifier() == NA_CHARACTER_TYPE)
					{
					  NAString indexName ((char *) cv->getConstValue(),
                                                              (size_t) cv->getStorageSize());
					  if (indexName != "")
					    {
					      ComObjectName iname ( indexName
					                          , COM_INDEX_NAME
					                          , FALSE // NABoolean createDropAlias - n/a
					                          , PARSERHEAP() // CollHeap * h
					                          , NASTRING_ALLOW_NSK_GUARDIAN_NAME_FORMAT // unsigned short pv_flags
					                          );
					      indexName = iname.getExternalName();
					      if (indexName == "")
						{
						  *SqlParser_Diags << DgSqlCode(-3113) <<
						    DgString0("Index name is not an ANSI name.");
						  return NULL;
						}
					      $$ = new (PARSERHEAP()) ScanForceWildCard();
					      ((ScanForceWildCard*)$$)->setIndexName(indexName);
					    }						  
					  else
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Expected non Empty String for index name. use ACCESS_PATH ANY for system decision.");
					      return NULL;
					    }
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for access path.");
					  return NULL;
					}
				    }
				  
				  else if ((*$1 == "MDAM_COLUMNS"))
				    {
				      short numColumns;
				      if (!cv)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for MDAM_COLUMNS.");
					  return NULL;
					}
				      if (nat->getTypeQualifier() == NA_NUMERIC_TYPE)
					{
					  if (cv->getStorageSize() > 2)
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Number of columns (short int) expected.");
					      return NULL;
					    }
					  numColumns = 
                                            (cv->getStorageSize() == 1 
                                             ? *((Int8*) cv->getConstValue()) 
                                             : *((short *) cv->getConstValue()));
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for MDAM_COLUMNS.");
					  return NULL;
					}
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
				      ((ScanForceWildCard*)$$)->setColumnOptions((Int32)numColumns,
								ScanForceWildCard::MDAM_COLUMNS_NO_MORE);
				    }

				  else if ((*$1 == "BLOCKS_PER_ACCESS"))
				    {
				      Lng32 blocksPerAccess;
				      if (!cv)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for BLOCKS_PER_ACCESS.");
					  return NULL;
					}
				      if (nat->getTypeQualifier() == NA_NUMERIC_TYPE)
					{
                                          if (cv->getStorageSize() <= 1)
                                            blocksPerAccess = *((Int8 *) cv->getConstValue());
                                          else if (cv->getStorageSize() <= 2)
                                            blocksPerAccess = *((short *) cv->getConstValue());
                                          else if (cv->getStorageSize() <= 4)
                                            blocksPerAccess = *((Lng32 *) cv->getConstValue());
                                          else
                                            {
                                              *SqlParser_Diags << DgSqlCode(-3113) <<
                                                DgString0("Illegal argument for BLOCKS_PER_ACCESS.");
                                              return NULL;
                                            }

					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for BLOCKS_PER_ACCESS.");
					  return NULL;
					}
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
				      ((ScanForceWildCard*)$$)->setNumberOfBlocksToReadPerAccess(blocksPerAccess);
				    } // blocks_per_access
				  
				  // Handle "SCALAR_UDF 'functionname' and "UDF_ACTION 'actionname'".  
				  // These are the function name and action name, respectively, for a UDF.
				  else if (*$1 == "SCALAR_UDF" || *$1 == "UDF_ACTION")
				    {
				      if (!cv)
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Character constant for function/action names expected.");
					  return NULL;
					}
				      if (nat->getTypeQualifier() == NA_CHARACTER_TYPE)
					{
					  NAString name ((char *) cv->getConstValue(),
                                                              (size_t) cv->getStorageSize());
					  if (name != "")
					    {
					      if (*$1 == "SCALAR_UDF")
					      {
  					        ComObjectName oname(name, COM_TABLE_NAME);
					        name = oname.getExternalName();
					        if (name == "")
						{
						  *SqlParser_Diags << DgSqlCode(-3113) <<
						     DgString0("Function name is not an ANSI name.");
						  return NULL;
						}
					        $$ = new (PARSERHEAP()) UDFForceWildCard(name, "");
					      }
					      else
					        $$ = new (PARSERHEAP()) UDFForceWildCard("", name);
 					    }						  
					  else
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Expected non Empty String for function/action name.");
					      return NULL;
					    }
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Character constant for function/action name expected.");
					  return NULL;
					}
				    }
				  else
				    {
				      *SqlParser_Diags << DgSqlCode(-3113) <<
					DgString0(NAString(*$1) +
						  " is not a valid shape directive (at least not when used with the given argument).");
				      yyerror("");
				      YYERROR;
				    }
				}
	      
	      | shape_identifier shape_identifier
		                {
				  if ((*$1 == "ACCESS_PATH")||(*$1 == "PATH"))	
				    {
				      if (*$2 == "ANY")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::INDEX_SYSTEM); 	
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for access path.");
					  return NULL;
					}
				    }
				  
				  else if (*$1 == "MDAM")
				    {
				      if (*$2 == "SYSTEM")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::MDAM_SYSTEM); 	
					}
				      else if (*$2 == "OFF")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::MDAM_OFF); 	
					}
				      else if (*$2 == "FORCED")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::MDAM_FORCED); 	
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for MDAM.");
					  return NULL;
					}
				    }
				  
				  else if (*$1 == "MDAM_COLUMNS")
				    {
				      if (*$2 == "SYSTEM")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)
					    ->setColumnOptions(0,ScanForceWildCard::MDAM_COLUMNS_REST_BY_SYSTEM);	
					}
				      else if (*$2 == "ALL")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)
					    ->setColumnOptions(0,ScanForceWildCard::MDAM_COLUMNS_ALL); 	
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for MDAM_COLUMNS.");
					  return NULL;
					}
				    }
				  
				  else if (*$1 == "DIRECTION")
				    {
				      if (*$2 == "SYSTEM")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::DIRECTION_SYSTEM); 	
					}
				      else if (*$2 == "FORWARD")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::DIRECTION_FORWARD); 	
					}
				      else if (*$2 == "REVERSE")
					{
					  $$ = new (PARSERHEAP()) ScanForceWildCard();
					  ((ScanForceWildCard*)$$)->setScanOptions(ScanForceWildCard::DIRECTION_REVERSED); 	
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for direction.");
					  return NULL;
					}
				    }
				  else
				    {
				      *SqlParser_Diags << DgSqlCode(-3113) <<
					DgString0("The statement <" + NAString(*$1) + " " + NAString(*$2)
						  + "> is not a valid shape directive.");
				      yyerror("");
				      YYERROR;
				    }
				}			  
	      
	      | shape_identifier '(' shape_arg_list ')'
		                {
				  $$ = DecodeShapeSyntax(*$1, $3,
				  			 SqlParser_Diags,
							 PARSERHEAP());
				  if ($$ == NULL)
				    {
				      yyerror("");
				      YYERROR;
				    }
				  delete $1;
				  delete $3;
				}
	
	      | shape_identifier shape_identifier '(' shape_arg_list ')'
				{
				  if (*$1 == "MDAM_COLUMNS")	
				    {
				      $$ = new (PARSERHEAP()) ScanForceWildCard();
				      NABoolean dummyNegate = FALSE;
				      Int32 numColumns = $4->entries();
				      ItemExpr *itm;
				      
				      ScanForceWildCard::scanOptionEnum* columnAlgorithms
					= new (PARSERHEAP()) ScanForceWildCard::scanOptionEnum[numColumns];
				      
				      for (Int32 i=0; i<numColumns; i++)
					{
					  itm = $4->at(i)->castToItemExpr();
					  if (itm == NULL OR 
					      itm->castToConstValue(dummyNegate) == NULL)
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Illegal MDAM_COLUMNS (...) argument");
					      return NULL;
					    }
					  const NAType *nat = itm->castToConstValue(dummyNegate)->getType();
					  if (nat->getTypeQualifier() != NA_NUMERIC_TYPE)
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Illegal MDAM_COLUMNS (...) argument");
					      return NULL;
					    }
					  short arg =
					    *((short *) itm->castToConstValue(dummyNegate)->getConstValue());
					  
					  if (arg == _SYSTEM_)
					    {
					      columnAlgorithms[i] = ScanForceWildCard::COLUMN_SYSTEM;
					    }
					  else if (arg == _SPARSE_)
					    {
					      columnAlgorithms[i] = ScanForceWildCard::COLUMN_SPARSE;
					    }
					  else if (arg == _DENSE_)
					    {
					      columnAlgorithms[i] = ScanForceWildCard::COLUMN_DENSE;
					    }
					  else
					    {
					      *SqlParser_Diags << DgSqlCode(-3113) <<
						DgString0("Illegal MDAM_COLUMNS (...) argument.");
					      return NULL;
					    }
					}
				      if (*$2 == "ALL")
					{
					  ((ScanForceWildCard*)$$)->
					    setColumnOptions(numColumns, columnAlgorithms,
							     ScanForceWildCard::MDAM_COLUMNS_ALL);
					}
				      else if (*$2 == "SYSTEM")
					{
					  ((ScanForceWildCard*)$$)->
					    setColumnOptions(numColumns, columnAlgorithms,
							     ScanForceWildCard::MDAM_COLUMNS_REST_BY_SYSTEM);
					}
				      else
					{
					  *SqlParser_Diags << DgSqlCode(-3113) <<
					    DgString0("Illegal argument for MDAM_COLUMNS.");
					  return NULL;
					}
				    }

				  else
				  {
				    *SqlParser_Diags << DgSqlCode(-3113) <<
					DgString0("The statement <" + NAString(*$1) + " " + NAString(*$2)
					+ " (...)> is not a valid shape directive.");
				    yyerror("");
				    YYERROR;
				  }
				}

/* type stringval */
shape_identifier : identifier
	      | token_shape_identifier
                                {
				  // some of the shape identifiers are actually
				  // keywords recognized by the parser
                                  $$ = unicodeToChar
					 (
                                          ToTokvalPlusYYText(&$1)->yytext,
					  ToTokvalPlusYYText(&$1)->yyleng,
					   (CharInfo::CharSet) (
					                        ComGetNameInterfaceCharSet()
					                        ),
					  PARSERHEAP());
				  // upshift the text, a regular
				  // identifier gets upshifted as well
				  $$->toUpper();
                                }

/* type tokval */
token_shape_identifier : TOK_JOIN
	      | TOK_UNION
              | TOK_OFF
	      | TOK_ANY
	      | TOK_ALL
	      | TOK_TABLE
	      | TOK_GROUP
              | TOK_TRANSPOSE
              | TOK_INSERT
              | TOK_UPDATE
              | TOK_DELETE

/* type exprnodeptrs */
shape_arg_list : query_shape_control
				{
				  $$ = new (PARSERHEAP())
					    ExprNodePtrList(PARSERHEAP());
				  $$->insert($1);
				}
	      | shape_arg_list ',' query_shape_control
				{
				  $1->insert($3);
				  $$ = $1;
				}
qid_identifier : identifier
                  {
                    $$ = $1;
                   }
                  | TOK_CURRENT
                  {
                    $$ = new (PARSERHEAP()) NAString("CURRENT", PARSERHEAP());
                  }
/* type relx */
/* See RelControl.h and NADefaults.cpp for why the separate reset() counter */
/* ODBC and SQLCI need the RESET (and RESET RESET) capability */
query_default_control : default_identifier QUOTED_STRING
                   {
                     // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                     // Need convert schema name to ISO_MAPPING character set before
                     // validating...
		     if (*$1 == "SCHEMA")
		       {
			 if (! validateVolatileSchemaName(*$2))
			   {
			     YYERROR;
			   }
		       }

		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1,*$2);
		   }
	      |		default_identifier TOK_RESET
                   {
		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1,"");
		     ((ControlAbstractClass *)$$)->reset() = 1;
		   }
	      |		'*' TOK_RESET
                   {
		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "","");
		     ((ControlAbstractClass *)$$)->reset() = 1;
		   }
	      |		'*' TOK_RESET TOK_RESET
                   {
		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "","RESET");
		     ((ControlAbstractClass *)$$)->reset() = 2;
		   }
              |		default_identifier TOK_HOLD
                   {
		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1,"", FALSE, 1);
		   }
              |		default_identifier TOK_RESTORE
                   {
		     $$ = new (PARSERHEAP())
		     		ControlQueryDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1,"", FALSE, 2);
		   }
	

/* type stringval */
/* We do NOT allow '*' here; it's meaningless and breaks NADefaults */
default_identifier : identifier
		   {
		   }
              | TOK_CATALOG
                   {
		     $$ = new (PARSERHEAP()) NAString("CATALOG", PARSERHEAP());
		   }
              | TOK_SCHEMA
                   {
		     $$ = new (PARSERHEAP()) NAString("SCHEMA", PARSERHEAP());
		   }

/* type relx */
/*   Notice that we allow all of
 *             CONTROL TABLE table_name * 'value';
 *             CONTROL TABLE * * 'value';
 *
 *   All the table wildcards (*) are CorrName("*",TRUE), i.e. isFabricated.
 *   All the token wildcards (*) and RESET's are EMPTY NAStrings ("", not "*").
 */
table_control : table_name table_control_identifier QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                  // Need to convert table_name to ISO_MAPPING character set ???
		  $$ = new (PARSERHEAP()) ControlTable($1, SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, *$3);
		}
              | '*'        table_control_identifier QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  $$ = new (PARSERHEAP()) ControlTable(
			 new (PARSERHEAP()) CorrName("*", TRUE, PARSERHEAP()),
			 SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, *$3);
		}

              | table_name table_control_identifier TOK_RESET
                {
                  // Need to convert table_name to ISO_MAPPING character set ???
		  $$ = new (PARSERHEAP()) ControlTable($1, SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}
              | '*'        table_control_identifier TOK_RESET
                {
		  $$ = new (PARSERHEAP()) ControlTable(
			 new (PARSERHEAP()) CorrName("*", TRUE, PARSERHEAP()),
			 SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}

              | table_name TOK_RESET	/* synonym for <table_name '*' RESET> */
                {
                  // Need to convert table_name to ISO_MAPPING character set ???
		  $$ = new (PARSERHEAP()) ControlTable($1, SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "", "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}
              | '*'        TOK_RESET	/* synonym for <'*' '*' RESET> */
                {
		  $$ = 
		    new (PARSERHEAP()) ControlTable(
			 new (PARSERHEAP()) CorrName("*", TRUE, PARSERHEAP()),
			 SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "", "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}

/* type stringval */
table_control_identifier: identifier
	      | '*'	{ $$ = new (PARSERHEAP()) NAString(); }

/* type relx */
session_control : QUOTED_STRING QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1, *$2);
		}
	      | TOK_SET QUOTED_STRING QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, *$3);
		}

              | QUOTED_STRING TOK_RESET 
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$1, "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}
              | TOK_RESET QUOTED_STRING
                {
                  // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$2, "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}

              | '*' TOK_RESET 
                {
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "", "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}
              | TOK_RESET '*'
                {
		  $$ = new (PARSERHEAP()) ControlSession(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "", "");
		  ((ControlAbstractClass *)$$)->reset() = 1;
		}

/* type describeType */
showcontrol_type:
	    '*'				{ $$ = Describe::CONTROL_ALL_; }
	  | TOK_ALL			{ $$ = Describe::CONTROL_ALL_; }
          | TOK_SHAPE			{ $$ = Describe::CONTROL_SHAPE_; }
          | TOK_QUERY TOK_SHAPE		{ $$ = Describe::CONTROL_SHAPE_; }
          | TOK_DEFAULT			{ $$ = Describe::CONTROL_DEFAULTS_; }
          | TOK_DEFAULTS		{ $$ = Describe::CONTROL_DEFAULTS_; }
          | TOK_QUERY TOK_DEFAULT	{ $$ = Describe::CONTROL_DEFAULTS_; }
          | TOK_QUERY TOK_DEFAULTS	{ $$ = Describe::CONTROL_DEFAULTS_; }
          | TOK_TABLE			{ $$ = Describe::CONTROL_TABLE_; }
          | TOK_SESSION			{ $$ = Describe::CONTROL_SESSION_; }

showplan_starting_tokens : TOK_SHOWPLAN showplan_options
                           {
                             SqlParser_CurrentParser->hiveDDLInfo_->essd_ = Parser::HiveDDLInfo::SHOWPLAN_;

                             char buf[40];
                             SqlParser_CurrentParser->hiveDDLInfo_->essdQueryStartPos_ = 9;

                             if ($2 != 0)
                               {
                                 SqlParser_CurrentParser->hiveDDLInfo_->essdOptions_ = 
                                   str_itoa($2, buf);

                                 SqlParser_CurrentParser->hiveDDLInfo_->essdQueryStartPos_ += strlen("option ") + strlen("'t'");
                               }

                             $$ = $2;
                           }

/* type relx */
show_statement:
	     TOK_SHOWCONTROL showcontrol_type 
		    optional_control_identifier optional_comma_match_clause 
             {
	       // For this Describe, the putative 'tableName' parameter
	       // is really our optional identifier.
	       // And another kludge, we pass ",MATCH FULL" in 'corr name'.
               CorrName id;
	       NABoolean showHeader = TRUE;
               
               if ($3)
	          id = CorrName(*$3, PARSERHEAP());
               else
	          id = CorrName("", PARSERHEAP());
	       if ($3 && $4 == Describe::MATCH_FULL_) 
	         id.setCorrName("FULL");
	       else if ($3 && $4 == Describe::MATCH_FULL_NO_HEADER_) {
	         id.setCorrName("FULL");
		 showHeader = FALSE;
	       }

	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), id, $2, COM_TABLE_NAME, 0, showHeader),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
	   | TOK_SHOWDDL table_name ',' TOK_EXPLAIN
	     {
               // this option is not supported and causes a crash.
               // It either need to fixed or removed.
               *SqlParser_Diags <<  DgSqlCode(-3131);
               YYERROR;

               CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
	       NAString * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
	                                       , PARSERHEAP() // in  - NAMemory * heapUsedForOutputBuffers
	                                       );
	       // If we can not get a variable-width multi-byte or single-byte string here, report error 
	       if ( stmt == NULL )
                 {
                   *SqlParser_Diags <<  DgSqlCode(-3406);
                   YYERROR;
                 }

               DDLExpr * de = new(PARSERHEAP()) DDLExpr
                 (NULL,
                  (char*)stmt->data(), 
                  stmtCharSet,
                  PARSERHEAP());
               
               de->setShowddlExplain(TRUE);
               de->setExplObjName($2->getQualifiedNameObj());

	       ExeUtilDisplayExplainComplex * eue =
		 new (PARSERHEAP()) 
		 ExeUtilDisplayExplainComplex((char*)stmt->data(),
					      stmtCharSet,
					      NULL,
					      de,
					      PARSERHEAP());
	       
	       $$ = eue;
	     }
	   | TOK_SHOWDDL table_name ',' TOK_EXPLAIN ',' TOK_NO TOK_LABEL TOK_STATISTICS
	     {
               // this option is not supported and causes a crash.
               // It either need to fixed or removed.
               *SqlParser_Diags <<  DgSqlCode(-3131);
               YYERROR;

	       CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
	       NAString  * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
						, PARSERHEAP() // in  - NAMemory * heapUsedForOutputBuffers
						);
	       // If we can not get a variable-width multi-byte or single-byte string here, report error 
	       if ( stmt == NULL )
	       {
	         *SqlParser_Diags <<  DgSqlCode(-3406);
	         YYERROR;
	       }

               DDLExpr * de = new(PARSERHEAP()) DDLExpr
                 (NULL,
                  (char*)stmt->data(), 
                  stmtCharSet,
                  PARSERHEAP());
               
               de->setShowddlExplain(TRUE);
               de->setNoLabelStats(TRUE);
               de->setExplObjName($2->getQualifiedNameObj());

	       ExeUtilDisplayExplainComplex * eue =
		 new (PARSERHEAP()) 
		 ExeUtilDisplayExplainComplex((char*)stmt->data(),
                                              stmtCharSet,
					      NULL,
					      de,
					      PARSERHEAP());
	       
	       $$ = eue;
	     }
	   | TOK_SHOWDDL table_name ',' TOK_EXPLAIN TOK_INTERNAL ',' attribute_num_rows_clause
	     {
	       double numRows = $7->castToElemDDLFileAttrPOSTableSize()->getNumRows();
	       CharInfo::CharSet stmtCharSet = CharInfo::UnknownCharSet;
	       NAString  * stmt = getSqlStmtStr ( stmtCharSet  // out - CharInfo::CharSet &
	                                        , PARSERHEAP() // in  - NAMemory * heapUsedForOutputBuffers
	                                        );
	       // If we can not get a variable-width multi-byte or single-byte string here, report error 
	       if ( stmt == NULL )
	       {
	         *SqlParser_Diags <<  DgSqlCode(-3406);
	         YYERROR;
	       }
               DDLExpr * de = new(PARSERHEAP()) DDLExpr
                 (NULL,
                  (char*)stmt->data(), 
                  stmtCharSet,
                  PARSERHEAP());
               
               de->setShowddlExplain(TRUE);
               de->setShowddlExplainInt(TRUE);
               de->setNumExplRows(numRows);
               de->setExplObjName($2->getQualifiedNameObj());

	       $$ = de;
	     }
           | TOK_SHOWDDL table_name optional_showddl_object_options_list
	     {
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$2, Describe::SHOWDDL_,
			          COM_TABLE_NAME, $3/*optional_sqlmp_option*/),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
           | TOK_SHOWDDL table_name ',' TOK_LOB TOK_DETAILS optional_showddl_object_options_list
	     {
	       ExeUtilLobShowddl * ls = new(PARSERHEAP()) 
		 ExeUtilLobShowddl(*$2, $6, PARSERHEAP());
	       $$ = ls;
	     }
          | TOK_SHOWDDL TOK_TABLE table_name optional_showddl_object_options_list
	     {
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$3, Describe::SHOWDDL_, 
			          COM_TABLE_NAME, $4/*optional_sqlmp_option*/),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
          | TOK_SHOWDDL table_mapping_function_tokens actual_routine_name 
            optional_showddl_object_options_list
	     {
               $3 
                 ->getQualifiedNameObj().setObjectNameSpace(COM_UDF_NAME);
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$3/*actual_routine_name*/, Describe::SHOWDDL_, 
			          COM_UDF_NAME, $4/*optional_showddl_options_lsit*/),
			 REL_ROOT,
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
          | TOK_SHOWDDL TOK_SCHEMA schema_name optional_showddl_schema_options_list
	     {
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$3, Describe::SHOWDDL_, $4),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
          | TOK_SHOWDDL TOK_USER authorization_identifier 
            {
              $$ = new (PARSERHEAP())
                RelRoot(new (PARSERHEAP())
                  Describe(SQLTEXT(), COM_USER_CLASS, *$3, Describe::SHOWDDL_),
                  REL_ROOT,
                  new (PARSERHEAP())
                  ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP()))); 
            }
          | TOK_SHOWDDL_ROLE authorization_identifier
              optional_showddl_role_option
            {
              $$ = new (PARSERHEAP())
                RelRoot(new (PARSERHEAP())
                  Describe(SQLTEXT(), COM_ROLE_CLASS, *$2, Describe::SHOWDDL_, $3),
                  REL_ROOT,
                  new (PARSERHEAP())
                  ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
            }
  
          | TOK_SHOWDDL_COMPONENT identifier
            {
              $$ = new (PARSERHEAP())
                RelRoot(new (PARSERHEAP())
                  Describe(SQLTEXT(), *$2),
                  REL_ROOT,
                  new (PARSERHEAP())
                  ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
            }
  
          | TOK_SHOWDDL_LIBRARY table_name 
               optional_showddl_object_options_list
  	       {
  	         $2 
                   ->getQualifiedNameObj().setObjectNameSpace(COM_LIBRARY_NAME); 
  	         $$ = new (PARSERHEAP())
        		 RelRoot(new (PARSERHEAP()) 
    	  		 Describe(SQLTEXT(), *$2, Describe::SHOWDDL_, COM_LIBRARY_NAME, $3),
  	  	           	 REL_ROOT, new (PARSERHEAP())
  			     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
  	         delete $2; // CorrName * qualified_name
  	       }	  

          | TOK_SHOWDDL_SEQUENCE table_name optional_showddl_object_options_list
	     {
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$2, Describe::SHOWDDL_, 
			          COM_SEQUENCE_GENERATOR_NAME, $3),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }

          | TOK_SHOWDDL TOK_PROCEDURE actual_routine_name 
             optional_showddl_object_options_list
	     {
	     // SHOWDDL no longer relies on the PROCEDURE keyword. It now
	     // handles procedures in the same manner as tables since procedures
	     // are now in the TA namespace.
	       $3 // actual_routine_name
		 ->getQualifiedNameObj().setObjectNameSpace(COM_UDF_NAME); // SPJ
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$3, Describe::SHOWDDL_, COM_UDF_NAME, $4),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	       delete $3; // CorrName * actual_routine_name
	     }	  
          | TOK_SHOWDDL TOK_FUNCTION actual_routine_name
            optional_showddl_action_name_clause optional_showddl_object_options_list
             {
               $$ = SqlParserAux_buildDescribeForFunctionAndAction
                 ( $3 // in - CorrName * actual_routine_name of UDF or UUDF  - deep copy
                 , $4 // in - CorrName * optional_showddl_action_name_clause - deep copy
                 , $5 // in - long       optional_showddl_object_objects_list
                 );
               delete $3; // CorrName * actual_routine_name of UDF or UUDF
               delete $4; // CorrName * actual_routine_name of routine action
             }
	   | TOK_INVOKE table_name
	     {
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
			 Describe(SQLTEXT(), *$2, Describe::INVOKE_),
			 REL_ROOT,	
			 new (PARSERHEAP())
			 ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }
	   | TOK_INVOKE table_as_procedure
	     {
	       CorrName * c = NULL;
	       if ($2->getOperatorType() == REL_EXPLAIN ||
	           $2->getOperatorType() == REL_STATISTICS ||
	           $2->getOperatorType() == REL_HIVEMD_ACCESS ||
		   $2->getOperatorType() == REL_EXE_UTIL ||
		   $2->getOperatorType() == REL_SCAN)
		 {
                   if ($2->getOperatorType() == REL_EXE_UTIL)
                     {
		       c = new(PARSERHEAP())
			 CorrName(((ExeUtilExpr *)$2)->
				  getVirtualTableName());
                       c->setSpecialType(ExtendedQualName::VIRTUAL_TABLE);
                     }
		   else if ($2->getOperatorType() == REL_SCAN)
		     {
		       Scan* ha = (Scan*)$2;
		       c = new(PARSERHEAP())
			 CorrName(ha->getTableName());
		     }
                   else
		     {
		       c = new(PARSERHEAP())
			 CorrName(((TableValuedFunction *)$2)->
				  getVirtualTableName());
		       c->setSpecialType(ExtendedQualName::VIRTUAL_TABLE);
		     }

		   $$ = new (PARSERHEAP())
		     RelRoot(new (PARSERHEAP())
			     Describe(SQLTEXT(), *c, Describe::INVOKE_),
			     REL_ROOT,	
			     new (PARSERHEAP())
			     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
		   delete c;
		 }
	       else {
		 // error here  SOLN 10-050216-4754
		 *SqlParser_Diags << DgSqlCode(-3131);
		 YYERROR;
	       }
	     }
	  | showplan_starting_tokens interactive_query_expression
	     {
	       // create a dummy name so as to satisfy the constructor of
	       // Describe. The tablename param is not used for SHOWPLAN qry.
	       CorrName c;

	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
		   Describe(SQLTEXT(), c, Describe::PLAN_,COM_TABLE_NAME,$1),
			    REL_ROOT,	
			    new (PARSERHEAP())
			      ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));

	     }

	  | showplan_starting_tokens TOK_EXPLAIN optional_options interactive_query_expression
	     {
	       // create a dummy name so as to satisfy the constructor of
	       // Describe. The tablename param is not used for SHOWPLAN qry.
	       CorrName c;

	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
		   Describe(SQLTEXT(), c, Describe::PLAN_,COM_TABLE_NAME,$1),
			    REL_ROOT,	
			    new (PARSERHEAP())
			      ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));

               SqlParser_CurrentParser->hiveDDLInfo_->essd_ = Parser::HiveDDLInfo::SHOWPLAN_;
	     }

	  | showplan_starting_tokens TOK_PROCEDURE '(' character_string_literal ',' character_string_literal ')'
	     {
               // DEFAULT_CHARSET has no effect on character_string_literal in this context
               //
	       // create a name of the form "module.statement", where
	       // the first char literal is the module and the second
	       // is the statement/procedure in that module. Statement
	       // name could be '*' for all statements.
	       //NAString temp(*$4);
	       //temp.append('.');
	       //temp.append(*$6);

	       CorrName c (*$6, NULL, *$4);
	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
		   Describe(SQLTEXT(), c, Describe::STATIC_PLAN_,COM_TABLE_NAME,$1),
			    REL_ROOT,	
			    new (PARSERHEAP())
			      ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	     }

	  | TOK_SHOWSHAPE 
            {
              SqlParser_CurrentParser->hiveDDLInfo_->essd_ = Parser::HiveDDLInfo::SHOWSHAPE_;
            }
            interactive_query_expression
	     {
	       // create a dummy name so as to satisfy the constructor of
	       // Describe. The tablename param is not used for SHOWPLAN qry.
	       CorrName c;

	       $$ = new (PARSERHEAP())
		 RelRoot(new (PARSERHEAP())
		   Describe(SQLTEXT(), c, Describe::SHAPE_),
			    REL_ROOT,	
			    new (PARSERHEAP())
			      ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));

	     }
       | TOK_SHOWSTATS TOK_FOR TOK_QUERY query_expression
         {
           CorrName c;
           $$ = new (PARSERHEAP())
         RelRoot(new (PARSERHEAP())
             Describe(SQLTEXT(), c, Describe::SHOWQRYSTATS_),
             REL_ROOT,	
             new (PARSERHEAP())
             ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
         }

        // The purpose of these showstats productions is to accept every possible combination so that the command
        // can be passed through to be really parsed by the USTATS parser.  Only the most obvious syntax errors 
        // will be found here. 
       | TOK_SHOWSTATS TOK_FOR TOK_TABLE table_name	TOK_ON group_list showstats_opts
         {
           $$ = new (PARSERHEAP())
         RelRoot(new (PARSERHEAP())
             Describe(SQLTEXT(), *$4, Describe::SHOWSTATS_),
             REL_ROOT,	
             new (PARSERHEAP())
             ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
         }

       | TOK_SHOWSTATS TOK_FOR TOK_LOG TOK_TABLE table_name     TOK_ON group_list showstats_opts
         {
           $$ = new (PARSERHEAP())
         RelRoot(new (PARSERHEAP())
             Describe(SQLTEXT(), *$5, Describe::SHOWSTATS_),
             REL_ROOT,
             new (PARSERHEAP())
             ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
         }

	 | TOK_SHOWTRANSACTION
         {
           // create a dummy name so as to satisfy the constructor of
           // Describe. The tablename param is not used for SHOWTRANSACTION qry.
           CorrName c;

           $$ = new (PARSERHEAP())
         RelRoot(new (PARSERHEAP())
           Describe(SQLTEXT(), c, Describe::TRANSACTION_),
                REL_ROOT,	
                new (PARSERHEAP())
                  ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
         }
	 | TOK_SHOWSET TOK_DEFAULTS TOK_ALL
	 {
	   $$ = new (PARSERHEAP())
	     RelRoot(new (PARSERHEAP())
		     ExeUtilShowSet(
			  ((CmpCommon::getDefault(SHOWCONTROL_SHOW_ALL) == DF_ON) 
			   ? ExeUtilShowSet::ALL_DEFAULTS_ 
			   : ExeUtilShowSet::EXTERNALIZED_DEFAULTS_)),
		     REL_ROOT,	
		     new (PARSERHEAP())
		     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	 }
	 | TOK_SHOWSET TOK_DEFAULTS
	 {
	   $$ = new (PARSERHEAP())
	     RelRoot(new (PARSERHEAP())
		     ExeUtilShowSet(ExeUtilShowSet::EXTERNALIZED_DEFAULTS_),
		     REL_ROOT,	
		     new (PARSERHEAP())
		     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	 }
         | TOK_SHOWSET TOK_DEFAULT default_identifier
	 {
	   $$ = new (PARSERHEAP())
	     RelRoot(new (PARSERHEAP())
		     ExeUtilShowSet(ExeUtilShowSet::SINGLE_DEFAULT_,
				    *$3),
		     REL_ROOT,	
		     new (PARSERHEAP())
		     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	 }
	 | TOK_GET TOK_ENVVARS
	 {
	   // create a dummy name so as to satisfy the constructor of
	   // Describe. The tablename param is not used for SHOWSET qry.
	   CorrName c;
	   
	   $$ = new (PARSERHEAP())
	     RelRoot(new (PARSERHEAP())
		     Describe(SQLTEXT(), c, Describe::ENVVARS_),
		     REL_ROOT,	
		     new (PARSERHEAP())
		     ColReference(new (PARSERHEAP()) ColRefName(TRUE, PARSERHEAP())));
	 }

/* type corrName */
optional_showddl_action_name_clause : empty
         {
           // optional_showddl_action_name_clause ::= empty

           $$ = NULL;
         }
                                    | TOK_ACTION actual_routine_action_name
         {
           // optional_showddl_action_name_clause ::=
           // TOK_ACTION actual_routine_action_name

           $$ = $2; // CorrName * actual_routine_action_name
         }

group_list : id_group_list                               { $$ = 0; }
           | TOK_EVERY TOK_KEY                           { $$ = 0; }
           | TOK_EVERY TOK_COLUMN                        { $$ = 0; }
           | TOK_EXISTING TOK_COLUMN                     { $$ = 0; } 
           | TOK_EXISTING TOK_COLUMNS                    { $$ = 0; } 
           | TOK_NECESSARY TOK_COLUMN                    { $$ = 0; } 
           | TOK_NECESSARY TOK_COLUMNS                   { $$ = 0; } 
           | TOK_EVERY TOK_KEY ',' id_group_list         { $$ = 0; }
           | TOK_EVERY TOK_COLUMN ',' id_group_list      { $$ = 0; }
           | TOK_EXISTING TOK_COLUMN ',' id_group_list   { $$ = 0; }
           | TOK_EXISTING TOK_COLUMNS ',' id_group_list  { $$ = 0; }
           | TOK_NECESSARY TOK_COLUMN ',' id_group_list  { $$ = 0; }
           | TOK_NECESSARY TOK_COLUMNS ',' id_group_list { $$ = 0; }

id_group_list : id_group                    { $$ = 0; }
              | id_group ',' id_group_list  { $$ = 0; }

id_group : identifier                                  { $$ = 0; }
         | '(' id_list ')'                             { $$ = 0; }
         | identifier TOK_TO identifier                { $$ = 0; }
         | '(' identifier ')' TOK_TO identifier        { $$ = 0; }
         | identifier TOK_TO '(' identifier ')'        { $$ = 0; }
         | '(' identifier ')' TOK_TO '('identifier ')' { $$ = 0; }

id_list : identifier              { $$ = 0; }
        | identifier ',' id_list  { $$ = 0; }

showstats_opts : empty       { $$ = 0; }
               | TOK_DETAIL  { $$ = 0; }

/* type showcontrolEnum */
optional_comma_match_clause : empty	  { $$ = Describe::MATCH_NONE_; }
			    | ',' TOK_MATCH TOK_FULL	   { $$ = Describe::MATCH_FULL_; }
			    | ',' TOK_MATCH TOK_PARTIAL	   { $$ = Describe::MATCH_PARTIAL_; }
			    | ',' TOK_MATCH TOK_FULL ',' TOK_NO TOK_HEADER	   
							   { $$ = Describe::MATCH_FULL_NO_HEADER_; }

/* type stringval */
optional_control_identifier:
	  default_identifier
			/* DEFAULTS attribute-name,
			 * or session-control first-quoted-string,
			 * or table-control-identifier
			 */
	  | '*'		{ $$ = NULL; }
	  | empty	{ $$ = NULL; }

/* type collationVal */
collate_clause : TOK_COLLATE TOK_DEFAULT   { $$ = CharInfo::DefaultCollation; }


               | TOK_COLLATE TOK_CHARACTER TOK_SET	    /* SQL/MP syntax */
	       				   { $$ = CharInfo::DefaultCollation; }

	       | TOK_COLLATE qualified_name
                   {
	      	     QualifiedName *qn = qualifiedNameFromStrings($2);
	       	     if (!qn) YYERROR;

		     // X.Y.Z is not NSK, but Y.Z or Z is ambiguous
		     // (could be ANSICAT.Y.Z *or* \NSK.$VOL.Y.Z)
		     // so we let the NAMETYPE default decide --
		     // with the added fillip that if the string is just Z,
		     // we first look it up as-is, w/o applying NSK vol.subvol
		     // (thus the string SJIS will be found as the system-
		     // defined collation, rather than bypassed in favor of
		     // \NSK.$VOL.SV.SJIS).
		     //
		     $$ = CharInfo::UNKNOWN_COLLATION;
		     NABoolean lookupNameAsNSK = FALSE;

		     if ($$ == CharInfo::UNKNOWN_COLLATION) {

		     // Lookup the name.  If unknown, emit WARNING and CONTINUE.
		     // It's a warning+continue, not an error,
		     // to allow the later "discovery" of user-defined
		     // collations via ReadTableDef's inserting them into the
		     // CollationDB.  SynthType and/or catman/CreateTable
		     // will emit error later if truly unknown then.
		     //
		     //## This REALLY needs to be done in the Binder,
		     //## a full-blown metadata lookup to see if user-defined
		     //## collation object exists...
		     //## so we should return a NAME (char * or NAString *)
		     //## instead of a CharInfo::Collation enum...
		     //
		     //## For most DML, let ItemExpr::synthesizeType(bindWA)
		     //## resolve the name, apply defaults, do the lookup...
		     //
		     //## First, though, need to figure out here
		     //## how to handle pure data types, e.g.,
		     //## - the target datatype of a CAST,
		     //## - column datatypes in a CREATE TABLE,
		     //## - hostvar datatypes.
		     //## Would still be nice to attach the collation name
		     //## string, perhaps a NAME pointer in CharType,
		     //## and validate/resolve it later,
		     //## in synthType for most DML but other places
		     //## for the 3 add'l cases noted above,
		     //## with proper error messages...  Perhaps someday!
		     //
		     NAString n(qn->getQualifiedNameAsAnsiString());
		     $$ = CharInfo::getCollationEnum(n, lookupNameAsNSK);
		     maybeEmitWarning3169($$, n);
		     if ( $$ == CharInfo::CZECH_COLLATION  &&
		          SqlParser_ISO_MAPPING != CharInfo::ISO88591 )
		          {
		              // CZECH COLLATION supported in only ISO88591 config.
		              *SqlParser_Diags << DgSqlCode(-3429);
		              YYABORT;
		          }
		     }
		   }

               | TOK_COLLATE guardian_location_name
                   {
		     NAString n(*$2);
		     ComMPLoc loc(n, ComMPLoc::FILE);
		     if (!loc.isValid(ComMPLoc::FILE)) { yyerror(""); YYERROR; }
		     n = loc.getMPName();

		     // These names are all non-ANSI:  $x.y.z  or  \s.$x.y.z
		     NABoolean lookupNameAsNSK = TRUE;

		     // Lookup the name.  If unknown, emit WARNING and CONTINUE.
		     //## This REALLY needs to be done in the Binder, etc. ...
		     $$ = CharInfo::getCollationEnum(n, lookupNameAsNSK);
		     maybeEmitWarning3169($$, n);
                   }

/* type collationAndCoercibility */
	/* Ansi 4.2.3 says that by default, hostvars and literals are COERCIBLE,
	 * unless they have a COLLATE clause in which case they're EXPLICIT.
	 * Only column refs can be IMPLICIT (and NATable.cpp makes them so).
	 */
collation_option : 
                   { $$.collation_    = CharInfo::DefaultCollation;
		     $$.coercibility_ = CharInfo::COERCIBLE;
		   }
                 | collate_clause
                   { $$.collation_    = $1;
		     $$.coercibility_ = CharInfo::EXPLICIT;
		   }

/* type tokval */
ordering_spec : TOK_ASC 
              | TOK_DESC
              | TOK_ASCENDING
              | TOK_DESCENDING

/* type item */
sort_or_group_key :   value_expression
                   {
                     ItemExpr * ie = $1;
                     ConstValue * cv = NULL;
                     if ((ie->getOperatorType() == ITM_CONSTANT) &&
                         ((cv = (ConstValue*)ie)->canGetExactNumericValue()) &&
                         (cv->getType()->getScale() == 0))
                       {
                         Int64 val = cv->getExactNumericValue();
                         ie = new (PARSERHEAP()) SelIndex(val);
                       }
                     else if (ie->getOperatorType() == ITM_REFERENCE)
                       {
                         ie = $1;
                       }
                     else
                       {
                         if (CmpCommon::getDefault(GROUP_OR_ORDER_BY_EXPR) == DF_OFF)
			   {
			     YYERROR;
			   }
                         ie = $1;
                       }

                     $$ = ie;
                   }

/* type item */
dml_column_reference : qualified_name 
		{
		   // helps with computing view text
		   //
		   ParInsertNameLoc($1->getPosition(), $1->getNameLength());
		   //
		   // note that colRefNameFromStrings()
		   // contains code that deletes $1
		   //
		   ColRefName  *newColRefName = colRefNameFromStrings($1);
		   if (newColRefName == NULL) YYABORT;
		   $$ = new (PARSERHEAP()) ColReference(newColRefName);
                }

/* item */
sort_spec : sort_or_group_key
          | sort_or_group_key collate_clause
              {
		// WARNING!  I don't support a collate_clause in a sort_spec.
                *SqlParser_Diags << DgSqlCode(+3023);
              }
          | sort_or_group_key ordering_spec
              {
		$$ = $1;
		if ($2 == TOK_DESC || $2 == TOK_DESCENDING)
		  {
		    $$ = new (PARSERHEAP()) InverseOrder($$);
		  }
              }
          | sort_or_group_key collate_clause ordering_spec
              {
		// WARNING!  I don't support collate_clauses in a sort_spec.
                *SqlParser_Diags << DgSqlCode(+3023);
              }

/* item */
sort_spec_list : sort_spec
   | sort_spec ',' sort_spec_list
           {
              $$ = new (PARSERHEAP()) ItemList( $1, $3);
           }

order_by_clause_non_empty : TOK_ORDER TOK_BY sort_spec_list
{ $$ = $3; }

/* item */
order_by_clause : TOK_ORDER TOK_BY sort_spec_list
                              { $$ = $3; }
                          |  empty
                             {
                               $$ = NULL;
                             }


/* type relx */
set_statement:  set_table_statement

/* type corrName */
set_table_name:  table_name   // includes the case of hostvar WITH a prototype
                   { $$ = $1 ; }
                | HOSTVAR   // The case of hostvar WITHOUT a prototype
                   {   // Solution: Add a bogus prototype
		     HostVar *hv = makeHostVar($1,NULL);
		     delete $1;  // okay to delete, a copy made in makeHostVar

                     // fake a dummy prototype
                     hv->setPrototypeValue("DUMMY");

	             // Remove leading/trailing blanks from string literal --
	             // the token(s) within the literal is the real proto value
	             TrimNAStringSpace(hv->getPrototypeValue());
	             if (hv->getPrototypeValue().isNull())
	             {
	                yyerror("");	// emits syntax error 15001
	                YYERROR;
	             }

		     AllHostVars->insert(hv);
		     TheHostVarRoles->addARole(HV_IS_INPUT);
		     // prepare a CorrName from the HV 
		     $$ = new (PARSERHEAP())
		       CorrName("HostVar$",PARSERHEAP(),hv->getName(),"$HV");
		     assert($$);
		     $$->setPrototype(hv);
		   }
                |  '*'
                   {
		     $$ = new (PARSERHEAP()) CorrName("*", TRUE, PARSERHEAP());
		   }

/* type boolean */
optional_stream: TOK_STREAM { $$ = TRUE ; } | empty { $$ = FALSE ; }

/* type item */
timeout_value:   literal
               | simple_host_variable
	       { TheHostVarRoles->setLastUnassignedTo(HV_IS_INPUT); $$ = $1 ;}
               | dynamic_parameter

/* type stmt_ptr */
set_table_statement: TOK_SET TOK_TABLE set_table_name 
                     optional_stream TOK_TIMEOUT  TOK_RESET
                   {
		     $$ = new (PARSERHEAP())   // a RESET 
		       RelSetTimeout( *$3, NULL, $4, TRUE );
                     *SqlParser_Diags << DgSqlCode(-4222)
                                      << DgString0("SET TABLE TIMEOUT");
                     yyerror("");
                     YYABORT;
		   }
                  |  TOK_SET TOK_TABLE set_table_name  // a timeout value
                     optional_stream TOK_TIMEOUT  timeout_value
                   {
		     $$ = new (PARSERHEAP()) 
		       RelSetTimeout( *$3, (ItemExpr *) $6 , $4);
                     *SqlParser_Diags << DgSqlCode(-4222)
                                      << DgString0("SET TABLE TIMEOUT");
                     yyerror("");
                     YYABORT;
		   }
                     

/* type relx */

set_session_default_statement : TOK_SET TOK_SESSION TOK_DEFAULT default_identifier QUOTED_STRING
                   {
                     // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
		     $$ = new (PARSERHEAP())
		       SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), *$4, *$5);
		   }

set_session_default_statement : TOK_SET TOK_PARSERFLAGS NUMERIC_LITERAL_EXACT_NO_SCALE
                   {
		     $$ = new (PARSERHEAP())
		       SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "SET_PARSERFLAGS", *$3);
		   }
	           | TOK_RESET TOK_PARSERFLAGS NUMERIC_LITERAL_EXACT_NO_SCALE
                   {
		     $$ = new (PARSERHEAP())
		       SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "RESET_PARSERFLAGS", *$3);
		   }
	           | TOK_RESET TOK_PARSERFLAGS
                   {
		     char flags[100];
		     Int32 flagVal = 0x7FFFFFFF;
		     str_itoa(flagVal, flags);
		     
		     $$ = new (PARSERHEAP())
		       SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), "RESET_PARSERFLAGS", flags);
		   }
                   | TOK_SET TOK_ENVVAR identifier
                     {
		       SqlParser_CurrentParser->getLexer()->setReturnAllChars();
		     }
                     ANY_STRING
                     {
		       NAString envNam = "SET_ENVVAR_";
		       envNam += *$3;
		       
		       NAString envVal;
		       
		       if ($5 == NULL)
			 envVal = "1";
		       else
			 envVal = *$5;

		       // trim leading and trailing spaces
		       envVal = envVal.strip(NAString::both);

		       $$ = new (PARSERHEAP())
			 SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), envNam, envVal);
		       
		       SqlParser_CurrentParser->getLexer()->resetReturnAllChars();
		     }
                   | TOK_RESET TOK_ENVVAR identifier
                   {
		     NAString envNam = "RESET_ENVVAR_";
		     envNam += *$3;

		     NAString envVal;
		     $$ = new (PARSERHEAP())
		       SetSessionDefault(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), envNam, envVal);
		   }

opt_atomic_clause: empty
	    {
	      $$ = RelExpr::UNSPECIFIED_ ;
	    }
	  | atomic_clause
	    {
	      $$ = $1;
	    }

/* type relx */
psm_3gl_statement: TOK_BEGIN opt_atomic_clause psm_3gl_block_start TOK_END
      {

	/* Validate Compound statement that is the triggered action */
	if (InsideTriggerDefinition == TRUE) {

	  /* trigger definition allows only BEGIN ATOMIC */
	  if ($2 != RelExpr::ATOMIC_) {
	    *SqlParser_Diags << DgSqlCode(-11050);
	    yyerror("");
	    YYABORT;
	  }

	  /* Empty block is an error inside Trigger Definition */
	  if ($3 == NULL) {
	    *SqlParser_Diags << DgSqlCode(-11018);
	    yyerror("");
	    YYABORT;
	  }
	} else if ($2 == RelExpr::ATOMIC_) {
	  /* if CS is not part of trigger definition, BEGIN ATOMIC
	  * should raise syntax error to maintain old behavior
	  */
	  *SqlParser_Diags << DgSqlCode(-15001);
	  yyerror("");
	  YYABORT;
	}
 
        if ( $3 == NULL ) { 
             $$ = NULL;
        } else {
          if ( $3->getOperatorType() == REL_COMPOUND_STMT )
            MarkInteriorNodesAsInCompoundStmt($3); 

          $$ = $3; 
        } 
      }
    | TOK_IF {InIfCondition = TRUE; ++in3GL_;} any_expression {InIfCondition = FALSE;} TOK_THEN psm_3gl_block_end elseif_else_opt
      TOK_END TOK_IF
      {
        if (($6 != NULL) && ($6->getOperatorType() == REL_COMPOUND_STMT) &&
                            (!($6->isinBlockStmt())))
            MarkInteriorNodesAsInCompoundStmt($6); 
        $$ = getIfRelExpr($3, $6, $7);
      }
    | TOK_BEGIN TOK_END 
    {  
    
      if (InsideTriggerDefinition == TRUE) {
		/* Empty block is an error inside Trigger Definition */
		*SqlParser_Diags << DgSqlCode(-11018);
		yyerror("");
		YYABORT;
	  }
        in3GL_++;
        $$ = NULL;
    } 

elseif_else_opt: empty { $$ = NULL; }
    | TOK_ELSEIF {InIfCondition = TRUE;} any_expression {InIfCondition = FALSE;} TOK_THEN psm_3gl_block_end elseif_else_opt
      { 
        if (($6 != NULL) && ($6->getOperatorType() == REL_COMPOUND_STMT) &&
                            (!($6->isinBlockStmt())))
            MarkInteriorNodesAsInCompoundStmt($6); 
        $$ = getIfRelExpr($3, $6, $7);
      }
    | TOK_ELSE psm_3gl_block_end 
      { 
        if (($2 != NULL) && ($2->getOperatorType() == REL_COMPOUND_STMT) &&
                            (!($2->isinBlockStmt())))
            MarkInteriorNodesAsInCompoundStmt($2); 
        $$ = $2; 
      } 

psm_3gl_block_start: { ++in3GL_; } psm_3gl_block_end 
      {
        $$ = $2;
      } 
	
/* Returns NULL for empty compound statement list */
psm_3gl_block_end : psm_3gl_stmt ';' psm_3gl_block_end
      { 
         if ( $1 == NULL ) {
            if ($3 == NULL) 
              $$ = NULL;
            else
              $$ = $3;
         } else {
	    // We can't deal with queries inside a CS if CS is part of
	    // trigger defintion. So raise error if this is the case.
	    if (InsideTriggerDefinition == TRUE) {
	      RelExpr *node = (RelExpr*)((RelExpr*)$1)->getChild(0);
	      if (node->getOperatorType() == REL_SCAN) {
		*SqlParser_Diags << DgSqlCode(-11047);
		YYERROR;
	      }
	    }
            if ( $3 == NULL )
               $$ = $1;
            else {
              CompoundStmt *cs = new (PARSERHEAP()) CompoundStmt($1, $3); 
              $$ = cs; 
            }
         }
      }
         | psm_3gl_stmt ';' 
      {
	// We can't deal with queries inside a CS is CS is part of
	// trigger defintion. So raise error if this is the case.
	if ($1 != NULL && InsideTriggerDefinition == TRUE) {
	  RelExpr *node = (RelExpr*)((RelExpr*)$1)->getChild(0);
	  if (node->getOperatorType() == REL_SCAN) {
	    *SqlParser_Diags << DgSqlCode(-11047);
	    YYERROR;
	  }
	}
	$$ = $1;
      }
         | psm_3gl_stmt ';' ';'
      { 
        *SqlParser_Diags << DgSqlCode(-3182);
        YYERROR;
      }

psm_3gl_stmt: interactive_query_expression
      { 
        if ($1) {
          RelExpr *node = (RelExpr*)((RelExpr*)$1)->getChild(0);
          switch (node->getOperatorType()) {
            // all stmts are allowed in compound stmts except:
            //   transaction, ddl, update statistics, stream stmts
// EJF L4J - CQD stmts are not allowed, error flagged
//   at create time else RelExpr CMPASSERTS in optimizer.
          default:
            break;
          case REL_DDL:
            *SqlParser_Diags << DgSqlCode(-3174) << DgString0(node->getText());
            break;
          case REL_TRANSACTION:
            *SqlParser_Diags << DgSqlCode(-3171) << DgString0(node->getText());
            break;
          }
        }
        $$ = $1;
      }
    | dynamic_sql_disallowed_in_cs
        { 
          *SqlParser_Diags << DgSqlCode(-3175);
          $$ = NULL;
        } 

/* stmt_ptr */
dynamic_sql_disallowed_in_cs : close_statement
	       | declare_dynamic_cursor
	       | describe_statement
	       | dynamic_prepare
	       | dynamic_execute
	       | execute_immediate
	       | fetch_cursor
	       | open_cursor

assignment_value : query_specification
                   {
					     
					RelRoot *temp = (RelRoot *) $1;
						 
					// Now store all variables found in output_hostvar_list into
					// a Root node. AssignmentHostVars contains such variables
                    for (CollIndex i = 0; i < AssignmentHostVars->entries(); i++) {
 		              temp->addAssignmentStTree((*AssignmentHostVars)[i]);
                    }

     		        AssignmentHostVars->clear();

                    $$ = temp;
					}

                  | value_expression_list
                   {

				     Tuple *tempTuple  = new (PARSERHEAP()) Tuple($1);
                     RelRoot *tempRoot = new (PARSERHEAP()) RelRoot(tempTuple);

				     // Now store all variables found in output_hostvar_list into
					 // a Root node. AssignmentHostVars contains such variables
                     for (CollIndex i = 0; i < AssignmentHostVars->entries(); i++) {
 		                tempRoot->addAssignmentStTree((*AssignmentHostVars)[i]);
                     }

     		         AssignmentHostVars->clear();
                     $$ = tempRoot;
                    }



/* Assignment statement for Compound Statements */
assignment_statement: TOK_SET {InAssignmentSt = TRUE;} output_hostvar_list {InAssignmentSt = FALSE;}
                              '=' assignment_value
                      {	    
					    ThereAreAssignments = TRUE;
					    TheHostVarRoles->setLastNunassignedTo($3,HV_IS_INPUT_OUTPUT);
					    NumOfScalars = NumOfArrays = 0;
					    $$ = $6;
					   }


/* type longint */
optional_showddl_schema_options_list : empty 
           {
             if(CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_INTERNAL )
             {
               $$ = 64;
             }
             else if (CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_EXTERNAL )
             {
               $$ = 32;
             }
             else
             {
               $$ = 0;
             }
          }

     |  ',' showddl_options_list
             {
  	       $$ = $2;
	       if (NOT($$ & 32) && NOT($$ & 64))
	       {
                 if(CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_INTERNAL )
               {
                 $$ = $$ + 64;
               }
                 else if (CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_EXTERNAL )
               {
                 $$ = $$ + 32;
               }
	     }

             // if mutually exclusive option have been specified, 
             // reject the command.  Mutually exclusinve options
             // include BRIEF(8)/DETAIL(4) and EXTERNAL(32)/INTERNAL(64).
             if ( (($2 & 4) && ($2 & 8)) ||
                  (($2 & 32) && ($2 & 64)) ||
                  (($2 & 16) && ($2 & 128)) ||
                  (($2 & 128) && ($2 & 256)) ||
		  (($2 & 16) && ($2 & 256)))
             {
                 yyerror("");        // emits syntax error 15001
                 YYERROR;
             }
	   }
	   
/* type longint */
showddl_options_list : showddl_options
        | showddl_options_list ',' showddl_options 
           {
	     $$ = $1 + $3;
	   
	   }

/* type longint */
showddl_options : 
        TOK_DETAIL
           {
	     $$ = 4;
	   }
     |  TOK_BRIEF
           {
	     $$ = 8;
	   }
     |  TOK_PRIVILEGES
           {
	     $$ = 16;
	   }
     |  TOK_GRANTEES
           {
	     $$ = 16;
	   }
     |  TOK_EXTERNAL
           {
	     $$ = 32;
	   }
     |  TOK_INTERNAL
           {
	     $$ = 64;
	   }
     |  TOK_PRIVILEGES TOK_ONLY
           {
	     $$ = 128;
	   }
     |  TOK_SYNONYMS TOK_ONLY
           {
	     $$ = 256;
	   }

/* type longint */
optional_showddl_object_options_list : empty
           {
             if(CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_INTERNAL )
             {
               $$ = 64;
             }
             else if (CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_EXTERNAL )
             {
               $$ = 32;
             }
             else
             {
               $$ = 0;
             }
          }

     | ',' showddl_options_list
           {
             $$ = $2;
             if (NOT($$ & 32) && NOT($$ & 64))
             {
               if(CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_INTERNAL )
              {
                 $$ = $$ + 64;
               }
                 else if (CmpCommon::getDefault(SHOWDDL_DISPLAY_FORMAT) == DF_EXTERNAL )
               {
                 $$ = $$ + 32;
               }
             }
             // if mutually exclusive or unsupported options have been
             // specified, reject the command.  Mutually exclusinve options
             // include EXTERNAL(32)/INTERNAL(64), unsupported options
             // include BRIEF(8)/DETAIL(4).
             if ( (($2 & 32) && ($2 & 64)) ||
                  ($2 & 8) )
             {
                 yyerror("");        // emits syntax error 15001
                 YYERROR;
             }
           }

optional_showddl_role_option : empty
           { 
             $$ = 0;
           }
             
     | ',' TOK_GRANTEES
           {
             $$ = 16;
           }
     | ',' TOK_PRIVILEGES
           {
             $$ = 16;
           }

/* type uint */
schema_or_database : TOK_SCHEMA
                     {
                       $$ = 1;
                     }
                     | TOK_DATABASE
                     {
                       $$ = 2;
                     }

/* type pStmtDDL */
schema_definition : TOK_CREATE schema_class schema_or_database schema_name_clause char_set collation_option
                    {
                      // cannot use keyword DATABASE if not hive ddl.
                      if (($3 == 2) &&
                          (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                        {
                          YYERROR;
                        }

                      NAString extSchName($4->getSchemaName().getSchemaNameAsAnsiString());
                      if (! validateVolatileSchemaName(extSchName))
                      {
                        YYERROR;
                      }

                    // allocate the CharType object and pass it to StmDDLCreateSchema. 
                    // StmtDDLCreateSchema will free the memory there.
                    CharType *charType = new (PARSERHEAP()) CharType(PARSERHEAP(), CharType::LiteralSchema, 
                                                      0, 0, FALSE, FALSE, FALSE, FALSE, FALSE,
                                                      $5, $6.collation_, $6.coercibility_ );
                                                         
                    StmtDDLCreateSchema *pNode = new (PARSERHEAP())
                      StmtDDLCreateSchema( *$4 /*schema_name_clause*/,
                                            $2, /* schema class */
                                            charType );
                     pNode->synthesize();
                     $$ = pNode;
                     delete $4 /*schema_name_clause*/;
                   }

schema_definition : TOK_CREATE schema_class schema_or_database TOK_IF TOK_NOT TOK_EXISTS 
                    schema_name_clause char_set collation_option
                    {
                     // cannot use keyword DATABASE if not hive ddl.
                      if (($3 == 2) &&
                          (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                        {
                          YYERROR;
                        }

                      NAString extSchName($7->getSchemaName().getSchemaNameAsAnsiString());
                      if (! validateVolatileSchemaName(extSchName))
                      {
                        YYERROR;
                      }

                      // allocate the CharType object and pass it to StmDDLCreateSchema. 
                      // StmtDDLCreateSchema will free the memory there.
                      CharType *charType = new (PARSERHEAP()) CharType(PARSERHEAP(), CharType::LiteralSchema,
                                                        0, 0, FALSE, FALSE, FALSE, FALSE, FALSE,
                                                        $8, $9.collation_, $9.coercibility_ );

                      StmtDDLCreateSchema *pNode = new (PARSERHEAP())
                        StmtDDLCreateSchema( *$7 /*schema_name_clause*/,
                                             $2, /* schema class */
                                             charType);
                      pNode->setCreateIfNotExists(TRUE);
                      pNode->synthesize();
                      delete $7 /*schema_name_clause*/;

                      SqlParser_CurrentParser->hiveDDLInfo_->ifExistsOrNotExists_ = TRUE;

                      $$ = pNode;
                    }


schema_definition : TOK_CREATE TOK_VOLATILE TOK_SCHEMA 
				{
				  SchemaName * vsn = 
				    processVolatileSchemaName(NULL, FALSE, TRUE);
				  if (!vsn)
				    YYERROR;

				  ElemDDLSchemaName edsn(*vsn);
                                  StmtDDLCreateSchema *pNode =
				    new (PARSERHEAP())
				      StmtDDLCreateSchema(
                                      edsn /*schema_name_clause*/,
                                      COM_SCHEMA_CLASS_SHARED, /* schema class */
                                      NULL);
				  pNode->setIsVolatile(TRUE);
				  pNode->setProcessAsExeUtil(TRUE);
                                  pNode->synthesize();
                                  $$ = pNode;
				}

/* type schemaClassEnum */
schema_class : empty
                                { 
                                  $$ = COM_SCHEMA_CLASS_DEFAULT;

                                  SqlParser_CurrentParser->hiveDDLInfo_->
                                    setValues(TRUE, StmtDDLonHiveObjects::CREATE_, StmtDDLonHiveObjects::SCHEMA_);
                                }
                              | TOK_PRIVATE
                                {
                                  $$ = COM_SCHEMA_CLASS_PRIVATE;
                                }
                              | TOK_SHARED
                                {
                                  $$ = COM_SCHEMA_CLASS_SHARED;
                                }

/* type pElemDDLSchemaName */
schema_name_clause : schema_name
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLSchemaName(*$1, "", PARSERHEAP());

                                  delete $1;
                                }

                      | TOK_AUTHORIZATION schema_authorization_identifier
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLSchemaName(*$2, *$2, PARSERHEAP());
                                  delete $2;
                                }

                      | schema_name TOK_AUTHORIZATION
                                schema_authorization_identifier
                                {
				  $$ = new (PARSERHEAP()) ElemDDLSchemaName(*$1, *$3, PARSERHEAP());
                                  delete $1;
                                  delete $3;
                                }

/* type pSchemaName */
schema_name : schema_name_ss
              {
                StringPos namePos = $1->getPosition();
                size_t nameLen = $1->getNameLength();
                $$ = schemaNameFromStrings($1);
                if ($$ == NULL) 
                  YYABORT;

                SqlParser_CurrentParser->hiveDDLInfo_->ddlNamePos_ = namePos;
                SqlParser_CurrentParser->hiveDDLInfo_->ddlNameLen_ = nameLen;

                preprocessHiveDDL(
                     $$->getCatalogName(), 
                     SqlParser_CurrentParser->hiveDDLInfo_);  
              }

/* type strSeq */
schema_name_ss : identifier
                 {
                   ShortStringSequence *strseq =
                     new (PARSERHEAP()) ShortStringSequence($1);
                   if (! strseq->isValid()) 
                     YYABORT;
                   $$ = strseq;
                 }
                | schema_name_ss '.' identifier
                 {
                   $1->append($3);
                   if (! $1->isValid()) 
                     YYABORT;
                   
                   $$ = $1;
                 }

/* type stringval */
schema_authorization_identifier : authorization_identifier

/* type stringval */
authorization_identifier : identifier
                                {
                                  // upshift even if delimited
                                  $$->toUpper();
                                }

/* type stringval */
external_user_identifier : identifier
                                {
                                  // upshift even if delimited
                                  NAString temp (*$$);
                                  $$->toUpper();
                                }

/* type pStmtDDL */

routine_definition : TOK_CREATE TOK_PROCEDURE optional_if_not_exists_clause ddl_qualified_name
                        routine_params_list_clause
                        optional_create_routine_attribute_list
                        optional_by_auth_identifier
                                {
                                  QualifiedName noActionQualName(PARSERHEAP());
                                  StmtDDLCreateRoutine *pNode =
                                    new (PARSERHEAP()) StmtDDLCreateRoutine
                                    ( *$4  // ddl_qualified_name of SPJs
                                    , noActionQualName
                                    , $5   // ElemDDLNode *  routine_params_list_clause
                                    , NULL // ElemDDLNode *  optional_routine_returns_clause
                                    , NULL // ElemDDLNode *  optional_passthrough_inputs_clause
                                    , $6   // ElemDDLNode *  optional_create_routine_attribute_list
                                    , COM_PROCEDURE_TYPE // ComRoutineType
                                    , PARSERHEAP()
                                    );
                                  pNode->setCreateIfNotExists($3);
                                  pNode->setOwner($7/*optional_by_auth_identifier*/);
                                  pNode->synthesize();
                                  $$ = pNode;
                                  delete $4;  // ddl_qualified_name of routine
                                }

  | TOK_CREATE create_scalar_function_tokens optional_if_not_exists_clause ddl_qualified_name
    routine_params_list_clause
    optional_routine_returns_clause
    optional_passthrough_inputs_clause
    optional_create_function_attribute_list
    {
      QualifiedName noActionQualName(PARSERHEAP());
      StmtDDLCreateRoutine *pNode =
        new (PARSERHEAP()) StmtDDLCreateRoutine
        ( *$4 // ddl_qualified_name of scalar function
          , noActionQualName
          , $5  // ElemDDLNode *  routine_params_list_clause
          , $6  // ElemDDLNode *  optional_routine_returns_clause
          , $7  // ElemDDLNode *  optional_passthrough_inputs_clause
          , $8  // ElemDDLNode *  optional_create_function_attribute_list
          , COM_SCALAR_UDF_TYPE // ComRoutineType create_scalar_function_tokens
          , PARSERHEAP()
          );
      pNode->setCreateIfNotExists($3); 
      pNode->synthesize();
      $$ = pNode;
      delete $4;  // ddl_qualified_name of routine
    }

  | TOK_CREATE table_mapping_function_tokens optional_if_not_exists_clause 
    ddl_qualified_name
    routine_params_list_clause
    optional_routine_returns_clause
    optional_passthrough_inputs_clause
    optional_create_function_attribute_list
    optional_by_auth_identifier
    {
      QualifiedName noActionQualName(PARSERHEAP());
      StmtDDLCreateRoutine *pNode =
        new (PARSERHEAP()) StmtDDLCreateRoutine
        ( *$4 // ddl_qualified_name of scalar function
          , noActionQualName
          , $5  // ElemDDLNode *  routine_params_list_clause
          , $6  // ElemDDLNode *  optional_routine_returns_clause
          , $7  // ElemDDLNode *  optional_passthrough_inputs_clause
          , $8  // ElemDDLNode *  optional_create_function_attribute_list
          , COM_TABLE_UDF_TYPE // ComRoutineType table_mapping_function_tokens
          , PARSERHEAP()
          );
      pNode->setCreateIfNotExists($3);
      pNode->setOwner($9/*optional_by_auth_identifier*/);
      pNode->synthesize();
      $$ = pNode;
      delete $4;  // ddl_qualified_name of routine
    }

  | TOK_CREATE universal_function_tokens optional_if_not_exists_clause 
    ddl_qualified_name
    universal_function_param_clause
    optional_create_function_attribute_list
    {
      QualifiedName noActionQualName(PARSERHEAP());
      StmtDDLCreateRoutine *pNode =
        new (PARSERHEAP()) StmtDDLCreateRoutine
        ( *$4  // ddl_qualified_name of universal function
          , noActionQualName
          , NULL // ElemDDLNode * optional_routine_params_list
          , NULL // ElemDDLNode * optional_routine_returns_clause
          , NULL // ElemDDLNode * optional_passthrough_inputs_clause
          , $6   // ElemDDLNode * optional_create_function_attribute_list
          , COM_UNIVERSAL_UDF_TYPE // ComRoutineType universal_function_tokens
          , PARSERHEAP()
          );
      pNode->setCreateIfNotExists($3);
      pNode->setUudfParamKindList($5); // universal_function_param_clause
      pNode->synthesize();
      $$ = pNode;
      delete $4;  // ddl_qualified_name of routine
    }

/* type routineTypeEnum */
create_scalar_function_tokens : TOK_FUNCTION
                                {
                                  $$ = COM_SCALAR_UDF_TYPE;
                                }
                              | TOK_SCALAR TOK_FUNCTION
                                {
                                  $$ = COM_SCALAR_UDF_TYPE;
                                }

/* type routineTypeEnum */
table_mapping_function_tokens : TOK_TABLE_MAPPING TOK_FUNCTION
                                {
                                  $$ = COM_TABLE_UDF_TYPE;
                                }

/* type routineTypeEnum */
universal_function_tokens : TOK_UNIVERSAL TOK_FUNCTION
                                {
                                  $$ = COM_UNIVERSAL_UDF_TYPE;
                                }

universal_function_param_clause : '(' universal_function_param_list ')'
                                {
                                  $$ = $2; // universal_function_param_list
                                }

/* type pElemDDL */
universal_function_param_list : universal_function_param
                              | universal_function_param_list ',' universal_function_param
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLList ( $1 , $3 );
                                }

/* type pElemDDL */
universal_function_param : empty
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUudfParamDef(COM_UUDF_PARAM_OMITTED);
                                }
                             | TOK_ACTION
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUudfParamDef(COM_UUDF_PARAM_ACTION);
                                }
                             | TOK_SAS_FORMAT
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUudfParamDef(COM_UUDF_PARAM_SAS_FORMAT);
                                }

                             | TOK_SAS_LOCALE
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUudfParamDef(COM_UUDF_PARAM_SAS_LOCALE);
                                }

                             | TOK_SAS_MODEL_INPUT_TABLE
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUudfParamDef(COM_UUDF_PARAM_SAS_MODEL_INPUT_TABLE);
                                }

/* type pElemDDL */
routine_params_list_clause : '(' routine_params_list ')'
                                {
                                  $$ = $2;
                                }
                           | TOK_LPAREN_BEFORE_DATATYPE routine_params_list ')'
                                {
                                  $$ = $2;
                                }
                                

/* type pStmtDDL */
alter_function_statement : TOK_ALTER universal_function_tokens ddl_qualified_name
                           TOK_ADD TOK_ACTION routine_action_qualified_name
                           routine_params_list_clause
                           routine_returns_clause
                           optional_passthrough_inputs_clause
                           optional_create_function_attribute_list
                                {
                                  StmtDDLCreateRoutine *pNode99 = new (PARSERHEAP())
                                    StmtDDLCreateRoutine
                                    ( *$3 // ddl_qualified_name of uudf - deep copy
                                    , *$6 // ddl_qualified_name of action - deep copy
                                    ,  $7 // routine_params_list_clause
                                    ,  $8 // routine_returns_clause
                                    ,  $9 // optional_passthrough_inputs_clause
                                    , $10 // optional_create_function_attribute_list
                                    , COM_ACTION_UDF_TYPE
                                    , PARSERHEAP()
                                    );
                                  pNode99->synthesize();
                                  $$ = pNode99;
                                  delete $3; // ddl_qualified_name of uudf
                                  delete $6; // ddl_qualified_name of action
                                }

                         | TOK_ALTER universal_function_tokens ddl_qualified_name
                           TOK_DROP TOK_ACTION routine_action_qualified_name
                           optional_cleanup    optional_drop_behavior
                           optional_validate   optional_logfile
                                {
                                  $$ = SqlParserAux_buildDropAction
                                    ( $3  // in - QualifiedName * ddl_qualified_name of uudf   - deep copy
                                    , $6  // in - QualifiedName * ddl_qualified_name of action - deep copy
                                    , $7  // in - NABoolean       optional_cleanup
                                    , $8  // in - ComDropBehavior optional_drop_behavior
                                    , $9  // in - NABoolean       optional_validate
                                    , $10 // in - NAString      * optional_logfile             - deep copy
                                    );
                                  delete $3; // ddl_qualified_name of uudf
                                  delete $6; // ddl_qualified_name of action
                                  if ($10) delete $10; // optional_logfile name
                                  if ($$ EQU NULL) { yyerror(""); YYERROR; } // Error: internal syntax only!
                                }

                         | TOK_ALTER TOK_FUNCTION ddl_qualified_name
                           optional_alter_passthrough_inputs_clause
                           optional_add_passthrough_inputs_clause
                           optional_create_function_attribute_list
                                {
                                  $$ = SqlParserAux_buildAlterFunction
                                    ( $3 // in - NAString    * ddl_qualified_name of function - deep copy
                                    , $4 // in - ElemDDLNode * optional_alter_passthrough_inputs_clause
                                    , $5 // in - ElemDDLNode * optional_add_passthrough_inputs_clause
                                    , $6 // in - ElemDDLNode * optional_create_function_attribute_list
                                    );
                                  delete $3; // ddl_qualified_name of function
                                }

                         | TOK_ALTER universal_function_tokens ddl_qualified_name
                           TOK_ALTER TOK_ACTION routine_action_qualified_name
                           optional_alter_passthrough_inputs_clause
                           optional_add_passthrough_inputs_clause
                           optional_create_function_attribute_list
                                {
                                  $$ = SqlParserAux_buildAlterAction
                                    ( $3 // in - ddl_qualified_name of UUDF - deep copy
                                    , $6 // in - ddl_qualified_name of routine action - deep copy
                                    , $7 // in - optional_alter_passthrough_inputs_clause
                                    , $8 // in - optional_add_passthrough_inputs_clause
                                    , $9 // in - optional_create_function_attribute_list
                                    );
                                  delete $3; // ddl_qualified_name of universal function
                                  delete $6; // ddl_qualified_name of routine action
                                }

                         | TOK_ALTER table_mapping_function_tokens ddl_qualified_name
                           optional_alter_passthrough_inputs_clause
                           optional_add_passthrough_inputs_clause
                           optional_create_function_attribute_list
                                {
                                  $$ = SqlParserAux_buildAlterTableMappingFunction
                                    ( $3 // in - QualifiedName * ddl_qualified_name of function - deep copy
                                    , $4 // in - ElemDDLNode   * optional_alter_passthrough_inputs_clause
                                    , $5 // in - ElemDDLNode   * optional_add_passthrough_inputs_clause
                                    , $6 // in - ElemDDLNode   * optional_create_function_attribute_list
                                    );
                                 delete $3; // ddl_qualified_name of table mapping function
                                }

/* type pElemDDL */
optional_alter_passthrough_inputs_clause : empty { $$ = NULL; }
                                         | alter_passthrough_inputs_clause

/* type pElemDDL */
alter_passthrough_inputs_clause : TOK_ALTER passthrough_inputs_clause_start_tokens
                                  { HexStringLiteralNotAllowed = FALSE; }
                                  alter_passthrough_params_list
                                {
                                  $$ = $4; // alter_passthrough_params_list
                                  HexStringLiteralNotAllowed = TRUE;
                                }

/* type pElemDDL */
alter_passthrough_params_list : alter_passthrough_param
                              | '(' alter_passthrough_params ')'
                                {
                                  $$ = $2; // alter_passthrough_params
                                }

/* type pElemDDL */
alter_passthrough_params : alter_passthrough_param
                         | alter_passthrough_params ',' alter_passthrough_param
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLList($1/*params*/, $3 /*param*/);
                                }

/* type pElemDDL */
alter_passthrough_param : passthrough_param_position passthrough_input_value optional_passthrough_input_type
                                {
                                  $$ = SqlParserAux_buildAlterPassThroughParamDef
                                    ( $1 // in - unsigned int  passthrough_param_position
                                    , $2 // in - ElemDDLNode * passthrough_input_value - shallow copy
                                    , $3 // in - ComRoutinePassThroughInputType optional_passthrough_input_type
                                    );
                                }

/* type pElemDDL */
optional_add_passthrough_inputs_clause : empty { $$ = NULL; }
                                       | TOK_ADD passthrough_inputs_clause
                                {
                                  $$ = $2; // passthrough_inputs_clause
                                }

/* type routineExecutionMode */
routine_execution_mode : TOK_FAST { $$ = COM_ROUTINE_FAST_EXECUTION; }
                       | TOK_SAFE { $$ = COM_ROUTINE_SAFE_EXECUTION; }

/* type pElemDDL */
optional_routine_returns_clause : empty { $$ = NULL; }
                                | routine_returns_clause

/* type pElemDDL */
routine_returns_clause : return_tokens routine_return_param
                                {
                                  $$ = $2;
                                }
                       | return_tokens routine_return_params
                                {
                                  $$ = $2;
                                }

/* type tokval */
return_tokens:  TOK_RETURN | TOK_RETURNS

/* type pElemDDL */
routine_return_params : '(' routine_return_param_list ')'
                                {
                                  $$ = $2;
                                }
                      | TOK_LPAREN_BEFORE_DATATYPE routine_return_param_list ')'
                                {
                                  $$ = $2;
                                }

/* type pElemDDL */
routine_return_param_list : routine_return_param_optional_not_null
                          | routine_return_param_list ','
                            routine_return_param_optional_not_null
                            {
                              $$ = new (PARSERHEAP())
                                ElemDDLList ($1/*list*/, $3/*param*/);
                            }

/* type pElemDDL */
routine_return_param : optional_return_param_mode optional_param_name routine_predef_type
                       {
                         ElemDDLParamDef *p = new (PARSERHEAP())
                           ElemDDLParamDef($3 /*predef_type*/,
                                           $2 /*optional_param_name*/,
                                           $1 /*optional_return_param_mode*/,
                                           PARSERHEAP());
                         delete $2 /*optional_param_name*/;
                         $$ = p;
                       }

/* type pElemDDL */
routine_return_param_optional_not_null :
  optional_return_param_mode
  optional_param_name
  routine_predef_type
  optional_cast_spec_not_null_spec
  {
    ElemDDLParamDef *p = new (PARSERHEAP())
      ElemDDLParamDef($3 /*predef_type*/,
                      $2 /*optional_param_name*/,
                      $1 /*optional_return_param_mode*/,
                      PARSERHEAP());
    if ($4)
    {
      // NOT NULL specified
      NAType *t = p->getParamDataType();
      t->setNullable(FALSE);
    }
    delete $2 /*optional_param_name*/;
    $$ = p;
  }

/* type routineParamMode */
optional_return_param_mode : TOK_OUT { $$ = COM_OUTPUT_PARAM; }
                           | empty   { $$ = COM_OUTPUT_PARAM; }

/* type tokval */
passthrough_inputs_clause_start_tokens : TOK_PASS TOK_THROUGH TOK_INPUT
                                       | TOK_PASS TOK_THROUGH TOK_INPUTS

/* type pElemDDL */
optional_passthrough_inputs_clause : empty { $$ =  NULL; }
                                   | passthrough_inputs_clause

/* type pElemDDL */
passthrough_inputs_clause : passthrough_inputs_clause_start_tokens
                            { HexStringLiteralNotAllowed = FALSE; }
                             passthrough_params_list
                                {
                                  $$ =  $3; // passthrough_params_list
                                  HexStringLiteralNotAllowed = TRUE;
                                }

/* type pElemDDL */
passthrough_params_list : passthrough_param
                        | '(' passthrough_params ')'
                                {
                                  $$ = $2; // passthrough_params
                                }

/* type pElemDDL */
passthrough_params : passthrough_param
                   | passthrough_params ',' passthrough_param
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLList ($1, $3);
                                }

/* type pElemDDL */
passthrough_param : passthrough_input_value optional_passthrough_input_type
                                {
                                  ElemDDLPassThroughParamDef *pNode11 = $1 // passthrough_input_value
                                    ->castToElemDDLPassThroughParamDef();
                                  pNode11->setPassThroughInputType($2); // optional_passthrough_input_type
                                  $$ = pNode11;
                                }

/* type passThroughInputType */
optional_passthrough_input_type : TOK_TEXT
                                {
                                  $$ = COM_ROUTINE_PASS_THROUGH_INPUT_TEXT_TYPE;
                                }
                                | TOK_BINARY
                                {
                                  $$ = COM_ROUTINE_PASS_THROUGH_INPUT_BINARY_TYPE;
                                }
                                | empty
                                {
                                  $$ = COM_ROUTINE_PASS_THROUGH_INPUT_BINARY_TYPE;
                                }

/* type uint */
passthrough_param_position : TOK_POSITION unsigned_integer
                                {
                                  $$ = $2; // unsigned_integer
                                }

/* type pElemDDL */
passthrough_input_value : TOK_VALUE literal_negatable
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPassThroughParamDef ( $2    // literal_negatable - shallow copy
                                                               , PARSERHEAP()
                                                               );
                                }

                        | TOK_VALUE TOK_FROM TOK_FILE std_char_string_literal
                                {
                                  // TOK_FILE is a non-reserved word (i.e., FILE can be a parameter name).
                                  // Production passthrough_input_value ::= TOK_FILE std_char_string_literal
                                  // does not work.  Must use a reserved keyword like TOK_VALUE or TOK_FROM
                                  // for the parsing to work correctly.  We do not have to use both VALUE and
                                  // FROM, but VALUE FROM FILE '/usr/fred/udf/passthru1.dat' just sounds good.
                                  // With the use of the non-terminal symbol std_char_string_literal, a
                                  // long OSS file path name can be broken into several parts - for example:
                                  // VALUE FROM FILE '/usr/fred/a/'
                                  //                 'very/long/path/'
                                  //                 'name'
                                  // Accept neither _iso88591 nor _ucs2 string literal prefix.

                                  $$ = new (PARSERHEAP())
                                    ElemDDLPassThroughParamDef ( *$4 // std_char_string_literal - deep copy
                                                               , PARSERHEAP()
                                                               );
                                  delete $4; // std_char_string_literal
                                }

/* type pElemDDL */
routine_params_list :   empty
                                {
                                  $$ = NULL;
                                }
                      | routine_params 

/* type pElemDDL */
routine_params : routine_param
                      | routine_params ',' routine_param
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLList ($1, $3);
                                }

/* type pElemDDL */
routine_param : optional_param_mode optional_param_name routine_predef_type
                  optional_cast_spec_not_null_spec
                {
                  if ($4)
                    $3->setNullable(FALSE);

                  $$ = new (PARSERHEAP()) ElemDDLParamDef(
						  $3 /*predef_type*/,
						  $2 /*optional_param_name*/,
						  $1 /*optional_param_mode*/,
                                                  PARSERHEAP());
                  delete $2 /*optional_param_name*/;
                }

/* type na_type */
routine_predef_type : predef_type
               {
                 if (($1->getTypeName() == LiteralTinyInt) &&
                     ((CmpCommon::getDefault(TRAF_TINYINT_SUPPORT) == DF_OFF) ||
                      (CmpCommon::getDefault(TRAF_TINYINT_SPJ_SUPPORT) == DF_OFF)))
                   {
                     NumericType * nt = (NumericType*)$1;
                     $$ = new (PARSERHEAP()) 
                       SQLSmall(PARSERHEAP(), NOT nt->isUnsigned(), $1->supportsSQLnull());
                   }
               }

/* type pElemDDLParamName */
optional_param_name : empty
                         {
                           $$ = NULL;
                         }
                    | param_name

/* type pElemDDLParamName */
param_name : IDENTIFIER
                         {
                           if ( ($1==NULL) || transformIdentifier(*$1)) YYERROR;
                           $$ = new (PARSERHEAP())ElemDDLParamName(*$1);
                           delete $1;
                         }
                    | DELIMITED_IDENTIFIER
                         {
                           if ( ($1==NULL) || transformIdentifier(*$1)) YYERROR;
                               $$ = new (PARSERHEAP())ElemDDLParamName(*$1);
                           delete $1;
                         }
                    | nonreserved_word
                         {  
                           NAString temp = *(unicodeToChar
                                            (ToTokvalPlusYYText(&$1)->yytext,
                                             ToTokvalPlusYYText(&$1)->yyleng,
                                             (CharInfo::CharSet) (
                                                                  ComGetNameInterfaceCharSet()
                                                                  ),
                                             PARSERHEAP()) );
                           temp.toUpper();
                           $$ = new (PARSERHEAP())ElemDDLParamName(temp);	   
                         }
                    | nonreserved_func_word
                         {  
                           NAString temp = *(unicodeToChar
                                            (ToTokvalPlusYYText(&$1)->yytext,
                                             ToTokvalPlusYYText(&$1)->yyleng,
                                             (CharInfo::CharSet) (
                                                                  ComGetNameInterfaceCharSet()
                                                                  ),
                                             PARSERHEAP()) );
                           temp.toUpper();
                           $$ = new (PARSERHEAP())ElemDDLParamName(temp);	   
                         }
			 /* Please check.
                    | empty
                         {
                           $$ = NULL;
                         }
*/
/* type routineParamMode */
optional_param_mode : TOK_IN 
                         {
                           $$ = COM_INPUT_PARAM;
                         }
                    | TOK_OUT 
                         {
                           $$ = COM_OUTPUT_PARAM;
                         }
                    | TOK_INOUT
                         {
                           $$ = COM_INOUT_PARAM;
                         }
                    | empty
                         {
                           $$ = COM_INPUT_PARAM;
                         }

/* type pElemDDL */
optional_create_routine_attribute_list : empty
                         {
                       $$ = NULL;
                         }
                      | create_routine_attribute_list

/* type pElemDDL */
create_routine_attribute_list : create_routine_attribute
                      | create_routine_attribute_list create_routine_attribute
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLOptionList(
                                       $1 /*create_routine_attribute_list*/,
                                       $2 /*create_routine_attribute*/);
                                }

/* type pElemDDL */
optional_create_function_attribute_list : empty { $$ = NULL; }
                      | create_function_attribute_list

/* type pElemDDL */
create_function_attribute_list : create_function_attribute
                      | create_function_attribute_list create_function_attribute
    {
      $$ = new (PARSERHEAP()) ElemDDLOptionList($1 /*list*/, $2 /*attr*/);
    }

/* type stringval */
std_char_string_literal : QUOTED_STRING
    {
      // std_char_string_literal ::= QUOTED_STRING


      PARSERASSERT(getStringCharSet(&$1/*QUOTED_STRING*/) == CharInfo::ISO88591 ||
                   getStringCharSet(&$1/*QUOTED_STRING*/) == CharInfo::UTF8);

      // We do not need to make the following call if the parameter is not $1 (e.g., $2).
      // The parser, by default, already copied the contents of the data structure
      // associating with $1 to that of $$.  We must make the following call if
      // we change the contents of the data structure associating with $1 and want to
      // copy the changes to the parser data structure associating with $$.
      //
      // The following call is not needed for this case.  The above comments described
      // how to use this function call (instead of $$ = $1).  In the semantic actions
      // of the next grammar production, this function must be called.  You may want
      // to walk through that code and read the associating comments.
      ToStringvalWithCharSet(&$$/*lhs*/)->shallowCopy(ToStringvalWithCharSet(&$1/*QUOTED_STRING*/)); // $$ = $1;

    }
  | std_char_string_literal QUOTED_STRING
    {
      // std_char_string_literal ::= std_char_string_literal QUOTED_STRING


      PARSERASSERT(getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::ISO88591 ||
                   getStringCharSet(&$1/*std_char_string_literal*/) == CharInfo::UTF8);
      PARSERASSERT(getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::ISO88591 ||
                   getStringCharSet(&$2/*QUOTED_STRING*/) == CharInfo::UTF8);

      if ( getStringCharSet(&$1) == getStringCharSet(&$2) ||
           getStringCharSet(&$1) == CharInfo::UTF8 )
      {
        ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$1)); // the default behavior
        $$->append(*$2);
        // if (getStringCharSet(&$2) == CharInfo::ISO88591)
        //   PARSERASSERT(NAStringHasOnly7BitAsciiChars(*$2));
        delete $2;
      }
      else if (getStringCharSet(&$2) == CharInfo::UTF8)
      {
        // PARSERASSERT(getStringCharSet(&$1) == CharInfo::ISO88591 && NAStringHasOnly7BitAsciiChars(*$1));
        ToStringvalWithCharSet(&$$)->shallowCopy(ToStringvalWithCharSet(&$2)); // must do this instead of $$ = $2;
        ToStringvalWithCharSet(&$$)->stringval = $1; // same as $$ = $1;
        $$->append(*$2);
        delete $2;
      }
      else
      {
        charsetMismatchError(&$1, &$2);
        YYERROR;
      }
    }


/* type pElemDDL */
create_routine_attribute : location_clause
                      | udr_external_name_clause
                      | udr_external_path_clause
                      | udr_language_clause
                      | udr_library_clause
                      | udr_param_style_clause
                      | udr_access_clause
                      | udr_result_sets_clause
                      | udr_deterministic_clause
                      | udr_isolate_clause
                      | udr_transaction_clause
                      | udr_external_security_clause

/* type pElemDDL */
create_function_attribute : create_function_udr_attribute
                          | create_function_udf_attribute

/* type pElemDDL */
create_function_udr_attribute : location_clause
                              | udr_external_name_clause
                              | udr_language_clause
                              | udr_deterministic_clause
                              | udr_access_clause
                              | udr_isolate_clause
                              | udr_transaction_clause
                              | udr_library_clause

/* type pElemDDL */
create_function_udf_attribute : udf_param_style_clause
                              | udf_version_tag_clause
                              | udf_optimization_hint_clause
                              | udf_state_area_clause
                              | udf_execution_mode_clause
                              | udf_special_attributes_clause
                              | udf_parallelism_clause
                              | udf_final_call_clause

/* type pElemDDL */
udr_external_name_clause : TOK_EXTERNAL TOK_NAME std_char_string_literal
                                {
                                  // DEFAULT_CHARSET has no effect on std_char_string_literal in this context
                                  // A long external name can span several lines - For example:
                                  // EXTERNAL NAME 'a_very_very_'
                                  //               'long_external_name'
                                  $$ = new (PARSERHEAP()) ElemDDLUdrExternalName(*$3); // std_char_string_literal
                                }

/* type pElemDDL */
udr_external_path_clause : TOK_EXTERNAL TOK_PATH std_char_string_literal
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrExternalPath(*$3); // std_char_string_literal
                                }

/* type pElemDDL */
udr_language_clause : TOK_LANGUAGE TOK_JAVA
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrLanguage(COM_LANGUAGE_JAVA);
                                } 
                    | TOK_LANGUAGE TOK_C
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrLanguage(COM_LANGUAGE_C);
                                } 
                    | TOK_LANGUAGE TOK_CPP
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrLanguage(COM_LANGUAGE_CPP);
                                } 
                    | TOK_LANGUAGE TOK_SQL
                                {
                                  yyerror("The LANGUAGE SQL clause is not supported within a routine definition. \n");
                                  YYERROR;
                                  $$ = new (PARSERHEAP()) ElemDDLUdrLanguage(COM_LANGUAGE_SQL);
                                } 

/* type pElemDDL */
udr_library_clause : TOK_LIBRARY ddl_qualified_name
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrLibrary(*$2);
                                } 
/* type pElemDDL */
udf_param_style_clause : routine_parameter_style_sql | routine_parameter_style_sqlrow

/* type pElemDDL */
routine_parameter_style_sql : TOK_PARAMETER TOK_STYLE TOK_SQL
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrParamStyle(COM_STYLE_SQL);
                                }

/* type pElemDDL */
routine_parameter_style_sqlrow : TOK_PARAMETER TOK_STYLE TOK_SQLROW
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrParamStyle(COM_STYLE_SQLROW);
                                  YYERROR; // this style is no longer allowed in DDL syntax
                                }

/* type pElemDDL */
udr_param_style_clause : TOK_PARAMETER TOK_STYLE TOK_JAVA
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrParamStyle(COM_STYLE_JAVA_CALL);
                                } 
                       | routine_parameter_style_sql
                       | routine_parameter_style_sqlrow
                                {
                                  $$ = $1;
                                  yyerror("The PARAMETER STYLE SQLROW clause is not supported within a procedure definition. \n");
                                  YYERROR;
                                } 
                       | TOK_PARAMETER TOK_STYLE TOK_GENERAL
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrParamStyle(COM_STYLE_GENERAL);
                                } 

/* type pElemDDL */
udr_access_clause : TOK_NO TOK_SQL
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrSqlAccess(COM_NO_SQL);
                                } 
                    | TOK_MODIFIES TOK_SQL TOK_DATA
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrSqlAccess(COM_MODIFIES_SQL);
                                } 
                    | TOK_READS TOK_SQL TOK_DATA
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrSqlAccess(COM_READS_SQL);
                                } 
                    | TOK_CONTAINS TOK_SQL
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrSqlAccess(COM_CONTAINS_SQL);
                                } 

/* type pElemDDL */
udr_result_sets_clause : TOK_DYNAMIC TOK_RESULT TOK_SETS unsigned_integer
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrMaxResults($4 /*unsigned_integer*/);
                                } 

/* type pElemDDL */
udr_deterministic_clause : TOK_DETERMINISTIC
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrDeterministic(TRUE);
                                } 
                    | TOK_NOT TOK_DETERMINISTIC
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrDeterministic(FALSE);
                                } 

/* type pElemDDL */
udr_isolate_clause : TOK_ISOLATE
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrIsolate(TRUE);
                                } 
                    | TOK_NO TOK_ISOLATE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLUdrIsolate(FALSE);
                                } 
/* type pElemDDL */
udr_transaction_clause : TOK_TRANSACTION TOK_REQUIRED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLUdrTransaction(COM_TRANSACTION_REQUIRED);
                                } 
                    | TOK_NO TOK_TRANSACTION TOK_REQUIRED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLUdrTransaction(COM_NO_TRANSACTION_REQUIRED);
                                } 

/* type pElemDDL */
udr_external_security_clause : udr_external_security_definer | udr_external_security_invoker

/* type pElemDDL */
udr_external_security_definer : TOK_EXTERNAL TOK_SECURITY TOK_DEFINER
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrExternalSecurity(COM_ROUTINE_EXTERNAL_SECURITY_DEFINER);
                                }

/* type pElemDDL */
udr_external_security_invoker : TOK_EXTERNAL TOK_SECURITY TOK_INVOKER
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLUdrExternalSecurity(COM_ROUTINE_EXTERNAL_SECURITY_INVOKER);
                                }

/* type pElemDDL */
udf_special_attributes_clause : file_attribute_keyword udf_special_attributes
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfSpecialAttributes(*$2); // deep copy
    delete $2; // udf_special_attributes
  }

/* type stringval */
udf_special_attributes : std_char_string_literal
                       | '(' std_char_string_literal ')'
  {
    $$ = $2; // std_char_string_literal
  }

/* type pElemDDL */
udf_final_call_clause : TOK_FINAL TOK_CALL
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfFinalCall(TRUE);
  }
                      | TOK_NO TOK_FINAL TOK_CALL
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfFinalCall(FALSE);
  }

/* type pElemDDL */
udf_state_area_clause : TOK_STATE TOK_AREA TOK_SIZE unsigned_integer
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfStateAreaSize($4/*unsigned_integer*/);
  }
                      | TOK_NO TOK_STATE TOK_AREA
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfStateAreaSize(0);
  }

/* type pElemDDL */
udf_parallelism_clause : TOK_ALLOW TOK_ANY TOK_PARALLELISM
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfParallelism(COM_ROUTINE_ANY_PARALLELISM);
  }
                       | TOK_NO TOK_PARALLELISM
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfParallelism(COM_ROUTINE_NO_PARALLELISM);
  }

/* type pElemDDL */
udf_execution_mode_clause : routine_execution_mode TOK_EXECUTION TOK_MODE
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfExecutionMode($1/*routine_execution_mode*/);
  }

/* type pElemDDL */
udf_optimization_hint_clause : udf_number_of_unique_values_clause
  | udf_optimization_stage udf_resource_kind TOK_COST udf_cost
  {
    $$ = SqlParserAux_buildUdfOptimizationHint ( $1 // in - int       udf_optimization_stage
                                               , $2 // in - int       udf_resource_kind
                                               , $4 // in - ComSInt32 udf_cost
                                               );
    if ($$ EQU NULL) { yyerror(""); YYERROR; }
  }

/* type tokval */
udf_optimization_stage : TOK_INITIAL | TOK_NORMAL

/* type tokval */
udf_resource_kind : TOK_CPU
                  | TOK_IO
                  | TOK_MESSAGE

/* type longint */
udf_cost : TOK_SYSTEM
  {
    $$ = -1;
  }
         | unsigned_integer
  {
    $$ = (Lng32)$1; // unsigned_integer
  }

/* type tokval */
number_of_unique_values_tokens : TOK_NUMBER TOK_OF TOK_UNIQUE TOK_OUTPUT TOK_VALUES

/* type pElemDDL */
udf_number_of_unique_values_clause : number_of_unique_values_tokens number_of_unique_output_values
  {
    $$ = $2; // ElemDDLNode * number_of_unique_values
  }

/* type pElemDDL */
number_of_unique_output_values : TOK_SYSTEM
  {
    ElemDDLUdfOptimizationHint * pNode63 = new (PARSERHEAP())
      ElemDDLUdfOptimizationHint(COM_UDF_NUMBER_OF_UNIQUE_OUTPUT_VALUES);
    pNode63->setUniqueOutputValuesParseTree(NULL); // use system settings
    pNode63->synthesize();
    $$ = pNode63;
  }
                        | '(' unique_output_value_list ')'
  {
    ElemDDLUdfOptimizationHint * pNode66 = new (PARSERHEAP())
      ElemDDLUdfOptimizationHint(COM_UDF_NUMBER_OF_UNIQUE_OUTPUT_VALUES);
    pNode66->setUniqueOutputValuesParseTree($2); // ItemExprList * unique_output_value_list
    pNode66->synthesize();
    $$ = pNode66;
  }

/* type itemlist */
unique_output_value_list : unique_output_value
  {
    ItemExprList *itemList777 = new (PARSERHEAP()) ItemExprList(PARSERHEAP());
    itemList777->insert($1); // ItemExpr * unique_output_value
    $$ = itemList777;
  }
                         | unique_output_value_list ',' unique_output_value
  {
    ItemExprList *itemList333 = (ItemExprList *)$1; // unique_output_value_list
    itemList333->insert($3); // ItemExpr * unique_output_value
    $$ = itemList333;
  }

/* type item */
unique_output_value : TOK_SYSTEM
  {
    NAString *theValue22 = new (PARSERHEAP()) NAString("1", PARSERHEAP());
    ItemExpr *returnValue = literalOfNumericNoScale(theValue22, '-'); // -1
    if (!returnValue) YYERROR;
    $$ = returnValue;
    // delete theValue22;
    /*
  }
                    | NUMERIC_LITERAL_EXACT_NO_SCALE
  {
    ItemExpr *returnValue = literalOfNumericNoScale($1); // deep copy
    if (!returnValue) YYERROR;
    $$ = returnValue;
    delete $1; // NAString * NUMERIC_LITERAL_EXACT_NO_SCALE
    */
  }
                    | literal

/* type pElemDDL */
udf_version_tag_clause : TOK_VERSION TOK_TAG std_char_string_literal
  {
    $$ = new (PARSERHEAP()) ElemDDLUdfVersionTag(*$3); // deep copy
    delete $3; // std_char_string_literal
  }

optional_hive_options : empty 
                      {
                        $$ = NULL;
                      }
                      | TOK_HIVE TOK_OPTIONS QUOTED_STRING
                      {
                        $$ = $3;
                      }

/* type pStmtDDL */
table_definition : create_table_start_tokens 
                        ddl_qualified_name 
                        table_definition_body
                        optional_create_table_attribute_list
                        optional_in_memory_clause
                        optional_map_to_hbase_clause
                        optional_hbase_data_format
	  	   {
                     $1->setOptions(TableTokens::OPT_NONE);
		     QualifiedName * qn;
                     if ($1->isVolatile())
                       qn = processVolatileDDLName($2, TRUE, TRUE);
		     else
                       qn = processVolatileDDLName($2, FALSE, FALSE);
		     if (! qn)
                       YYABORT;

                     if ($6) // map to hbase table
                       {
                         if ($1->getType() != TableTokens::TYPE_EXTERNAL_TABLE)
                           YYERROR;

                         // cannot be create like
                         if ($3->castToElemDDLLikeCreateTable())
                           {
                             *SqlParser_Diags << DgSqlCode(-3242)
                                              << DgString0("Cannot specify LIKE clause with mapped hbase tables.");
                             YYERROR;
                           }
                         
                         // cannot specify cat/schema names
                         if ((NOT qn->getCatalogName().isNull()) ||
                             (NOT qn->getSchemaName().isNull()))
                           {
                             *SqlParser_Diags << DgSqlCode(-3242)
                                              << DgString0("Cannot specify catalog or schema names with mapped hbase tables.");
                             YYERROR;
                           }
                       }

		     StmtDDLCreateTable *pNode =
		       new (PARSERHEAP())
		       StmtDDLCreateTable(
			    *qn, //ddl_qualified_name
			    $3,  //table_definition_body
			    $4,  //optional_create_table_attribute_list
			    NULL,
			    NULL,
			    PARSERHEAP());

                     if ($6)
                       {
                         CorrName cn(*$6);
                         pNode->setLikeSourceTableName(cn);

                         pNode->setMapToHbaseTable(TRUE);

                         pNode->setHbaseDataFormat($7);
                       }

                     $1->setTableTokens(pNode);
		     pNode->synthesize();

		     if (ParNameCTLocListPtr)
		       {
			 delete ParNameCTLocListPtr;
			 ParNameCTLocListPtr = NULL;
		       }

		     $$ = pNode;
                     delete $1; //TableTokens
		     delete $2; //ddl_qualified_name
		   }

table_definition : create_table_start_tokens 
                   ddl_qualified_name
                   like_definition
	  	   {
                     $1->setOptions(TableTokens::OPT_NONE);
		     QualifiedName * qn;
                     if ($1->isVolatile())
                       qn = processVolatileDDLName($2, TRUE, TRUE);
		     else
                       qn = processVolatileDDLName($2, FALSE, FALSE);
		     if (! qn)
                       YYABORT;

		     StmtDDLCreateTable *pNode =
		       new (PARSERHEAP())
		       StmtDDLCreateTable(
			    *qn, //ddl_qualified_name
			    $3,  //like_definition
			    NULL,
			    NULL,
			    NULL,
			    PARSERHEAP());

                     $1->setTableTokens(pNode);
		     pNode->synthesize();

		     if (ParNameCTLocListPtr)
		       {
			 delete ParNameCTLocListPtr;
			 ParNameCTLocListPtr = NULL;
		       }

		     $$ = pNode;
                     delete $1; //TableTokens
		     delete $2; //ddl_qualified_name
		   }

		 | TOK_CREATE special_table_name
                        table_definition_body
                        optional_create_table_attribute_list
		   {
		     StmtDDLCreateTable *pNode =
		       new (PARSERHEAP())
		       StmtDDLCreateTable(
			    $2->getQualifiedNameObj() /*table_name*/,
			    $3 /*table_definition_body*/,
			    $4 /*optional_create_table_
				*attribute_list*/,
			    NULL,
			    NULL,
			    PARSERHEAP());
		     pNode->setTableType($2->getSpecialType());
		     pNode->synthesize();
		     
		     if (ParNameCTLocListPtr)
		       {
			 delete ParNameCTLocListPtr;
			 ParNameCTLocListPtr = NULL;
		       }
		     
		     $$ = pNode;
		     delete $2; /*special_table_name*/
		   }

                 | create_table_start_tokens
                   ddl_qualified_name
 		   table_definition_body
 		   optional_create_table_attribute_list 
 		   create_table_as_attr_list_end
		   ctas_load_and_in_memory_options
		   ctas_insert_columns
                   optional_hive_options
		   create_table_as_token 
                   {
                     if (CmpCommon::getDefault(HIVE_CTAS_IN_NATIVE_MODE) == DF_OFF)
                       SqlParser_CurrentParser->hiveDDLInfo_->setFoundDDL(FALSE);                       
                   }
		   optional_locking_stmt_list 
                   query_expression 
                   optional_limit_spec
		   {
		     QualifiedName * qn;

		     if ($1->getType() == TableTokens::TYPE_GHOST_TABLE) // ghost table
		       {
			 // Syntax error: CREATE GHOST TABLE ... AS ...
			 yyerror("");
			 YYERROR;
		       }

                     $1->setOptions($6);
                     if ($1->isVolatile())
                       qn = processVolatileDDLName($2, FALSE, FALSE);
		     else
		       qn = $2;
		     if (! qn)
			 YYABORT;

		     RelRoot *top = finalize($12);
                   //limit clause
                   if ($13)
                   {
                     if (top->getFirstNRows() >= 0)
                       {
                         // cannot specify LIMIT and FIRST N clauses together.
                         YYERROR;
                       }
                     else
                       {
                         NABoolean negate;
                         if ($13->castToConstValue(negate))
                           {
                             ConstValue * limit = (ConstValue*)$13;
                             Lng32 scale = 0;
                             top->setFirstNRows(limit->getExactNumericValue(scale));
                             top->setFirstNRowsParam(NULL);
                           }
                         else
                           {
                             top->setFirstNRowsParam($13);
                             top->setFirstNRows(-1);
                           }
                       }
                   }

		     StmtDDLCreateTable *pNode =
		       new (PARSERHEAP())
		       StmtDDLCreateTable(
			    *qn, //ddl_qualified_name
			    $3,  // table_definition_body
			    $4,  // optional_create_table_attribute_list
			    $7,  // insert column list 
			    top,
			    PARSERHEAP());
                     $1->setTableTokens(pNode);
		     pNode->synthesize();
		     
		     if (ParSetTextEndPos(pNode)) 
		       {					
			 yyerror("");				
			 YYERROR;				
		       }

		     if (ParNameCTLocListPtr)
		       {
			 delete ParNameCTLocListPtr;
			 ParNameCTLocListPtr = NULL;
		       }

                     if ($8)
                       pNode->setHiveOptions(*$8);

		     $$ = pNode;
                     delete $1; //TableTokens
		     delete $2; //ddl_qualified_name
		   }

                 | create_table_start_tokens 
                   ddl_qualified_name 
                   {
                     if (CmpCommon::getDefault(HIVE_CTAS_IN_NATIVE_MODE) == DF_OFF)
                       SqlParser_CurrentParser->hiveDDLInfo_->setFoundDDL(FALSE);                       
                   }
		   optional_create_table_attribute_list 
		   create_table_as_attr_list_end
		   ctas_load_and_in_memory_options
		   ctas_insert_columns
                   optional_hive_options
		   create_table_as_token 
		   optional_locking_stmt_list 
                   query_expression 
                   optional_limit_spec
		   {
		     QualifiedName * qn;

		     if ($1->getType() == TableTokens::TYPE_GHOST_TABLE) // ghost table
		       {
			 // Syntax error: CREATE GHOST TABLE ... AS ...
			 yyerror("");
			 YYERROR;
		       }

                     $1->setOptions($6);
                     if ($1->isVolatile())
                       qn = processVolatileDDLName($2, FALSE, FALSE);
		     else
		       qn = $2;
		     if (! qn)
                       YYABORT;

		     RelRoot *top = finalize($11);
                   //limit clause
                   if ($12)
                   {
                     if (top->getFirstNRows() >= 0)
                       {
                         // cannot specify LIMIT and FIRST N clauses together.
                         YYERROR;
                       }
                     else
                       {
                         NABoolean negate;
                         if ($12->castToConstValue(negate))
                           {
                             ConstValue * limit = (ConstValue*)$12;
                             Lng32 scale = 0;
                             top->setFirstNRows(limit->getExactNumericValue(scale));
                             top->setFirstNRowsParam(NULL);
                           }
                         else
                           {
                             top->setFirstNRowsParam($12);
                             top->setFirstNRows(-1);
                           }
                       }
                   }
		     
		     StmtDDLCreateTable *pNode =
		       new (PARSERHEAP())
		       StmtDDLCreateTable(
			    *qn,  //ddl_qualified_name
			    NULL, //table_definition_body
			    $4,   //optional_create_table_attribute_list
			    $7,   //insert column list 
			    top,
			    PARSERHEAP());
                     $1->setTableTokens(pNode);
		     pNode->synthesize();
		     
		     if (ParSetTextEndPos(pNode)) 
		       {					
			 yyerror("");				
			 YYERROR;				
		       }

		     if (ParNameCTLocListPtr)
		       {
			 delete ParNameCTLocListPtr;
			 ParNameCTLocListPtr = NULL;
		       }

                     if ($8)
                       pNode->setHiveOptions(*$8);

		     $$ = pNode;
                     delete $1; //TableTokens
		     delete $2;  //ddl_qualified_name
		   }

              | TOK_CREATE TOK_HBASE TOK_TABLE identifier '(' col_fam_quoted_string_list ')'
               {
		 QualifiedName qn(*$4);

		 StmtDDLCreateHbaseTable *pNode =
		   new (PARSERHEAP())
		   StmtDDLCreateHbaseTable(
				      qn /*ddl_qualified_name*/,
				      $6,
				      NULL,
				      PARSERHEAP());

		 $$ = pNode;
               }
              | TOK_CREATE TOK_HBASE TOK_TABLE identifier '(' col_fam_quoted_string_list ')' hbase_table_options
               {
		 QualifiedName qn(*$4);

		 StmtDDLCreateHbaseTable *pNode =
		   new (PARSERHEAP())
		   StmtDDLCreateHbaseTable(
				      qn /*ddl_qualified_name*/,
				      $6,
				      $8->castToElemDDLHbaseOptions(), /* hbase options list */
				      PARSERHEAP());

		 $$ = pNode;
               }

/* tableTokens */
create_table_start_tokens : 
                   TOK_CREATE TOK_TABLE optional_if_not_exists_clause
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_REGULAR_TABLE, $3); 
                     $$ = tableTokens;

                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::CREATE_, StmtDDLonHiveObjects::TABLE_, $3);
		   }

                   | TOK_CREATE TOK_EXTERNAL TOK_TABLE optional_if_not_exists_clause
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_EXTERNAL_TABLE, $4); 
                     $$ = tableTokens;

                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::CREATE_, StmtDDLonHiveObjects::TABLE_, $4);
		   }

                   | TOK_CREATE TOK_IMPLICIT TOK_EXTERNAL TOK_TABLE optional_if_not_exists_clause
                   {
                     if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                       {
                         yyerror(""); YYERROR; /*internal syntax only!*/
                       }
                     
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_IMPLICIT_EXTERNAL_TABLE, $5); 
                     $$ = tableTokens;
		   }

                   | TOK_CREATE TOK_SET TOK_TABLE optional_if_not_exists_clause
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_SET_TABLE, $4); 
                     $$ = tableTokens;
		   }

                   | TOK_CREATE TOK_MULTISET TOK_TABLE optional_if_not_exists_clause 
                   {
		     if (NOT SqlParser_CurrentParser->modeSpecial1())
		       {
			 YYERROR;
		       }

		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_MULTISET_TABLE, $4); 
                     $$ = tableTokens;
		   }

                   | TOK_CREATE TOK_VOLATILE TOK_TABLE optional_if_not_exists_clause 
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                    if (CmpCommon::getDefault(MODE_SPECIAL_1) == DF_ON)
                    { 
                       TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_TABLE_MODE_SPECIAL1, $4); 
                       $$ = tableTokens;
                    }

                    else
                    {                      
                       TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_TABLE, $4); 
                       $$ = tableTokens;
                    }
		   }

                   | TOK_CREATE TOK_LOCAL TOK_TEMPORARY TOK_TABLE optional_if_not_exists_clause
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_TABLE, $5); 
                     $$ = tableTokens;
		   }

                   | TOK_CREATE TOK_GLOBAL TOK_TEMPORARY TOK_TABLE optional_if_not_exists_clause 
                   {
                     CheckModeSpecial4;
 
		     ParNameCTLocListPtr = new (PARSERHEAP())
		       ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_TABLE, $5); 
                     $$ = tableTokens;
		   }

                   | TOK_CREATE ghost TOK_TABLE 
                   {
                     ParNameCTLocListPtr = new (PARSERHEAP())
                     ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_GHOST_TABLE, FALSE); 
                     $$ = tableTokens;
                   }

                   | TOK_CREATE TOK_SET TOK_VOLATILE TOK_TABLE optional_if_not_exists_clause
                   {
		     ParNameCTLocListPtr = new (PARSERHEAP())
		     ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_SET_TABLE, $5); 
                     $$ = tableTokens;
		   }

		   | TOK_CREATE TOK_MULTISET TOK_VOLATILE TOK_TABLE optional_if_not_exists_clause
                   {
                     CheckModeSpecial1();
		     ParNameCTLocListPtr = new (PARSERHEAP())
		     ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                     TableTokens *tableTokens = new TableTokens(TableTokens::TYPE_VOLATILE_MULTISET_TABLE, $5); 
                     $$ = tableTokens;
		   }

/* type boolean */
optional_if_not_exists_clause : 
                empty
                  {
                    $$ = FALSE;
                  }
               | TOK_IF TOK_NOT TOK_EXISTS
                  {
                    $$ = TRUE;
                  }

/* type boolean */
optional_if_exists_clause :
          empty
            {
               $$ = FALSE;
             }
          | TOK_IF TOK_EXISTS
             {
               $$ = TRUE;
             }

/* type boolean */
optional_if_not_registered_clause : 
                empty
                  {
                    $$ = FALSE;
                  }
               | TOK_IF TOK_NOT TOK_REGISTERED
                  {
                    $$ = TRUE;
                  }
               | TOK_IF TOK_NOT TOK_EXISTS
                  {
                    $$ = TRUE;
                  }

/* type boolean */
optional_if_registered_clause :
          empty
            {
               $$ = FALSE;
             }
          | TOK_IF TOK_REGISTERED
             {
               $$ = TRUE;
             }
          | TOK_IF TOK_EXISTS
             {
               $$ = TRUE;
             }


create_table_as_attr_list_start: empty
	           {
		     // Mark the text begining of attr list
		     if (ParNameCTLocListPtr)
		       ParSetBeginOfCreateTableAsAttrList(ParNameCTLocListPtr);
		   }

create_table_as_attr_list_end: empty
	           {
		     // Mark the text begining of attr list
		     if (ParNameCTLocListPtr)
		       ParSetEndOfCreateTableAsAttrList(ParNameCTLocListPtr);
		   }

ctas_load_and_in_memory_options : TOK_LOAD TOK_IF TOK_EXISTS 
                   {
		     $$ = TableTokens::OPT_LOAD; 
		   }
                 | TOK_NO_LOAD
                   {
		     if (CmpCommon::getDefault(IN_MEMORY_OBJECT_DEFN) == DF_ON)
		       $$ = TableTokens::OPT_IN_MEM; 
		     else
		       $$ = TableTokens::OPT_NO_LOAD; 
		   }
                 | TOK_NO_LOAD TOK_IN TOK_MEMORY 
                   {
		     $$ = TableTokens::OPT_IN_MEM; 
		   }
                 | TOK_LOAD TOK_IF TOK_EXISTS TOK_WITH TOK_TRUNCATE
                   {
		     $$ = TableTokens::OPT_LOAD_WITH_DELETE; 
		   }
                 | TOK_LOAD TOK_IF TOK_EXISTS TOK_WITH TOK_DELETE TOK_DATA
                   {
		     $$ = TableTokens::OPT_LOAD_WITH_DELETE; 
		   }
                 | empty 
                   {		  
		     if (CmpCommon::getDefault(IN_MEMORY_OBJECT_DEFN) == DF_ON)
		       $$ = TableTokens::OPT_IN_MEM; 
		     else
		       $$ = TableTokens::OPT_NONE;
		   }

/* type pElemDDL */
ctas_insert_columns : TOK_INSERT TOK_COLUMNS '(' view_column_def_list ')'
                   {
		     if (CmpCommon::getDefault(COMP_BOOL_207) == DF_OFF)
		       {
			 YYERROR;
		       }

		     $$ = $4;
		   }
                 | empty {$$ = 0;}

create_table_as_token: TOK_AS
	{
	  // Mark the text begining of AS query
	  if (ParNameCTLocListPtr)
	    ParSetBeginOfCreateTableAsQueryPos(ParNameCTLocListPtr);
	}

/* type pElemDDL */
table_definition_body : table_element_list
                      | external_table_definition
                      | table_element_list external_table_definition
                        {
                          $$ = new (PARSERHEAP())
                            ElemDDLList(
                                 $1 /*table_elements*/,
                                 $2 /*table_element*/);
                        }

/* type pElemDDL */
table_element_list : '(' table_elements ')'
                                {
                                  $$ = $2 /*table_elements*/;
                                }
				   | optional_ignored_table_options '(' table_elements ')'
                                {
                                  $$ = $3 /*table_elements*/;
                                }

/* type tokval */
empty : 	{ $$ = 0; }

/* type pElemDDL */
table_elements : table_element
                      | table_elements ',' table_element
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLList(
						$1 /*table_elements*/,
						$3 /*table_element*/);
                                }

/* type pElemDDL */
table_element : set_in_column_defn column_definition reset_in_column_defn
                        {
                          $$ = $2;
                        }
                      | table_constraint_definition

set_in_column_defn : 
                  {
                    in_col_defn = TRUE; 
                    $$=1;
                  }
reset_in_column_defn : 
                  {
                    in_col_defn = FALSE;
                    $$  = 0;
                  }

/* type pElemDDL */
column_definition : qualified_name data_type optional_column_attributes
                                {
                                  NAType * type = $2;

                                  if (CmpCommon::getDefault(MODE_SPECIAL_4) == DF_ON) 
                                    {
                                      // change DATE to TIMESTAMP(0)
                                      if ((type->getTypeQualifier() == NA_DATETIME_TYPE) &&
                                          (type->getPrecision() == SQLDTCODE_DATE))
                                        {
                                          type = new (PARSERHEAP()) SQLTimestamp(PARSERHEAP(), TRUE, 0);
                                        }

                                      // change FLOAT(p) to NUMERIC(p)
                                      else if ((type->getFSDatatype() == REC_FLOAT64) &&
                                               (((SQLDoublePrecision*)type)->fromFloat()))
                                        {
                                          SQLDoublePrecision* f = (SQLDoublePrecision*) type;
                                          Lng32 numPrec = f->origPrecision();
                                          if (numPrec == 0)
                                            numPrec = 18;

                                          if (numPrec > MAX_HARDWARE_SUPPORTED_SIGNED_NUMERIC_PRECISION)
                                            type = new (PARSERHEAP()) 
                                              SQLBigNum(PARSERHEAP(), numPrec, 0, TRUE, TRUE, TRUE);
                                          else
                                            {
                                              const Int16 DisAmbiguate = 0; // added for 64bit project

                                              type = new (PARSERHEAP()) 
                                                SQLNumeric(PARSERHEAP(), TRUE, numPrec, 0, DisAmbiguate);
                                            }
                                        }
                                    }

                                  NAString * colFam = NULL;
                                  NAString * colNam = NULL;
                                  ShortStringSequence *strseq = $1;
                                  Lng32 numParts = strseq->numParts();
                                  if (CmpCommon::getDefault(TRAF_MULTI_COL_FAM) == DF_OFF)
                                    {
                                      if (numParts != 1)
                                        YYERROR;
                                      colNam = strseq->extract(0);
                                    }
                                  else
                                    {
                                      if (numParts > 2)
                                        YYERROR;

                                      if (numParts == 1)
                                        colNam = strseq->extract(0);
                                      else
                                        {
                                          colFam = strseq->extract(0);
                                          colNam = strseq->extract(1);
                                        }
                                    }

                                  $$ = new (PARSERHEAP())
				    ElemDDLColDef(
                                         colFam /* column family */,
                                         colNam /*column_name*/,
                                         type /*data_type*/,
                                         $3 /*optional_column_attributes*/);
                                  delete $1 /*column_name*/;
                                }

column_definition : qualified_name 
                                {
                                  NAString * colFam = NULL;
                                  NAString * colNam = NULL;
                                  ShortStringSequence *strseq = $1;
                                  Lng32 numParts = strseq->numParts();
                                  if (CmpCommon::getDefault(TRAF_MULTI_COL_FAM) == DF_OFF)
                                    {
                                      if (numParts != 1)
                                        YYERROR;
                                      colNam = strseq->extract(0);
                                    }
                                  else
                                    {
                                      if (numParts > 2)
                                        YYERROR;

                                      if (numParts == 1)
                                        colNam = strseq->extract(0);
                                      else
                                        {
                                          colFam = strseq->extract(0);
                                          colNam = strseq->extract(1);
                                        }
                                    }

                                  $$ = new (PARSERHEAP())
				    ElemDDLColDef(
                                         colFam /* column family */,
                                         colNam /*column_name*/,
                                         NULL,
                                         NULL);
                                  delete $1 /*column_name*/;
                                }

/* type stringval */
column_name : identifier

/* type pElemDDL */
col_def_default_clause : TOK_DEFAULT enableCharsetInferenceInColDefaultVal col_def_default_clause_argument
				{
				  $$ = $3 /*col_def_default_clause_argument*/;
                                  restoreInferCharsetState();
				}

                | TOK_NO_DEFAULT
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_NO_DEFAULT);
                                }
                | TOK_GENERATED sg_type sg_identity_option
                                {
				 				
			          // Process GENERATED BY DEFAULT or GENERATED ALWAYS AS					  
                                  ElemDDLSGOptions *pSGOptions = NULL;
		                           
		                  if ($3)
		                    {
		                       pSGOptions = $3->castToElemDDLColDefault()->getSGOptions();
		                       if (pSGOptions)
		                         pSGOptions->setCDType($2);
			               else
				         YYERROR;
				    }
				  else
				    YYERROR;
				  
                                   $$ = $3;
                                   
                                }
 /* type pElemDDL */
col_def_default_clause_argument : literal_negatable
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
				       ElemDDLColDefault::COL_DEFAULT,
                                       $1 /*literal*/);
                                }

                      | datetime_value_function
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_DEFAULT,
                                       $1 /*datetime_value_function*/);
                                }

                      | datetime_misc_function_used_as_default
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_FUNCTION_DEFAULT);

                                  ((ElemDDLColDefault *)$$)->setDefaultExprString( (const NAString &)((DateFormat*)$1)->getOriginalString());
                                  ((ElemDDLColDefault *)$$)->setDefaultValueExpr($1);
                                }
                      | builtin_function_user
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_DEFAULT,
                                       $1 /*builtin_function_user*/);
                                }

                      | null_constant
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_DEFAULT,
                                       $1 /*null_constant*/);
                                }
                       
 /* type uint */
sg_type : TOK_BY TOK_DEFAULT TOK_AS
      {
        $$ = 1;
      }
        | TOK_ALWAYS TOK_AS
      {
        $$ = 2;
      }
                  
 /* type pElemDDL */                              
 sg_identity_option : sg_identity_function
                                { /* sg_identity_option */
				  $$ = new (PARSERHEAP())
				    ElemDDLColDefault(
						      ElemDDLColDefault::COL_DEFAULT,
						      NULL,
						      (ElemDDLSGOptions *)$1  /* ElemDDLSGOptions */
						      );
                                }                               

/* type pElemDDL */
optional_column_attributes : empty
                                {
                                  $$ = NULL;
                                }

                      | compress_clause
                      | column_attributes optional_compress_clause

/* type pElemDDL */
column_attributes : column_attribute
                      | column_attributes column_attribute
                                {
				  if ($2)
				    {
				      $$ = new (PARSERHEAP())
					ElemDDLList(
						    $1 /*column_attributes*/,
						    $2 /*column_attribute*/);
				    }
				  else
				    $$ = $1;
                                }

/* type pElemDDL */
column_attribute : column_constraint_definition
		    | optional_loggable
                    | optional_lobattrs
                    | heading
                    | serialized
                    | col_def_default_clause

/* type pElemDDL */
column_constraint_definition :  constraint_name_definition
                                column_constraint
                                optional_constraint_attributes
                                {
                                  $$ = $2 /*column_constraint*/;
				  if ($2)
				    {
				      $2->setConstraintName(
							    *$1 /*constraint_name_definition*/);
				      $2->setConstraintAttributes(
								  $3 /*optional_constraint_
								      *attributes*/);
				    }
                                  delete $1 /*constraint_name_definition*/;
                                }
                      | column_constraint optional_constraint_attributes
                                {
                                  $$ = $1 /*column_constraint*/;
				  if ($1)
				    $1->setConstraintAttributes(
								$2 /*optional_constraint_attributes*/);
                                }

/* type pQualName */
constraint_name_definition : TOK_CONSTRAINT constraint_name
                                {
                                  $$ = $2 /*constraint_name*/;
                                }

/* type pElemDDLConstraint */
column_constraint :  TOK_NOT TOK_NULL
                                {
			          NonISO88591LiteralEncountered = FALSE;
                                  $$ = new (PARSERHEAP()) ElemDDLConstraintNotNull(TRUE, PARSERHEAP());
                                }
                     |  TOK_NOT TOK_NULL TOK_ENABLE
                                {
			          NonISO88591LiteralEncountered = FALSE;
                                  $$ = new (PARSERHEAP()) ElemDDLConstraintNotNull(TRUE, PARSERHEAP());
                                }
                     |  TOK_NULL
                                {
				  NonISO88591LiteralEncountered = FALSE;
                                  $$ = new (PARSERHEAP()) ElemDDLConstraintNotNull(FALSE, PARSERHEAP());
                                }

                      | { NonISO88591LiteralEncountered = FALSE; } column_unique_specification
				{
				  $$ = $2 /*column_unique_specification*/;
				}

                      | { NonISO88591LiteralEncountered = FALSE; } references_specification
				{
				  $$ = $2 /*references_specification*/;
				}

                      | { NonISO88591LiteralEncountered = FALSE; } check_constraint_definition 
				{
				  $$ = $2 /*check_constraint_definition*/;
				}

// pElemDDLL
optional_loggable : TOK_LOGGABLE
					{
						$$ = new (PARSERHEAP()) ElemDDLLoggable(TRUE);
					}
					| TOK_NOT TOK_LOGGABLE
					{
						$$ = new (PARSERHEAP()) ElemDDLLoggable(FALSE);
					}

// pElemDDLL
optional_lobattrs :  TOK_STORAGE  QUOTED_STRING
        {
	  LobsStorage ls;
	  
	   if (*$2 == "external")
	    ls = Lob_External_HDFS_File;
	  else
	    ls = Lob_HDFS_File;

	  $$ = new (PARSERHEAP()) ElemDDLLobAttrs(ls);
	}

/* type columnOrderingEnum */
ddl_ordering_spec : TOK_ASC
				{
				  $$ = COM_ASCENDING_ORDER;
				}

                      | TOK_ASCENDING
				{
				  $$ = COM_ASCENDING_ORDER;
				}

                      | TOK_DESC
				{
				  $$ = COM_DESCENDING_ORDER;
				}

                      | TOK_DESCENDING
				{
				  $$ = COM_DESCENDING_ORDER;
				}

/* type pElemDDLConstraintUnique */
column_unique_specification : unique_constraint_specification
                      | TOK_PRIMARY TOK_KEY optional_nullable_pkey
                                {
                                  $$ = new (PARSERHEAP()) 
                                    ElemDDLConstraintPKColumn(
                                         COM_ASCENDING_ORDER, 
                                         $3 /*isNullable*/);
                                }

                      | TOK_PRIMARY TOK_KEY optional_nullable_pkey ddl_ordering_spec
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintPKColumn(
                                         $4 /*ddl_ordering_spec*/,
                                         $3 /*isNullable*/);
                                }

/* type pElemDDLConstraintUnique */
unique_constraint_specification : TOK_UNIQUE
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLConstraintUnique();
                                }

/* type pElemDDLConstraintUnique */
unique_specification : unique_constraint_specification
                      | TOK_PRIMARY TOK_KEY optional_nullable_pkey
                                {
                                  $$ = new (PARSERHEAP()) 
                                    ElemDDLConstraintPK(NULL, ComPkeySerialization::COM_SER_NOT_SPECIFIED,
                                                        $3);
                                }
                      | TOK_PRIMARY TOK_KEY optional_nullable_pkey TOK_SERIALIZED
                                {
                                  $$ = new (PARSERHEAP()) 
                                    ElemDDLConstraintPK(NULL, ComPkeySerialization::COM_SERIALIZED,
                                                        $3);
                                }
                      | TOK_PRIMARY TOK_KEY optional_nullable_pkey TOK_NOT TOK_SERIALIZED
                                {
                                  $$ = new (PARSERHEAP()) 
                                    ElemDDLConstraintPK(NULL, ComPkeySerialization::COM_NOT_SERIALIZED,
                                                        $3);
                                }

/* type pElemDDLConstraint */
check_constraint_definition : check_constraint_starting_tokens
                                search_condition ')'
                                {
                                  ElemDDLConstraintCheck *pCkCnstrnt =
                                    new (PARSERHEAP())
				      ElemDDLConstraintCheck(
                                        $2 /*search_condition*/,
                                        *ParNameLocListPtr,
                                        PARSERHEAP());
                                  if (ParSetTextEndPos(pCkCnstrnt)) 
				    { yyerror(""); YYERROR; }
                                  $$ = pCkCnstrnt;
                                  //
                                  // ParNameLocListPtr is no longer needed.
                                  //
                                  delete ParNameLocListPtr;
                                  ParNameLocListPtr = NULL;
                                }

/* type tokval */
check_constraint_starting_tokens : TOK_CHECK '('
                                {
                                  //
                                  // Allocates a working array to contain
                                  // the information relating to the
                                  // location of the ANSI name components
                                  // appearing in the search condition of
                                  // the check constraint definition.
                                  // This array helps with the computing of
                                  // the check constraint search condition
                                  // text.
                                  //
                                  // Also keeps track of the start position
                                  // of the search condition in the input
                                  // string.
                                  //
                                  ParNameLocListPtr = new (PARSERHEAP()) 
 				      ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                                  ParSetTextStartPosForCheckConstraint(
                                        ParNameLocListPtr);
                                }

/* type pElemDDLConstraintRI */
references_specification : TOK_REFERENCES referenced_table_and_columns
                                optional_ri_match_clause
                                optional_referential_triggered_action
                                {
				  if ($3 == COM_PARTIAL_MATCH_OPTION) {
				    // MATCH PARTIAL phrase not yet supported.
				    *SqlParser_Diags << DgSqlCode(-3024);
				    YYERROR;
				  }
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintRI(
                                       $2 /*referenced_table_and_columns*/,
                                       $3 /*optional_ri_match_clause*/,
                                       $4 /*optional_referential_
                                           *triggered_action*/);
                                }

/* type pElemDDL */
referenced_table_and_columns : ddl_qualified_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLReferences(
                                        *$1 /*ddl_qualified_name*/);
                                  delete $1 /*ddl_qualified_name*/;
                                }
                      | ddl_qualified_name '(' reference_column_list ')'
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLReferences(
                                        *$1 /*ddl_qualified_name*/,
                                         $3 /*reference_column_list*/);
                                  delete $1 /*ddl_qualified_name*/;
                                }

/* type matchTypeEnum */
optional_ri_match_clause    : empty	  { $$ = COM_NONE_MATCH_OPTION; }
			    | match_clause
                                {
                                  $$ = $1;
                                  // MATCH clause is not yet supported in
                                  // referential integrity constraint
                                  // definition.
                                  *SqlParser_Diags << DgSqlCode(-3029)
                                          << DgString0("MATCH clause");
                                  YYABORT;                                  
                                }

match_clause		    : TOK_MATCH match_type { $$ = $2; }

match_type		    : TOK_FULL	  { $$ = COM_FULL_MATCH_OPTION; }
			    | TOK_PARTIAL { $$ = COM_PARTIAL_MATCH_OPTION; }

/* type pElemDDL */
optional_referential_triggered_action : empty { $$ = NULL; }
                      | referential_triggered_actions

/* type pElemDDL */
referential_triggered_actions : referential_triggered_action
                      | referential_triggered_actions
                                referential_triggered_action
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLList(
                                       $1 /*referential_triggered_actions*/,
                                       $2 /*referential_triggered_action*/);
                                }

/* type pElemDDL */
referential_triggered_action : update_rule
                      | delete_rule

/* type pElemDDL */
update_rule : TOK_ON TOK_UPDATE referential_action
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLRefTrigActUpdateRule(
                                       $3 /*referential_action*/);
                                }

/* type pElemDDL */
delete_rule : TOK_ON TOK_DELETE referential_action
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLRefTrigActDeleteRule(
                                       $3 /*referential_action*/);
                                }

/* type pElemDDL */
referential_action : TOK_CASCADE
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLRefActCascade();
                                  // CASCADE is not yet supported in
                                  // referential integrity constraint
                                  // definition.
                                  *SqlParser_Diags << DgSqlCode(-3029)
                                                   << DgString0("CASCADE");
                                  YYABORT;
                                }

                      | TOK_SET TOK_NULL
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLRefActSetNull();
                                  // SET NULL is not yet supported in
                                  // referential integrity constraint
                                  // definition.
                                  *SqlParser_Diags << DgSqlCode(-3029)
                                                   << DgString0("SET NULL");
                                  YYABORT;
                                }

                      | TOK_SET TOK_DEFAULT
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLRefActSetDefault();
                                  // SET DEFAULT is not yet supported in
                                  // referential integrity constraint
                                  // definition.
                                  *SqlParser_Diags << DgSqlCode(-3029)
                                                   << DgString0("SET DEFAULT");
                                  YYABORT;
                                }

                      | TOK_NO TOK_ACTION
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLRefActNoAction();
                                }
                      | TOK_RESTRICT
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLRefActRestrict();
                                }


/* type pElemDDL */
optional_constraint_attributes : empty
                                {
                                  $$ = NULL;
                                }

                      | constraint_attributes

/* type pElemDDL */
constraint_attributes : constraint_attribute
                      | constraint_attributes constraint_attribute
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLList(
                                       $1 /*constraint_attributes*/,
                                       $2 /*constraint_attribute*/);
                                }

/* type stringval */
format_attributes : empty { $$ = NULL; }
                    |  TOK_FORMAT QUOTED_STRING  
                         { 
			   $$ = $2; 
			 }

/* type pElemDDL */
constraint_attribute : constraint_attribute_droppable
						| constraint_attribute_enforced

/* type pElemDDL */
constraint_attribute_droppable : TOK_DROPPABLE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintAttrDroppable(TRUE);
                                }
                      | TOK_NOT_DROPPABLE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintAttrDroppable(FALSE);
								}
/* type pElemDDL */
constraint_attribute_enforced : TOK_ENFORCED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintAttrEnforced(TRUE);
                                }
                         | TOK_NOT_ENFORCED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintAttrEnforced(FALSE);
                                } 

/* type pElemDDL */
heading : TOK_HEADING heading_character_string_literal
                                {
                                  $$ = $2; // heading_character_string_literal - type pElemDDL
                                }
                      | TOK_NO TOK_HEADING
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLColHeading(ElemDDLColHeading::COL_NO_HEADING);
                                }

/* type pElemDDL */
heading_character_string_literal : character_string_literal
                                {
                                  // heading_character_string_literal ::= character_string_literal

                                  NAString *pHeadingText = $1/*character_string_literal*/;
                                  TrimNAStringSpace(*pHeadingText, FALSE, TRUE);  // trim trailing blanks
                                  $$ = new (PARSERHEAP()) ElemDDLColHeading(ElemDDLColHeading::COL_HEADING,
                                                                            *pHeadingText/*deep copy*/);
                                  delete pHeadingText;
                                }
                      | unicode_string_literal
				{
                                     NAString *pCString = NULL;
                                     if ($1/*unicode_string_literal*/->length() == 0)
                                       pCString = new(PARSERHEAP()) NAString(PARSERHEAP()); // an empty string
                                     else
                                       pCString = unicodeToChar
                                       ( $1/*unicode_string_literal*/->data()   // const NAWchar *
                                       , $1/*unicode_string_literal*/->length() // in NAWchars
                                       , (Lng32) ComGetNameInterfaceCharSet()   // CharInfo::UTF8
                                       , PARSERHEAP()                           // heap for *pCString
                                       , FALSE                     // in - NABoolean allowInvalidChar
                                       );
                                     if (pCString == NULL)
                                     {
                                       // The string argument contains characters that cannot be converted.
                                       *SqlParser_Diags << DgSqlCode(-8413);
                                       YYERROR;
                                     }
                                     $$ = new (PARSERHEAP()) ElemDDLColHeading
                                       ( ElemDDLColHeading::COL_HEADING
                                       , *pCString // deep copy
                                       );
                                     delete $1; // NAWString * unicode_string_literal
                                     delete pCString;
				}

/* type pElemDDL */
serialized : TOK_SERIALIZED
                                {
				  if (CmpCommon::getDefault(MODE_SEABASE) == DF_OFF)
				    {
				      // Not for non-seabase mode
				      yyerror("");
				      YYERROR;
				    }

				  $$ = new (PARSERHEAP()) ElemDDLSeabaseSerialized(TRUE);
                                }
                         | TOK_NOT TOK_SERIALIZED
                                {
				  if (CmpCommon::getDefault(MODE_SEABASE) == DF_OFF)
				    {
				      // Not for non-seabase mode
				      yyerror("");
				      YYERROR;
				    }

				  $$ = new (PARSERHEAP()) ElemDDLSeabaseSerialized(FALSE);
                                }

/* type pElemDDL */
optional_compress_clause : empty
                           { $$ = NULL; }
                         | compress_clause
                           { $$ = NULL; }

compress_clause : TOK_COMPRESS
                  { $$ = NULL; }
                | TOK_COMPRESS literal
                  { $$ = NULL; }
                | TOK_COMPRESS '(' literal ')'
                  { $$ = NULL; }
                | TOK_COMPRESS value_expression_list_paren
                  { $$ = NULL; }


/* type pElemDDL */
table_constraint_definition : { NonISO88591LiteralEncountered = FALSE; } constraint_name_definition table_constraint
                                optional_constraint_attributes
                                {
                                  $3->setConstraintName(
                                      *$2 /*constraint_name_definition*/);
                                  $3->setConstraintKind(ElemDDLConstraint::
                                                        TABLE_CONSTRAINT_DEF);
                                  $3->setConstraintAttributes(
                                       $4 /*optional_constraint_attributes*/);
                                  $$ = $3 /*table_constraint*/;
                                  delete $2 /*constraint_name_definition*/;
                                }

                      | { NonISO88591LiteralEncountered = FALSE; } table_constraint optional_constraint_attributes
                                {
                                  $2->setConstraintKind(ElemDDLConstraint::
                                                        TABLE_CONSTRAINT_DEF);
                                  $2->setConstraintAttributes(
                                       $3 /*optional_constraint_attributes*/);
                                  $$ = $2 /*table_constraint*/;
                                }

/* type pElemDDLConstraint */
table_constraint : unique_constraint_definition
		 | references_constraint_definition
		 | check_constraint_definition

/* type pElemDDLConstraint */
unique_constraint_definition : unique_specification '(' unique_column_list ')'
                                {
                                  $1->setColumnRefList(
                                       $3 /*unique_column_list*/);
                                  $$ = $1 /*unique_specification*/;
                                }

/* type pElemDDL */
unique_column_list : column_reference_list

/* type pElemDDL */
column_reference_list : column_reference
                      | column_reference_list ',' column_reference
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColRefList(
                                       $1 /*column_reference_list*/,
                                       $3 /*column_reference*/);
                                }

/* type pElemDDL */
column_reference : column_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColRef(
                                        *$1 /*column_name*/,
                                        COM_UNKNOWN_ORDER /*default val*/,
                                        PARSERHEAP());
                                  delete $1 /*column_name*/;
                                }

                      | column_name ddl_ordering_spec
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColRef(
                                        *$1 /*column_name*/,
                                         $2 /*ddl_ordering_spec*/,
                                        PARSERHEAP());
                                  delete $1 /*column_name*/;
                                }

/* type pElemDDLConstraint */
references_constraint_definition : 
      TOK_FOREIGN TOK_KEY '(' referencing_columns ')' references_specification
                                {
                                  $6->setReferencingColumnNameList(
                                       $4 /*referencing_columns*/);
                                  $$ = $6 /*references_specification*/;
                                }

/* type pElemDDL */
referencing_columns : reference_column_list

/* type pElemDDL */
reference_column_list : column_name_list

/* type pElemDDL */
column_name_list : column_name_spec
                      | column_name_list ',' column_name_spec
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColNameList(
                                       $1 /*column_name_list*/,
                                       $3 /*column_name_spec*/);
                                }

/* type pElemDDL */
column_name_spec : column_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColName(*$1 /*column_name*/);
                                  delete $1 /*column_name*/;
                                }

/* type pElemDDL */
like_definition : TOK_LIKE source_table optional_like_option_list
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeCreateTable(
                                        *$2 /*source_table*/,
                                         $3 /*optional_like_option_list*/,
                                        FALSE,
                                        PARSERHEAP());
                                  delete $2 /*source_table*/;
                                }

/* type pElemDDL */
external_table_definition : TOK_FOR source_table
                                {
                                  if (SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_)
                                    SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_ = FALSE;

                                  if (SqlParser_CurrentParser->hiveDDLInfo_->backquotedDelimFound_)
                                    { 
                                      yyerror(""); 
                                      YYERROR;
                                    }

                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeCreateTable(
                                        *$2 /*source_table*/,
                                        NULL,
                                        TRUE, 
                                        PARSERHEAP());
                                  delete $2 /*source_table*/;
                                }

//++ MV
// added support for special tables
/* type corrName */
source_table : qualified_name 
		  {
		     // helps with computing view text
		     //
		     ParInsertNameLoc($1->getPosition(), $1->getNameLength());
		     //
		     // note that corrNameFromStrings()
		     // contains code that deletes $1
		     //
		     $$ = corrNameFromStrings($1);
		     if ($$ == NULL) YYABORT;

		     if (processVolatileDDLName(&($$->getQualifiedNameObj()),
						FALSE, FALSE) == NULL)
		       YYABORT;
		  }
	       | TOK_TABLE '(' TOK_IUD_LOG_TABLE qualified_name 
		 optional_special_table_loc_clause ')'
		  {
		    if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
		    {
			// note that corrNameFromStrings()
			// contains code that deletes $4
			//
			$$ = corrNameFromStrings($4);
			$$->setSpecialType(ExtendedQualName::IUD_LOG_TABLE);
			if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
			{
			  $$/*actual_table_name*/->setPartnClause(*$5);
			  delete $5/*optional_special_table_loc_clause*/;
			}
		    }
		    else
		      { yyerror(""); YYERROR; /*internal syntax only!*/}
		  } 

	       | TOK_TABLE '(' TOK_RANGE_LOG_TABLE qualified_name 
		 optional_special_table_loc_clause ')'
		  {
		    if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
		    {
			// note that corrNameFromStrings()
			// contains code that deletes $4
			//
			$$ = corrNameFromStrings($4);
			$$->setSpecialType(ExtendedQualName::RANGE_LOG_TABLE);
			if ($5 /*optional_special_table_loc_clause*/ NEQ NULL)
			{
			  $$/*actual_table_name*/->setPartnClause(*$5);
			  delete $5/*optional_special_table_loc_clause*/;
			}
		    }
		    else
		      { yyerror(""); YYERROR; /*internal syntax only!*/}
		  }
//-- MV

/* type pElemDDL */
optional_like_option_list : empty
                                {
                                  $$ = NULL;
                                }

                      | like_option_list

/* type pElemDDL */
like_option_list : like_option
                      | like_option_list like_option
                                {
                                  if ($1 != NULL && $2 != NULL)
                                    $$ = new (PARSERHEAP())
                                      ElemDDLList(
                                           $1 /*like_option_list*/,
                                           $2 /*like_option*/);
                                  else if ($1 != NULL)
                                    $$ = $1;
                                  else
                                    $$ = $2;
                                }

/* type pElemDDL */
like_option : TOK_WITHOUT TOK_CONSTRAINTS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithoutConstraints();
                                }
                      | TOK_WITH TOK_CONSTRAINTS
                                {
                                  // for backward compatibility
                                  $$ = NULL;
                                }

                      | TOK_WITH TOK_HEADINGS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithHeadings();
                                }
                      | TOK_WITH TOK_PARTITIONS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithHorizontalPartitions();
                                }
                      | TOK_WITH TOK_HORIZONTAL TOK_PARTITIONS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithHorizontalPartitions();
                                }
                      | TOK_WITHOUT TOK_SALT
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithoutSalt();
                                }
                      | TOK_WITHOUT TOK_DIVISION
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithoutDivision();
                                }
                      | salt_by_clause
                                {
                                  ElemDDLSaltOptionsClause * saltClause = 
                                    $1->castToElemDDLSaltOptionsClause();
                                  ComASSERT($1->castToElemDDLSaltOptionsClause());
                                  $$ = new (PARSERHEAP())
                                    ElemDDLLikeSaltClause(saltClause);
                                }
                      | TOK_LIMIT TOK_COLUMN TOK_LENGTH TOK_TO unsigned_integer
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLLikeLimitColumnLength($5);
                                }
                      | TOK_WITHOUT TOK_ROW TOK_FORMAT
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithoutRowFormat();
                                }
                      | TOK_WITHOUT TOK_LOB TOK_COLUMNS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLLikeOptWithoutLobColumns();
                                }

/* type pElemDDL */
optional_create_table_attribute_list : create_table_as_attr_list_start
                                {
                                  $$ = NULL;
                                }

                      | create_table_as_attr_list_start create_table_attribute_list
                                {
				  $$ = $2;
				}

/* type pElemDDL */
create_table_attribute_list : create_table_attribute
                      | create_table_attribute_list create_table_attribute
                                {
                                  if ($1 == NULL)
                                  {
                                     $$ = $2;
                                  }
                                  else if ($2 == NULL)
                                  {
                                     $$ = $1;
                                  }
                                  else
                                  $$ = new (PARSERHEAP())
				    ElemDDLOptionList(
                                       $1 /*create_table_attribute_list*/,
                                       $2 /*create_table_attribute*/);
                                }

/* type pElemDDL */
create_table_attribute : file_attribute_clause
                      | location_clause
                      | partition_definition
                      | salt_by_clause
                      | division_by_clause
                      | store_by_clause
		      | mv_file_attribute_clause // for MVs only
                      | file_attribute_pos_clause
                      | table_feature
                      | hbase_table_options 

/* type pElemDDL */
file_attribute_clause : file_attribute_keyword file_attribute_list
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrClause(
                                       $2 /*file_attribute_list*/);
                                }

/* type tokval */
file_attribute_keyword : TOK_ATTRIBUTE
                      |  TOK_ATTRIBUTES

/* type pElemDDL */
file_attribute_list : file_attribute

                      | file_attribute_list file_attribute
                                {
                                  // *** Error *** comma must be used
                                  // to separate file attributes
                                  //*SqlParser_Diags << DgSqlCode(-3026);

                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrList(
                                       $1 /*file_attribute_list*/,
                                       $2 /*file_attribute*/);
                                }

                      | file_attribute_list ',' file_attribute
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrList(
                                       $1 /*file_attribute_list*/,
                                       $3 /*file_attribute*/);
                                }

/* type pElemDDL */
file_attribute :        file_attribute_allocate_clause
                      | file_attribute_audit_clause
                      | file_attribute_audit_compress_clause
                      | file_attribute_block_size_clause
                      | file_attribute_buffered_clause
                      | file_attribute_clear_on_purge_clause
                      | file_attribute_compression_clause
/* not yet supported: | file_attribute_dcompress_clause		***/
                      | file_attribute_deallocate_clause
                      | file_attribute_icompress_clause
/* not supported anymore | file_attribute_max_size_clause       ***/
					  | file_attribute_extent_clause
					  | file_attribute_maxextent_clause
					  | file_attribute_rangelog_clause
					  | file_attribute_lockonrefresh_clause
					  | file_attribute_insertlog_clause
					  | file_attribute_mvs_allowed_clause
					  | file_attribute_uid_clause
                      | file_attribute_row_format_clause
                      | file_attribute_no_label_update_clause
                      | file_attribute_owner_clause
                      | file_attribute_default_col_fam

/* type pElemDDL */           
file_attribute_allocate_clause : TOK_ALLOCATE unsigned_smallint
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrAllocate(
                                       $2 /*unsigned_smallint*/);
                                }
 
/* type pElemDDL */
file_attribute_audit_clause : TOK_AUDIT
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrAudit(TRUE);
                                }

                      | TOK_NO TOK_AUDIT
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrAudit(FALSE);
                                }

/* type pElemDDL */
file_attribute_audit_compress_clause : TOK_AUDITCOMPRESS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrAuditCompress(TRUE);
                                }

                      | TOK_NO TOK_AUDITCOMPRESS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrAuditCompress(FALSE);
                                }

/* type pElemDDL */
file_attribute_block_size_clause : TOK_BLOCKSIZE unsigned_integer
                                optional_block_size_unit
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrBlockSize(
                                       $2 /*unsigned_integer*/);
                                }

/* type tokval */
optional_block_size_unit : empty
                      | TOK_BYTES

/* type pElemDDL */
file_attribute_buffered_clause : TOK_BUFFERED
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLFileAttrBuffered(TRUE);
                                }

                      | TOK_NO TOK_BUFFERED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrBuffered(FALSE);
                                }

/* type pElemDDL */
file_attribute_clear_on_purge_clause : TOK_CLEARONPURGE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrClearOnPurge(TRUE);
                                }

                      | TOK_NO TOK_CLEARONPURGE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrClearOnPurge(FALSE);
                                }

/* type pElemDDL */
file_attribute_compression_clause : TOK_COMPRESSION
                        {
                           ComCompressionType compressionType;
                           if (CmpCommon::getDefault(COMPRESSION_TYPE, 0) == DF_HARDWARE)
                              compressionType = COM_HARDWARE_COMPRESSION;
                           else if (CmpCommon::getDefault(COMPRESSION_TYPE, 0) == DF_SOFTWARE)
                              compressionType = COM_SOFTWARE_COMPRESSION;
                           else
                             compressionType = COM_NO_COMPRESSION;

                          $$ = new (PARSERHEAP())
                          ElemDDLFileAttrCompression(compressionType);
                     
                        }
                        |
                        TOK_NO TOK_COMPRESSION
                        {
                          $$ = new (PARSERHEAP())
                          ElemDDLFileAttrCompression(COM_NO_COMPRESSION);
                        }
                        | 
                        TOK_COMPRESSION TOK_TYPE TOK_NONE
                        {
                          $$ = new (PARSERHEAP())
                          ElemDDLFileAttrCompression(COM_NO_COMPRESSION);
                        }
                        | TOK_COMPRESSION TOK_TYPE TOK_SOFTWARE
                        {
                          $$ = new (PARSERHEAP())
                          ElemDDLFileAttrCompression(COM_SOFTWARE_COMPRESSION);
                        }
                        | TOK_COMPRESSION TOK_TYPE TOK_HARDWARE
                        {
                          $$ = new (PARSERHEAP())
                          ElemDDLFileAttrCompression(COM_HARDWARE_COMPRESSION);
                        }

/* type pElemDDL */
file_attribute_deallocate_clause : TOK_DEALLOCATE
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrDeallocate();
                                }

/* type pElemDDL */
file_attribute_icompress_clause : TOK_ICOMPRESS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrICompress(TRUE);
                                }

                      | TOK_NO TOK_ICOMPRESS
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrICompress(FALSE);
                                }

/* type pElemDDL */
file_attribute_extent_clause : TOK_EXTENT file_attribute_extent
                                {
                                  $$ = $2 /*file_attribute_extent*/;
                                }

optional_page : empty
              | TOK_PAGE
              | TOK_PAGES

/* longint */
extent_page : unsigned_integer optional_page { $$ = (Lng32)$1; }

/* longint */
signed_extent_page : sign extent_page 
				     { 
                       if ($1 == '+') /* ignore plus sign and continue */
                         $$ = $2;
                       else { // Negative value not allowed for EXTENT value.
                         *SqlParser_Diags << DgSqlCode(-3198);
                         $$ = 0;
                         YYABORT;
                       }
                     }

/* type pElemDDL */
file_attribute_extent : TOK_UNBOUNDED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrExtents();
                                }

                      | extent_page
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLFileAttrExtents( 
                                       $1 /*unsigned_integer (pri ext)*/,
                                       $1 /*unsigned_integer (sec ext)*/);
                                }

                      | '(' extent_page ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/,
			               $2 /*unsigned_integer (sec ext)*/);
                                }

                      | '(' extent_page ',' extent_page ')'
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/,
                                       $4 /*unsigned_integer (sec ext)*/);

                                }

                      | signed_extent_page
                        {
				  $$ = new (PARSERHEAP())
                                  ElemDDLFileAttrExtents( 
                                       $1 /*unsigned_integer (pri ext)*/,
                                       $1 /*unsigned_integer (sec ext)*/);
                        }

                      | '(' signed_extent_page ')'
                        {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/);
			              /*since no sec ext was supplied, let the default be used*/
                        }

                      | '(' signed_extent_page ',' extent_page ')'
                        {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/,
                                       $4 /*unsigned_integer (sec ext)*/);
                        }

                      | '(' extent_page ',' signed_extent_page ')'
                        {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/,
                                       $4 /*unsigned_integer (sec ext)*/);
                        }

                      | '(' signed_extent_page ',' signed_extent_page ')'
                        {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrExtents(
                                       $2 /*unsigned_integer (pri ext)*/,
                                       $4 /*unsigned_integer (sec ext)*/);
                        }

/* type pElemDDL */
file_attribute_maxextent_clause : TOK_MAXEXTENTS file_attribute_maxextent
                                {
                                  $$ = $2 /*file_attribute_maxextent*/;
                                }

file_attribute_maxextent : TOK_UNBOUNDED
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrMaxExtents();
                                }

                      | extent_page
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrMaxExtents(
                                       $1 /*unsigned_integer (max ext)*/);
                                }

/* type pElemDDL */
file_attribute_no_label_update_clause : TOK_NO TOK_LABEL TOK_UPDATE
                                {
				  if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
				    {
				      yyerror(""); YYERROR; /*internal syntax only!*/
				    }

                                  $$ = new (PARSERHEAP())
				    ElemDDLFileAttrNoLabelUpdate(TRUE);
                                }

//++ MV 
// type pElemDDL 
file_attribute_rangelog_clause : range_log_type TOK_RANGELOG
								{
									$$ = new (PARSERHEAP())
										ElemDDLFileAttrRangeLog($1);
								}

//++ MV 
// type rangelogType 
range_log_type : TOK_NO
					{
						$$ = COM_NO_RANGELOG;
					}
					| TOK_AUTOMATIC
					{
						$$ = COM_AUTO_RANGELOG;
					}
					| TOK_MANUAL
					{
						$$ = COM_MANUAL_RANGELOG;
					}
					| TOK_MIXED
					{
						$$ = COM_MIXED_RANGELOG;
					}


// type pElemDDL 
file_attribute_lockonrefresh_clause: TOK_LOCKONREFRESH
									 {
										$$ = new (PARSERHEAP())
											ElemDDLFileAttrLockOnRefresh(TRUE);
									 }
									 | TOK_NO TOK_LOCKONREFRESH
									 {
										$$ = new (PARSERHEAP())
											ElemDDLFileAttrLockOnRefresh(FALSE);
									 }



// type <pElemDDL>  		
file_attribute_insertlog_clause: TOK_INSERTLOG
								 {
										$$ = new (PARSERHEAP())
											ElemDDLFileAttrInsertLog(TRUE);

								 }
								 | TOK_NO TOK_INSERTLOG
								 {
										$$ = new (PARSERHEAP())
											ElemDDLFileAttrInsertLog(FALSE);
								 }


// type <pElemDDL>  		
file_attribute_mvs_allowed_clause: 	mvs_allowed_type TOK_MVS TOK_ALLOWED
									{
										$$ = new (PARSERHEAP())
											ElemDDLFileAttrMvsAllowed($1);

									}


// type <mvsAllowedType>  
mvs_allowed_type: TOK_NO
				  {
					  $$ = COM_NO_MVS_ALLOWED;
				  }
				  | TOK_ON TOK_STATEMENT
				  {
					$$ = COM_ON_STATEMENT_MVS_ALLOWED;
				  }
				  | TOK_ON TOK_REQUEST
				  {
					$$ = COM_ON_REQUEST_MVS_ALLOWED;
				  }
				  | TOK_RECOMPUTE
				  {
					$$ = COM_RECOMPUTE_MVS_ALLOWED;
				  }
				  | TOK_ALL
				  {
					$$ = COM_ALL_MVS_ALLOWED;
				  }


/* type pElemDDL */
file_attribute_uid_clause : TOK_UID NUMERIC_LITERAL_EXACT_NO_SCALE
                                {
       // This syntax to be used by Backup/Restore only.
       // If Backup/Restore is ever implemented then add a parserflag for it 
       // and report the 3001 error only if flag is not set.
                                  *SqlParser_Diags << DgSqlCode(-3001) << DgString0("UID");

       // Uncomment the next 2 lines if Backup/Restore is ever implemented.
				  //$$ = new (PARSERHEAP()) ElemDDLFileAttrUID(atoInt64($2->data()));
				  //delete $2;		   
                                }

/* type pElemDDL */
file_attribute_owner_clause : TOK_BY authorization_identifier
                                  {
                                    $$ = new (PARSERHEAP()) ElemDDLFileAttrOwner(*$2);
                                    delete $2;
                                  }
 

/* type pElemDDL */
file_attribute_row_format_clause : TOK_ALIGNED TOK_FORMAT
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLFileAttrRowFormat
				    (ElemDDLFileAttrRowFormat::eALIGNED);
                                }
				| TOK_PACKED TOK_FORMAT
				{
                                  yyerror("");
                                  YYERROR;
                                  
                                  $$ = new (PARSERHEAP()) ElemDDLFileAttrRowFormat
				    (ElemDDLFileAttrRowFormat::ePACKED);
				}
				| TOK_HBASE TOK_FORMAT
				{
                                  $$ = new (PARSERHEAP()) ElemDDLFileAttrRowFormat
				    (ElemDDLFileAttrRowFormat::eHBASE);
				}

/* type pElemDDL */
file_attribute_default_col_fam : TOK_DEFAULT TOK_COLUMN TOK_FAMILY QUOTED_STRING
                                {
                                  if (CmpCommon::getDefault(TRAF_MULTI_COL_FAM) == DF_OFF)
                                    {
                                      YYERROR;
                                    }

                                  $$ = new (PARSERHEAP()) ElemDDLFileAttrColFam(*$4);
                                }

/* type pElemDDL */
attribute_inmemory_options_clause : 
           TOK_INDEX TOK_LEVELS unsigned_integer
           {
	     // max of index levels of partitions that
	     // belong to this table.
	     $$ = new (PARSERHEAP()) 
	       ElemDDLFileAttrPOSTableSize(-1,-1,-1,$3,-1);
	   }

	 | TOK_PARTITIONS TOK_EOF  NUMERIC_LITERAL_EXACT_NO_SCALE
	   {
	     // EOF for one partition of the table in bytes.
	     $$ = new (PARSERHEAP()) 
	       ElemDDLFileAttrPOSTableSize(-1,-1,-1,-1,atoInt64($3->data()));
	   }

/* type pElemDDL */
file_attribute_pos_clause : TOK_INITIAL TOK_TABLE TOK_SIZE unsigned_integer
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSTableSize($4, -1, -1);
                                }
                         |  TOK_MAX TOK_TABLE TOK_SIZE unsigned_integer
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSTableSize(-1, $4, -1);
                                }
                         |  TOK_TABLE TOK_SIZE '(' unsigned_integer ',' unsigned_integer ')'
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSTableSize($4, $6, -1);
                                }
                         |  attribute_num_rows_clause

                         // applies only to inMemory table definitions
                         |  attribute_inmemory_options_clause

                         |  TOK_NUMBER TOK_OF TOK_LOCAL TOK_PARTITIONS unsigned_integer
                                {
				  // negative number of partitions except -1 
				  // indicate local partitions. 
				  // -1 in numPartns field indicates that partn
				  // clause was not specified.
				  // If num of local partns is 1, set the value
				  // to zero.
				  // 1 local partition is the same as no partitions.
				  Int32 partitions = ($5 == 1 ? 0 : -1 * $5);
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(($5 == 1 ? 0 : -(Int32)$5));
                                }
                         |  TOK_NO_PARTITION
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(0);
                                }
                         |  TOK_NO_PARTITIONS
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(0);
                                }
                         |  TOK_IGNORE TOK_POS
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSIgnore(TRUE);
                                }
                         |  TOK_NUMBER TOK_OF TOK_LOCAL TOK_PARTITIONS TOK_SYSTEM
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(-MAX_COMSINT32);
                                }
                         |  TOK_NUMBER TOK_OF TOK_ALL TOK_PARTITIONS unsigned_integer
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns($5);
                                }
                         |  TOK_NUMBER TOK_OF TOK_ALL TOK_PARTITIONS TOK_SYSTEM
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(MAX_COMSINT32);
                                }
                         |  TOK_NUMBER TOK_OF TOK_PARTITIONS unsigned_integer
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns($4);
                                }
                         |  TOK_NUMBER TOK_OF TOK_PARTITIONS TOK_SYSTEM
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSNumPartns(MAX_COMSINT32);
                                }
                         | TOK_DISK TOK_POOL unsigned_integer
                           {
                             $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSDiskPool($3,MAX_COMSINT32);
                           }
                         | TOK_DISK TOK_POOL unsigned_integer TOK_OF unsigned_integer
                           {
                             $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSDiskPool($3,$5);
                           }
                         | TOK_DISK TOK_POOL TOK_ANY TOK_OF unsigned_integer
                           {
                             $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSDiskPool(MAX_COMSINT32, $5);
                           }


/* type pElemDDL */
attribute_num_rows_clause : TOK_NUMBER TOK_OF TOK_ROWS unsigned_integer
                                {
				  $$ = new (PARSERHEAP()) ElemDDLFileAttrPOSTableSize(-1, -1, $4);
                                }
                          | TOK_NUMBER TOK_OF TOK_ROWS NUMERIC_LITERAL_APPROX
                                {
				  ConstValue * cv = 
				    (ConstValue*)(literalOfApproxNumeric($4));
				  if (! cv) 
				    YYERROR;

				  $$ = 
				    new (PARSERHEAP()) ElemDDLFileAttrPOSTableSize(
					 -1, -1, 
					 ((cv->getStorageSize() == sizeof(float))
					  ? *(float*)(cv->getConstValue())
					  : *(double*)(cv->getConstValue())));
                                }

/* type ComPartitioningScheme */
partition_type    : empty
                      {
                        $$ = COM_HASH_V2_PARTITIONING;   
                      }
                  | TOK_RANGE
                      {
			if (CmpCommon::getDefault(ALLOW_RANGE_PARTITIONING) == DF_OFF)
			  {
			    // range partitioning is allowed only if this CQD is set.
			    YYERROR;
			  }
			
                        $$ = COM_RANGE_PARTITIONING;
                      }
                  | TOK_HASH
                      {
                        $$ = COM_HASH_V1_PARTITIONING;   
                      }
                  | TOK_HASH2
                      {
                        $$ = COM_HASH_V2_PARTITIONING;   
                      }

/* TD-style ON COMMIT clause -- ignore it! */

table_feature : TOK_NOT_DROPPABLE
                { 
                    $$ = new (PARSERHEAP())
                      ElemDDLTableFeature(COM_NOT_DROPPABLE);
                }
                | TOK_DROPPABLE
                {
                    $$ = new (PARSERHEAP())
                      ElemDDLTableFeature(COM_DROPPABLE);
                }
                | TOK_INSERT_ONLY
                { 
                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX)==DF_OFF)
                  {
                    // Not yet externalized
                    yyerror("");
                    YYERROR;
                  }

                  $$ = new (PARSERHEAP())
                     ElemDDLTableFeature(COM_DROPPABLE_INSERT_ONLY);
                }
                | TOK_INSERT_ONLY ',' TOK_NOT_DROPPABLE
                { 
                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX)==DF_OFF)
                  {
                    // Not yet externalized
                    yyerror("");
                    YYERROR;
                  }
                  $$ = new (PARSERHEAP())
                    ElemDDLTableFeature(COM_NOT_DROPPABLE_INSERT_ONLY);
               }
               | TOK_INSERT_ONLY ',' TOK_DROPPABLE
               {
                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX)==DF_OFF)
                  {
                    // Not yet externalized
                    yyerror("");
                    YYERROR;
                  }

                  $$ = new (PARSERHEAP())
                    ElemDDLTableFeature(COM_DROPPABLE_INSERT_ONLY);
                }
                | TOK_NOT_DROPPABLE ',' TOK_INSERT_ONLY
                {
                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX)==DF_OFF)
                  {
                    // Not yet externalized
                    yyerror("");
                    YYERROR;
                  }
                  $$ = new (PARSERHEAP())
                    ElemDDLTableFeature(COM_NOT_DROPPABLE_INSERT_ONLY);
                }
                | TOK_DROPPABLE ',' TOK_INSERT_ONLY
                {
                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX)==DF_OFF)
                  {
                    // Not yet externalized
                    yyerror("");
                    YYERROR;
                  }

                  $$ = new (PARSERHEAP())
                    ElemDDLTableFeature( COM_DROPPABLE_INSERT_ONLY);
                }


is_not_droppable : TOK_DROPPABLE
                   { $$ = FALSE; }
                 | TOK_NOT_DROPPABLE
                   { $$ = TRUE; }

online_or_offline    : TOK_ONLINE
                      { $$ = TRUE; }
                     | TOK_OFFLINE
                      { $$ = FALSE; }

/* type boolean */
optional_in_memory_clause : empty
                             {   
			       if (CmpCommon::getDefault(IN_MEMORY_OBJECT_DEFN) == DF_ON)
				 $$ = TRUE;
			       else
				 $$ = FALSE; 
			     }
                            | TOK_IN TOK_MEMORY
                             { 
			       $$ = TRUE; 
			     }

/* type stringval */
optional_map_to_hbase_clause : empty
                             {   
                               $$ = NULL;
			     }
                            | TOK_MAP TOK_TO TOK_HBASE TOK_TABLE identifier
                             { 
			       $$ = $5; 
			     }
/* type int */
optional_hbase_data_format : empty
                             {   
                               $$ = TRUE; // varchar format
			     }
                            | TOK_DATA TOK_FORMAT TOK_VARCHAR
                             { 
			       // data is stored in var length string format 
			       // For ex, 123 is stored as a 3 byte string "123"
			       $$ = TRUE; 
			     }
                            | TOK_DATA TOK_FORMAT TOK_NATIVE
                             { 
			       // data is stored in native format.
			       // For ex, smallint is stored as 2 byte binary
			       $$ = FALSE;
			     }

hbase_table_options : TOK_HBASE_OPTIONS '('  hbase_options_list ')'
                              {
				$$ = new (PARSERHEAP()) 
				  ElemDDLHbaseOptions($3, PARSERHEAP());
			      }

hbase_options_list : hbase_option
                      {
			NAList<HbaseCreateOption*> * hbol =
			  new (PARSERHEAP ()) NAList<HbaseCreateOption*>(PARSERHEAP ());
			hbol->insert($1);
			$$ = hbol;
		      }
                     | hbase_options_list ',' hbase_option
                      {
			$1->insert($3);
			$$ = $1;
		      }
;

hbase_option : identifier '=' QUOTED_STRING
                     {
			 //			 new(PARSERHEAP()) HbaseCreateOption(*$1, *$3);
		       NAText key($1->data());
		       NAText val($3->data());
		       HbaseCreateOption * hbo =
			 new(PARSERHEAP()) HbaseCreateOption(key, val);
		       $$ = hbo;
		     }

/* type pElemDDL */
partition_definition : partition_type TOK_PARTITION 
                                     optional_partition_definition_body
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionClause(
                                       $3 /*optional_partition_definition_body*/,
                                       NULL /*partition_by_column_list*/, 
                                       $1 /*partition_type*/);
                                }
                     | partition_type TOK_PARTITION_BY partition_by_column_list 
                                     optional_partition_definition_body
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionClause(
                                       $4 /*optional_partition_definition_body*/,
                                       $3 /*partition_by_column_list*/, 
                                       $1 /*partition_type*/);
                                }
                     | partition_type TOK_PARTITION_BY TOK_RANGE_N '(' range_n_args ')'
                       { $$ = NULL ; }

/* TD-style partition definition -- ignore so we use HASH2 by default! */

range_n_args : range_n_arg
             | range_n_arg ',' range_n_args


range_n_arg : value_expression TOK_BETWEEN value_expression { $$ = NULL; }
            | value_expression TOK_BETWEEN '*'              { $$ = NULL; }

            | value_expression TOK_BETWEEN value_expression
                               TOK_AND     value_expression { $$ = NULL; }

            | value_expression TOK_BETWEEN '*'
                               TOK_AND     value_expression { $$ = NULL; }
            | value_expression TOK_BETWEEN value_expression
                               TOK_AND     '*'              { $$ = NULL; }

            | value_expression TOK_BETWEEN '*' TOK_AND '*'  { $$ = NULL; }

            | value_expression TOK_BETWEEN value_expression
                               TOK_EACH    literal          { $$ = NULL; }
            | value_expression TOK_BETWEEN value_expression
                               TOK_AND     value_expression
                               TOK_EACH    literal          { $$ = NULL; }
            | value_expression TOK_BETWEEN value_expression
                               TOK_AND     '*'
                               TOK_EACH    literal          { $$ = NULL; }

            | value_expression                              { $$ = NULL; }
            | '*'                                           { $$ = NULL; }
            | value_expression TOK_AND  value_expression    { $$ = NULL; }
            | '*'              TOK_AND  value_expression    { $$ = NULL; }
            | value_expression TOK_AND  '*'                 { $$ = NULL; }
            | '*'              TOK_AND  '*'                 { $$ = NULL; }

            | value_expression TOK_EACH literal             { $$ = NULL; }
            | value_expression TOK_AND  value_expression
                               TOK_EACH literal             { $$ = NULL; }
            | value_expression TOK_AND '*' TOK_EACH literal { $$ = NULL; }

            | TOK_NO TOK_RANGE TOK_OR  TOK_UNKNOWN          { $$ = NULL; }
            | TOK_NO TOK_RANGE                              { $$ = NULL; }

/* type pElemDDL */
partition_by_column_list : '(' column_reference_list ')'
                                {
                                  $$ = new (PARSERHEAP())
				      ElemDDLPartitionByColumnList(
                                       $2 /*column_reference_list*/);
                                }

/* type pElemDDL */
optional_partition_definition_body : empty
                                {
                                  $$ = NULL;
                                }
                             | partition_definition_body
                                {
                                  $$ = $1 /*partition_definition_body*/;
                                }

/* type pElemDDL */
partition_definition_body : '(' partition_list ')'
                                {
                                  $$ = $2 /*partition_list*/;
                                }

                   /* | other partitioning scheme such as hash */
                   /* | new partitioning method such as balance */

/* type pElemDDL */
partition_list : range_partition_list
                      | system_partition_list

/* type pElemDDL */
range_partition_list : range_partition
                      | range_partition_list ',' range_partition
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionList(
                                       $1 /*range_partition_list*/,
                                       $3 /*range_partition*/);
                                }
/* type pElemDDL */
range_partition : partition_add_drop_option { NonISO88591LiteralEncountered = FALSE; } TOK_FIRST TOK_KEY key_list
                                location_clause optional_partition_attribute_list
                                {
				  if (NonISO88591LiteralEncountered) {
				    *SqlParser_Diags << DgSqlCode(-1240);
				    YYABORT;
				  }
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionRange(
                                       $1 /*partition_add_drop_option*/,
                                       $5 /*key_list*/,
                                       $6 /*location_clause*/,
                                       $7 /*optional_partition_attribute_list*/);
                                }

/* type pElemDDL */
key_list :   key_value
	 | '(' key_value_list ')'
                                {
                                  $$ = $2 /*key_value_list*/;
                                }
/* type pElemDDL */
system_partition_list : system_partition
                      | system_partition_list ',' system_partition
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionList(
                                       $1 /*system_partition_list*/,
                                       $3 /*system_partition*/);
                                }

/* type pElemDDL */
system_partition : partition_add_drop_option location_clause
                                optional_partition_attribute_list
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLPartitionSystem(
                                       $1 /*partition_add_drop_option*/,
                                       $2 /*location_clause*/,
                                       $3 /*optional_partition_attribute_list*/);
                                }

/* type pElemDDL */
optional_partition_attribute_list : empty
                                {
                                  $$ = NULL;
                                }

                      | partition_attribute_list

/* type pElemDDL */
partition_attribute_list :   partition_attribute

		      | partition_attribute_list partition_attribute
		     
        {

                    $$ = new (PARSERHEAP()) ElemDDLPartnAttrList(
                                       $1 /*partition_attribute_list*/,
                                       $2 /*partition_attribute*/);
        }
/* type pElemDDL */
partition_attribute : file_attribute_extent_clause
		      | file_attribute_maxextent_clause

/* type partitionOptionEnum */
partition_add_drop_option : TOK_ADD
                                {
                                  $$ = ElemDDLPartition::ADD_OPTION;
                                }

                      | TOK_DROP
                                {
                                  $$ = ElemDDLPartition::DROP_OPTION;
                                }

/* type pElemDDL */
key_value :  literal_negatable
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLKeyValue($1 /*literal*/);
                                }

                      | null_constant
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLKeyValue($1 /*literal*/);
                                }

/* type pElemDDL */
key_value_list : key_value
                      | key_value_list ',' key_value
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLKeyValueList(
                                       $1 /*key_value_list*/,
                                       $3 /*key_value*/);
                                }

/* type tokval */
division_by_clause_starting_tokens : TOK_DIVISION TOK_BY '('
                               {
                                 // division_by_clause_starting_tokens ::= TOK_DIVISION TOK_BY '('

                                 // This code is similar to that of check_constraint_starting_tokens 
                                 ParNameDivByLocListPtr = new (PARSERHEAP()) 
                                   ParNameLocList ( SQLTEXT()
                                                  , (CharInfo::CharSet)SQLTEXTCHARSET()
                                                  , SQLTEXTW()
                                                  , PARSERHEAP()
                                                  );
                                  ParSetTextStartPosForDivisionByClause(ParNameDivByLocListPtr);
                               }

/* type pElemDDL */
salt_by_clause : TOK_SALT TOK_USING NUMERIC_LITERAL_EXACT_NO_SCALE TOK_PARTITIONS optional_salt_column_list
                               {
                                 Int32 numParts = (Int32) atoi(*$3);
                                 if (numParts < 0)
                                   YYERROR;
                                 $$ = new (PARSERHEAP()) ElemDDLSaltOptionsClause($5, numParts);
                               }

optional_salt_column_list : TOK_ON '(' column_reference_list ')'
                               {
                                 $$ = $3;
                               }
                   | /* empty */
                               {
                                 $$ = NULL;
                               }

/* type pElemDDL */
salt_like_clause : TOK_SALT TOK_LIKE TOK_TABLE
                               {
                                 $$ = new (PARSERHEAP()) ElemDDLSaltOptionsClause(TRUE); //like table
                               }

/* type pElemDDL */
division_by_clause : division_by_clause_starting_tokens sort_by_value_expression_list  optional_division_column_names ')'
                               {
                                 // division_by_clause ::= division_by_clause_starting_tokens sort_by_value_expression_list ')'

                                 ElemDDLDivisionClause * pDivClause = new (PARSERHEAP())
                                   ElemDDLDivisionClause($2); // sort_by_value_expression_list
                                 pDivClause->setNameLocList(*ParNameDivByLocListPtr); // deep copy
                                 if (ParSetTextEndPos(pDivClause))
                                 {
                                   YYERROR;
                                 }
                                 pDivClause->setStartPosition(ParNameDivByLocListPtr->getTextStartPosition());
                                 delete ParNameDivByLocListPtr;
                                 ParNameDivByLocListPtr = NULL;
                                 if ($3)
                                   {
                                     pDivClause->synthesize($3 /*column_reference_list*/);
                                     if (NOT pDivClause->isNumOfDivExprsAndColsMatched())
                                       {
                                         YYERROR;
                                       }
                                   }
                                   
                                 $$ = pDivClause;
                               }

/* type pElemDDL */
optional_division_column_names : empty
                               { $$ = NULL; }
                    | TOK_NAMED TOK_AS '(' column_reference_list ')'
                               {
                                 $$ = $4;
                               }

/* type pElemDDL */
store_by_clause : TOK_STORE TOK_BY store_option_clause
                                {
                                  $$ = $3 /*store_option*/;
                                }

                  | TOK_UNIQUE TOK_PRIMARY_INDEX  '(' column_reference_list ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLStoreOptKeyColumnList(
                                       $4 /*column_reference_list*/,
                                       TRUE);
                                }
                  | TOK_PRIMARY_INDEX  '(' column_reference_list ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLStoreOptKeyColumnList(
                                       $3 /*column_reference_list*/);
                                }
                  | TOK_PRIMARY TOK_KEY TOK_NOT TOK_SERIALIZED '(' column_reference_list ')' 
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLStoreOptKeyColumnList(
                                       $6 /*column_reference_list*/,
				       TRUE, FALSE, TRUE);
                                  ((ElemDDLStoreOptKeyColumnList*)$$)->
                                    setSerializedOption(ComPkeySerialization::COM_NOT_SERIALIZED);
                                }

                  | TOK_PRIMARY TOK_KEY TOK_SERIALIZED '(' column_reference_list ')' 
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLStoreOptKeyColumnList(
                                       $5 /*column_reference_list*/,
				       TRUE, FALSE, TRUE);
                                  ((ElemDDLStoreOptKeyColumnList*)$$)->
                                    setSerializedOption(ComPkeySerialization::COM_SERIALIZED);
                                }

                  | TOK_PRIMARY TOK_KEY  '(' column_reference_list ')'
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLStoreOptKeyColumnList(
                                       $4 /*column_reference_list*/,
				       TRUE, FALSE, TRUE);
                                }

/* type pElemDDL */
store_option_clause : TOK_UNIQUE unique_store_option
                                {
                                  $$ = $2 /*unique_store_option*/;
                                }
                      | store_option
                                {
                                  $$ = $1 /*store_option*/;
                                }

/* type pElemDDL */
unique_store_option : TOK_PRIMARY TOK_KEY
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLStoreOptNondroppablePK(
                                       TRUE /*unique*/ );
                                }

                      | '(' column_reference_list ')'
                                {
                                  CHECK_DBTRANSPORTER ;
                                  $$ = new (PARSERHEAP())
				    ElemDDLStoreOptKeyColumnList(
                                       $2 /*column_reference_list*/,
                                       FALSE,
                                       TRUE /*uniqueStoreByKeyList*/ );
                                }

/* type pElemDDL */
store_option : TOK_PRIMARY TOK_KEY
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLStoreOptNondroppablePK(
                                       FALSE /*not unique*/ );
                                }

                      | '(' column_reference_list ')'
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLStoreOptKeyColumnList(
                                       $2 /*column_reference_list*/);
                                }

                      | TOK_ENTRY TOK_ORDER
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLStoreOptEntryOrder();
				  // Illegal syntax error
				  YYERROR;
                                }

/* type pStmtDDL */
view_definition : create_view_keywords 
                                optional_if_not_exists_clause 
                                ddl_qualified_name
                                optional_view_column_list
                                optional_location_clause
                                optional_by_auth_identifier
                                TOK_AS optional_locking_stmt_list 
                                query_expression
                                order_by_clause
                                optional_with_check_option
                                {
				  RelRoot *top = finalize($9);
				  if (($10) &&
				      (CmpCommon::getDefault(ALLOW_ORDER_BY_IN_CREATE_VIEW) == DF_OFF))
				    {
				      YYERROR;
				    }

                                  top->addOrderByTree($10);
				  if ((top->accessOptions().userSpecified()) &&
				      (CmpCommon::getDefault(ALLOW_ISOLATION_LEVEL_IN_CREATE_VIEW) == DF_OFF))
				    {
				      // Genesis 10-980217-0467:
				      // FOR xxx ACCESS not allowed in C.V.
				      // At first blush allowing it seems a nifty
				      // shorthand -- but it does not fit at all
				      // well with Ansi/Tdm txn/stmt
				      // isolation-level defaulting model.
				      // Also see BindWA::bindView.
				      *SqlParser_Diags << DgSqlCode(-3168);
				      ComASSERT(top->accessOptions().lockMode() ==
						LOCK_MODE_NOT_SPECIFIED_);
				      YYERROR;
				    }
                                   //10-070108-1558 -Begin
                                   //[First/Any N] syntax is not allowed in
                                   // CREATE VIEW statement
                                   //But if internal CQD is set, it is allowed.
                                   if(CmpCommon::getDefault(ALLOW_FIRSTN_IN_SUBQUERIES) != DF_ON)
                                   {
                                   if ($9->getFirstNRows() != -1)
                                   {
                                      *SqlParser_Diags << DgSqlCode(-4103);
                                       YYERROR;
                                   }
                                   }
                                   //10-070108-1558 -End

				  StmtDDLCreateView *pCreateViewParseNode
				    = new (PARSERHEAP())
				    StmtDDLCreateView(
					 *$3 /*ddl_qualified_name*/,
					 *ParNameLocListPtr,

                                         $4 /*optional_view_column_list*/,
                                         $5 /*optional_location_clause*/,
                                         top,
                                         $11 /*optional_with_check_option*/,
                                         $1 /*optional_create_view_behavior_enum*/,
                                         $6 /*optional_by_auth_identifier*/);

                                  if ($2)
                                    pCreateViewParseNode->setCreateIfNotExists(TRUE);

                                  delete $3 /*ddl_qualified_name*/;
                                  pCreateViewParseNode->synthesize();
                                  if (ParSetTextEndPos(pCreateViewParseNode))
				    { yyerror(""); YYERROR; }
                                  $$ = pCreateViewParseNode;
                                }

/* type tokval */
create_view_keywords : TOK_CREATE TOK_VIEW
                                {
				  //
                                  // This is the first production being
                                  // reduced in the processing of create
                                  // view statement.
                                  //
                                  // Allocates a working array to contain
                                  // the information relating to the
                                  // location of the ANSI name components
                                  // appearing in the create view statement.
                                  // This array helps with the computing of
                                  // the view text.
                                  //
                                  // Also keeps track of the start position
                                  // of the create view statement in the
                                  // input string.
                                  //
				  NonISO88591LiteralEncountered = FALSE;

                                  ParNameLocListPtr = new (PARSERHEAP())
                                    ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                                  ParSetTextStartPosForCreateView(
                                        ParNameLocListPtr);
                                  $$ = COM_CREATE_VIEW_BEHAVIOR;

                                  SqlParser_CurrentParser->hiveDDLInfo_->
                                    setValues(TRUE, StmtDDLonHiveObjects::CREATE_, StmtDDLonHiveObjects::VIEW_);
                                }
                     | TOK_CREATE TOK_SYSTEM TOK_VIEW
                                {
                                  // see comment above
                                  NonISO88591LiteralEncountered = FALSE;

                                  ParNameLocListPtr = new (PARSERHEAP())
                                      ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                                  ParSetTextStartPosForCreateView(
                                        ParNameLocListPtr);
                                  $$ = COM_CREATE_SYSTEM_VIEW_BEHAVIOR;

                                }
                     | TOK_CREATE TOK_OR TOK_REPLACE TOK_VIEW 
                                {
                                  // see comment above
                                  NonISO88591LiteralEncountered = FALSE;

                                  ParNameLocListPtr = new (PARSERHEAP())
                                      ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                                  ParSetTextStartPosForCreateView(
                                        ParNameLocListPtr);
                                  $$ = COM_CREATE_OR_REPLACE_VIEW_BEHAVIOR;

                                }
                     | TOK_CREATE TOK_OR TOK_REPLACE TOK_VIEW TOK_CASCADE
                                {
                                  // see comment above
                                  NonISO88591LiteralEncountered = FALSE;

                                  ParNameLocListPtr = new (PARSERHEAP())
                                      ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
                                  ParSetTextStartPosForCreateView(
                                        ParNameLocListPtr);
                                  $$ = COM_CREATE_OR_REPLACE_VIEW_CASCADE_BEHAVIOR;

                                }

/* type pQualName */
routine_action_qualified_name : routine_action_name
                                {
                                  // routine_action_qualified_name ::= routine_action_name

                                  // helps with computing view text
                                  ParInsertNameLoc($1->getPosition(),
                                                   $1->getNameLength());
                                  //
                                  // note that qualifiedNameFromStrings()
                                  // contains code that deletes $1
                                  //
                                  $$ = qualifiedNameFromStrings($1);
                                  if ($$ == NULL) 
                                    YYABORT;
                                  
                                  $$ = processVolatileDDLName($$, FALSE, FALSE);
                                  if ($$ == NULL)
                                    YYABORT;

                                  $$->setObjectNameSpace(COM_UUDF_ACTION_NAME);
                                }

/* type pQualName */
ddl_qualified_name : qualified_name
		     {
                       // ddl_qualified_name :
                       // helps with computing view text
                       //
                       StringPos namePos = $1->getPosition();
                       size_t nameLen = $1->getNameLength();
                       ParInsertNameLoc(namePos, nameLen);
                       
                       //
                       // note that qualifiedNameFromStrings()
                       // contains code that deletes $1
                       //
                       $$ = qualifiedNameFromStrings($1);
                       if ($$ == NULL) 
                         YYABORT;
                       
                       $$ = processVolatileDDLName($$, FALSE, FALSE);
                       if ($$ == NULL)
                         YYABORT;
                       
                       SqlParser_CurrentParser->hiveDDLInfo_->ddlNamePos_ = namePos;
                       SqlParser_CurrentParser->hiveDDLInfo_->ddlNameLen_ = nameLen;
                     
                       preprocessHiveDDL(
                            $$->getCatalogName(), 
                            SqlParser_CurrentParser->hiveDDLInfo_);  
                     }

/* type pQualName */
volatile_ddl_qualified_name : qualified_name
				{
				  // helps with computing view text
				  //
				  ParInsertNameLoc($1->getPosition(),
				     		   $1->getNameLength());
				  //
				  // note that qualifiedNameFromStrings()
				  // contains code that deletes $1
				  //
				  $$ = qualifiedNameFromStrings($1);
				  if ($$ == NULL) 
				    YYABORT;


				  $$ = processVolatileDDLName($$, TRUE, TRUE);
				  if ($$ == NULL) 
				    YYABORT;
				}

/* type pElemDDL */
/*	The following productions are intended to ensure we ignore the following options.
Create Table <tablename> [,CHECKSUM = ALL|DEFAULT|LOW|MEDIUM|HIGH|NONE]	
Create Table <tablename> [,[NO] FALLBACK [PROTECTION]]	  
Create Table <tablename> [,FREESPACE = <int value> [PERCENT]]  
Create Table <tablename> [,[NO|DUAL|LOCAL|NOT LOCAL] AFTER JOURNAL]	 
Create Table <tablename> [,[NO|DUAL] [BEFORE] JOURNAL]	 
Create Table <tablename> [,[NO] LOG]  
*/
optional_ignored_table_options :  optional_ignored_table_option
                               | optional_ignored_table_option  optional_ignored_table_options

optional_ignored_table_option :   ',' TOK_FALLBACK optional_ignored_suffix	 { $$ = NULL; }
					           |  ',' TOK_NO TOK_FALLBACK optional_ignored_suffix	 { $$ = NULL; }
					           |  ',' TOK_FREESPACE '=' unsigned_integer optional_ignored_suffix	 { $$ = NULL; }
							   |  ',' TOK_CHECKSUM '='  optional_ignored_suffix	 { $$ = NULL; }
							   |  ',' TOK_CHECKSUM '='  IDENTIFIER	 { $$ = NULL; }		// this is for NONE
  						       |  ',' TOK_LOG { $$ = NULL; }
							   |  ',' TOK_NO TOK_LOG { $$ = NULL; }
					   		   |  ',' optional_ignored_prefix optional_ignored_prefix2 TOK_JOURNAL  { $$ = NULL; }

optional_ignored_suffix : empty { $$ = NULL; }
				   	 	 | TOK_PROTECTION { $$ = NULL; }
				   		 | TOK_PERCENT { $$ = NULL; }
				   		 | TOK_ALL { $$ = NULL; }
				   		 | TOK_DEFAULT { $$ = NULL; }

optional_ignored_prefix : empty { $$ = NULL; }
                        | TOK_NO { $$ = NULL; }
                        | TOK_DUAL { $$ = NULL; }
				   		| TOK_LOCAL { $$ = NULL; }
				   	    | TOK_NOT TOK_LOCAL { $$ = NULL; }

optional_ignored_prefix2 : empty { $$ = NULL; }
                        | TOK_BEFORE { $$ = NULL; }
				 		| TOK_AFTER { $$ = NULL; }  
/* type pElemDDL */
optional_view_column_list : empty
                                {
                                  $$ = NULL;
                                }
                      | view_column_list

/* type pElemDDL */
view_column_list : '(' view_column_def_list ')'
                       {
			 //   Keep position of end of column list
			 if(ParNameLocListPtr==NULL) YYERROR;  // 10-060228-4747
			 ParSetEndOfOptionalColumnListPos(ParNameLocListPtr);
			 
			 $$ = $2 /*view_column_name_list*/;
		       }

/* type pElemDDL */
view_column_def_list : view_column_definition
                      | view_column_def_list ',' view_column_definition
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLList(
                                       $1 /*view_column_def_list*/,
                                       $3 /*view_column_definition*/);
                                }

/* type pElemDDL */
view_column_definition : column_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColViewDef(
                                        *$1 /*column_name*/);
                                  delete $1 /*column_name*/;
                                }

                      | column_name heading
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLColViewDef(
                                        *$1 /*column_name*/,
                                         $2 /*heading*/);
                                  delete $1 /*column_name*/;
                                }

/* type pElemDDL */
optional_with_check_option : empty
                                {
                                  $$ = NULL;
                                }

                      | with_check_option

/* type pElemDDL */
with_check_option : TOK_WITH optional_levels_clause TOK_CHECK TOK_OPTION
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLWithCheckOption(
                                       $2 /*optional_levels_clause*/);
                                }

/* type levelEnum */
optional_levels_clause : empty
                                {
                                  $$ = COM_CASCADED_LEVEL;
                                }

                      | levels_clause

/* type levelEnum */
levels_clause : TOK_CASCADED
                                {
                                  $$ = COM_CASCADED_LEVEL;
                                }

                      | TOK_LOCAL
                                {
                                  // *** Error *** WITH LOCAL CHECK
                                  // OPTION clause not supported.
                                  *SqlParser_Diags << DgSqlCode(-3119);
                                  $$ = COM_LOCAL_LEVEL;
                                }

/* type pStmtDDL */
give_statement : TOK_GIVE TOK_SCHEMA schema_name 
                 TOK_TO authorization_identifier optional_drop_behavior
                                {
                  $$ = new (PARSERHEAP())
                    StmtDDLGiveSchema(
                                         *$3 /*schema_name*/,
                                         *$5 /*authorization_identifier*/,
                                          $6 /*drop behavior*/);
                  delete $5;
                  delete $3;
                                }

               |
                 TOK_GIVE givable_object_type ddl_qualified_name 
                 TOK_TO authorization_identifier
                                {
                  $$ = new (PARSERHEAP())
                    StmtDDLGiveObject(
                                          $2, /*ComObjectType*/
                                         *$3, /*qualified_name*/
                                         *$5 /*authorization_identifier*/);
                  delete $3;
                  delete $5;
                                }
                       
               |
                 TOK_GIVE TOK_ALL TOK_FROM authorization_identifier 
                 TOK_TO authorization_identifier
                                {
                  $$ = new (PARSERHEAP())
                    StmtDDLGiveAll(
                                         *$4, /*from auth ID*/
                                         *$6  /*to auth ID*/);
                  delete $4;
                  delete $6;
                                }
                       
/* type pObjectTypeEnum */
givable_object_type:       TOK_TABLE
                           {
                             $$ = COM_BASE_TABLE_OBJECT;
                           }
                           | TOK_VIEW
                           {
                             $$ = COM_VIEW_OBJECT;
                           }
                           | TOK_LIBRARY
                           {
                             $$ = COM_LIBRARY_OBJECT;
                           }
                           | TOK_PROCEDURE
                           {
                             $$ = COM_STORED_PROCEDURE_OBJECT;
                           }
                           | TOK_FUNCTION
                           {
                             $$ = COM_USER_DEFINED_ROUTINE_OBJECT;
                           }

/* type pStmtDDL */
revoke_role_statement : TOK_REVOKE optional_with_admin_option
                                   TOK_ROLE authorization_identifier_list
                                   TOK_FROM grantee_list
                                   optional_drop_behavior
                                   optional_granted_by
                        {
                          $$ = new (PARSERHEAP())
                            StmtDDLRoleGrant(
                                $4 , /* authorization_identifier_list - role list */
                                $6 , /* grantee list */
                                $2 , /* optional_with_admin_option */
                                $8 , /* optional granted by */
                                $7 , /* optional drop behavior */
                                FALSE /* isGrantRole */ );
                        }

/* type boolean */
optional_with_admin_option : empty
                             {
                               $$ = FALSE;
                             }

                           | TOK_WITH TOK_ADMIN TOK_OPTION
                           {
                             $$ = TRUE;
                           }

/*admin_option_for : empty
                   {
                       $$ = FALSE;
                   }
              | TOK_ADMIN TOK_OPTION TOK_FOR
                   {
                       $$ = TRUE;
                   }*/

/* type pElemDDL */
authorization_identifier_list : authorization_identifier
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLGrantee(*$1 /*authorization_identifier*/);
                                  delete $1 /*authorization_identifier*/;
                                }

                     | authorization_identifier_list ',' authorization_identifier
                       {
                         $$ = new (PARSERHEAP())
                           ElemDDLList
                           ( $1 /*authorization_identifier_list*/
                           , new (PARSERHEAP())
                             ElemDDLGrantee(*$3 /*authorization_identifier*/)
                           );
                         delete $3 /*authorization_identifier*/;
                       }

/* type pElemDDL */
optional_granted_by: empty
                     { 
                       $$ = NULL;
                     }
                   | optional_granted TOK_BY TOK_CURRENT_USER
                     {
                       // we make a grantee node with CURRENT_USER as the 
                       // name of the grantee(user).   This special case 
                       // is then handled in the Exec code
                       NAString currentUserConstant("CURRENT_USER");
                      
                       $$ = new (PARSERHEAP())
                       ElemDDLGrantee(currentUserConstant,
                                      PARSERHEAP());                     
                     }
                   | optional_granted TOK_BY authorization_identifier
                     {
                       // optional_granted_by ::= TOK_GRANTED TOK_BY authorization_identifier

                                  $$ = new (PARSERHEAP())
                                    ElemDDLGrantee(
                                        *$3 /*authorization_identifier*/,
                                        PARSERHEAP());
                                  delete $3 /*authorization_identifier*/;
                     } 

/* type boolean */
optional_granted : empty
                   {
                     $$ = FALSE;
                   }
                 | TOK_GRANTED
                   {
                     $$ = TRUE;
                   }
                           
/* type pStmtDDL */
grant_statement : TOK_GRANT privileges TOK_ON ddl_object_name optional_action
                            TOK_TO grantee_list optional_with_grant_option
                            optional_granted_by
                          {
                            $$ = new (PARSERHEAP())
                              StmtDDLGrant($2 /*privileges*/,
                                          *$4 /*ddl_object_name*/,
                                           $7 /*grantee_list*/,
                                           $8 /*optional_with_grant_option*/,
                                           $9 /*optional_granted_by*/,
                                           $5 /*optional_action*/);
                            delete  $4  /*ddl_object_name*/;

//                  | TOK_GRANT privileges TOK_ON TOK_TABLE '(' ghost TOK_TABLE ddl_qualified_name ')' optional_action
//                            TOK_TO grantee_list optional_with_grant_option
//                            optional_granted_by

//                          {
//			    $8->setSpecialType(ExtendedQualName::GHOST_TABLE);
//
//                            $$ = new (PARSERHEAP())
//                              StmtDDLGrant($2 /*privileges*/,
//                                          *$8 /*ddl_object_name*/,
//                                           $12 /*grantee_list*/,
//                                           $13 /*optional_with_grant_option*/,
//                                           $14 /*optional_granted_by*/,
//                                           $10 /*optional_action*/);
//                            delete  $8  /*ddl_object_name*/;
//                          }

                          }

/* type pStmtDDL */
grant_schema_statement : TOK_GRANT privileges TOK_ON TOK_SCHEMA schema_name 
                            TOK_TO grantee_list optional_with_grant_option
                            optional_granted_by
                          {
 			    $$ = new (PARSERHEAP())
			      StmtDDLSchGrant($2 /*privileges*/,
                                             *$5 /*schema_name*/,
                                              $7 /*grantee_list*/,
                                              $8 /*optional_with_grant_option*/,
                                              $9 /*optional_granted_by*/);
                            delete $5 /*schema_name*/;
                         }
                       | TOK_GRANT privileges TOK_ON TOK_DEFAULT TOK_SCHEMA
                            TOK_TO grantee_list optional_with_grant_option
                            optional_granted_by
                          {
                            if (!Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                            {
                              yyerror(""); YYERROR; /*internal syntax only!*/
                            }

                            SchemaName defaultSchema;
                            ElemDDLSchemaName schemaName(defaultSchema);

                            $$ = new (PARSERHEAP())
                              StmtDDLSchGrant($2 /*privileges*/,
                                              schemaName /*schema_name*/,
                                              $7 /*grantee_list*/,
                                              $8 /*optional_with_grant_option*/,
                                              $9 /*optional_granted_by*/);
                         }

/* type pStmtDDL */
grant_role_statement : TOK_GRANT TOK_ROLE authorization_identifier_list TOK_TO grantee_list
                                 optional_with_admin_option
                                 optional_granted_by
                       {
                          $$ = new (PARSERHEAP())
			       StmtDDLRoleGrant(
                                $3 , /*role list*/ 
                                $5 , /* grantee list */
                                $6 , /* optional with admin option */
				$7 , /* optional granted by */ 
				COM_UNKNOWN_DROP_BEHAVIOR, /* optional drop behavior */
				TRUE  /* isGrantRole */  );
                       }                                   

/* type pStmtDDL */
grant_component_privilege_stmt :  TOK_GRANT TOK_COMPONENT privilege_or_privileges_token
                                            component_privilege_name_list
                                            TOK_ON component_name
                                            TOK_TO authorization_identifier_or_public
                                            optional_with_grant_option
                                            optional_granted_by
               {
                 // grant_component_privilege_stmt ::=
                 //   TOK_GRANT TOK_COMPONENT privilege_or_privileges_token
                 //             component_privilege_name_list TOK_ON component_name
                 //             TOK_ON component_name
                 //             TOK_TO authorization_identifier
                 //             optional_with_grant_option
                 //             optional_granted_by
                 $$ = new(PARSERHEAP())
                   StmtDDLGrantComponentPrivilege
                   ( $4  // component_privilege_name_list - shallow copy
                   , *$6 // component_name - deep copy
                   , *$8 // authorization_identifier - a.k.a. user_role_name - deep copy
                   , ($9 != NULL) // optional_with_grant_option - NABoolean
                   , $10 // optional granted by
                   , PARSERHEAP()
                   );
                 // cannot delete $4 (shallow copy)
                 delete $6; // component_name
                 delete $8; // authorization_identifier - a.k.a. user_role_name
                 delete $9; // optional_with_grant_option
               }

authorization_identifier_or_public : authorization_identifier
                                     {
                                       $$=$1;
                                     }
                                     | TOK_PUBLIC
				     {
                                       NAString *tmp = new
 					   (PARSERHEAP()) NAString(("PUBLIC"),PARSERHEAP());
                                        $$ = tmp;
				     }
/* type pConstStringList */
component_privilege_name_list : component_privilege_name
               {
                 $$ = new (PARSERHEAP()) ConstStringList(PARSERHEAP ());
                 $$->insert($1); // component_privilege_name - NAString * stringval - shallow copy
               }
               | component_privilege_name_list ',' component_privilege_name
               {
                 // See if the privilege name has already been specified
                 for (CollIndex i = 0; i < $1->entries(); i++)
                 {
                    NAString listName = $1->operator[](i)->data();
                    NAString currentName = $3->data();
                    if (listName == currentName)
                    {
                      *SqlParser_Diags << DgSqlCode(-3170);
                       YYABORT;
                    }
                 }
                 $1->insert($3); // $3 - NAString   * component_privilege_name      - shallow copy
                 $$ = $1;        // ConstStringList * component_privilege_name_list - shallow copy
               }
/* type tokval */
privilege_or_privileges_token : TOK_PRIVILEGE  { }
                              | TOK_PRIVILEGES { }
				                        
privileges : TOK_ALL TOK_PRIVILEGES
             {
               $$ = new (PARSERHEAP())
               ElemDDLPrivileges(ElemDDLNode::ALL);
             }
             | TOK_ALL
             {
               $$ = new (PARSERHEAP())
               ElemDDLPrivileges(ElemDDLNode::ALL);
             }
             | privilege_action_list
             {
               $$ = new (PARSERHEAP())
               ElemDDLPrivileges($1 /*priv_action_list*/);
             }


/* type pElemDDL */
privilege_action_list : privilege_action | privilege_action_list ',' privilege_action
                        {
		          $$ = new (PARSERHEAP())
		            ElemDDLList( $1 /*privilege_action_list*/,
                                         $3 /*privilege_action*/ );
                        }		      

		
/* type pElemDDL */
privilege_action:			
		      TOK_SELECT optional_privilege_column_list
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActSelect(
                                       $2 /*optional_privilege_column_list */);
                                }

                      | TOK_DELETE
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDelete();
                                }
                              
                      | TOK_EXECUTE
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActExecute();
                                }
			
		      | TOK_INSERT optional_privilege_column_list
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActInsert(
                                       $2 /*optional_privilege_column_list*/);
                                }

                      | TOK_UPDATE optional_privilege_column_list
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActUpdate(
                                       $2 /*optional_privilege_column_list*/);
                                }

                      | TOK_USAGE
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActUsage();
                                }
			
                      | TOK_REFERENCES optional_privilege_column_list
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActReferences(
                                       $2 /*optional_privilege_column_list*/);
                                }
				
		      /* DDL privileges */		
				
                      | TOK_ALTER  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActAlter();
                                }

                      | TOK_ALTER_LIBRARY  
                                {
				 $$ = new (PARSERHEAP())
				     ElemDDLPrivActAlterLibrary();
				}

                      | TOK_ALTER_MV  
                                {
				 $$ = new (PARSERHEAP())
				     ElemDDLPrivActAlterMV();
				}

                      | TOK_ALTER_MV_GROUP  
                                {
			         $$ = new (PARSERHEAP())
				   ElemDDLPrivActAlterMVGroup();
                                }

                      | TOK_ALTER_ROUTINE_ACTION
                                {
                                 $$ = new (PARSERHEAP())
                                   ElemDDLPrivActAlterRoutineAction();
                                }

                      | TOK_ALTER_ROUTINE
                                {
                                 $$ = new (PARSERHEAP())
                                   ElemDDLPrivActAlterRoutine();
                                }

                      | TOK_ALTER_SYNONYM  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActAlterSynonym();
                                }

                      | TOK_ALTER_TABLE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActAlterTable();
                                }

                      | TOK_ALTER_TRIGGER  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActAlterTrigger();
                                }

                      | TOK_ALTER_VIEW  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActAlterView();
                                }

                      | TOK_CREATE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreate();
                                }

                      | TOK_CREATE_LIBRARY  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateLibrary();
                                }

                      | TOK_CREATE_MV  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateMV();
                                }

                      | TOK_CREATE_MV_GROUP  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateMVGroup();
                                }

                      | TOK_CREATE_ROUTINE_ACTION
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActCreateRoutineAction();
                                }

                      | TOK_CREATE_ROUTINE
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActCreateRoutine();
                                }

                      | TOK_CREATE_TABLE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateTable();
                                }

                      | TOK_CREATE_TRIGGER  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateTrigger();
                                }

                      | TOK_CREATE_SYNONYM  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateSynonym();
                                }
				
		      | TOK_CREATE_PROCEDURE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateProcedure();
                                }

                      | TOK_CREATE_VIEW  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActCreateView();
                                }

                      | TOK_DBA  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDBA();
                                }

                      | TOK_DROP  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDrop();
                                }

                      | TOK_DROP_LIBRARY  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropLibrary();
                                }

                      | TOK_DROP_MV  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropMV();
                                }

                      | TOK_DROP_MV_GROUP  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropMVGroup();
                                }

                      | TOK_DROP_PROCEDURE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropProcedure();
                                }

                      | TOK_DROP_ROUTINE_ACTION
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActDropRoutineAction();
                                }
                      | TOK_DROP_ROUTINE
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActDropRoutine();
                                }
                      | TOK_DROP_SYNONYM  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropSynonym();
                                }

                      | TOK_DROP_TABLE  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropTable();
                                }

                      | TOK_DROP_TRIGGER  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropTrigger();
                                }
				
		      | TOK_DROP_VIEW  
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActDropView();
                                }

		      /* Utility privileges */
		      		
                      | TOK_MAINTAIN  
                                { yyerror(""); 
                                  YYERROR;
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActMaintain();
                                }
				
                      | TOK_REFRESH  
                                { yyerror(""); 
                                  YYERROR;
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActRefresh();
                                }
				
                      | TOK_TRANSFORM  
                                { yyerror(""); 
                                  YYERROR;
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActTransform();
                                }
				
                      | TOK_UPDATE_STATS  
                                { yyerror(""); 
                                  YYERROR;
				  $$ = new (PARSERHEAP())
				    ElemDDLPrivActUpdateStats();
                                }

                      | TOK_ALL_DDL
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActAllDDL();
                                }

                      | TOK_ALL_DML
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActAllDML();
                                }

                      | TOK_ALL_UTILITY
                                {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLPrivActAllOther();
                                }

optional_privilege_column_list : empty
                                {
				  $$ = NULL;
                                }
                      | '(' privilege_column_list ')'
                                {
				  $$ = $2 /*privilege_column_list*/;
                                }

/* type pElemDDL */
privilege_column_list : column_name_list

/* type pQualName */
ddl_object_name : ddl_qualified_name {
                         $1->setObjectNameSpace(COM_TABLE_NAME);
                         $$ = $1; }
                      | TOK_TABLE ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_TABLE_NAME);
				  $$ = $2; }
                      | TOK_TABLE_MAPPING ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_UDF_NAME);
                                  $$ = $2; }
                      | TOK_PROCEDURE ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_UDF_NAME);
				  $$ = $2; }
                      | TOK_FUNCTION ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_UDF_NAME);
                                  $$ = $2; }
                                
                      | TOK_LIBRARY ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_LIBRARY_NAME);
                                  $$ = $2; }
                      | TOK_SEQUENCE ddl_qualified_name {
                                  $2->setObjectNameSpace(COM_SEQUENCE_GENERATOR_NAME);
                                  $$ = $2; }
                                
/* type pElemDDL */
grantee_list : grantee
                      | grantee_list ',' grantee
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLList(
                                       $1 /*grantee_list*/,
                                       $3 /*grantee*/);
                                }

/* type pElemDDL */
grantee : TOK_PUBLIC
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLGrantee(PARSERHEAP());
                                }

                      | authorization_identifier
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLGrantee(
                                        *$1 /*authorization_identifier*/,
                                        PARSERHEAP());
                                  delete $1 /*authorization_identifier*/;
                                }


/* type pElemDDL */
optional_with_grant_option : empty
                                {
				  $$ = NULL;
                                }

                      | with_grant_option

optional_action : empty
                  { $$ = NULL; }
                | TOK_FOR TOK_ACTION routine_action_qualified_name
                  { $$ = $3; }

/* type pElemDDL */
with_grant_option : TOK_WITH TOK_GRANT TOK_OPTION
                                {
				  $$ = new (PARSERHEAP())
				    ElemDDLWithGrantOption();
                                }
/* type pElemDDL */
optional_by_auth_identifier : empty
                                {
				  $$ = NULL;
                                }

                      | TOK_BY authorization_identifier
                                {
                                  if (!Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                                  {
                                    // Internal syntax: not allowed
                                    yyerror("");
                                    YYERROR;
                                  }
				  $$ = new (PARSERHEAP())
				    ElemDDLGrantee(
                                        *$2 /*authorization_identifier*/,
                                        PARSERHEAP());
                                  delete $2 /*authorization_identifier*/;
                                }






/* type pQualName */
constraint_name : ddl_qualified_name

/* type pStmtDDL */
catalog_definition : TOK_CREATE TOK_CATALOG catalog_definition2
                     {
                       $$ = $3;
		     }


/* type pStmtDDL */
catalog_definition2 : sql_mx_catalog_name optional_create_catalog_attribute_list
                      {
			$$ = new (PARSERHEAP())
			  StmtDDLCreateCatalog(*$1, $2);
			delete $1;
		      }


/* type stringval */
catalog_name	    : sql_mx_catalog_name
		    | sql_mp_catalog_name

/* type stringval */
sql_mx_catalog_name : identifier

/* type stringval */
sql_mp_catalog_name : SYSTEM_VOLUME_NAME '.' identifier
                        {
			  // SQL/MP style catalog name specified.
			  $1->append(".");
			  $1->append(*$3);
			  $$ = $1;
			  delete $3;
			}
                      | empty
                        {
			  *SqlParser_Diags << DgSqlCode(-3157);
			  $$ = NULL;
			  YYABORT;
			}

/* type pElemDDL */
optional_create_catalog_attribute_list : empty
                                {
                                  $$ = NULL;
                                }
                      | create_catalog_attribute_list

/* type pElemDDL */
create_catalog_attribute_list : create_catalog_attribute
                      | create_catalog_attribute_list create_catalog_attribute
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLList(
                                       $1 /*create_catalog_attribute_list*/,
                                       $2 /*create_catalog_attribute*/);
                                }

/* type pElemDDL */
create_catalog_attribute : location_clause

/* type pElemDDL */

location_clause : TOK_LOCATION location_definition optional_partition_name_clause
                                {
                                  $$ = $2; // location_definition
                                  ElemDDLLocation *pLocClause = (ElemDDLLocation *)$$;
                                  NAString partitionName;
                                  if ($3 != NULL)
                                    partitionName = *$3;
                                  pLocClause->setPartitionName(partitionName);
                                }


/* type stringval */
volume_only_name : DOLLAR_IDENTIFIER
				{
				  //
				  // regular_identifier represents a disk
				  // name without the dollar symbol prefix.
				  // This scheme allows white spaces
				  // between the dollar symbol prefix
				  // and the name.  The embedded white
                                  // spaces, if appear, are removed.
				  //
				  $$ = $1 /*regular_identifier (disk name)*/;
                                }

/* type stringval */
oss_path_name : oss_path_name_elem
                      | oss_path_name oss_path_name_elem
                                {
				  // This scheme allows white spaces
				  // between elements in an OSS path
				  // name.  The embedded white spaces,
				  // if appear, are removed.
				  //
                                  $1/*oss_path_name*/->append(*$2);
				  delete $2 /*oss_path_name_elem*/;
				  $$ = $1;
                                }

/* type stringval */
oss_path_name_elem : '/' regular_identifier
                                {
                                  $2/*regular_identifier*/->prepend('/');
				  $$ = $2;
                                }

/* type stringval */
log_file_name : std_char_string_literal
              | regular_identifier
              | oss_path_name

/* type stringval */
optional_partition_name_clause : empty
				{
                                  $$ = NULL;
				}

			| TOK_NAME partition_name
				{
                                  $$ = $2;
				}
/* type pElemDDL */
location_definition : guardian_location_name
                                {
                                  $$ = new (PARSERHEAP()) ElemDDLLocation(
                                       ElemDDLLocation::LOCATION_GUARDIAN_NAME,
                                       *$1);
                                  delete $1;
                                  if (NOT $$->castToElemDDLLocation()->isSubvolumeNameValid() ||
                                      NOT $$->castToElemDDLLocation()->isFilenameValid())
                                    {
                                      // The location name is not valid.
                                      yyerror("");
                                      YYERROR;
                                    }
                                }

                      // VO: Removed alternative that allowed OSS style location spec
/*  ** It has been decided that syntax of the location clause can be
 *  ** LOCATION $VOLUME where $VOLUME is a Guardian volume name.  We
 *  ** can no longer use the '$' symbol for the environment variable.
 *                      
 *                      | '$' identifier TOK_AS partition_name
 *                              {
 *                                // *** Error *** environment variable
 *                                // not allowed in LOCATION clause.
 *
 *				  *SqlParser_Diags << DgSqlCode(-????);
 *
 *                                // needs to check to make sure that the
 *                                // environment variable name syntax is
 *                                // valid.  Currently, no checking is
 *                                // being done.
 *                                //
 *                                $$ = new (PARSERHEAP()) ElemDDLLocation(
 *                                     ElemDDLLocation::
 *                                     LOCATION_ENVIRONMENT_VARIABLE,
 *                                      *$2); // identifier (env var name)
 *                                delete $2;  // identifier
 *                              }
 */

/* type stringval */
guardian_location_name : guardian_volume_name
                       | guardian_volume_name '.' 
		         regular_identifier   '.'
			 regular_identifier
				{
				  $1->append("." + *$3 + "." + *$5);
				  delete $3; // regular_identifier (subvol)
				  delete $5; // regular_identifier (file00)
				  $$ = $1;
				}

/* type stringval */
guardian_volume_name : SYSTEM_VOLUME_NAME
		     | volume_only_name

partition_name :  identifier

/*********************************************/
/****  Handle  CREATE TRIGGER  statement  ****/
/****          B E G I N                  ****/
/*********************************************/

/* type itemList */
trigger_set_clause_list : trigger_set_clause 
             {
	       ItemExprList * iel = 
		 new(PARSERHEAP()) ItemExprList( PARSERHEAP() );
	       iel->insert( $1 );
	       $$ = iel ;
	     }
           | trigger_set_clause_list ',' trigger_set_clause 
             {
	       ((ItemExprList *)$1)->insert( $3 );
	       $$ = $1;
	     }

/* type item */
trigger_set_clause : identifier '=' value_expression
             {
	       // meantime: we require fully qualified left-hand name
	       *SqlParser_Diags << DgSqlCode(-11017) ; // must be qualified
	       YYABORT;
	     }
           | identifier '.' identifier '=' value_expression
             {
	       $$ = new (PARSERHEAP())
		 Assign(new (PARSERHEAP())
			ColReference(new (PARSERHEAP()) ColRefName(*$3,*$1)), $5);
	       delete $1;
	       delete $3;
	     }

/* type item */
triggered_before_action: empty   // I.e. anything not SET or SIGNAL
                {
		  // Before triggers support only SET or SIGNAL actions
		  *SqlParser_Diags << DgSqlCode(-11014);
		  yyerror("");
		  YYABORT;
		} 
              | item_signal_statement 
		{
		  $$ = $1 ;
		}
              | TOK_SET trigger_set_clause_list
                {
		  // Pass an ItemExprList as an ItemExpr -- convert it
		  $$ =  new (PARSERHEAP()) NATypeToItem( (NAType *) $2 );
		}

/* type relx */
triggered_after_action: empty   // Empty or any option not listed below
                {
		  // empty action not supported !!
		  *SqlParser_Diags << DgSqlCode(-11018);
		  yyerror("");
		  YYABORT;
		} 
              | TOK_SET
                {
		  *SqlParser_Diags << DgSqlCode(-11015) ; // no SET for AFTER
		  yyerror("");
		  YYABORT;
		}
              | front_of_insert Rest_Of_insert_statement 
		{
		  $$ = finalize($2, FALSE);
		}
	      |	 update_statement_searched access_type
		{
		  $$ = finalize($1, FALSE);
		  RelRoot * treeTopPtr = (RelRoot *)$$;
		  if ($2 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
		    treeTopPtr->accessOptions().accessType() = $2;
		}
	      | delete_statement  access_type
		{
		  $$ = finalize($1, FALSE);
		  RelRoot * treeTopPtr = (RelRoot *)$$;
		  if ($2 != TransMode::ACCESS_TYPE_NOT_SPECIFIED_)
		    treeTopPtr->accessOptions().accessType() = $2;
		}
              | signal_statement 
		{
		  $$ = finalize($1, FALSE);
		}
	| standalone_call_statement
	  {
	    $$ = finalize($1, FALSE);
	  }
	| psm_3gl_statement
	  {
	    if (($1 != NULL)) {
	      --in3GL_;
	      $$ = finalize($1, FALSE);
	      CSInsideTriggerDefinition = TRUE;
	    } else {
	      // empty block is an error.
	      *SqlParser_Diags << DgSqlCode(-11018);
	      yyerror("");
	      YYABORT;
	    }
	  }


triggerred_when_clause: empty
               {
		 $$ = NULL;
	       }
          | TOK_WHEN '(' any_expression ')'
               {
		 $$ = $3;
	       }

/* type iudOp */
iud_event: TOK_INSERT
                  {
                     $$ = COM_INSERT;
                  }
         | TOK_UPDATE
                  {
                     $$ = COM_UPDATE;
                  }
         | TOK_DELETE
                  {
                     $$ = COM_DELETE;
                  }

optional_update_column_list : empty
                  {
		    $$ = NULL;
		  }
         | TOK_OF '(' column_reference_list ')'
                  {
		    $$ = $3 /* column_reference_list */;
		  }

optional_row_table:  /* empty */
	    {
	  $$ = ParTRIG_SCOPE_NONE;
	}
      | TOK_ROW
	    {
	  $$ = ParTRIG_SCOPE_ROW;
	}
      | TOK_TABLE
	    {
	$$ = ParTRIG_SCOPE_TABLE; 
	}

referencing_clause:  empty
            {
              $$ = NULL;
	    }
            | TOK_REFERENCING TOK_OLD optional_row_table as_clause
            {
               RowOrTableClause1 = $3;	     
                $$ =  new (PARSERHEAP()) OldNewNames( $4, NULL );
            }
            | TOK_REFERENCING TOK_NEW optional_row_table as_clause
            {
              RowOrTableClause1 = $3;	      
              $$ =  new (PARSERHEAP()) OldNewNames( NULL, $4 );	    
            }
            | TOK_REFERENCING TOK_OLD optional_row_table as_clause ',' TOK_NEW 
			optional_row_table as_clause
            {
              // make sure that we are using the same keyword in both clauses if they are both
              // specified. In other words we cannot have referencing clauses like
  		// REFERENCING OLD ROW AS OLDR, NEW TABLE AS NEWT
		 if (($3 && $7) && ($3 != $7))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
              
              RowOrTableClause1 = $3;
              RowOrTableClause2 = $7;
                    $$ =  new (PARSERHEAP()) OldNewNames( $4, $8 );
                  }
            | TOK_REFERENCING TOK_NEW optional_row_table as_clause ',' TOK_OLD 
			optional_row_table as_clause
            {
              if (($3 && $7) && ($3 != $7))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
                 
              RowOrTableClause1 = $3;
              RowOrTableClause2 = $7;
                    $$ =  new (PARSERHEAP()) OldNewNames( $8, $4 );	    
            }


before_action_orientation: empty
                     {
            	if ((RowOrTableClause1 == ParTRIG_SCOPE_TABLE) || (RowOrTableClause2 == ParTRIG_SCOPE_TABLE))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
                        $$ = FALSE;   /* Default is ROW */
                     }
                  | TOK_FOR TOK_EACH TOK_ROW
                     {
               	if ((RowOrTableClause1 == ParTRIG_SCOPE_TABLE) || (RowOrTableClause2 == ParTRIG_SCOPE_TABLE))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
               	$$ = FALSE;
             }
            | TOK_FOR TOK_EACH TOK_STATEMENT
            {
                // no such thing as before-stmt trigger
		       *SqlParser_Diags << DgSqlCode(-11010);
		        YYABORT;
		     }

after_action_orientation: empty
                     {
                 if ((RowOrTableClause1 == ParTRIG_SCOPE_ROW) || (RowOrTableClause2 == ParTRIG_SCOPE_ROW))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
                        $$ = TRUE;   /* Default is STATEMENT */
                     }
                  | TOK_FOR TOK_EACH TOK_ROW
                     {
                if ((RowOrTableClause1 == ParTRIG_SCOPE_TABLE) || (RowOrTableClause2 == ParTRIG_SCOPE_TABLE))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
               	$$ = FALSE;
             }
             | TOK_FOR TOK_EACH TOK_STATEMENT
             {
               	if ((RowOrTableClause1 == ParTRIG_SCOPE_ROW) || (RowOrTableClause2 == ParTRIG_SCOPE_ROW))
		{
			*SqlParser_Diags << DgSqlCode(-11049);
			YYABORT;
		}
               	$$ = TRUE;
             }


// returns pStmtDDL
trigger_definition: before_trigger_definition
		{
		  /* Reset the trigger related globals */
		  RowOrTableClause1 = ParTRIG_SCOPE_NONE;
		  RowOrTableClause2 = ParTRIG_SCOPE_NONE;
		  InsideTriggerDefinition = FALSE;
		  CSInsideTriggerDefinition = FALSE;
		  $$ = $1;
		}
	      | after_trigger_definition
		{
		  /* Reset the trigger related globals */
		  RowOrTableClause1 = ParTRIG_SCOPE_NONE;
		  RowOrTableClause2 = ParTRIG_SCOPE_NONE;
		  InsideTriggerDefinition = FALSE;
		  CSInsideTriggerDefinition = FALSE;
		  $$ = $1;
		}


// returns pStmtDDL
before_trigger_definition: before_trigger_prefix triggerred_when_clause
                                                    triggered_before_action
            {
	      $$ = $1;  // the CreateTriggerStmt object to return

	      StmtDDLCreateTrigger *triggerObject = $1;
	      assert ( !triggerObject->isAfter()); // Only for BEFORE triggers	      
	      // Find the end of the input text and keep it
	      if (ParSetTextEndPos(triggerObject)) { yyerror(""); YYERROR; }

	      // The "ParNameLocListPtr" should NOT be deleted here !   ;
	      // It is kept in triggerObject, and would be deleted by   ;
	      // the destructor of triggerObject
	      ParNameLocListPtr = NULL;
	      
              if ( $3 == NULL ) { yyerror(""); YYERROR; }

	      // Prepare the REFERENCING names
	      TableRefList nameList;
	      prepareReferencingNames( nameList, triggerObject );

	      // Construct the appropriate BeforeTrigger object
	      BeforeTrigger * bt;
	      if ( ITM_NATYPE == $3->getOperatorType() ) { // Action is SET
		// Undo the (ugly) "wrapping" by taking the ItemExpr's child
		ItemExprList * iel = (ItemExprList *) 
		  ((NATypeToItem *)$3)->synthesizeType();
		bt = new(PARSERHEAP()) BeforeTrigger(nameList, $2, iel); 
	      } else {      // Action must be "signal" 
		assert ( ITM_RAISE_ERROR == $3->getOperatorType() ) ; 
		RaiseError * re = (RaiseError *) $3 ;
		bt = new(PARSERHEAP()) BeforeTrigger(nameList, $2, re); 
	      }
	      triggerObject->setAction( bt ); // Add the action tree
	    }

// returns pStmtDDL
after_trigger_definition: after_trigger_prefix triggerred_when_clause
                                              triggered_after_action
            {	    
	      $$ = $1;   // the CreateTriggerStmt object to return

	      StmtDDLCreateTrigger *triggerObject = $1;
	      assert ( triggerObject->isAfter() );  // Only for AFTER triggers	      
	      // Find the end of the input text and keep it
	      if (ParSetTextEndPos(triggerObject)) { yyerror(""); YYERROR; }

	      // The "ParNameLocListPtr" should NOT be deleted here !   ;
	      // It is kept in triggerObject, and would be deleted by   ;
	      // the destructor of triggerObject
	      ParNameLocListPtr = NULL;
	      
              if ( $3 ) ((RelRoot *)$3)->setRootFlag(FALSE); // not a true root
	      else { yyerror(""); YYERROR; }
	      
	      // Prepare the REFERENCING names
	      TableRefList nameList;
	      prepareReferencingNames( nameList, triggerObject );

	      //  for the "else" of the 'when clause'
	      ItemExpr *noOpArg = new (PARSERHEAP()) ConstValue(0);
	      RelExpr  *noOp = new (PARSERHEAP()) Tuple(noOpArg);
	      RelRoot  *noOpRoot = new (PARSERHEAP()) RelRoot(noOp);
              noOpRoot->setEmptySelectList();
	      
	      ItemExpr * whenCond = $2;
	      if ( whenCond == NULL ) 
		whenCond = new (PARSERHEAP()) BoolVal(ITM_RETURN_TRUE);
	      else
		if (whenCond->containsSubquery())
		{
		  *SqlParser_Diags << DgSqlCode(-11023);
		  YYABORT;
		}

	      Union *u = new (PARSERHEAP()) 
		Union($3, noOpRoot, NULL, whenCond); 
	      u->setCondUnary();
	      RelExpr *triggerAction = u;
	      if ( ! triggerObject->isStatement() ) {
		// This is an After Row trigger - need a RenameReference node
		triggerAction = new(PARSERHEAP()) 
		  RenameReference(triggerAction, nameList);
	      }

	      // does this trigger use ROW or TABLE keywords in its referencing clause
	      if (CSInsideTriggerDefinition)
	         triggerObject->setHasCSInAction ();

	      // add the action tree (with a RelRoot) to pNode
	      triggerObject->setAction(finalize(triggerAction));
	    }

before_trigger_prefix: create_trigger_keywords ddl_qualified_name 
             optional_by_auth_identifier 
             TOK_BEFORE iud_event optional_update_column_list TOK_ON
             ddl_qualified_name referencing_clause before_action_orientation
             {
               *SqlParser_Diags << DgSqlCode(-3131);
               YYERROR;

		InsideTriggerDefinition = TRUE;

	       // 
               // Initialize names for REFERENCING 
	       //
	       NAString *oldName = NULL;
	       NAString *newName = NULL;
	       
	       if ( $9 ) { // if there is a referencing clause
		 oldName = $9->oldName();
		 newName = $9->newName();
	       }
	       //
	       //  Perform semantic checks
	       //
		   Int32 errCount =0;
	       if ( $10 )  {           // NO BEFORE-STMT TRIGGERS !!
		 *SqlParser_Diags << DgSqlCode(-11010);
		 errCount++;
		   }
	       if ( $5 != COM_UPDATE && $6 ) { // Only UPDATE can have columns
		 *SqlParser_Diags << DgSqlCode(-11011);
		 errCount++;
		   }
	       if ( NULL != oldName && $5 == COM_INSERT ) { // Insert: No OLD
		 *SqlParser_Diags << DgSqlCode(-11012);
		 errCount++;
		   }
	       if ( NULL != newName && $5 == COM_DELETE ) { // Delete: No NEW
		 *SqlParser_Diags << DgSqlCode(-11013);
		 errCount++;
		   }
	       if ( errCount > 0 ) { // any errors ?
		 delete $2;
		 delete $8;
		 YYABORT;
	       }

               // is this trigger using ROW or TABLE keywords in its referencing clause
               NABoolean hasRowOrTableInRefClause = ((RowOrTableClause1 != ParTRIG_SCOPE_NONE ) || 
                                                     (RowOrTableClause2 != ParTRIG_SCOPE_NONE));

	       StmtDDLCreateTrigger *pNode =
		 new (PARSERHEAP())
		 StmtDDLCreateTrigger(
				      *$2 /* trigger_name */,
				      ParNameLocListPtr,
				      FALSE /* before_trigger */,
				      hasRowOrTableInRefClause,
				      $5 /* iud_event */,
				      $6 /* opt_update_col_list */,
				      *$8 /* subject table qual name */,
				      oldName, 
				      newName,
				      $10 /* action_orientation */,
                                      $3 /* optional auth id */
				      );
	       pNode->synthesize();
	       delete $2 /* trigger_name */;
	       delete $8 /* ddl_qualified_name */;
	       if ( $9 ) delete $9 /* referencing_clause */;
	       $$ = pNode;
	     }

after_trigger_prefix: create_trigger_keywords ddl_qualified_name 
             optional_by_auth_identifier
             TOK_AFTER iud_event optional_update_column_list TOK_ON
             ddl_qualified_name referencing_clause after_action_orientation
             {
               *SqlParser_Diags << DgSqlCode(-3131);
               YYERROR;

		InsideTriggerDefinition = TRUE;

	       // 
               // Initialize names for REFERENCING 
	       //
	       NAString *oldName = NULL;
	       NAString *newName = NULL;
	       
	       if ( $9 ) { // if there is a referencing clause
		 oldName = $9->oldName();
		 newName = $9->newName();
	       }
	       //
	       //  Perform semantic checks
	       //
	       if ( $5 != COM_UPDATE && $6 ) // Only UPDATE can have columns
		 *SqlParser_Diags << DgSqlCode(-11011);
	       if ( NULL != oldName && $5 == COM_INSERT )  // Insert: No OLD
		 *SqlParser_Diags << DgSqlCode(-11012);
	       if ( NULL != newName && $5 == COM_DELETE )  // Delete: No NEW
		 *SqlParser_Diags << DgSqlCode(-11013);
	       if ( SqlParser_Diags->getNumber(DgSqlCode::ERROR_) > 0 ) { // any errors ?
		 delete $2;
		 delete $8;
		 YYABORT;
	       }

               // is this trigger using ROW or TABLE keywords in its referencing clause
               NABoolean hasRowOrTableInRefClause = ((RowOrTableClause1 != ParTRIG_SCOPE_NONE ) || 
                                                     (RowOrTableClause2 != ParTRIG_SCOPE_NONE));

	       StmtDDLCreateTrigger *pNode =
		 new (PARSERHEAP())
		 StmtDDLCreateTrigger(
				      *$2 /* trigger_name */,
				      ParNameLocListPtr,
				      TRUE /* after_trigger */,
				      hasRowOrTableInRefClause,
				      $5 /* iud_event */,
				      $6 /* opt_update_col_list */,
				      *$8 /* subject table qual name */,
				      oldName, 
				      newName,
				      $10 /* action_orientation */,
                                      $3 /* optional auth it */
				      );
	       pNode->synthesize();
	       delete $2 /* trigger_name */;
	       delete $8 /* ddl_qualified_name */;
	       if ( $9 ) delete $9 /* referencing_clause */;
	       $$ = pNode;
	     }

create_trigger_keywords: TOK_CREATE TOK_TRIGGER 
              {
                // This is the first production being reduced in the 
		// processing of create trigger statement.
		//
		// Keep track of the start position of the create trigger
		// statement in the input string.

		NonISO88591LiteralEncountered = FALSE;

		ParNameLocListPtr = new (PARSERHEAP())
		  ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
		ParSetTextStartPosForCreateTrigger(ParNameLocListPtr);
	      }

/*********************************************/
/****  Handle  CREATE TRIGGER  statement  ****/
/****           E N D                     ****/
/*********************************************/

//----------------------------------------------------------------------------
//++ MV
//----------------------------------------------------------------------------

mv_token: TOK_MV 
         {
         }
        | TOK_MATERIALIZED TOK_VIEW 
         {
         }

/* type refreshType */
refresh_type: TOK_RECOMPUTE
                  {
                     $$ = COM_RECOMPUTE;
                  }
            | TOK_REFRESH TOK_ON TOK_STATEMENT
                  {
                     $$ = COM_ON_STATEMENT;
                  }
            | TOK_REFRESH TOK_ON TOK_REQUEST
                  {
                     $$ = COM_ON_REQUEST;
                  }
            | TOK_REFRESH TOK_BY TOK_USER
                  {
                     $$ = COM_BY_USER;
                  }

// type pElemDDL
create_mv_attribute_table_lists : empty
	    {
	      $$ = NULL;
	    }
	    | create_mv_one_attribute_table_list

	    | create_mv_attribute_table_lists create_mv_one_attribute_table_list
	      {
		$$ = new (PARSERHEAP())ElemDDLList($1, // list
						   $2 // one
						   );
	      }
 

// type pElemDDL
create_mv_one_attribute_table_list : ignore_changes_on_table_list

// type pElemDDL
ignore_changes_on_table_list: TOK_IGNORE TOK_CHANGES TOK_ON qual_name_list
			  {
			    $$ = new(PARSERHEAP())
				ElemDDLCreateMVOneAttributeTableList
						  (COM_IGNORE_CHANGES, $4 );
			  }

// type pElemDDL 
qual_name_list : qual_name
		| qual_name_list ',' qual_name
	       {
		  $$ = new (PARSERHEAP()) ElemDDLList($1, // ElemDDLList
						      $3  // ElemDDLQualName
						      );
	       }

				 


// type pElemDDL 
qual_name : ddl_qualified_name
	   {
		$$ = new (PARSERHEAP())ElemDDLQualName(*$1);
		delete $1;
	   }



/* type mvStatus */
mv_initialization_clause:  TOK_INITIALIZE TOK_ON TOK_CREATE
			   {
			     $$ = MVINIT_ON_CREATE;
			   }
			 | TOK_INITIALIZED TOK_ON TOK_CREATE
			   {
			     $$ = MVINIT_ON_CREATE;
			   }
			 | TOK_INITIALIZE TOK_ON TOK_REFRESH
			   {
			     $$ = MVINIT_ON_REFRESH;
			   }
			 | TOK_INITIALIZED TOK_ON TOK_REFRESH
			   {
			     $$ = MVINIT_ON_REFRESH;
			   }
			 | TOK_NO TOK_INITIALIZATION
			   {
			     $$ = MVINIT_NO_INIT;
			   }
			 | TOK_INITIALIZE TOK_BY TOK_USER
			   {
			     $$ = MVINIT_BY_USER;
			   }

/* type boolean */
optional_query_rewrite: empty
                   {
		     // Keep (in a global variable) the begining
		     // of the "optional file options" clause
		     ParSetBeginingOfFileOptionsListPos(ParNameLocListPtr);

                     $$ = (CmpCommon::getDefault(MVQR_REWRITE_ENABLED_OPTION) == DF_ON);
                   }
                 | enable_status TOK_QUERY TOK_REWRITE
                   {
		     // Keep (in a global variable) the begining
		     // of the "optional file options" clause
		     ParSetBeginingOfFileOptionsListPos(ParNameLocListPtr);

		     $$ = $1;   /* Enable/Disable query rewrite */
                   }

/* type pElemDDL */
// taken from CREATE TABLE (like optional_create_table_attribute_list)
optional_create_mv_file_options : 
                   empty
                     {
		       $$ = NULL; 
		     }
                 | create_table_attribute_list
                     {
		       // Mark the text end of the table options list
		       ParSetEndOfFileOptionsListPos(ParNameLocListPtr);
		       
		       $$ = $1;
		     }


// type pElemDDL 
mv_file_attribute_clause : mv_file_attribute_keyword mv_file_attribute_list
			 {
			  $$ = new (PARSERHEAP())ElemDDLMVFileAttrClause($2);
			 }


// type tokval 
mv_file_attribute_keyword : TOK_MVATTRIBUTE
			  | TOK_MVATTRIBUTES


// type pElemDDL 
mv_file_attribute_list: mv_file_attribute
		      | mv_file_attribute_list ',' mv_file_attribute
		      {
			$$ = new (PARSERHEAP())ElemDDLFileAttrList($1, $3);
		      }

// type pElemDDL 
mv_file_attribute : mv_audit_type
		  {
		    $$ = new (PARSERHEAP())ElemDDLFileAttrMvAudit($1);
		  }
		  | TOK_COMMIT TOK_REFRESH TOK_EACH unsigned_integer
		  {
		    $$ = new (PARSERHEAP())ElemDDLFileAttrMVCommitEach($4);
		  }


mv_audit_type: TOK_AUDIT 	
	    {
		    $$ = COM_MV_AUDIT;
	    }
	    | TOK_NO TOK_AUDIT
	    {
		    $$ = COM_MV_NO_AUDIT;
	    }
	    | TOK_NO TOK_AUDITONREFRESH
	    {
		    $$ = COM_MV_NO_AUDIT_ON_REFRESH;
	    }


as_token: TOK_AS
	{
	   // Mark the text begining of the MV query
	   ParSetBeginOfMVQueryPos(ParNameLocListPtr);
	}


//----------------------------------------------------------------------------
// type pStmtDDL 
mv_definition: create_mv_keywords ddl_qualified_name
		optional_view_column_list
		refresh_type
		create_mv_attribute_table_lists // changes clause
		mv_initialization_clause
		optional_query_rewrite
		optional_create_mv_file_options
//                optional_by_auth_identifier		
                optional_in_memory_clause
                as_token query_expression
    {
      *SqlParser_Diags << DgSqlCode(-3131);
      YYERROR;

      RelRoot *top = finalize($11);
      ForUpdateSpec spec(FALSE);
      spec.finalizeUpdatability(top);

      if (($9) &&
	  (CmpCommon::getDefault(COMP_BOOL_219) == DF_OFF))
	{
	  // syntax not yet supported
	  yyerror(""); 
	  YYERROR; 
	}

      // ( The following was taken from CREATE VIEW )
      // The following applies when the user specified BROWSE, STABLE or 
      // REPEATABLE access type and/or the user specified SHARE or EXCLUSIVE 
      // lock mode
      if (top->accessOptions().userSpecified())
	{
	  // Genesis 10-980217-0467:
	  // FOR xxx ACCESS not allowed in C.V.
	  // At first blush allowing it seems a nifty shorthand -- but it 
	  // does not fit at all well with Ansi/Tdm txn/stmt isolation-level 
	  // defaulting model. Also see BindWA::bindView.
	  *SqlParser_Diags << DgSqlCode(-3168);
	  ComASSERT(top->accessOptions().lockMode() ==
		    LOCK_MODE_NOT_SPECIFIED_);
	  YYERROR;
	}

      //++MV
      // FIRST/ANY is not allowed in query expresion of MVs.
      if ($11->getFirstNRows() != -1)
      {
	*SqlParser_Diags << DgSqlCode(-12318);
	YYERROR;
      }
      //--MV

      // REFRESH BY USER Syntax
      if ($4 == COM_BY_USER)
	{
	  if ($6 != MVINIT_BY_USER &&
	      $6 != MVINIT_ON_CREATE)
	    { // REFRESH BY USER must be followed by INITIALIZE BY USER or ON CREATE.
	      *SqlParser_Diags << DgSqlCode(-12332);
	      YYERROR;
	    }
	}
      else
        { // This is not REFRESH BY USER, do not allow INIT BY USER
	  if ($6 == MVINIT_BY_USER)
	    { // This materialized view cannot be of type INITIALIZE BY USER.
	      *SqlParser_Diags << DgSqlCode(-12085);
	      YYERROR;
	    }
        }
      
      StmtDDLCreateMV *pCreateMVParseNode
	= new (PARSERHEAP())
	     StmtDDLCreateMV( *$2,  // ddl_qualified_name 
			      *ParNameLocListPtr,
			      $3, // optional_view_column_list 
			      $4, // refresh_type 
			      $5, // changes clause 
			      $6, // mv_initialization_clause 
			      $7, // optional_query_rewrite 
			      $8, // optional_create_mv_file_options 
			      top,
                              NULL // optional_by_auth_identifier
			      );
      delete $2; // ddl_qualified_name 

      pCreateMVParseNode->setInMemoryObjectDefn($9);

      pCreateMVParseNode->synthesize();

      if (ParSetTextEndPos(pCreateMVParseNode)) // Set the end of text, and 
	{					// copy all those global 
	  yyerror("");				// position keepers into this 
	  YYERROR;				// ParseNode
	}

      $$ = pCreateMVParseNode;

      if ($1) /*create_mv_keywords*/
        $$->setIsGhostObject(TRUE);

      //
      // ParNameLocListPtr is no longer needed. Cleanup globals.
      //
      delete ParNameLocListPtr;
      ParNameLocListPtr = NULL;
      ParNameLocListPtr = ParNameSavedLocListPtr;
      ParEndOfOptionalColumnListPos = 0 ;
      ParBeginingOfFileOptionsListPos = 0;
      ParEndOfFileOptionsListPos = 0;
      ParEndOfSelectColumnListPos = 0 ;
      WeAreInACreateMVStatement = FALSE;
      ThisIsTheFirstMVQuerySelect = TRUE;
    }


/* type boolean */
create_mv_keywords: TOK_CREATE optional_ghost mv_token
              {
                // This is the first production being reduced in the 
		// processing of create mv statement.
		//
		// Keep track of the start position of the create mv
		// statement in the input string.

		ParNameSavedLocListPtr = ParNameLocListPtr;
		ParNameLocListPtr = new (PARSERHEAP())
		  ParNameLocList(SQLTEXT(), (CharInfo::CharSet)SQLTEXTCHARSET(), SQLTEXTW(), PARSERHEAP());
		ParSetTextStartPosForCreateMV(ParNameLocListPtr);

		WeAreInACreateMVStatement = TRUE;

                $$ = $2; /*optional_ghost*/
	      }




// OZ create mv group stmt

// type pStmtDDL 
create_mvrgroup_statement : TOK_CREATE TOK_MVGROUP ddl_qualified_name
{
  *SqlParser_Diags << DgSqlCode(-3131);
  YYERROR;

  $$ = new (PARSERHEAP())StmtDDLCreateMvRGroup(*$3);
  delete $3;
}


//----------------------------------------------------------------------------
//-- MV
//----------------------------------------------------------------------------

					
/* type pStmtDDL */
index_definition : TOK_CREATE optional_unique_optional_ghost TOK_INDEX
                        index_name TOK_ON optional_ghost_ddl_qualified_name
                        index_column_list optional_ignore_clause 
                        optional_index_option_list
                        optional_in_memory_clause
                                {
                                  StmtDDLCreateIndex *pNode =
                                    new (PARSERHEAP())
				      StmtDDLCreateIndex(
                                       ($2 == 1 || $2 == 3) /* UNIQUE */,
                                      *$4 /*index_name*/,
				       *$6 /*optional_ghost_ddl_qualified_name*/,
                                       $7 /*index_column_list*/,
                                       $8 /* optional_ignore_clause */, 
                                       $9 /*optional_index_option_list*/);

				  pNode->setInMemoryObjectDefn($10);
                                  pNode->synthesize();
                                  if ($2 == 2 || $2 == 3) /* GHOST */
                                  {
                                    pNode->setIsGhostObject(TRUE);         /* Create a ghost index */
                                    // Ghost index. The table may be regular or ghost.
                                    if ($6 /*optional_ghost_ddl_qualified_name*/ ->isGhost())
                                      pNode->setIsIndexOnGhostTable(TRUE); /* on a ghost table */
                                  } else {
                                    // Regular index. The table cannot be ghost.
                                    if ($6 /*optional_ghost_ddl_qualified_name*/ ->isGhost())
                                    {
				      yyerror("");
				      YYERROR;
                                    }
                                  }
                                  delete $4 /*index_name*/;
                                  delete $6 /*optional_ghost_ddl_qualified_name*/;
                                  $$ = pNode;
                                }

                 | TOK_CREATE TOK_VOLATILE optional_unique_option TOK_INDEX
                        index_name TOK_ON volatile_ddl_qualified_name
                        index_column_list optional_index_option_list
                        optional_in_memory_clause
                              {
				StmtDDLCreateIndex *pNode =
				  new (PARSERHEAP())
				  StmtDDLCreateIndex(
                                       $3 /*optional_unique_option*/,
				       *$5 /*index_name*/,
				       *$7 /*ddl_qualified_name*/,
                                       $8 /*index_column_list*/,
                                       FALSE /*optional_ignore_clause*/,
                                       $9 /*optional_index_option_list*/);
				pNode->setIsVolatile(TRUE);
				pNode->setProcessAsExeUtil(TRUE);

				pNode->setInMemoryObjectDefn($10);

				pNode->synthesize();
				delete $5 /*index_name*/;
				delete $7 /*ddl_qualified_name*/;
				$$ = pNode;
			      }

 /* type pStmtDDL */
populate_index_definition: TOK_POPULATE TOK_INDEX
                        index_name TOK_ON ddl_qualified_name optional_purgedata
                                {
                                  
                                  StmtDDLPopulateIndex *pNode =
                                    new (PARSERHEAP())
				      StmtDDLPopulateIndex(
                                           FALSE, FALSE,
                                           *$3 /*index_name*/,
                                           *$5 /*ddl_qualified_name*/);
                                 pNode->synthesize();

                                  delete $3 /*index_name*/;
                                  delete $5 /*ddl_qualified_name*/;
                                  $$ = pNode;
                               }

                    | TOK_POPULATE TOK_ALL TOK_INDEXES
                        TOK_ON ddl_qualified_name 
                                {
                                  
				  NAString cn("DUMMY");

                                  StmtDDLPopulateIndex *pNode =
                                    new (PARSERHEAP())
				      StmtDDLPopulateIndex(
                                           TRUE, FALSE,
                                           cn /*index_name*/,
                                           *$5 /*ddl_qualified_name*/);
				  pNode->synthesize();
				  
                                  delete $5 /*ddl_qualified_name*/;
                                  $$ = pNode;
                               }
                            | TOK_POPULATE TOK_ALL TOK_UNIQUE TOK_INDEXES
                              TOK_ON ddl_qualified_name 
                                {
                                  

				  NAString cn("DUMMY");

                                  StmtDDLPopulateIndex *pNode =
                                    new (PARSERHEAP())
				      StmtDDLPopulateIndex(
                                           FALSE,TRUE,
                                           cn /*index_name*/,
                                           *$6 /*ddl_qualified_name*/);
				  pNode->synthesize();
				  
                                  delete $6 /*ddl_qualified_name*/;
                                  $$ = pNode;
                               }

/* type boolean */
optional_purgedata : empty
                                {
                                  $$ = FALSE;
                                }
                      | TOK_PURGEDATA
                                {
                                  $$ = TRUE;
                                }

/* type boolean */
optional_unique_option : empty
                                {
                                  $$ = FALSE;
                                }
                      | TOK_UNIQUE
                                {
                                  $$ = TRUE;
                                }

// We use optional_unique_optional_ghost instead of optional_unique optional_ghost
// in order to avoid shift/reduce conflicts.
/* type uint */
optional_unique_optional_ghost : empty
                                 {
                                   $$ = 0;
                                 }
                                 | TOK_UNIQUE
                                 {
                                   $$ = 1;
                                 }
                                 | ghost
                                 {
                                   $$ = 2;
                                 }
                                 | TOK_UNIQUE ghost
                                 {
                                   $$ = 3;
                                 }

/* type pQualName */
optional_ghost_ddl_qualified_name : ddl_qualified_name
                                 {
                                   $$ = $1;
                                 }
                                 | ghost TOK_TABLE ddl_qualified_name
                                 {
                                   $$ = $3;
                                   $$->setIsGhost(TRUE);
                                 }

/* type stringval */
index_name : identifier

/* type pElemDDL */
index_column_list : '(' column_reference_list ')'
                                {
                                  $$ = $2 /*column_reference_list*/;
                                }

/* type boolean */
optional_ignore_clause : empty
                                {
                                  $$ = FALSE;
                                }
                      | TOK_IGNORE TOK_POS
                                {
                                  $$ = TRUE;
                                }

/* type pElemDDL */
optional_index_option_list : empty
                                {
                                  $$ = NULL;
                                }
                      | index_option_list


/* type pElemDDL */
index_option_list : index_option_spec
                      | index_option_list index_option_spec
                                {
                                  if ($1 == NULL)
                                  {
                                     $$ = $2;
                                  }
                                  else if ($2 == NULL)
                                  {
                                     $$ = $1;
                                  }
                                  else
                                  $$ = new (PARSERHEAP())
				    ElemDDLOptionList(
                                       $1 /*index_option_list*/,
                                       $2 /*index_option_spec*/);
                                }

/* type pElemDDL */
index_option_spec : location_clause
                      | partition_definition
                      | file_attribute_clause
                      | parallel_execution_clause
                      | populate_option
                      | attribute_num_rows_clause
                      | index_division_clause
                      | hbase_table_options
                      | salt_like_clause
                      | TOK_TABLESPACE IDENTIFIER
                         {
			   $$ = NULL;
			 }

/* type pElemDDL */
index_division_clause : division_by_clause
                        {
                          YYERROR;
                        }

                      | TOK_DIVISION TOK_LIKE TOK_TABLE
                        {
                          // index_division_clause ::= TOK_DIVISION TOK_LIKE TOK_TABLE

                          $$ = new (PARSERHEAP())
                            ElemDDLDivisionClause(ElemDDLDivisionClause::DIVISION_LIKE_TABLE);
                        }

/* type pElemDDL */

populate_option: TOK_NO TOK_POPULATE
                 {
		   ElemDDLIndexPopulateOption * elemIndex = new (PARSERHEAP())
                                                               ElemDDLIndexPopulateOption();
                   elemIndex->setNoPopulateClause(TRUE);
                   elemIndex->setNoPopulateOptionCount();
		   $$ = elemIndex;
                 }
 
                 | TOK_POPULATE
                   {
		      ElemDDLIndexPopulateOption * elemIndex = new (PARSERHEAP())
                                                               ElemDDLIndexPopulateOption();
                      elemIndex->setPopulateOptionCount();
                      $$ = elemIndex;
                          
                   }
 
/* type pElemDDL */
parallel_execution_clause : TOK_PARALLEL TOK_EXECUTION parallel_execution_spec
                                {
                                  // *** Error *** PARALLEL EXECUTION
                                  // clause not supported yet
				  *SqlParser_Diags << DgSqlCode(-3030);
                                  $$ = $3 /*parallel_execution_spec*/;
                                }

/* type pElemDDL */
parallel_execution_spec : TOK_ON
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLParallelExec(
                                       TRUE /*TOK_ON*/);
                                }

                      | TOK_ON TOK_CONFIG oss_path_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLParallelExec(
                                       TRUE /*TOK_ON*/,
                                       *$3  /*oss_path_name*/);
                                  delete $3;
                                }

                      | TOK_OFF
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLParallelExec(
                                       FALSE /*TOK_OFF*/);
                                }

/* type pStmtDDL */
initialize_sql_statement : TOK_INITIALIZE_SQL 
                             optional_create_role_list
                             optional_register_user_list
                         {
                           StmtDDLInitializeSQL *pNode = new (PARSERHEAP()) 
                             StmtDDLInitializeSQL($2, $3, PARSERHEAP());
                           pNode->synthesize();
                           $$ = pNode;
                         }

/* type pElemDDL */
optional_create_role_list :  empty
                          {
                            $$ = NULL;
                          }
                          | init_create_role_list

/* type pElemDDL */
init_create_role_list : init_create_role_element
                      | init_create_role_list init_create_role_element
                      {
                        $$ = new (PARSERHEAP())
                               ElemDDLList( $1 /*init_create_role_list*/,
                                            $2 /*init_create_role_element*/);
                      }

/* type pElemDDL */
init_create_role_element : create_role_statement
                    {
                      if ($1)
                        $$ = $1->castToElemDDLNode();
                      else
                        $$ = NULL;
                    }



/* type pElemDDL */
optional_register_user_list :  empty
                            {
                              $$ = NULL;
                            }
                            | init_register_user_list

/* type pElemDDL */
init_register_user_list : init_register_user_element
                        | init_register_user_list init_register_user_element
                        {
                          $$ = new (PARSERHEAP())
                             ElemDDLList($1 /*init_register_user_list*/,
                                         $2 /*init_register_user_element*/);
                        }

/* type pElemDDL */
init_register_user_element : register_user_statement
                           {
                             if ($1)
                               $$ = $1->castToElemDDLNode();
                             else
                               $$ = NULL;
                           }

/* type pElemDDL */
optional_location_clause : empty
                                {
				  $$ = NULL;
                                }

                      | location_clause

/* type pStmtDDL */
create_sequence_statement : TOK_CREATE TOK_SEQUENCE ddl_qualified_name sequence_generator_options
		      {
			ElemDDLSGOptions *sgOptions = 
			  new (PARSERHEAP()) ElemDDLSGOptions(
							      COM_EXTERNAL_SG,
							      $4 /*sequence_generator_option_list*/);
			
			$$ = new (PARSERHEAP())
			  StmtDDLCreateSequence(
					      *$3 /*seq_name_clause*/,
					      sgOptions /*seq gen options*/);
			delete $3 /*seq_name*/;
		      }
                   | TOK_CREATE TOK_INTERNAL TOK_SEQUENCE ddl_qualified_name sequence_generator_options
		      {
                        if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                          {
                            yyerror(""); YYERROR; /*internal syntax only!*/
                          }

			ElemDDLSGOptions *sgOptions = 
			  new (PARSERHEAP()) ElemDDLSGOptions(
							      COM_INTERNAL_SG, 
							      $5 /*sequence_generator_option_list*/);
			
			$$ = new (PARSERHEAP())
			  StmtDDLCreateSequence(
					      *$4 /*seq_name_clause*/,
					      sgOptions /*seq gen options*/);
			delete $4 /*seq_name*/;
		      }

alter_sequence_statement : TOK_ALTER TOK_SEQUENCE ddl_qualified_name all_sequence_generator_options
		      {
			ElemDDLSGOptions *sgOptions = 
			  new (PARSERHEAP()) ElemDDLSGOptions(
							      2, /* SG_EXTERNAL */
							      $4 /*sequence_generator_option_list*/);
			
			$$ = new (PARSERHEAP())
			  StmtDDLCreateSequence(
					      *$3 /*seq_name_clause*/,
					      sgOptions /*seq gen options*/,
					      TRUE /*alter*/);
			delete $3 /*seq_name*/;
		      }

alter_sequence_statement : TOK_ALTER TOK_INTERNAL TOK_SEQUENCE ddl_qualified_name all_sequence_generator_options
		      {
                        if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                          {
                            yyerror(""); YYERROR; /*internal syntax only!*/
                          }

			ElemDDLSGOptions *sgOptions = 
			  new (PARSERHEAP()) ElemDDLSGOptions(
							      1, /* SG_INTERNAL */
							      $5 /*sequence_generator_option_list*/);
			
			$$ = new (PARSERHEAP())
			  StmtDDLCreateSequence(
					      *$4 /*seq_name_clause*/,
					      sgOptions /*seq gen options*/,
					      TRUE /*alter*/);
			delete $4 /*seq_name*/;
		      }

/* type pStmtDDL */
cleanup_objects_statement : TOK_CLEANUP cleanup_object_identifier ddl_qualified_name optional_cleanup_return_details
               {
                 StmtDDLCleanupObjects::ObjectType ot;
                 if (*$2 == "TABLE")
                   ot = StmtDDLCleanupObjects::TABLE_;
                 else if (*$2 == "INDEX")
                   ot = StmtDDLCleanupObjects::INDEX_;
                 else if (*$2 == "VIEW")
                   ot = StmtDDLCleanupObjects::VIEW_;
                 else if (*$2 == "SEQUENCE")
                   ot = StmtDDLCleanupObjects::SEQUENCE_;
                 else if ((*$2 == "SCHEMA") ||
                          (*$2 == "SCHEMA_P"))
                   ot = StmtDDLCleanupObjects::SCHEMA_PRIVATE_;
                 else if (*$2 == "SCHEMA_S")
                   ot = StmtDDLCleanupObjects::SCHEMA_SHARED_;
                 else if (*$2 == "HBASE_TABLE")
                   ot = StmtDDLCleanupObjects::HBASE_TABLE_;
                 else if (*$2 == "OBJECT")
                   ot = StmtDDLCleanupObjects::UNKNOWN_;
                 else
                   YYERROR;

                 QualifiedName * qn = $3;
                 if ((ot == StmtDDLCleanupObjects::SCHEMA_PRIVATE_) ||
                     (ot == StmtDDLCleanupObjects::SCHEMA_SHARED_))
                   {
                     if ($3->fullyExpanded()) // cannot be a 3-part name
                       YYERROR;

                     qn = new(PARSERHEAP()) QualifiedName(SEABASE_SCHEMA_OBJECTNAME,
                                                          $3->getObjectName(),
                                                          $3->getSchemaName());
                   }

                 StmtDDLCleanupObjects *pNode = new (PARSERHEAP())
                   StmtDDLCleanupObjects(ot,
                                         qn->getQualifiedNameAsAnsiString(),
                                         NULL,
                                         PARSERHEAP());

                 if ($4 == TRUE)
                   {
                     // not yet supported
                     YYERROR;

                     pNode->setGetStatus(TRUE);
                     pNode->setReturnDetails(TRUE);
                   }

                 delete $3;

		 $$ = pNode;
	       }
             | TOK_CLEANUP cleanup_object_identifier ddl_qualified_name ',' TOK_UID  NUMERIC_LITERAL_EXACT_NO_SCALE optional_cleanup_return_details
               {
                 StmtDDLCleanupObjects::ObjectType ot;
                 if (*$2 == "TABLE")
                   ot = StmtDDLCleanupObjects::TABLE_;
                 else if (*$2 == "INDEX")
                   ot = StmtDDLCleanupObjects::INDEX_;
                 else if (*$2 == "VIEW")
                   ot = StmtDDLCleanupObjects::VIEW_;
                 else if (*$2 == "SEQUENCE")
                   ot = StmtDDLCleanupObjects::SEQUENCE_;
                 else if (*$2 == "OBJECT")
                   ot = StmtDDLCleanupObjects::UNKNOWN_;
                 else
                   YYERROR;

                 QualifiedName * qn = $3;
                 StmtDDLCleanupObjects *pNode = new (PARSERHEAP())
                   StmtDDLCleanupObjects(ot,
                                         qn->getQualifiedNameAsAnsiString(),
                                         $6,
                                         PARSERHEAP());
                 
                 if ($7 == TRUE)
                   {
                     // not yet supported
                     YYERROR;
                     
                     pNode->setGetStatus(TRUE);
                     pNode->setReturnDetails(TRUE);
                   }

                 delete $3;
                 delete $6;

		 $$ = pNode;
	       }
            | TOK_CLEANUP TOK_UID NUMERIC_LITERAL_EXACT_NO_SCALE  
               {
                 StmtDDLCleanupObjects *pNode = new (PARSERHEAP())
                   StmtDDLCleanupObjects(StmtDDLCleanupObjects::OBJECT_UID_,
                                         *$3,
                                         NULL,
                                         PARSERHEAP());

                 delete $3;

		 $$ = pNode;
	       }
           | TOK_CLEANUP TOK_METADATA optional_cleanup_return_details
               {
                 StmtDDLCleanupObjects *pNode = new (PARSERHEAP())
                   StmtDDLCleanupObjects(StmtDDLCleanupObjects::OBSOLETE_,
                                         "",
                                         NULL,
                                         PARSERHEAP());

                 pNode->setGetStatus(TRUE);
                 if ($3 == TRUE)
                   pNode->setReturnDetails(TRUE);

		 $$ = pNode;
	       }
           | TOK_CLEANUP TOK_METADATA  ',' TOK_CHECK optional_cleanup_return_details
               {
                 StmtDDLCleanupObjects *pNode = new (PARSERHEAP())
                   StmtDDLCleanupObjects(StmtDDLCleanupObjects::OBSOLETE_,
                                         "",
                                         NULL,
                                         PARSERHEAP());
                 pNode->setCheckOnly(TRUE);
                 pNode->setGetStatus(TRUE);
                 if ($5 == TRUE)
                   pNode->setReturnDetails(TRUE);

		 $$ = pNode;
	       }

cleanup_object_identifier : object_identifier
                       | TOK_PRIVATE TOK_SCHEMA   { $$ = new (PARSERHEAP()) NAString("SCHEMA_P"); }
                       | TOK_SHARED TOK_SCHEMA   { $$ = new (PARSERHEAP()) NAString("SCHEMA_S"); }
                       | TOK_OBJECT { $$ = new (PARSERHEAP()) NAString("OBJECT");}
                       | TOK_HIVE TOK_TABLE { $$ = new (PARSERHEAP()) NAString("HIVE_TABLE");}
                       | TOK_HIVE TOK_VIEW { $$ = new (PARSERHEAP()) NAString("HIVE_VIEW");}
                       | TOK_HBASE TOK_TABLE { $$ = new (PARSERHEAP()) NAString("HBASE_TABLE");}

/* type boolean */
optional_cleanup_return_details : empty
                                       {
                                         $$ = FALSE;
                                       }
                                     | ',' TOK_RETURN TOK_DETAILS
                                       {
                                         $$ = TRUE;
                                       }

/* type pStmtDDL */
drop_sequence_statement : TOK_DROP TOK_SEQUENCE ddl_qualified_name 
		      {
			$$ = new (PARSERHEAP())
			  StmtDDLDropSequence(
					      *$3 /*seq_name_clause*/);
			delete $3 /*seq_name*/;
		      }

/* type pStmtDDL */
drop_schema_statement : TOK_DROP schema_or_database
                        {

                          SqlParser_CurrentParser->hiveDDLInfo_->
                            setValues(TRUE, StmtDDLonHiveObjects::DROP_, StmtDDLonHiveObjects::SCHEMA_);
                        }
                        schema_name_clause optional_cleanup 
                        optional_drop_behavior 
                                {
                                  // cannot use keyword DATABASE if not hive ddl.
                                  if (($2 == 2) &&
                                      (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                                    {
                                      YYERROR;
                                    }

				  NAString extSchName($4->getSchemaName().getSchemaNameAsAnsiString());
				  if (! validateVolatileSchemaName(extSchName))
				    {
				      YYERROR;
				    }

				  $$ = new (PARSERHEAP())
				    StmtDDLDropSchema(
                                        *$4 /*schema_name_clause*/,
                                         $6 /*optional_drop_behavior*/,
                                         $5 /*optional_cleanup*/,
					FALSE);
                                  delete $4 /*schema_name*/;
                                }

drop_schema_statement : TOK_DROP schema_or_database TOK_IF TOK_EXISTS 
                        {
                          SqlParser_CurrentParser->hiveDDLInfo_->
                            setValues(TRUE, StmtDDLonHiveObjects::DROP_, StmtDDLonHiveObjects::SCHEMA_, TRUE);
                        }
                        schema_name_clause optional_cleanup
                        optional_drop_behavior
                                {
                                  // cannot use keyword DATABASE if not hive ddl.
                                  if (($2 == 2) &&
                                      (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                                    {
                                      YYERROR;
                                    }

                                  NAString extSchName($6->getSchemaName().getSchemaNameAsAnsiString());
                                  if (! validateVolatileSchemaName(extSchName))
                                    {
                                      YYERROR;
                                    }

                                    StmtDDLDropSchema *pNode =
                                      new (PARSERHEAP())
                                      StmtDDLDropSchema(
                                        *$6 /*schema_name_clause*/,
                                         $8 /*optional_drop_behavior*/,
                                         $7 /*optional_cleanup*/,
                                        FALSE);
                                  pNode->setDropIfExists(TRUE); 
                                  delete $6 /*schema_name*/;
                                  $$ = pNode;
                                }

drop_schema_statement : TOK_DROP TOK_VOLATILE TOK_SCHEMA schema_name optional_cleanup optional_drop_behavior
                                {
				  if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
				    {
				      yyerror(""); YYERROR; /*internal syntax only!*/
				    }

                                  ElemDDLSchemaName edsn(*$4);

				  StmtDDLDropSchema *pNode = 
				    new (PARSERHEAP())
				    StmtDDLDropSchema(
                                         edsn /*schema_name*/,
                                         $6 /*optional_drop_behavior*/,
					 $5,
					FALSE);
                                  delete $4 /*schema_name*/;
				  pNode->setIsVolatile(TRUE);
				  $$ = pNode;
                                }

                        | TOK_DROP TOK_IMPLICIT TOK_VOLATILE TOK_SCHEMA optional_cleanup optional_drop_behavior
                                {
				  if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
				    {
				      yyerror(""); YYERROR; /*internal syntax only!*/
				    }

				  SchemaName schName(CmpCommon::context()->sqlSession()->volatileSchemaName(),
						     CmpCommon::context()->sqlSession()->volatileCatalogName());
                                  ElemDDLSchemaName edsn(schName);
				    
				  StmtDDLDropSchema *pNode = 
				    new (PARSERHEAP())
				    StmtDDLDropSchema(
					 edsn,
                                         $6 /*optional_drop_behavior*/,
					 $5,
					 FALSE);
				  pNode->setIsVolatile(TRUE);
				  pNode->setProcessAsExeUtil(TRUE);
				  $$ = pNode;
                                }

                         | TOK_DROP TOK_IMPLICIT TOK_VOLATILE TOK_SCHEMA TOK_TABLES optional_cleanup optional_drop_behavior
                                {
				  if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
				    {
				      yyerror(""); YYERROR; /*internal syntax only!*/
				    }

				  SchemaName schName(CmpCommon::context()->sqlSession()->volatileSchemaName(),
						     CmpCommon::context()->sqlSession()->volatileCatalogName());
                                  ElemDDLSchemaName edsn(schName);

				  StmtDDLDropSchema *pNode = 
				    new (PARSERHEAP())
				    StmtDDLDropSchema(
					 edsn,
                                         $7 /*optional_drop_behavior*/,
					 $6,
					 TRUE);
				  pNode->setIsVolatile(TRUE);
				  $$ = pNode;
                                }

/* type ComDropBehavior */
extension_drop_behavior : empty
                                {
                                  //
                                  // If drop behavior does not appear
                                  // (a Tandem extension), the default
                                  // is Restrict.
                                  //
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }

                      | TOK_CASCADE
                                {
#ifndef NDEBUG
                                  $$ = COM_CASCADE_DROP_BEHAVIOR;
#else
				  yyerror("");
				  YYERROR;
#endif
                                }


/* type ComDropBehavior */
optional_drop_behavior : empty
                                {
                                  //
                                  // If drop behavior does not appear, the default
                                  // is Restrict.
                                  //
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }

                      | drop_behavior

/* type ComDropBehavior */
drop_behavior : TOK_CASCADE
                                {
                                  $$ = COM_CASCADE_DROP_BEHAVIOR;
                                }

                      | TOK_RESTRICT
                                {
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }
                     | TOK_NO TOK_CHECK
                                {
				  if (NOT Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
				    { 
				      yyerror(""); 
				      YYERROR; /*internal syntax only!*/
				    }

                                  $$ = COM_NO_CHECK_DROP_BEHAVIOR;
                                }

optional_drop_index_behavior : empty
                                {
                                  //
                                  // If drop behavior does not appear, the default
                                  // is Restrict.
                                  //
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }
                       | TOK_CASCADE
                                {
                                  $$ = COM_CASCADE_DROP_BEHAVIOR;
                                }

                      | TOK_RESTRICT
                                {
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }

                      | TOK_NO TOK_CHECK
                                {
                                  $$ = COM_NO_CHECK_DROP_BEHAVIOR;
                                }

/* type ComDropBehavior */
optional_drop_invalidate_dependent_behavior : empty
                                {
                                  //
                                  // If drop behavior does not appear, the default
                                  // is Restrict.
                                  //
                                  $$ = COM_RESTRICT_DROP_BEHAVIOR;
                                }

                      | TOK_CASCADE TOK_INVALIDATE
				{
 				  $$ = COM_CASCADE_INVALIDATE_DEPENDENT_BEHAVIOR;
				} 
                      | drop_behavior
optional_cleanup : empty
                      {
                        $$ = FALSE;
                      }
                      | TOK_CLEANUP
                      {
                        $$ = TRUE;
                      }
                      | TOK_WITH TOK_CLEANUP
                      {
                        $$ = TRUE;
                      }

optional_validate : empty
                      {
                        $$ = FALSE;
                      }
                      | TOK_VALIDATE
                      {
                        yyerror(""); YYERROR; /*internal syntax only!*/
                      }

optional_logfile : empty
                      {
                         $$ = NULL;
                      }
                      | TOK_LOG log_file_name
                      {
                         $$ = $2;
                      } 

/* type pStmtDDL */
alter_index_statement : TOK_ALTER optional_ghost TOK_INDEX ddl_qualified_name
                                alter_index_action
                                {
                                  $$ = $5 /*alter_index_action*/;
                                  if ($2) /*optional_ghost*/
                                    $$->setIsGhostObject(TRUE);
                                  $$->castToStmtDDLAlterIndex()->
                                    setIndexName(*$4 /*ddl_qualified_name*/);
                                  delete $4 /*ddl_qualified_name*/;
                                }

/* type pStmtDDL */
alter_index_action : file_attribute_clause
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterIndexAttribute(
                                       $1 /*file_attribute_clause*/);
                                }
                      | TOK_ALTER hbase_table_options
                        {
                                $$ = new (PARSERHEAP())
				  StmtDDLAlterIndexHBaseOptions($2->castToElemDDLHbaseOptions());
                        }

//----------------------------------------------------------------------------
// MV - RG

/* type pStmtDDL */
alter_mv_refresh_group_statement : TOK_ALTER TOK_MVGROUP mv_group_name_to_alter
			mv_group_alter_action_type mv_name_list
{
  $$ = new (PARSERHEAP())StmtDDLAlterMvRGroup(*$3, // groupQaulName
                                              $4, // action
                                              $5 // ElemDDLList of MVs
                                              );
  delete $3;
}


/* type pQualName */
mv_group_name_to_alter : ddl_qualified_name

/* type MVRGAlterActionType */
mv_group_alter_action_type : TOK_ADD
							 {
								
							 $$ = StmtDDLAlterMvRGroup::ADD_ACTION;

							 }
						 | TOK_REMOVE
							 {

							 $$ = StmtDDLAlterMvRGroup::REMOVE_ACTION;

							 }
						| TOK_OPENBLOWNAWAY
							{
							$$ = StmtDDLAlterMvRGroup::testOpenBlownAway_action; // OZY_TEST
							}
						| TOK_REDEFTIME
							{
							$$ = StmtDDLAlterMvRGroup::testRedefTimeStamp_action; // OZY_TEST

							}

/* type pElemDDL */
mv_name_list : mv_name_node
			| mv_name_list ',' mv_name_node
				   {

				   $$ = 
					new (PARSERHEAP()) ElemDDLList(	$1, // ElemDDLList
													$3	// ElemDDLMVNameNode
																				);
				   }


/* type pElemDDL */
mv_name_node : ddl_qualified_name
					   {
						$$ = new (PARSERHEAP())ElemDDLQualName(*$1);
						delete $1;
					   }



//----------------------------------------------------------------------------
//++ INTERNAL REFRESH PARSING SECTION

// OZ_REFRESH

// relx
internal_refresh_command : TOK_INTERNAL TOK_REFRESH internal_refresh_options
			  {
     	     		    if (Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE) &&
			        Get_SqlParser_Flags(ALLOW_FUNNY_IDENTIFIER)	)
			    {
			      $$ = $3;
		            }
			    else
			    { yyerror(""); YYERROR; /*internal syntax only!*/}
			  }

// relx				
internal_refresh_options : internal_refresh_mv_name recompute_refresh_options
			  {
			    $$ = new (PARSERHEAP())Refresh(*$1,
							    $2->getIsNoDelete());
							    // NEW RECOMPUTE
			    delete $1;
			    delete (RecomputeRefreshOption*)$2;

			  }
			  | internal_refresh_mv_name incremental_refresh_options
			  {
			    $2->synthesize(); // without this nothing will work
			    // $2->trace();

			    if (IncrementalRefreshOption::SINGLEDELTA == $2->getType())
			    {
			      $$ = new (PARSERHEAP())Refresh( *$1, // mvName
							$2->getDeltaDefPtrList(), 
							$2->getNRowsClause(),
							$2->getPipelineClause());
			    } else if (IncrementalRefreshOption::MULTIDELTA == $2->getType())
			      $$ = new (PARSERHEAP())Refresh( *$1, // mvName
							      $2->getDeltaDefPtrList(),
							      $2->getPhaseNum(),
							      $2->getPipelineClause());
			    delete $1;
			    delete $2;

			  }



// pQualName			
internal_refresh_mv_name : qualified_name
			{
			  $$ = qualifiedNameFromStrings($1);
			  // delete $1 done in qualifiedNameFromStrings;
			}



// pRecomputeRefreshOption
recompute_refresh_options: TOK_RECOMPUTE TOK_NODELETE
			 {
			  $$ = new (PARSERHEAP())RecomputeRefreshOption(TRUE);
			 }
			 | TOK_RECOMPUTE
			 {
			  $$ = new (PARSERHEAP())RecomputeRefreshOption(FALSE);
			 }

// pIncrementalRefreshOption	
incremental_refresh_options : TOK_FROM TOK_SINGLEDELTA delta_definition_list optional_nrows_clause optional_pipeline_clause
			    {
			      $$ = new (PARSERHEAP())IncrementalRefreshOption
				      (
				      $3, //pDeltaDefinitionPtrList 
				      $4, // pOptionalNRowsClause
				      $5  // pOptionalPipelineClause
				      );

			    }
			    | TOK_FROM TOK_MULTIDELTA delta_definition_list TOK_PHASE unsigned_integer optional_pipeline_clause
			    {
			      $$ = new (PARSERHEAP())IncrementalRefreshOption
					  (
					  $3, //pDeltaDefinitionPtrList 
					  $5, // uint
					  $6  // pOptionalPipelineClause
					  );

			    }

						   
//pDeltaDefinitionPtrList		
delta_definition_list : delta_definition_node
		      {
			$$ = new (PARSERHEAP())DeltaDefinitionPtrList();
			$$->insert($1);
		      }
		      |
		      delta_definition_list ',' delta_definition_node
		      {
			$1->insert($3);
			//delete $3;
			$$ = $1;
		      }
//pDeltaDefinition		
delta_definition_node: qualified_name TOK_BETWEEN begin_epoch TOK_AND end_epoch delta_options
					   {
					      $$ = new(PARSERHEAP())DeltaDefinition
						  (
							  qualifiedNameFromStrings($1),
							  $3, // begin_epoch
							  $5, // end_epoch
							  $6 // pDeltaOptions
						  );
					      
					      // delete $1 done in qualifiedNameFromStrings;


					   }
					   
//uint						
begin_epoch : unsigned_integer


//uint						
end_epoch : unsigned_integer


//pDeltaOptions
delta_options : TOK_DE TOK_LEVEL unsigned_integer delta_def_logs
		{
		  $$ = new (PARSERHEAP())DeltaOptions($3, $4);
		}

//pDeltaDefLogs
delta_def_logs : delta_def_range_log delta_def_iud_log
		{
		  $$ = new (PARSERHEAP())DeltaDefLogs($1, $2);
		}

//pDeltaDefRangeLog
delta_def_range_log : TOK_USE TOK_NO TOK_RANGELOG 
		      {
		        $$ = new (PARSERHEAP())DeltaDefRangeLog(DeltaDefRangeLog::NO_LOG);
		      }
	  	      | TOK_USE TOK_RANGELOG unsigned_integer TOK_NUM_OF_RANGES
		      {
		        $$ = new (PARSERHEAP())DeltaDefRangeLog(DeltaDefRangeLog::CARDINALITY_ONLY, $3);
		      }
		      | TOK_USE TOK_RANGELOG unsigned_integer TOK_NUM_OF_RANGES unsigned_integer TOK_ROWS_COVERED
		      {
		        $$ = new (PARSERHEAP())DeltaDefRangeLog(DeltaDefRangeLog::ALL, $3, $5);
		      }

//pDeltaDefIUDLog
delta_def_iud_log :  TOK_USE TOK_IUDLOG iud_statistics_rows
		    {
		      $$ = new (PARSERHEAP())DeltaDefIUDLog(DeltaDefIUDLog::STAT, 
							    $3 //pIUDStatistics 
							    );
		    }
		    | TOK_USE TOK_NO TOK_IUDLOG 
		    {
		      $$ = new (PARSERHEAP())DeltaDefIUDLog(DeltaDefIUDLog::NO_LOG);
		    }
		    | TOK_USE TOK_IUDLOG TOK_INSERT TOK_ONLY
		    {
		      $$ = new (PARSERHEAP())DeltaDefIUDLog(DeltaDefIUDLog::INSERT_ONLY);
		    }
		    | TOK_USE TOK_IUDLOG
		    {
		      $$ = new (PARSERHEAP())DeltaDefIUDLog(DeltaDefIUDLog::NO_STAT);
		    }
		    

//pIUDStatistics
iud_statistics_rows : num_inserted num_deleted num_updated optional_update_collumns
		    {
		      $$ = new (PARSERHEAP())IUDStatistics($1,$2,$3,$4);
		    }

//uint						
num_inserted : unsigned_integer TOK_ROWS_INSERTED
	     {
		$$ = $1;
	     }

//uint						
num_deleted : unsigned_integer TOK_ROWS_DELETED
	   {
	      $$ = $1;
	   }

//uint						
num_updated : unsigned_integer TOK_ROWS_UPDATED
	   {
	    $$ = $1;
	   }

			  
// pIntegerList
optional_update_collumns :  TOK_COLUMNS '(' columns_num_list ')'
			{
			  $$ = $3; 
			}
			|empty
			 {
			    $$ = NULL;				   
			 }


// pIntegerList
columns_num_list : unsigned_integer 
		 {
		  $$ = new (PARSERHEAP())IntegerList();
		  $$->insert($1);
		 }
		 | columns_num_list ',' unsigned_integer
		 {
		  $1->insert($3);
		  $$ = $1;
		 }
			  
// pOptionalNRowsClause
optional_nrows_clause: empty
		     {
			$$ = NULL;
		     }
		     | TOK_COMMIT TOK_EACH unsigned_integer TOK_PHASE phase_num optional_catchup
		     {
		      
		       $$ = new (PARSERHEAP())NRowsClause( $3, // commit each
							  $5, // PHASE
							  $6 // pOptionalCatchupClause
							  );
		     }



//uint						
phase_num : unsigned_integer

// item
optional_catchup : empty
		  {
		    $$ = NULL;
		  }
		  | TOK_CATCHUP unsigned_integer
		  {
		    $$ = new (PARSERHEAP())ConstValue($2);
		  }
		  | TOK_CATCHUP dynamic_parameter
		  {
		    $$ = $2;
		  }




//pPipelineClause
optional_pipeline_clause : empty
			 {
			    $$ = NULL;
			 }
			 | pipeline_clause
			 {
			    $$ = $1;
			 }

//pPipelineClause				
pipeline_clause :  TOK_PIPELINE '(' pipeline_mv_name_list ')' pipeline_def_list
		 {
		    $$ = new (PARSERHEAP())PipelineClause($3, $5);
		 }
		 | TOK_PIPELINE '(' pipeline_mv_name_list ')' 
		 {
		    $$ = new (PARSERHEAP())PipelineClause($3);
		 }

					

// pPipelineDefPtrList
pipeline_def_list: pipeline_def
		  {

		    PipelineDefPtrList * pOneNodeDefList = 
						    new (PARSERHEAP())PipelineDefPtrList();

		    pOneNodeDefList->insert($1);
						    
		    $$ = pOneNodeDefList;
		  }
		  
		  | pipeline_def_list ',' pipeline_def
		     {
			$1->insert($3);
			//delete $3;
			$$ = $1;
		     }


// pPipelineDef
pipeline_def: qualified_name TOK_PIPELINE '(' pipeline_mv_name_list ')'
	    {
	      QualifiedName * mvName = qualifiedNameFromStrings($1);
	      // delete $1 done in qualifiedNameFromStrings;
	      
	      $$ = new (PARSERHEAP())PipelineDef( mvName, $4 );
	    }

//pQualName
pipeline_mv_name_list: pipeline_mv_name_node
		     {
			$$ = new (PARSERHEAP())QualNamePtrList();
			$$->insert($1);

		     }
			     | pipeline_mv_name_list ',' pipeline_mv_name_node
		     {
			$1->insert($3);
			//delete $3;
			$$ = $1;	
		     }

// pQualifiedNamePtrList
pipeline_mv_name_node: qualified_name
		       {
			  $$ = qualifiedNameFromStrings($1);
			  // delete $1 done in qualifiedNameFromStrings;
		       }

//-- INTERNAL REFRESH PARSING SECTION
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//++ MVLOG

mvlog_command : mvlog_keywords mvlog_table_name 
				'(' column_list ')' TOK_BETWEEN mvlog_values_list TOK_AND mvlog_values_list
				{
					$$ = new (PARSERHEAP()) MvLog($2, $4, $7, $9);
				}

mvlog_values_list : '(' value_expression ')' 
					{
					  $$ = $2;
					}
					| '(' value_expression_list_comma ')' 
					{
					  $$ = $2;
					}

mvlog_keywords : TOK_MVLOG TOK_INTO TOK_RANGELOG TOK_OF

mvlog_table_name : qualified_name
				   {
				     $$ = qualifiedNameFromStrings($1);
				     // delete $1 done in qualifiedNameFromStrings;
				   }


//-- MVLOG
//----------------------------------------------------------------------------

 no_check_log: empty
		{
		  $$ = 0;
		}
		| TOK_NOMVLOG
		{
		  $$ = 1;
		}
		| TOK_NO TOK_CHECK
		{
		  $$ = 2;
		}
		| TOK_NOMVLOG TOK_NO TOK_CHECK
		{
		  $$ = 3;
		}
		| TOK_NO TOK_CHECK TOK_NOMVLOG
		{
		  $$ = 3;
		}

ignore_triggers: empty
		{
			$$ = FALSE;
		}
		| TOK_IGNORETRIGGERS
		{
			$$ = TRUE;
		}

// type boolean		
                 
no_rollback: empty
        {
            $$ = FALSE;
        }
        | TOK_WITH TOK_NO TOK_ROLLBACK
        {
            $$ = TRUE;
        }

/* type boolean */
enable_status : TOK_DISABLE
                 {
		   $$ = FALSE;
		 }
               | TOK_ENABLE
                 {
		   $$ = TRUE;
		 }
/* type boolean */
optional_all_of : empty
                 {
		   $$ = FALSE;
		 }
               | TOK_ALL TOK_OF
                 {
		   $$ = TRUE;
		 }

/* type pStmtDDL */
alter_trigger_statement : TOK_ALTER TOK_TRIGGER enable_status
                             optional_all_of  ddl_qualified_name
                          {
			    $$ = new (PARSERHEAP())
			      StmtDDLAlterTrigger(
						  $3, /* enable_status */
						  $4, /* optional_all_of */
						  *$5 /*ddl_qualified_name*/);
			    delete $5;
			  }

/* type uint */
alter_view_start_tokens : TOK_ALTER TOK_VIEW
                   {
                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::ALTER_, StmtDDLonHiveObjects::VIEW_);

                     $$ = 0;
                   }

/* type pStmtDDL */
alter_view_statement : alter_view_start_tokens 
                       ddl_qualified_name
                       TOK_RENAME TOK_TO identifier
                          {
                            $$ = new (PARSERHEAP())StmtDDLAlterView
                                     ( *$2 // ddl_qualified_name (old name)
                                     , *$5 // identifier (new name)
                                     );
                            delete $2;  // ddl_qualified_name
                            delete $5;  // identifier
                          }
                     |  alter_view_start_tokens
                        ddl_qualified_name
                        TOK_COMPILE optional_cascade 
                          {
                            $$ = new (PARSERHEAP())StmtDDLAlterView
                                     ( *$2 // ddl_qualified_name (view name to validate)
                                     ,  $4 // cascade TRUE or FALSE 
                                     );
                            delete $2;  // ddl_qualified_name
                          }

//----------------------------------------------------------------------------
//++ MV

// type pStmtDDL
alter_mv_statement : TOK_ALTER optional_ghost mv_token alter_mv_body
					 {
                                           *SqlParser_Diags << DgSqlCode(-3131);
                                           YYERROR;
                                           
                                           $4->castToStmtDDLAlterMV()->synthesize();
                                           $$ = $4 /*alter_mv_body*/;
                                           if ($2) /*optional_ghost*/
                                             $$->setIsGhostObject(TRUE);
					 }


// type pStmtDDL
alter_mv_body : alter_mv_query_rewrite
				   {
					   $$ = $1;
				   }
				| alter_mv_file_attribs
				{
					$$ = $1;
				}
				| alter_mv_mvfile_attribs
				{
					$$ = $1;
				}
				| alter_mv_rename
				{
					$$ = $1;
				}
                                | alter_mv_attribute_table_lists
                                {
                                        $$ = $1;
                                }



// type pStmtDDL
alter_mv_query_rewrite : ddl_qualified_name enable_status TOK_QUERY TOK_REWRITE 
					 {
						$$ = new (PARSERHEAP())StmtDDLAlterMV( *$1, //ddl_qualified_name
																$2 // enable_status 
																);
						delete $1;
					 }

// type pStmtDDL
alter_mv_file_attribs : ddl_qualified_name file_attribute_clause 
					{
						$$ = new (PARSERHEAP())StmtDDLAlterMV( *$1, //ddl_qualified_name
																$2 // ElemDDLFileAttrClause 
																);
						delete $1;
					}

// type pStmtDDL
alter_mv_mvfile_attribs : ddl_qualified_name mv_file_attribute_clause 
					{
						$$ = new (PARSERHEAP())StmtDDLAlterMV( *$1, //ddl_qualified_name
																$2 // ElemDDLFileAttrClause 
																);
						delete $1;
					}

/* type pStmtDDL */
alter_mv_rename : ddl_qualified_name TOK_RENAME TOK_TO identifier
                                 optional_cascade
                                {
                                  $$ = new (PARSERHEAP())StmtDDLAlterMV
                                           ( *$1 // ddl_qualified_name (old name)
                                           , *$4 // identifier (new name)
                                           ,  $5 // optional_cascade
                                           );
                                  delete $1;  // ddl_qualified_name
                                  delete $4;  // identifier
                                }

/* type pStmtDDL */
alter_mv_attribute_table_lists : ddl_qualified_name TOK_ADD ignore_changes_on_table_list
                                 {
                                   $$ = new (PARSERHEAP()) StmtDDLAlterMV
                                         ( *$1
                                         ,  $3
                                         , StmtDDLAlterMV::ADD_IGNORE_CHANGES_LIST
                                         );

                                  delete $1;
                                 }

                               | ddl_qualified_name TOK_REMOVE ignore_changes_on_table_list
                                 {
                                   $$ = new (PARSERHEAP()) StmtDDLAlterMV
                                         ( *$1
                                         ,  $3
                                         , StmtDDLAlterMV::REMOVE_IGNORE_CHANGES_LIST
                                         );

                                  delete $1;
                                 }


/* type boolean */
optional_cascade : empty
                                {
                                  $$ = FALSE;
                                }

                      | TOK_CASCADE
                                {
                                  $$ = TRUE;
                                }

/* type boolean */
optional_skip_view_check : empty
                                {
                                  $$ = FALSE;
                                }

                      | TOK_SKIP TOK_VIEW TOK_CHECK
                                {
                                  if (! Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
                                    {
                                      yyerror("");
                                      YYERROR;     /*internal syntax only!*/
                                    }
                                  $$ = TRUE;
                                }

//-- MV
//----------------------------------------------------------------------------


/* type pStmtDDL */
alter_audit_config_statement: TOK_ALTER TOK_AUDIT TOK_CONFIG 
                                 TOK_LOG QUOTED_STRING QUOTED_STRING QUOTED_STRING
				{
				    $$ = new (PARSERHEAP())
				      StmtDDLAlterAuditConfig 
					(*$5, /*string*/ 
					 *$6, /*string*/ 
					 *$7  /*string*/ 
                                         );
				}

/* type pStmtDDL */
alter_catalog_statement: TOK_ALTER TOK_CATALOG sql_mx_catalog_name enable_status TOK_SCHEMA schema_name
				{
				    $$ = new (PARSERHEAP())
				      StmtDDLAlterCatalog 
					(*$3,	//sql_mx_catalog_name
					  $4,	//enable_status
					 *$6	//schema_name
					 );				      				     
				      delete $6;
				}

			  | TOK_ALTER TOK_CATALOG sql_mx_catalog_name enable_status TOK_ALL TOK_SCHEMA
				{
				    $$ = new (PARSERHEAP())
				      StmtDDLAlterCatalog
				      (*$3,	//sql_mx_catalog_name
				       $4,      //enable_status
                                       FALSE);  //disable_create
				}

                          | TOK_ALTER TOK_CATALOG sql_mx_catalog_name enable_status TOK_CREATE
                                {
                                    if (!Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                                    {
                                      // Internal syntax: not allowed
                                      yyerror("");
                                      YYERROR;
                                    }
                                    $$ = new (PARSERHEAP())
                                      StmtDDLAlterCatalog
                                      (*$3,     //sql_mx_catalog_name
                                       $4,      //enable_status
                                       TRUE);   //disable_create
                                }

                          | TOK_ALTER TOK_ALL TOK_CATALOG enable_status TOK_CREATE
                                {
                                    $$ = new (PARSERHEAP())
                                      StmtDDLAlterCatalog
                                      ($4);     //enable_status
                                }

                          | TOK_ALTER TOK_ALL TOK_CATALOGS enable_status TOK_CREATE
                                {
                                    $$ = new (PARSERHEAP())
                                      StmtDDLAlterCatalog
                                      ($4);     //enable_status
                                }

                          | TOK_ALTER TOK_CATALOG sql_mx_catalog_name enable_status TOK_CREATE TOK_IN TOK_SCHEMA schema_name
                                {
                                    if (!Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                                    {
                                      // Internal syntax: not allowed
                                      yyerror("");
                                      YYERROR;
                                    }
                                    $$ = new (PARSERHEAP())
                                      StmtDDLAlterCatalog
                                      (*$3,     //sql_mx_catalog_name
                                       $4,      //enable_status
                                       TRUE,    //disable/enable_create
				       *$8);
                                }

alter_schema_start_tokens : TOK_ALTER schema_or_database
                            {
                              SqlParser_CurrentParser->hiveDDLInfo_->
                                setValues(TRUE, StmtDDLonHiveObjects::ALTER_, StmtDDLonHiveObjects::SCHEMA_);

                              $$ = $2;
                            }

/* type pStmtDDL */
alter_schema_statement: alter_schema_start_tokens
                        schema_name_clause alter_stored_descriptor_option
			{
                          // cannot use keyword DATABASE if not hive ddl.
                          if (($1 == 2) &&
                              (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                            {
                              YYERROR;
                            }

                          $$ = new (PARSERHEAP()) 
                            StmtDDLAlterSchema
                            (*$2,
                             (StmtDDLAlterTableStoredDesc::AlterStoredDescType)$3);

                        }
                     |  alter_schema_start_tokens
                        schema_name_clause TOK_DROP TOK_ALL TOK_TABLES
			{
                          // cannot use keyword DATABASE if not hive ddl.
                          if (($1 == 2) &&
                              (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                            {
                              YYERROR;
                            }

                          NAString extSchName($2->getSchemaName().getSchemaNameAsAnsiString());
                          if (! validateVolatileSchemaName(extSchName))
                            {
                              YYERROR;
                            }
                          
                          $$ = new (PARSERHEAP())
                            StmtDDLDropSchema(
                                 *$2 /*schema_name_clause*/,
                                 COM_CASCADE_DROP_BEHAVIOR,
                                 FALSE /*optional_cleanup*/,
                                 TRUE);
                          delete $2 /*schema_name*/;
                        }
                     |  alter_schema_start_tokens
                        schema_name_clause TOK_RENAME TOK_TO identifier
			{
                          // cannot use keyword DATABASE if not hive ddl.
                          if (($1 == 2) &&
                              (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_))
                            {
                              YYERROR;
                            }

                          NAString extSchName($2->getSchemaName().getSchemaNameAsAnsiString());
                          if (! validateVolatileSchemaName(extSchName))
                            {
                              YYERROR;
                            }
                          
                          $$ = new (PARSERHEAP())
                            StmtDDLAlterSchema(
                                 *$2 , //schema_name_clause
                                 *$5);
                          delete $2; // schema_name
                          delete $5; // renamed schema
                        }

/* type pStmtDDL */
alter_library_statement : TOK_ALTER TOK_LIBRARY ddl_qualified_name 
                          TOK_FILE std_char_string_literal
                          optional_library_clientname
                          optional_library_clientfilename
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterLibrary(
                                        *$3 /*ddl_qualified_name*/,
                                        *$5 /*string*/,
                                        $6 /*ElemDDLNode*/,
                                        $7 /*ElemDDLNode*/,
                                        PARSERHEAP());
                                  delete $3 /*ddl_qualified_name*/;
                                 
                               }
/* type pElemDDL */
optional_library_clientname : empty
                         {
                       $$ = NULL;
                         }
                   | TOK_HOST TOK_NAME std_char_string_literal
                         {
                          $$ = new (PARSERHEAP()) ElemDDLLibClientName(*$3); // std_char_string_literal
                         } 

/* type pElemDDL */
optional_library_clientfilename : empty
                         {
                       $$ = NULL;
                         }
                   | TOK_LOCAL TOK_FILE std_char_string_literal
                         {
                          $$ = new (PARSERHEAP()) ElemDDLLibClientFilename(*$3); // std_char_string_literal
                         } 
                               
// Make optional clauses not position dependent                              
//* type pElemDDL LIBRARY
//optional_library_attribute_list : empty
//                         {
//                       $$ = NULL;
//                         }
//                      | library_attribute_list
//
//* type pElemDDL LIBRARY
//library_attribute_list : library_attribute
//                      | library_attribute_list library_attribute
//                                {
//                                  $$ = new (PARSERHEAP())
//				    ElemDDLOptionList(
//                                       $1 ,//*library_attribute_listLIBRARY
//                                       $2 );//*library_attributeLIBRARY
//                                }
//
//* type pElemDDL LIBRARY
//library_attribute :  TOK_LOCAL TOK_FILE std_char_string_literal
//                         {
//                          $$ = new (PARSERHEAP()) ElemDDLLibClientFilename(*$3); // std_char_string_literal
//                      	 }
//                   | TOK_HOST TOK_NAME std_char_string_literal
//                         {
//                          $$ = new (PARSERHEAP()) ElemDDLLibClientName(*$3); // std_char_string_literal
//                         } 
//
                          
/* type pStmtDDL */
create_library_stmt : TOK_CREATE optional_system TOK_LIBRARY ddl_qualified_name 
                          TOK_FILE std_char_string_literal
                          optional_library_clientname
                          optional_library_clientfilename
                          optional_by_auth_identifier
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLCreateLibrary(
                                        $2 /* isSystem */,
                                        *$4 /*ddl_qualified_name*/,
                                        *$6 /*string*/,
                                        $7 /*ElemDDLNode*/,
                                        $8 /*ElemDDLNode*/,
                                        $9 /*by authid*/,
                                        PARSERHEAP());
                                  delete $4 /*ddl_qualified_name*/;
                                 
                               }
                               
/* type pStmtDDL */
optional_system : empty
                  {
                    $$ = FALSE;
                  }
                  | TOK_SYSTEM
                  {
		    $$ = TRUE;
		  }

/* type pStmtDDL */
drop_library_statement : TOK_DROP TOK_LIBRARY ddl_qualified_name optional_drop_behavior
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLDropLibrary(
                                        *$3 /*ddl_qualified_name*/,
                                        $4  /*optional_drop_behavior*/ );
                                  delete $3 /*ddl_qualified_name*/;
                               }

/* type uint */
alter_table_start_tokens : TOK_ALTER optional_ghost TOK_TABLE
                   {
                     if ($2)
                       $$ = 1;
                     else
                       $$ = 0;

                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::ALTER_, StmtDDLonHiveObjects::TABLE_);
                   }

                          
/* type pStmtDDL */
alter_table_statement :  alter_table_start_tokens
                                ddl_qualified_name
                                alter_table_action 
                                {
                                  $$ = $3 /*alter_table_action*/;
                                  if ($1) /*optional_ghost*/
                                    $$->setIsGhostObject(TRUE);
                                  $$->castToStmtDDLAlterTable()->
                                    setTableName(QualifiedName (*$2 /*ddl_qualified_name*/, 
                                                  PARSERHEAP()));
				  if($$->castToStmtDDLAlterTableAddColumn())
                                    {
				      $$->castToStmtDDLAlterTableAddColumn()->
					synthesize();
                                    }
                                  delete $2 /*ddl_qualified_name*/;
                                }
                       | alter_table_start_tokens ddl_qualified_name
                                is_not_droppable
                                {
                                  StmtDDLAlterTable *pNode = new (PARSERHEAP())
				                             StmtDDLAlterTable(DDL_ALTER_TABLE_DROPPABLE);
                                  pNode->setTableName(QualifiedName
				                      (*$2 /*ddl_qualified_name*/,
						       PARSERHEAP()));

                                  pNode->setIsDroppable(!$3);
                                  $$ = pNode;
                                  delete $2 /*ddl_qualified_name*/;
                                  if ($1) /*optional_ghost*/
                                    $$->setIsGhostObject(TRUE);
                                }
                       | alter_table_start_tokens ddl_qualified_name
                                TOK_INSERT_ONLY
                                {
                                  if (CmpCommon::getDefault(CAT_ALLOW_NEW_FEATUREX) == DF_OFF)
                                  {
                                    // Feature not externalized
                                    yyerror(""); 
                                    YYERROR;
                                  }

                                  StmtDDLAlterTable *pNode = new (PARSERHEAP())
                                                             StmtDDLAlterTable(DDL_ALTER_TABLE_INSERT_ONLY);
                                  pNode->setTableName(QualifiedName
                                                      (*$2 /*ddl_qualified_name*/,
                                                       PARSERHEAP()));
                                  pNode->setInsertOnly(TRUE);
                                  $$ = pNode;
                                  delete $2 /*ddl_qualified_name*/;
                                  if ($1) /*optional_ghost*/
                                    $$->setIsGhostObject(TRUE);
                                }

                     | alter_table_start_tokens ddl_qualified_name TOK_NAMESPACE 
				{
                                  if ( ! Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE)
		                       && ( CmpCommon::getDefault(ALLOW_GHOST_OBJECTS) == DF_OFF )
                                     )
                                  {
                                    // Internal syntax: not allowed
                                    yyerror(""); 
                                    YYERROR; 
                                  }
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableNamespace
                                      (*$2);
                                  $$->castToStmtDDLAlterTable()->
                                    setTableName(QualifiedName
                                                 (*$2 /*ddl_qualified_name*/, 
                                                  PARSERHEAP()));
                                  if($1)
                                    $$->setIsGhostObject(TRUE);
 				  else
                                    $$->setIsGhostObject(FALSE);
                                  delete $2; // identifier
				}

                       | alter_table_start_tokens ddl_qualified_name online_or_offline                      
                        {
                            StmtDDLAlterTable *pNode = new (PARSERHEAP())
			                                    StmtDDLAlterTable(DDL_ALTER_TABLE_TOGGLE_ONLINE);
                            pNode->setTableName(QualifiedName(*$2 , PARSERHEAP())); 
                            pNode->setIsOnline($3);
                            $$ = pNode;
  		            if($1)
                              $$->setIsGhostObject(TRUE);
 			    else
                              $$->setIsGhostObject(FALSE);     
                            delete $2;
                        }
                       | alter_table_start_tokens ddl_qualified_name online_or_offline TOK_FOR TOK_PURGEDATA
                        {
			  if ((NOT Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE)) ||
                              ($2)) // ghost
			    { 
			      yyerror(""); 
			      YYERROR; /*internal syntax only!*/
			    }

			  StmtDDLAlterTable *pNode = new (PARSERHEAP())
			    StmtDDLAlterTable(DDL_ALTER_TABLE_TOGGLE_ONLINE);
			  pNode->setTableName(QualifiedName(*$2 , PARSERHEAP())); 
			  pNode->setIsOnline($3);
			  pNode->setForPurgedata(TRUE);
			  $$ = pNode;
			  $$->setIsGhostObject(FALSE);
			  delete $2;
                        }
                     | TOK_ALTER TOK_VOLATILE TOK_TABLE volatile_ddl_qualified_name
                                alter_table_action
                                {
                                  $$ = $5 /*alter_table_action*/;
				  $$->setIsVolatile(TRUE);
				  
                                  $$->castToStmtDDLAlterTable()->
                                    setTableName(QualifiedName
                                                 (*$4 /*ddl_qualified_name*/, 
                                                  PARSERHEAP()));
                                  delete $4 /*ddl_qualified_name*/;
                                }

                     | TOK_MSCK
                       { 
                         // this is a Hive only syntax
                         SqlParser_CurrentParser->hiveDDLInfo_->
                           setValues(TRUE, StmtDDLonHiveObjects::MSCK_, 
                                     StmtDDLonHiveObjects::TABLE_);
                       }
                       TOK_REPAIR TOK_TABLE ddl_qualified_name
                       {
                         if (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_)
                           {
                             *SqlParser_Diags << DgSqlCode(-3242)
                                              << DgString0("Specified object must be a Hive object.");
                           }

                         $$ = NULL;
                         YYERROR;
                       }
                     | alter_table_start_tokens ddl_qualified_name TOK_RECOVER TOK_PARTITIONS
                       {
                         // this is a Hive only syntax
                         SqlParser_CurrentParser->hiveDDLInfo_->
                           setValues(TRUE, StmtDDLonHiveObjects::MSCK_, 
                                     StmtDDLonHiveObjects::TABLE_);

                         if (NOT SqlParser_CurrentParser->hiveDDLInfo_->foundDDL_)
                           {
                             *SqlParser_Diags << DgSqlCode(-3242)
                                              << DgString0("Specified object must be a Hive object.");
                           }
 
                         $$ = NULL;
                         YYERROR;
                       }

ghost : TOK_GHOST
                 {
                   // GHOST is allowed only if the flag ALLOW_SPECIALTABLETYPE is set,
                   // or the CQD ALLOW_GHOST_OBJECTS is set to 'ON'.
                   if ( ! Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE)
		        && ( CmpCommon::getDefault(ALLOW_GHOST_OBJECTS) == DF_OFF )
                      )
                   {
                     // Internal syntax: GHOST not allowed
                     yyerror(""); 
                     YYERROR; 
                   }
                 }

/* type boolean */
optional_ghost : empty
                 {
                   $$ = FALSE;
                 }
                 | ghost
                 {
                   $$ = TRUE;
                 }


/* type pStmtDDL */
alter_table_action : add_table_constraint_definition
                                {
                                  switch ($1->getOperatorType())
                                  {
                                  case ELM_CONSTRAINT_CHECK_ELEM :
                                    $$ = new (PARSERHEAP())
				      StmtDDLAddConstraintCheck($1);
                                    break;
                                  case ELM_CONSTRAINT_PRIMARY_KEY_ELEM :
                                    // Assumes that this case is only
                                    // used when the user specifies the
                                    // ALTER TABLE <table-name> ADD
                                    // CONSTRAINT statement to create a
                                    // Primary Key constraint which will
                                    // always be droppable regardless of
                                    // the value in the PRIMARY_KEY_
                                    // CONSTRAINT_DROPPABLE_OPTION in the
                                    // DEFAULTS table.
                                    $$ = new (PARSERHEAP())
				      StmtDDLAddConstraintPK($1,
                                       TRUE /* isAlwaysDroppable */);
                                    break;
                                  case
                                    ELM_CONSTRAINT_REFERENTIAL_INTEGRITY_ELEM :
                                    $$ = new (PARSERHEAP())
				      StmtDDLAddConstraintRI($1);
                                    break;
                                  case ELM_CONSTRAINT_UNIQUE_ELEM :
                                    $$ = new (PARSERHEAP())
				      StmtDDLAddConstraintUnique($1);
                                    break;
                                  default :
                                    ABORT("internal logic error");
                                    break;
                                  }
                                }

                      | drop_table_constraint_definition


                      | file_attribute_clause
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableAttribute(
                                       $1 /*file_attribute_clause*/);
                                }

                      | alter_table_disable_index_clause
                                {
                                  $$ = $1;
                                }

                      | alter_table_enable_index_clause
                                {
                                  $$ = $1;
                                }

                      | alter_table_column_clause
                                {
                                  // *** Error *** COLUMN clause
                                  // in ALTER TABLE statement
                                  // not yet supported.
                                  *SqlParser_Diags << DgSqlCode(-3032);
                                  $$ = $1;
                                }
								
                      | alter_table_move_clause
                                {
                                  // *** Error *** MOVE clause
                                  // in ALTER TABLE statement
                                  // not yet supported.
                                  *SqlParser_Diags << DgSqlCode(-3033);
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableMove($1);
                                }

                      | partition_definition
                                {
                                  // *** Error *** PARTITION clause
                                  // in ALTER TABLE statement
                                  // not yet supported.
				  *SqlParser_Diags << DgSqlCode(-3034);
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTablePartition($1);
                                }

                      | alter_table_rename_clause
                                {
                                  // *** ERROR[3035] message is now obsolete.
                                  // // *** Error *** RENAME clause
                                  // // in ALTER TABLE statement
                                  // // not yet supported.
				  // *SqlParser_Diags << DgSqlCode(-3035);
                                  $$ = $1;
                                }

                      | alter_table_set_constraint_clause
                                {
                                  // *** Error *** SET CONSTRAINT
                                  // clause in ALTER TABLE statement
                                  // not yet supported.
				  *SqlParser_Diags << DgSqlCode(-3036);
                                  $$ = $1;
                                }

		      | alter_table_disable_constraint_clause
				{
				  $$=$1;
				}

		      | alter_table_enable_constraint_clause
				{
				  $$ = $1;
				}

                      | alter_table_add_column_clause
                                {
                                  $$ = $1;
                                }

                     | alter_table_drop_column_clause
                                {
                                  $$ = $1;
                                }

		      | alter_table_alter_column_clause // for LOGGABLE
				{
				  $$ = $1;
				  
				}                               
		      | alter_table_alter_column_datatype
			{
      				$$ = $1;
			}
		      | alter_table_alter_column_rename
			{
      				$$ = $1;
			}
		      | alter_table_alter_column_default_value 
			{
      				$$ = $1;

			}
			
		      | alter_table_alter_column_set_sg_option 
			{
      				$$ = $1;

			}
                      | TOK_ALTER hbase_table_options
                        {
                                $$ = new (PARSERHEAP())
				  StmtDDLAlterTableHBaseOptions($2->castToElemDDLHbaseOptions());
                        }
			
                      | alter_stored_descriptor_option
                        {
                          $$ = new (PARSERHEAP()) StmtDDLAlterTableStoredDesc
                            ((StmtDDLAlterTableStoredDesc::AlterStoredDescType)$1);
                        }


/* type pStmtDDL */
alter_synonym_statement : TOK_ALTER TOK_SYNONYM ddl_qualified_name 
                          TOK_TO ddl_qualified_name
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterSynonym(
                                        *$3 /*ddl_qualified_name*/,
                                        *$5 /*ddl_qualified_name*/);
                                  delete $3 /*ddl_qualified_name*/;
                                  delete $5 /*ddl_qualified_name*/;
                               }
                               
/* type pStmtDDL */
drop_table_constraint_definition : TOK_DROP TOK_CONSTRAINT constraint_name
                                   optional_drop_index_behavior
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLDropConstraint (
                                      *$3, /* constraint name */
                                       $4  /* optional drop behavior */);
                                  delete $3;
                               }

/* type pElemDDL */
add_table_constraint_definition : TOK_ADD table_constraint_definition
                                {
                                  $$ = $2 /*table_constraint_definition*/;
                                }

/* type pStmtDDL */
alter_table_column_clause : TOK_COLUMN identifier heading
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableColumn(
                                       *$2 /*identifier (column name)*/,
                                        $3 /*heading*/,
                                       PARSERHEAP());
                                  delete $2;
                                }

// type pStmtDDL
alter_table_alter_column_datatype : TOK_ALTER TOK_COLUMN column_definition
				{
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableAlterColumnDatatype(
                                         $3 /* column definition */);
                                  restoreInferCharsetState();
				}


// type pStmtDDL
alter_table_alter_column_default_value : TOK_ALTER TOK_COLUMN column_name TOK_DEFAULT enableCharsetInferenceInColDefaultVal alter_col_default_clause_arg
				{
				  $$ = new (PARSERHEAP())
				       StmtDDLAlterTableAlterColumnDefaultValue(
						*$3, // column name
						 $6 /*alter_col_default_clause_arg*/);
                		       delete $3;
			       	       restoreInferCharsetState();
				}

// type pStmtDDL
alter_table_alter_column_rename : TOK_ALTER TOK_COLUMN column_name TOK_RENAME TOK_TO column_name
				{
				  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableAlterColumnRename(
                                         *$3,  // column name
                                         *$6); // renamed column name
                                  delete $3;
                                  delete $6;
                                  restoreInferCharsetState();
				}
				
// type pStmtDDL
alter_table_alter_column_set_sg_option : TOK_ALTER TOK_COLUMN column_name TOK_SET sequence_generator_options
				{
				  ElemDDLSGOptions *sgOptions = new (PARSERHEAP()) ElemDDLSGOptions(
				     1, /* SG_INTERNAL */
				     $5 /*sequence_generator_option_list*/);
                                       
				  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableAlterColumnSetSGOption(
				      *$3,        // column name
				      sgOptions  /* sequence generator options*/);
				      
				  delete $3;
				}
                             | TOK_ALTER TOK_COLUMN column_name reset_option
				{
				  ElemDDLSGOptions *sgOptions = new (PARSERHEAP()) ElemDDLSGOptions(
				     1, /* SG_INTERNAL */
				     $4 /*sequence_generator_option_list*/);
                                       
				  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableAlterColumnSetSGOption(
				      *$3,        // column name
				      sgOptions  /* sequence generator options*/);
				      
				  delete $3;
				}
				
/* type pElemDDL */
alter_col_default_clause_arg : literal
                               {
                                  $$ = new (PARSERHEAP())
                                    ElemDDLColDefault(
                                       ElemDDLColDefault::COL_DEFAULT,
                                       $1 /*literal*/);
                               }

// type pStmtDDL
alter_table_alter_column_clause : TOK_ALTER TOK_COLUMN column_name alter_column_type
								{
									$$ = new (PARSERHEAP())
										StmtDDLAlterTableAlterColumnLoggable(	
										*$3, // column name
										$4 // loggable
										);
									delete $3;

								}
// type boolean
alter_column_type : TOK_LOGGABLE
					{
						$$ = TRUE;	
					}
					| TOK_NOT TOK_LOGGABLE
					{
						$$ = FALSE;	
					}


/* type pElemDDL */
alter_table_move_clause : TOK_MOVE source_location_list TOK_TO
                                dest_location_list
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLAlterTableMove(
                                       $2 /*source_location_list*/,
                                       $4 /*dest_location_list*/);
                                }

/* type pStmtDDL */
alter_table_set_constraint_clause : TOK_SET constraints_keyword
                                constraint_name_list constraint_setting
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableSetConstraint(
                                       $3 /*constraint_name_list*/,
                                       $4 /*constraint_setting*/);
                                }

/* type tokval */
constraints_keyword : TOK_CONSTRAINT
                      | TOK_CONSTRAINTS

/* type pElemDDL */
constraint_name_list : constraint_simple_name
                      | constraint_name_list ',' constraint_simple_name
                                {
                                  $$ = new (PARSERHEAP())
				    ElemDDLConstraintNameList(
                                       $1 /*constraint_name_list*/,
                                       $3 /*constraint_simple_name*/);
                                }

/* type pElemDDL */
constraint_simple_name : qualified_name
                                {
				  if ($1->numParts() >
				      ShortStringSequence::MAX_SIMPLENAME_PARTS)
				    {
				      // ~String0 is an invalid simple name 
                                      *SqlParser_Diags << DgSqlCode(-3027) 
 				        << DgWString0(badNameFromStrings($1));
                                      delete $1;
				      YYABORT;
				    }
				  else
				    {
				      //
				      // note that qualifiedNameFromStrings()
				      // contains code that deletes $1
				      //
				      QualifiedName *qualName =
					qualifiedNameFromStrings($1);
				      if (qualName == NULL) YYABORT;
				      $$ = new (PARSERHEAP())
					     ElemDDLConstraintName(*qualName,
                                                                   PARSERHEAP());
				    }
                                }

/* type boolean */
constraint_setting : TOK_OFF
                                {
                                  $$ = FALSE;
                                }

                      | TOK_ON
                                {
                                  $$ = TRUE;
                                }

/* type pElemDDL */
source_location_list : location_list

/* type pElemDDL */
dest_location_list : location_list

/* type pElemDDL */
location_list : location_definition

/* type pStmtDDL */
alter_table_disable_index_clause : TOK_DISABLE TOK_ALL TOK_INDEXES
                                {
                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableDisableIndex(*tmp, 
                                                                  TRUE, FALSE);
                                  delete tmp;
                                }
                                |
                                TOK_DISABLE TOK_ALL TOK_UNIQUE TOK_INDEXES
                                {
                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableDisableIndex(*tmp, FALSE,
                                                                  TRUE);
                                  delete tmp;
                                }
                                |
                                TOK_DISABLE TOK_ALL TOK_INDEX
                                {
                                  NAString *tmp = new
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableDisableIndex(*tmp, TRUE, 
                                                                  FALSE);
                                  delete tmp;
                                }
                                |
                                TOK_DISABLE TOK_INDEX index_name 
                                {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableDisableIndex
                                    ( *$3, FALSE, FALSE);
                                  delete $3;
                                }

alter_table_enable_index_clause : TOK_ENABLE TOK_ALL TOK_INDEXES
                                {
                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableEnableIndex(*tmp, TRUE, 
                                                                 FALSE);
                                  delete tmp;
                                }
                                |
                                TOK_ENABLE TOK_ALL TOK_UNIQUE TOK_INDEXES
                                {
                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableEnableIndex(*tmp, FALSE,
                                                                 TRUE);
                                  delete tmp;
                                }
                                |
                                TOK_ENABLE TOK_ALL TOK_INDEX
                                {
                                  NAString *tmp = new
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableEnableIndex(*tmp, TRUE, 
                                                                 FALSE);
                                  delete tmp;
                                }
                                |
                                TOK_ENABLE TOK_INDEX index_name 
                                {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableEnableIndex
                                    ( *$3, FALSE, FALSE);
                                  delete $3;
                                }

alter_table_rename_clause : TOK_RENAME TOK_TO identifier optional_cascade optional_skip_view_check
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLAlterTableRename
                                      ( *$3 // identifier (new name)
                                      ,  $4 // optional_cascade
                                      ,  $5 // optional_skip_view_check
                                      );
                                  delete $3; // identifier
                                }

/* type pStmtDDL */
alter_table_disable_constraint_clause : TOK_DISABLE TOK_ALL TOK_CONSTRAINTS
                                {
                                  YYERROR; // not yet supported.

                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableToggleConstraint(*tmp, TRUE, TRUE, FALSE);
                                  delete tmp;
                                }
                                |
                                TOK_DISABLE TOK_CONSTRAINT constraint_name
                                {
                                  YYERROR; // not yet supported

                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableToggleConstraint( *$3, FALSE, TRUE, FALSE);
                                  delete $3;
                                }

/* type pStmtDDL */
alter_table_enable_constraint_clause : TOK_ENABLE TOK_ALL TOK_CONSTRAINTS optional_validate_clause
                                {
                                  YYERROR; // not yet supported.

                                  NAString *tmp = new 
                                     (PARSERHEAP()) NAString((""),PARSERHEAP());
                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableToggleConstraint(*tmp, TRUE, FALSE, $4);
                                  delete tmp;
                                }
                                |
                                TOK_ENABLE TOK_CONSTRAINT constraint_name optional_validate_clause
                                {
                                  YYERROR; // not yet supported

                                  $$ = new (PARSERHEAP())
                                    StmtDDLAlterTableToggleConstraint( *$3, FALSE, FALSE, $4);
                                  delete $3;
                                }

optional_validate_clause : empty
                     { $$ = TRUE; }
                   | TOK_VALIDATE
                     { $$ = TRUE; }
                   | TOK_NO TOK_VALIDATE
                     { $$ = FALSE; }

/* type pStmtDDL */
alter_table_add_column_clause : TOK_ADD optional_col_keyword 
                                  column_definition
                                  {
                                   StmtDDLAlterTableAddColumn *pNode = 
                                     new (PARSERHEAP())
                                     StmtDDLAlterTableAddColumn( 
                                      $3 /* column_definition */);
                                   $$ = pNode;
                                }
alter_table_add_column_clause : TOK_ADD TOK_IF TOK_NOT TOK_EXISTS optional_col_keyword
                                  column_definition
                                  {
                                   StmtDDLAlterTableAddColumn *pNode = 
                                     new (PARSERHEAP())
                                     StmtDDLAlterTableAddColumn( 
                                      $6 /* column_definition */);
				   pNode->setAddIfNotExists(TRUE);
                                   $$ = pNode;
                                }

/* type tokval */
optional_col_keyword : empty
                     | TOK_COLUMN

/* type pStmtDDL */
alter_table_drop_column_clause : TOK_DROP optional_col_keyword
                                  column_name
                                  {
                                   StmtDDLAlterTableDropColumn *pNode = 
                                     new (PARSERHEAP())
                                     StmtDDLAlterTableDropColumn( 
                                      *$3 /* column_name */);
                                   $$ = pNode;
                                  }

alter_table_drop_column_clause : TOK_DROP optional_col_keyword TOK_IF TOK_EXISTS column_name
                                  {
                                   StmtDDLAlterTableDropColumn *pNode = 
                                     new (PARSERHEAP())
                                     StmtDDLAlterTableDropColumn( 
                                      *$5 /* column_name */);
				   pNode->setDropIfExists(TRUE);
                                   $$ = pNode;
                                  }

/* type uint */
alter_stored_descriptor_option : TOK_GENERATE TOK_STORED TOK_DESCRIPTOR
              {
                $$ = (Int32)StmtDDLAlterTableStoredDesc::GENERATE;
              }
              | TOK_CHECK TOK_STORED TOK_DESCRIPTOR
              {
                $$ = (Int32)StmtDDLAlterTableStoredDesc::CHECK;
              }
              | TOK_DELETE TOK_STORED TOK_DESCRIPTOR
              {
                $$ = (Int32)StmtDDLAlterTableStoredDesc::DELETE;
              }
              | TOK_ENABLE TOK_STORED TOK_DESCRIPTOR
              {
                $$ = (Int32)StmtDDLAlterTableStoredDesc::ENABLE;
              }
              | TOK_DISABLE TOK_STORED TOK_DESCRIPTOR
              {
                $$ = (Int32)StmtDDLAlterTableStoredDesc::DISABLE;
              }


/* type pStmtDDL */

drop_sql : TOK_DROP TOK_SQL extension_drop_behavior
                               {
                                  $$ = new (PARSERHEAP()) StmtDDLDropSQL($3);
                               }
/* type pStmtDDL */

drop_module : TOK_DROP TOK_MODULE module_name
                              {
                                  QualifiedName *modName = qualifiedNameFromStrings($3);
				  // note that qualifiedNameFromStrings()
				  // contains code that deletes $3
	                          if (!modName) YYERROR;
                                  $$ = new (PARSERHEAP()) StmtDDLDropModule(*modName);
                              }



/* type pStmtDDL */
drop_synonym_stmt : TOK_DROP TOK_SYNONYM ddl_qualified_name
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLDropSynonym(
                                        *$3 /*ddl_qualified_name*/);
                                  delete $3 /*ddl_qualified_name*/;
                               }
                               
/* type pStmtDDL */
drop_exception_stmt : TOK_DROP TOK_EXCEPTION TOK_TABLE ddl_qualified_name TOK_ON
                               ddl_qualified_name optional_cleanup
                               optional_drop_behavior optional_logfile
                               {
                                 /* If LOG option specified, */
                                 /* Either ALLOW_SPECIALTABLETYPE or CQD IS_DB_TRANSPORTER */
                                 /* must also be specified  */
                                 if ($9)
                                 {
                                     CHECK_DBTRANSPORTER ;
                                 }
                                 NAString *pLogFile = NULL;
                                 if ($9)
                                    pLogFile =new (PARSERHEAP()) NAString
                                                   ( $9->data(), PARSERHEAP());

                                 $$ = new (PARSERHEAP())
                                 StmtDDLDropExceptionTable(
                                       *$4 /*ddl_qualified_name*/,
                                       *$6 /*ddl_qualified_name*/,
                                        $8   /*optional_drop_behavior*/,
                                        $7 /*for CLEANUP mode set to TRUE*/,
                                         pLogFile  /*log_file_name*/                                  
                                 );
                                 delete $4 /*ddl_qualified_name*/;
                                 delete $6 /*ddl_qualified_name*/;
                                 delete $9 /*log_file_name*/;
                               }    
                               
/* type pStmtDDL */                             
drop_all_exception_stmt : TOK_DROP TOK_ALL TOK_EXCEPTION TOK_TABLES TOK_ON
                               ddl_qualified_name optional_cleanup
                               optional_drop_behavior optional_logfile
                               {
                                 /* If LOG option specified, */
                                 /* Either ALLOW_SPECIALTABLETYPE or CQD IS_DB_TRANSPORTER */
                                 /* must also be specified  */
                                 if ($9)
                                 {
                                     CHECK_DBTRANSPORTER ;
                                 }
                                 NAString *pLogFile = NULL;
                                 if ($9)
                                    pLogFile =new (PARSERHEAP()) NAString
                                                   ( $9->data(), PARSERHEAP());

                                 $$ = new (PARSERHEAP())
                                 StmtDDLDropExceptionTable(
                                       *$6 /*ddl_qualified_name*/,
                                        $8 /*optional_drop_behavior*/,
                                        $7 /*for CLEANUP mode set to TRUE*/,
                                         pLogFile  /*log_file_name*/                                  
                                 );
                                 delete $6 /*ddl_qualified_name*/;
                                 delete $9 /*log_file_name*/;
                               }                                                                                             
                                                                                        
/* type pStmtDDL */
drop_table_statement : TOK_DROP special_table_name optional_drop_behavior
               {
                 StmtDDLDropTable *pNode =
                   new (PARSERHEAP())
                     StmtDDLDropTable(
                                      $2->getQualifiedNameObj() /*table_name*/,
                                      $3 /*optional_drop_behavior*/ );
                 pNode->setTableType($2->getSpecialType());
                 $$ = pNode;
                 delete $2 /*table_name*/;
               }

               | drop_table_start_tokens  ddl_qualified_name optional_cleanup
                 optional_drop_invalidate_dependent_behavior 
               {
                   $$ = new (PARSERHEAP())
                   StmtDDLDropTable(
                                    *$2  /*ddl_qualified_name*/,
                                    $4   /*optional_drop_invalidate_dependent_behavior*/,
                                    $3   /*for CLEANUP mode set to TRUE*/,
                                    FALSE, /* validate option - to be obsoleted*/
                                    NULL  /*log_file_name - to be obsoleted*/);
                   // $1: 0 - regular table, 1 - ghost table, 2 - regular table IF EXISTS,
                   //     3 - external table, 4 - external table IF EXISTS
                   if ($1 == 1)  /*ghost*/
                   {
                     $$->setIsGhostObject(TRUE);
                     $$->castToStmtDDLDropTable()->setTableType(ExtendedQualName::GHOST_TABLE);
                   }

                  if ($1 == 3 || $1 == 4)
                     $$->castToStmtDDLDropTable()->setIsExternal(TRUE);

                  if ($1 == 5 || $1 == 6)
                     $$->castToStmtDDLDropTable()->setIsExternal(TRUE);

                   if ($1 == 2 || $1 == 4 || $1 == 6)
                     {
                       $$->castToStmtDDLDropTable()->setDropIfExists(TRUE);
                     }

                   delete $2 /*ddl_qualified_name*/;

                 }
                  | TOK_DROP TOK_VOLATILE TOK_TABLE volatile_ddl_qualified_name
                                optional_cleanup optional_drop_behavior
				{
				  StmtDDLDropTable *pNode = 
				    new (PARSERHEAP())
				    StmtDDLDropTable(
					 *$4 /*ddl_qualified_name*/,
					 $6 /*optional_drop_behavior*/,
					 $5 /*optional cleanup*/,
					 FALSE, NULL);
				  pNode->setIsVolatile(TRUE);
				  pNode->setProcessAsExeUtil(TRUE);
				  pNode->synthesize();
				  delete $4 /*ddl_qualified_name*/;
				  $$ = pNode;
				}

                  | TOK_DROP TOK_LOCAL TOK_TEMPORARY TOK_TABLE volatile_ddl_qualified_name
                                optional_cleanup optional_drop_behavior
				{
				  StmtDDLDropTable *pNode = 
				    new (PARSERHEAP())
				    StmtDDLDropTable(
					 *$5 /*ddl_qualified_name*/,
					 $7 /*optional_drop_behavior*/,
					 $6 /*optional cleanup*/,
					 FALSE, NULL);
				  pNode->setIsVolatile(TRUE);
				  pNode->setProcessAsExeUtil(TRUE);
				  pNode->synthesize();
				  delete $5 /*ddl_qualified_name*/;
				  $$ = pNode;
				}
               | TOK_DROP TOK_HBASE TOK_TABLE identifier
                 {
		   QualifiedName qn(*$4);

		   StmtDDLDropHbaseTable *pNode =
		     new (PARSERHEAP())
		     StmtDDLDropHbaseTable(
					   qn /*ddl_qualified_name*/);
		   
		   $$ = pNode;
		 }
               | drop_table_start_tokens identifier TOK_FOR ddl_qualified_name
                 optional_cleanup optional_drop_behavior
                 {
                   // TBD: currently the syntax ignores identifier.  The drop
                   // code assumes the identifier is the same as the third part
                   // of the ddl_qualified_name. We may allow them to be 
                   // different in the future.  
                   $$ = new (PARSERHEAP())
                   StmtDDLDropTable(
                                    *$4  /*ddl_qualified_name*/,
                                    $6   /*optional_drop_invalidate_dependent_behavior*/,
                                    $5   /*for CLEANUP mode set to TRUE*/,
                                    FALSE, /* validate option - to be obsoleted*/
                                    NULL  /*log_file_name - to be obsoleted*/);
                   // $1: 0 - regular table, 1 - ghost table, 2 - regular table IF EXISTS,
                   //     3 - external table, 4 - external table IF EXISTS
                   if ($1 == 3 || $1 == 4)
                     $$->setIsExternal(TRUE);
                   if ($1 == 4)
                     $$->castToStmtDDLDropTable()->setDropIfExists(TRUE);
                      
                   delete $2 /*identifier*/;
                   delete $4 /*ddl_qualified_name*/;
                 }


// It took some care to avoid introducing a shift/reduce conflict for DROP GHOST TABLE.
// See the shift/reduce case study near the beginning of this file.

/* type uint */
drop_table_start_tokens : TOK_DROP TOK_TABLE
                   {
                     $$ = 0;

                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::DROP_, StmtDDLonHiveObjects::TABLE_);
                   }
                  | TOK_DROP ghost TOK_TABLE
                   {
                     $$ = 1;
                   }
                  | TOK_DROP TOK_TABLE TOK_IF TOK_EXISTS
                   {
                     $$ = 2;

                     SqlParser_CurrentParser->hiveDDLInfo_->
                       setValues(TRUE, StmtDDLonHiveObjects::DROP_, StmtDDLonHiveObjects::TABLE_, TRUE);
                   }
                  | TOK_DROP TOK_EXTERNAL TOK_TABLE 
                   {
                     $$ = 3;
                   }
                  | TOK_DROP TOK_EXTERNAL TOK_TABLE TOK_IF TOK_EXISTS
                  {
                    SqlParser_CurrentParser->hiveDDLInfo_->ifExistsOrNotExists_ = TRUE;
                     $$ = 4;
                   }

/* type pStmtDDL */
// MV - RG
drop_mvrgroup_statement : TOK_DROP TOK_MVGROUP ddl_qualified_name
{
  *SqlParser_Diags << DgSqlCode(-3131);
  YYERROR;

  $$ = new (PARSERHEAP())StmtDDLDropMvRGroup(*$3);
  delete $3;
}

/* type pStmtDDL */
drop_trigger_statement : TOK_DROP TOK_TRIGGER ddl_qualified_name 
                         optional_cleanup optional_validate optional_logfile
                {
                  *SqlParser_Diags << DgSqlCode(-3131);
                  YYERROR;

                  /* If VALIDATE, or LOG option specified, */
                  /* ALLOW_SPECIALTABLETYPE must also be specified  */
                  if (($5 || $6) &&
                     !Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
                    yyerror(""); YYERROR; /*internal syntax only!*/
                  }
                  else
                  {
                    NAString *pLogFile = NULL;
                    if ($6)
                      pLogFile =new (PARSERHEAP()) NAString
                        ( $6->data(), PARSERHEAP());
                    $$ = new (PARSERHEAP())
                      StmtDDLDropTrigger(
                                         *$3  /*ddl_qualified_name*/,
                                          $4 /*for CLEANUP mode set to TRUE*/,
                                          $5 /*for VALIDATE mode set to FALSE*/,
                                          pLogFile  /*log_file_name*/);
                    delete $3 /*ddl_qualified_name*/;
                    delete $6 /*log_file_name*/;
                   }
                 }

/* type pStmtDDL */
drop_mv_statement : TOK_DROP optional_ghost mv_token ddl_qualified_name optional_cleanup
                    optional_drop_behavior optional_validate optional_logfile
                {
                  *SqlParser_Diags << DgSqlCode(-3131);
                  YYERROR;

                  /* If VALIDATE, or LOG option specified, */
                  /* ALLOW_SPECIALTABLETYPE must also be specified  */
                  if (($7 || $8) &&
                     !Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
                     yyerror(""); YYERROR; /*internal syntax only!*/
                  }
                  else
                  {
                    NAString *pLogFile = NULL;
                    if ($8)
                      pLogFile =new (PARSERHEAP()) NAString
                        ( $8->data(), PARSERHEAP());

                    $$ = new (PARSERHEAP())
		    StmtDDLDropMV(
                                  *$4  /*ddl_qualified_name*/,
                                   $6   /*optional_drop_behavior*/,
                                   $5 /*for CLEANUP mode set to TRUE*/,
                                   $7 /*for VALIDATE mode set to FALSE*/,
                                   pLogFile  /*log_file_name*/);
                    if ($2) /*optional_ghost*/
                      $$->setIsGhostObject(TRUE);
                    delete $4 /*ddl_qualified_name*/;
                    delete $8 /*log_file_name*/;
                  }
                }

/* type pStmtDDL */
drop_index_statement : TOK_DROP optional_ghost TOK_INDEX ddl_qualified_name optional_cleanup
                       optional_drop_index_behavior optional_validate optional_logfile
               {
                 /* If VALIDATE, or LOG option specified, */
                 /* ALLOW_SPECIALTABLETYPE must also be specified  */
                 if (($7 || $8) &&
                    !Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                 {
                   yyerror(""); YYERROR; /*internal syntax only!*/
                 }
                 else
                 {
                   NAString *pLogFile = NULL;
                   if ($8)
                     pLogFile = new (PARSERHEAP()) NAString
                       ( $8->data(), PARSERHEAP());
                   $$ = new (PARSERHEAP())
		   StmtDDLDropIndex(
                                    *$4  /*ddl_qualified_name*/,
                                    $6   /*optional_drop_behavior*/,
                                    $5 /*for CLEANUP mode set to TRUE*/,
                                    $7 /*for VALIDATE mode set to FALSE*/,
                                    pLogFile  /*log_file_name*/);
                   if ($2) /*optional_ghost*/
                     $$->setIsGhostObject(TRUE);
                   delete $4 /*ddl_qualified_name*/;
                   delete $8 /*log_file_name*/;
                 }
               }

/* type routineTypeEnum */
drop_routine_type_tokens : TOK_FUNCTION { $$ = COM_UNKNOWN_ROUTINE_TYPE; }
                         | TOK_SCALAR TOK_FUNCTION { $$ = COM_SCALAR_UDF_TYPE; }
                         | table_mapping_function_tokens
                         | universal_function_tokens
                         | TOK_PROCEDURE { $$ = COM_PROCEDURE_TYPE; }

/* type pStmtDDL */
drop_routine_statement : TOK_DROP drop_routine_type_tokens optional_if_exists_clause
                         ddl_qualified_name
                         optional_cleanup  optional_drop_behavior
                         optional_validate optional_logfile
                {
                  $$ = SqlParserAux_buildDropRoutine
                    ( $2  // in - ComRoutineType drop_routine_type_tokens
                    , $4  // in - QualifiedName * ddl_qualified_name of routine - deep copy
                    , $5  // in - NABoolean       optional_cleanup
                    , $6  // in - ComDropBehavior optional_drop_behavior
                    , $7  // in - NABoolean       optional_validate
                    , $8  // in - NAString      * optional_logfile              - deep copy
                    , $3  // in - NABoolean       optional_if_exists_clause
                    );
                  delete $4; // ddl_qualified_name of routine
                  if ($8) delete $8; // optional_logfile
                  if ($$ EQU NULL) { yyerror(""); YYERROR; } // Error: internal syntax only!
                }

/* type pStmtDDL */
drop_view_statement : TOK_DROP TOK_VIEW optional_if_exists_clause 
                        {
                          SqlParser_CurrentParser->hiveDDLInfo_->
                            setValues(TRUE, StmtDDLonHiveObjects::DROP_, StmtDDLonHiveObjects::VIEW_, $3);
                        }
                      ddl_qualified_name optional_cleanup
                      optional_drop_invalidate_dependent_behavior optional_validate optional_logfile
                {
                  /* If VALIDATE, or LOG option specified, */
                  /* ALLOW_SPECIALTABLETYPE must also be specified  */
                  if (($8 || $9) &&
                     !Get_SqlParser_Flags(ALLOW_SPECIALTABLETYPE))
                  {
                    yyerror(""); YYERROR; /*internal syntax only!*/
                  }
                  else
                  {
                    NAString *pLogFile = NULL;
                    if ($9)
                      pLogFile = new (PARSERHEAP()) NAString
                        ( $9->data(), PARSERHEAP());
                    StmtDDLDropView * dropView = new (PARSERHEAP())
                      StmtDDLDropView(
                                    *$5  /*ddl_qualified_name*/,
                                    $7   /*optional_drop_invalidate_dependent_behavior*/,
                                    $6 /*for CLEANUP mode set to TRUE*/,
                                    $8 /*for VALIDATE mode set to FALSE*/,
                                    pLogFile  /*log_file_name*/);

                    if ($3)
                      {
                        dropView->setDropIfExists(TRUE);
                      }

                    delete $5 /*ddl_qualified_name*/;
                    delete $9 /*log_file_name*/;
                    $$ = dropView;
                  }
                }

drop_index_statement : TOK_DROP TOK_VOLATILE TOK_INDEX volatile_ddl_qualified_name
		       optional_drop_behavior
                               {
				  StmtDDLDropIndex *pNode = new (PARSERHEAP())
				    StmtDDLDropIndex(
                                        *$4, /*ddl_qualified_name*/
					 $5  /* optional drop behavior */);
				  pNode->setIsVolatile(TRUE);
				  pNode->synthesize();
				  //pNode->setProcessAsExeUtil(TRUE);

				  $$ = pNode;
                                  delete $4 /*ddl_qualified_name*/;
                                }


/* type pStmtDDL */				
revoke_schema_statement: TOK_REVOKE optional_grant_option_for privileges
				TOK_ON TOK_SCHEMA schema_name TOK_FROM
				grantee_list optional_drop_behavior
                                optional_granted_by
			  {		
				  $$ = new (PARSERHEAP())
				    StmtDDLSchRevoke(
					  $2 /*optional_grant_option_for*/,
					  $3 /*schema_privileges*/,
					 *$6 /*schema_name*/,
					  $8 /*grantee_list*/,
					  $9 /*optional_drop_behavior*/,
                                          $10 /*optional_granted_by*/);
				  delete $6  /*schema_name*/;				    
			  }	                                

/* type pStmtDDL */
revoke_component_privilege_stmt : TOK_REVOKE optional_grant_option_for TOK_COMPONENT privilege_or_privileges_token
                                             component_privilege_name_list TOK_ON component_name
                                             TOK_FROM authorization_identifier_or_public
                                             optional_drop_behavior optional_granted_by
                                {
                                  // revoke_component_privilege_stmt ::=
                                  //   TOK_REVOKE optional_grant_option_for TOK_COMPONENT privilege_or_privileges_token
                                  //              component_privilege_name_list TOK_ON component_name
                                  //              TOK_FROM authorization_identifier
                                  $$ = new(PARSERHEAP())
                                    StmtDDLRevokeComponentPrivilege
                                    ( $5  // component_privilege_name_list - shallow copy
                                    , *$7 // component_name - deep copy
                                    , *$9 // authorization_identifier - a.k.a. user_role_name - deep copy
                                    , $2  // optional_grant_option_for - NABoolean
                                    , $11 // optional granted by
                                    , PARSERHEAP()
                                    );
                                  // cannot delete $5 - component_privilege_name_list - shallow copy
                                  delete $7; // component_name
                                  delete $9; // authorization_identifier - a.k.a. user_role_name
                                }

/* type pStmtDDL */
revoke_statement : TOK_REVOKE optional_grant_option_for privileges
                                TOK_ON ddl_object_name optional_action TOK_FROM
                                grantee_list optional_drop_behavior
                                optional_granted_by
                                {
                                  $$ = new (PARSERHEAP())
				    StmtDDLRevoke(
                                         $2 /*optional_grant_option_for*/,
					 $3 /*privileges*/,
                                        *$5 /*ddl_object_name*/,
                                         $8 /*grantee_list*/,
                                         $9 /*optional_drop_behavior*/,
                                         $10 /*optional_granted_by*/,
                                         $6 /*optional_action*/);
                                  delete $5 /*ddl_object_name*/;
                                }                
/* type boolean */
optional_grant_option_for : empty
                                {
                                  $$ = FALSE;
                                }

                      | grant_option_for

/* type boolean */
grant_option_for : TOK_GRANT TOK_OPTION TOK_FOR
                                {
                                  $$ = TRUE;
                                }


/* type pStmtDDL */
drop_catalog_statement : TOK_DROP TOK_CATALOG catalog_name extension_drop_behavior
                                {
				  $$ = new (PARSERHEAP())
				    StmtDDLDropCatalog(
					*$3 /*identifier (catalog name)*/,
                     $4 /*extension_drop_behavior*/);
				  delete $3 /*identifier*/;
                                }

/*ALTER USER*/
alter_user_statement :  TOK_ALTER TOK_USER authorization_identifier 
                        TOK_SET TOK_EXTERNAL TOK_NAME external_user_identifier
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLAlterUser(
                                        *$3 /*databaseUsername*/, 
                                        StmtDDLAlterUser::SET_EXTERNAL_NAME,
                                        $7 /*externalUsername*/,
                                        TRUE /*isValidUser*/,
                                        PARSERHEAP()); 
                                  delete $3;
                                }
			  |
                          
                        TOK_ALTER TOK_USER authorization_identifier 
                        TOK_SET TOK_ONLINE
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLAlterUser(
                                        *$3 /*databaseUsername*/, 
                                        StmtDDLAlterUser::SET_IS_VALID_USER,
                                        NULL /*externalUsername*/,
                                        TRUE /*isValidUser*/,
                                        PARSERHEAP()); 
                                  delete $3;
                                }
			  |
                          
                        TOK_ALTER TOK_USER authorization_identifier 
                        TOK_SET TOK_OFFLINE
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLAlterUser(
                                        *$3 /*databaseUsername*/, 
                                        StmtDDLAlterUser::SET_IS_VALID_USER,
                                        NULL /*NOT USED: externalUsername*/,
                                        FALSE /*isValidUser*/,
                                        PARSERHEAP()); 
                                  delete $3;
                                }

/* type pStmtDDL */
register_component_statement : TOK_REGISTER TOK_COMPONENT component_name optional_system optional_component_detail_clause
                                {
                                  // register_component_statement ::= TOK_REGISTER TOK_COMPONENT component_name
                                  //                                               optional_component_detail_clause
                                  $$ = new (PARSERHEAP())
                                    StmtDDLRegisterComponent
                                    ( StmtDDLRegisterComponent::REGISTER_COMPONENT
                                    , *$3  // component_name - deep copy
                                    , $4   // optional_system
                                    , *$5  // optional_component_detail_clause - deep copy
                                    , PARSERHEAP()
                                    );
                                  delete $3; // component_name
                                  delete $5; // optional_component_detail_clause
                                }
/* type stringval */
optional_component_detail_clause : empty
                                {
                                  // optional_register_component_detail_clause ::= empty
                                  $$ = new(PARSERHEAP()) NAString(PARSERHEAP()); // an empty string
                                }
                   | TOK_DETAIL component_str_lit
                                {
                                  // optional_register_component_detail_clause ::= TOK_DETAIL std_char_string_literal
                                  if ($2/*component_str_lit*/->length() > ComMAX_COMPONENT_DETAIL_STRING_LEN_IN_BYTES)
                                  {
                                    // $0~string0 is too long (longer than $1~int1 $2~string1).
                                    // Component detail text is too long (longer than 80 bytes).
                                    *SqlParser_Diags << DgSqlCode(-3301)
                                                     << /*subst0*/ DgString0("Component detail text")
                                                     << /*subst1*/ DgInt0(ComMAX_COMPONENT_DETAIL_STRING_LEN_IN_BYTES)
                                                     << /*subst2*/ DgString1("bytes");
                                    YYERROR;
                                  }
                                  $$ = $2; // component_str_lit
                                }
/* type stringval */
component_str_lit : std_char_string_literal
                                {
                                  // component_str_lit ::= std_char_string_literal
                                  NAString *pCStr = NULL;
                                  if (getStringCharSet(&$1) == CharInfo::ISO88591)
                                  {
                                    pCStr = new(PARSERHEAP()) NAString(*$1, PARSERHEAP()); // std_char_string_literal - deep copy
                                  }
                                  else
                                  {
                                    pCStr = charToChar ( (Lng32)CharInfo::ISO88591    // targetCS
                                                       , $1->data()                   // const char *s - std_char_string_literal
                                                       , $1->length()                 // Int32 sLenInBytes
                                                       , (Lng32)getStringCharSet(&$1) // sourceCS
                                                       , PARSERHEAP()                 // heap for allocated target string
                                                       );
                                    if (pCStr == NULL) // conversion failed
                                    {
                                      YYERROR;
                                    }
                                  }
                                  if (NOT NAStringHasOnly7BitAsciiChars(*pCStr))
                                  {
                                    YYERROR;
                                  }
                                  // No length limit checking here please
                                  NAStringUpshiftASCII(*pCStr);
                                  $$ = pCStr;
                                  delete $1; // std_char_string_literal
                                }
/* type pStmtDDL */
/*REGISTER USER*/
register_user_statement : TOK_REGISTER TOK_USER external_user_identifier
                             optional_as_auth_clause optional_schema_clause
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLRegisterUser(
                                        *$3 /*external_user*/, 
                                        $4 /*auth_id*/,
                                        $5 /*schema clause*/,
                                        PARSERHEAP()); 
                                  delete $3;
                                }

/* type pElemDDL */
optional_schema_clause : empty
                         {
                           $$ = NULL;
                         }
                         /*TODO: Increases shift/reduce conflicts
                         | schema_class TOK_SCHEMA schema_name
                         {
	     	           $$ = new (PARSERHEAP()) ElemDDLAuthSchema(*$3, $1, PARSERHEAP());
                             if ($3 != NULL)
                                delete $3;
                         }
                         */
                         | schema_class TOK_SCHEMA 
                         {
	     	           $$ = new (PARSERHEAP()) ElemDDLAuthSchema($1, PARSERHEAP());
                         }
                     
/* type pStmtDDL */
unregister_component_statement : TOK_UNREGISTER TOK_COMPONENT component_name optional_drop_behavior
                                {
                                  // unregister_component_statement ::= TOK_UNREGISTER TOK_COMPONENT component_name
                                  $$ = new (PARSERHEAP())
                                    StmtDDLRegisterComponent
                                    ( StmtDDLRegisterComponent::UNREGISTER_COMPONENT
                                    , *$3 // component_name - deep copy
                                    , $4  // drop behavior
                                    , PARSERHEAP()
                                    );
                                  delete $3; // component_name
                                }
/* type pStmtDDL */
/*UNREGISTER USER*/
unregister_user_statement : TOK_UNREGISTER TOK_USER external_user_identifier
                             optional_drop_behavior
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLRegisterUser(
                                        *$3 /*auth_id*/,
                                        $4 /*drop_behavior*/,
                                        PARSERHEAP());
                                  delete $3;
                                }

/* type stringval */
as_auth_clause : TOK_AS authorization_identifier
                     {
                        $$ = $2;
                     }

/* type stringval */
optional_as_auth_clause : empty
                     {
                        $$ = NULL;
                     }
                     | as_auth_clause

// type stringval - a guardian style system name having the form: "\FIGARO".
nsk_node_name: BACKSLASH_SYSTEM_NAME 
               {
                NAString *nodeName = new (PARSERHEAP())
                                          NAString(($1)->data(), PARSERHEAP() );
                if ((nodeName->index("\\", 0, NAString::ignoreCase)) != 0 ||
                    nodeName->length() > 8 || nodeName->length() < 2 )
                {
                  *SqlParser_Diags << DgSqlCode(-3127)
                                   << DgString0(nodeName->data());
                  YYERROR;
                }
                $$ = nodeName;
                delete $1;
               }

/* type pStmtDDL */
// Syntax: 
// register [internal] hive {table|view|schema} 
//          [if not exists] <obj-name> [cascade]
//
register_hive_statement : TOK_REGISTER optional_internal_clause TOK_HIVE object_identifier optional_if_not_registered_clause ddl_qualified_name optional_cascade
                          {
                            if (NOT ((*$4 == "TABLE") ||
                                     (*$4 == "VIEW") ||
                                     (*$4 == "SCHEMA")))
                              {
                                YYERROR;
                              }
      
                            if ($7 && (*$4 != "VIEW"))
                              {
                                YYERROR;
                              }

                            $$ = new (PARSERHEAP())
                              StmtDDLRegOrUnregObject(
                                   *$6,
                                   StmtDDLRegOrUnregObject::HIVE,
                                   TRUE, // register
                                   (*$4 == "TABLE" ? COM_BASE_TABLE_OBJECT
                                    : (*$4 == "VIEW" ? COM_VIEW_OBJECT
                                       : COM_SHARED_SCHEMA_OBJECT)),
                                   $5, // if not exists?
                                   $2, // is internal registration?
                                   $7, // is cascade?
                                   FALSE,
                                   PARSERHEAP());
                            delete $6;
                          }

// Syntax: 
// unregister [internal] hive {table|view|schema} 
//            [if exists] <obj-name> [cascade]
//
unregister_hive_statement : TOK_UNREGISTER optional_internal_clause TOK_HIVE object_identifier optional_if_registered_clause ddl_qualified_name optional_cascade optional_cleanup
                              {
                                if (NOT ((*$4 == "TABLE") ||
                                         (*$4 == "VIEW") ||
                                         (*$4 == "SCHEMA")))
                                  {
                                    YYERROR;
                                  }
                                
                                if ($7 &&
                                    (*$4 != "VIEW"))
                                  {
                                    YYERROR;
                                  }
                                
                                $$ = new (PARSERHEAP())
                                  StmtDDLRegOrUnregObject(
                                       *$6,
                                       StmtDDLRegOrUnregObject::HIVE,
                                       FALSE, // unregister
                                       (*$4 == "TABLE" ? COM_BASE_TABLE_OBJECT
                                        : (*$4 == "VIEW" ? COM_VIEW_OBJECT
                                           : COM_SHARED_SCHEMA_OBJECT)),
                                       $5, // if exists?
                                       $2, // is internal unregister?
                                       $7, // is cascade?
                                       $8, // is cleanup?
                                       PARSERHEAP());
                                delete $6;
                              }

/* type pStmtDDL */
// Syntax: register [internal] hbase table [if not exists] <table-name> 
register_hbase_statement : TOK_REGISTER optional_internal_clause TOK_HBASE TOK_TABLE optional_if_not_registered_clause ddl_qualified_name
                          {
                            StmtDDLRegOrUnregObject *pNode = new (PARSERHEAP())
                              StmtDDLRegOrUnregObject(
                                   *$6,
                                   StmtDDLRegOrUnregObject::HBASE,
                                   TRUE, // register
                                   COM_BASE_TABLE_OBJECT,
                                   $5, // if not exists?
                                   $2, // is internal registration?
                                   FALSE,
                                   FALSE,
                                   PARSERHEAP());

                            $$ = pNode;
                            delete $6;
                          }

/* type pStmtDDL */
// Syntax: unregister [internal] hbase table [if exists] <table-name>
unregister_hbase_statement : TOK_UNREGISTER optional_internal_clause TOK_HBASE TOK_TABLE optional_if_registered_clause ddl_qualified_name optional_cleanup
                              {
                                $$ = new (PARSERHEAP())
                                  StmtDDLRegOrUnregObject(
                                       *$6,
                                       StmtDDLRegOrUnregObject::HBASE,
                                       FALSE, // unregister
                                       COM_BASE_TABLE_OBJECT,
                                       $5, // if exists?
                                       $2, // is internal unregister?
                                       FALSE,
                                       $7, // is cleanup?
                                       PARSERHEAP());
                                delete $6;
                              }

/* type boolean */
optional_internal_clause : empty
                  {
                    $$ = FALSE;
                  }
                  | TOK_INTERNAL
                  {
		    $$ = TRUE;
		  }

/*CREATE ROLE*/
create_role_statement : TOK_CREATE TOK_ROLE authorization_identifier
                             optional_with_admin_clause
                                {
                                  $$ = new (PARSERHEAP())
                                  StmtDDLCreateRole(
                                        *$3 /* role name */,
                                        $4 /* grantor/owner is null if not specified or CURRENT_USER is specified*/,
                                        PARSERHEAP());
                                  delete $3;
                                }

/* type pElemDDL */
optional_with_admin_clause : empty
                     {
                        $$ = NULL;
                     }
                     | with_admin_clause

/* type pElemDDL */
with_admin_clause : TOK_WITH TOK_ADMIN authorization_identifier
                    {
                        $$ = new (PARSERHEAP())
                              ElemDDLGrantee(
                                   *$3 /*authorization_identifier*/,
                                   PARSERHEAP());
                        delete $3 /*authorization_identifier*/;
                    }
                    | TOK_WITH TOK_ADMIN TOK_CURRENT_USER
                    {
                        $$ = NULL;  // specifying CURRENT_USER is same as not specifying WITH ADMIN option
                    }

/*DROP ROLE*/
drop_role_statement : TOK_DROP TOK_ROLE authorization_identifier
                      {
                         $$ = new (PARSERHEAP())
                               StmtDDLCreateRole(
                                    *$3 /* role name */,
                                    PARSERHEAP());
                         delete $3;
                      }

/* type pStmtDDL */
create_component_privilege_stmt : TOK_CREATE TOK_COMPONENT TOK_PRIVILEGE 
                                             component_privilege_name
                                             TOK_AS priv_abbrev_str_lit
                                             TOK_ON component_name
                                             optional_system
                                             optional_component_detail_clause
               {
                 // create_component_privilege_stmt ::=
                 //   TOK_CREATE TOK_COMPONENT TOK_PRIVILEGE component_privilege_name
                 //              TOK_AS priv_abbrev_str_lit
                 //              TOK_ON component_name
                 //              optional_component_detail_clause

                 $$ = new (PARSERHEAP())
                   StmtDDLCreateComponentPrivilege
                   ( *$4 // component_privilege_name - deep copy
                   , *$6 // priv_abbrev_str_lit - deep copy
                   , *$8 // component_name - deep copy
		   , $9 //optional_system
                   , *$10 // optional_component_detail_clause - deep copy
                   , PARSERHEAP()
                   );
                 delete $4 /*component_privilege_name*/;
                 delete $6 /*priv_abbrev_str_lit*/;
                 delete $8 /*component_name*/;
                 delete $10 /*optional_component_detail_clause*/;
               }

/* type pStmtDDL */
drop_component_privilege_stmt : TOK_DROP TOK_COMPONENT TOK_PRIVILEGE 
                                 component_privilege_name
                                 TOK_ON component_name optional_drop_behavior
               {
                 // drop_component_privilege_stmt ::=
                 //   TOK_DROP TOK_COMPONENT TOK_PRIVILEGE component_privilege_name
                 //                                        TOK_ON component_name

                 $$ = new (PARSERHEAP())
                   StmtDDLDropComponentPrivilege
                   ( *$4 // component_privilege_name - deep copy
                   , *$6 // component_name - deep copy
                   , $7  // drop behavior
                   , PARSERHEAP()
                   );
                 delete $4 /*component_privilege_name*/;
                 delete $6 /*component_name*/;
               }

/* type stringval */
priv_abbrev_str_lit : component_str_lit
               {
                 // priv_abbrev_str_lit ::= component_str_lit

                 if ($$->length()/*in bytes*/ > ComMAX_COMPONENT_PRIV_ABBREV_STRING_LEN_IN_BYTES)
                 {
                   // $0~string0 is too long (longer than $1~int1 $2~string1).
                   // Component privilege abbreviation is too long (longer than 2 bytes).
                   *SqlParser_Diags << DgSqlCode(-3301)
                                    << /*subst0*/ DgString0("Component privilege abbreviation")
                                    << /*subst1*/ DgInt0(ComMAX_COMPONENT_PRIV_ABBREV_STRING_LEN_IN_BYTES)
                                    << /*subst2*/ DgString1("bytes");
                   YYERROR;
                 }
               }

/* type stringval */
component_privilege_name : identifier_with_7_bit_ascii_chars_only
               {
                 // component_privilege_name ::= identifier_with_7_bit_ascii_chars_only
               }

/* type stringval */
component_name : regular_identifier_with_7_bit_ascii_chars_only
               {
                 // component_name ::= regular_identifier_with_7_bit_ascii_chars_only
               }
/* type stringval */
regular_identifier_with_7_bit_ascii_chars_only : regular_identifier
               {
                  // regular_identifier_with_7_bit_ascii_chars_only ::= regular_identifier

                  NAString * pName = charToChar ( (Lng32)CharInfo::ISO88591 // targetCS
                                                , $1->data()                // const char *s - regular_identifier
                                                , $1->length()              // Int32 sLenInBytes
                                                , (Lng32)ComGetNameInterfaceCharSet() // sourceCS - CharInfo::UTF8
                                                , PARSERHEAP()              // heap for allocated target string
                                                );
                  if ( pName == NULL // conversion failed
                       || NOT NAStringHasOnly7BitAsciiChars(*pName) )
                  {
                    YYERROR;
                  }
                  $$ = pName;
                  if (transformIdentifier(*$$, TRUE, TRUE))
                  {
                        YYERROR;
                  }
                  delete $1; // regular_identifier
               }

/* type stringval */
identifier_with_7_bit_ascii_chars_only : identifier
               {
                  // identifier_with_7_bit_ascii_chars_only ::= identifier

                  NAString * pName = charToChar ( (Lng32)CharInfo::ISO88591 // targetCS
                                                , $1->data()                // const char *s - regular_identifier
                                                , $1->length()              // Int32 sLenInBytes
                                                , (Lng32)ComGetNameInterfaceCharSet() // sourceCS - CharInfo::UTF8
                                                , PARSERHEAP()              // heap for allocated target string
                                                );
                  if ( pName == NULL // conversion failed
                       || NOT NAStringHasOnly7BitAsciiChars(*pName) )
                  {
                    YYERROR;
                  }
                  $$ = pName;
                  delete $1; // identifier
               }

/* type pStmtDDL */
create_synonym_stmt : TOK_CREATE TOK_SYNONYM 
                      ddl_qualified_name TOK_FOR ddl_qualified_name
                      optional_by_auth_identifier
                               {
                                  $$ = new (PARSERHEAP())
                                    StmtDDLCreateSynonym(
                                        *$3 /*ddl_qualified_name*/,
                                        *$5 /*ddl_qualified_name*/,
                                         $6 /*optional_by_auth_identifier*/);
                                  delete $3 /*ddl_qualified_name*/;
                                  delete $5 /*ddl_qualified_name*/;
                               }

/* type longint */
showplan_options : optional_options 
           {
             if ($1 == NULL)
               {
                 $$ = 0x0000000E;
               }
             else 
               {
                 // DEFAULT_CHARSET has no effect on QUOTED_STRING in this context
                 Int32 i = 0;
                 char *str = (char *)$1->data();
                 ULng32 flag = 0;
                 while(str[i] != '\0')
                   {
                     switch(str[i])
                       {
                       case ' ' :  break;
                       case 'p' :  if (flag & 0x00000002)
                           YYERROR;
                         else
                           flag = flag | 0x00000002;
                         break;
                       case 'e' :  if (flag & 0x00000004)
                           YYERROR;
                         else
                           flag = flag | 0x00000004;
                         break;
                       case 't' :  if (flag & 0x00000008)
                           YYERROR;
                         else
                           flag = flag | 0x00000008;
                         break;
                       case 'n' :  if (flag & 0x00000010)
                           YYERROR;
                         else
                           flag = flag | 0x00000010;
                         break;
                       default  :  YYERROR;
                       }
                     i++;
                   }
                 // if only 'n' option is specified(no regenerate pcode),
                 // then display everything.
                 if (flag == 0x10)
                   {
                     flag |= 0x0E;
                   }
                 $$ = flag;
               }
           }

cpu_identifier : SYSTEM_CPU_IDENTIFIER
                {
                  $$ = $1;
                }
               | NUMERIC_LITERAL_EXACT_NO_SCALE
                {
                  $$ = $1;
                }
cpu_identifier_with_all : cpu_identifier
                  {
                    $$ = $1;
                  } 
                | TOK_ALL
                  {
                    $$ = new (PARSERHEAP()) NAString("-1", PARSERHEAP());
                  }               
pid_identifier : cpu_identifier ',' NUMERIC_LITERAL_EXACT_NO_SCALE
                {
                    $1->append(",");
                    $1->append(*$3);
                    $$ = $1;
                    delete $3;
                }
               | DOLLAR_IDENTIFIER
                {
                  $$ = $1;
                }  
               | TOK_CURRENT
                {
                  $$ = new (PARSERHEAP()) NAString("CURRENT", PARSERHEAP());
                }

qid_internal_identifier : NUMERIC_LITERAL_EXACT_NO_SCALE  /* cpu */
                      ',' NUMERIC_LITERAL_EXACT_NO_SCALE  /* pid */ 
                      ',' NUMERIC_LITERAL_EXACT_NO_SCALE  /* timestamp */
                      ',' NUMERIC_LITERAL_EXACT_NO_SCALE  /* query number */
               {
                  $1->append(",");
                  $1->append(*$3);
                  $1->append(",");
                  $1->append(*$5);
                  $1->append(",");
                  $1->append(*$7);
                  $$ = $1;
                  delete $3;
                  delete $5;
                  delete $7;
               }

stats_active_clause : /* empty */
                { $$ = 1;}
             |   TOK_ACTIVE NUMERIC_LITERAL_EXACT_NO_SCALE    
                { 
                  $$ = atoi(*$2);
                  delete $2;
                }
reset_clause : /* empty */
                  { $$ = 0; }
             |  TOK_RESET
                  { $$ = 2; } /* same as RMS_INIT_STATS Positive value because we can't return negative */ 


qid_internal_stats_merge_clause : /* empty */
                                 { $$ = 0; } /* use the session default view type */
                                | ',' stats_merge_clause
                                 { $$ = $2; }

stats_merge_clause : /*empty */
               { $$ = 0; } /* use the session default view type */
             |  TOK_ACCUMULATED   
               { $$ = SQLCLI_ACCUMULATED_STATS; }
             |  TOK_PERTABLE   
               { $$ = SQLCLI_PERTABLE_STATS; }
             |  TOK_PROGRESS
               { $$ = SQLCLI_PROGRESS_STATS; }
             | TOK_DEFAULT
               { $$ = SQLCLI_SAME_STATS; }  


/* type pStmtDDL */
comment_on_statement : TOK_COMMENT TOK_ON comment_on_object_types ddl_qualified_name TOK_IS QUOTED_STRING
               {
                 StmtDDLCommentOn *pNode = 
                   new(PARSERHEAP()) StmtDDLCommentOn(
                     $3,
                     *$4,
                     *$6,
                     PARSERHEAP()
                   );

                 $$ = pNode;
               }
             | TOK_COMMENT TOK_ON TOK_SCHEMA schema_name TOK_IS QUOTED_STRING
               {
                   NAString tmpSchema($4->getSchemaNameAsAnsiString());

                   if (! validateVolatileSchemaName(tmpSchema))
                   {
                     YYERROR;
                   }

                   StmtDDLCommentOn *pNode = new(PARSERHEAP()) StmtDDLCommentOn(
                                                 StmtDDLCommentOn::COMMENT_ON_TYPE_SCHEMA,
                                                 QualifiedName(SEABASE_SCHEMA_OBJECTNAME, $4->getSchemaName(), $4->getCatalogName(), PARSERHEAP()),
                                                 *$6,
                                                 PARSERHEAP());

                   $$ = pNode;
               }
             | TOK_COMMENT TOK_ON TOK_COLUMN qualified_name TOK_IS QUOTED_STRING
               {
                 ShortStringSequence *seq = (ShortStringSequence *) $4;
                 UInt32 numParts = seq->numParts();

                 if (numParts < 2)
                   YYABORT;

                 NAString strEmpty("", PARSERHEAP());

                 NAString *columnName = seq->extract(numParts - 1);
                 NAString *tableName  = seq->extract(numParts - 2);
                 NAString *schemaName = numParts > 2 ? seq->extract(numParts - 3) : &strEmpty;
                 NAString *catalogName = numParts > 3 ? seq->extract(numParts - 4) : &strEmpty;

                 QualifiedName tblName(*tableName, *schemaName, *catalogName, PARSERHEAP());
                 ColRefName *colRefName = new(PARSERHEAP()) ColRefName(*columnName, CorrName(tblName, PARSERHEAP()));
                 StmtDDLCommentOn *pNode = 
                           new(PARSERHEAP()) StmtDDLCommentOn(
                                  StmtDDLCommentOn::COMMENT_ON_TYPE_COLUMN,
                                  tblName,
                                  *$6,
                                  new(PARSERHEAP()) ColReference(colRefName),
                                  PARSERHEAP()
                           );

                 $$ = pNode;
               }


comment_on_object_types : TOK_TABLE
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_TABLE;
               }
             | TOK_INDEX
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_INDEX;
               }
             | TOK_VIEW
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_VIEW;
               }
             | TOK_LIBRARY
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_LIBRARY;
               }
             | TOK_PROCEDURE
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_PROCEDURE;
               }
             | TOK_FUNCTION
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_FUNCTION;
               }
             | TOK_SEQUENCE
               {
                 $$ = StmtDDLCommentOn::COMMENT_ON_TYPE_SEQUENCE;
               }
               
               

/* type tokval */
//
//   As many tokens as possible should be ADDED to this list, and REMOVED
//   from common/ReservedWords.h list "TandemReservedWords".
//   Criteria for being non-reserved are:
//
//     1. token is a single word
//
//     2. it is not a <reserved word> or potential <reserved word>
//	  as defined by Ansi 5.2, i.e.,
//	  it is not on either of the ReservedWords.h lists
//	  "AnsiReservedWords" or "PotentialAnsiReservedWords"
//	  (but see exceptions in the latter list, in the .h file!)
//
//     3. SqlParser does not emit a syntax error (error 15001) given the input
//	    TABLE candidateword;	e.g. TABLE ASCENDING;
//
//     4. adding the word to this list does not increase the number of
//	  conflicts/ambiguities in the grammar, as indicated by warning messages
//	  from yacc or bison
//
nonreserved_word :      TOK_ABORT
                      | TOK_ACCESS
                      | TOK_ACCUMULATED
                      | TOK_ACTIVATE
                      | TOK_ACTIVE
                      | TOK_ALIGNED
                      | TOK_ALLOW
                      | TOK_ALLOWED // MV
                      | TOK_APPEND
                      | TOK_AREA
		      | TOK_AUTOABORT
                      | TOK_AUTOMATIC // MV
                      | TOK_REPEATABLE
                      | TOK_SERIALIZABLE
	        //          | TOK_ANSIVARCHAR  //->nonreserved_datatype   
                      | TOK_ALL_DDL
                      | TOK_ALL_DML
                      | TOK_ALL_UTILITY
                      | TOK_ALTER_LIBRARY
                      | TOK_ALTER_MV
                      | TOK_ALTER_MV_GROUP
                      | TOK_ALTER_ROUTINE
                      | TOK_ALTER_ROUTINE_ACTION
                      | TOK_ALTER_SYNONYM
                      | TOK_ALTER_TABLE
                      | TOK_ALTER_TRIGGER
                      | TOK_ALTER_VIEW
                      | TOK_ALWAYS
                      | TOK_AQR
                      | TOK_ARKCMP
                      | TOK_ASCENDING
                      | TOK_ATOMIC
                      | TOK_ATTRIBUTE
                      | TOK_ATTRIBUTES
		      | TOK_AUDITONREFRESH 
                      | TOK_AUDIT
                      | TOK_AUTOBEGIN
                      | TOK_AUTOCOMMIT
                      | TOK_AUDITCOMPRESS
                      | TOK_AUTHENTICATION
		      | TOK_AVERAGE_STREAM_WAIT
		      | TOK_BACKUP
	        //          | TOK_BIGINT      //->nonreserved_datatype         
                      | TOK_BLOCKSIZE
                      | TOK_BT
                      | TOK_BRIEF
                      | TOK_BUFFER
                      | TOK_BUFFERED
                      | TOK_BYTES
                      | TOK_C
		   // | TOK_CALL  // uncomment *IF* remove from ReservedWords.h
                      | TOK_CANCEL
                      | TOK_CARDINALITY
                      | TOK_CATALOGS
                      | TOK_CATALOG_NAME
		      | TOK_CATCHUP // MV
                      | TOK_CENTURY
                      | TOK_CHANGED
		      | TOK_CHANGES // MV
                      | TOK_CHARS
                      | TOK_CHARACTERS
                      | TOK_CHARACTER_SET_CATALOG
                      | TOK_CHARACTER_SET_NAME
                      | TOK_CHARACTER_SET_SCHEMA
                      | TOK_CLASS_ORIGIN
                      | TOK_CLEAN
                      | TOK_CLEANUP
                      | TOK_CLEAR
                      | TOK_CLEARONPURGE
                      | TOK_CLUSTER
                      | TOK_CLUSTERING
                      | TOK_COLLATION_CATALOG
                      | TOK_COLLATION_NAME
                      | TOK_COLLATION_SCHEMA
					  | TOK_COLUMNS // MV OZ_REFRESH
                      | TOK_COLUMN_NAME
                      | TOK_COLUMN_NUMBER
                      | TOK_COMMANDS
                      | TOK_COMMAND_FUNCTION
                      | TOK_COMMENT
                      | TOK_COMMITTED
                      | TOK_COMP
                      | TOK_COMPACT
                      | TOK_COMPARE
                      | TOK_COMPLETE
                      | TOK_COMPONENT
                      | TOK_COMPONENTS
		      | TOK_COMPRESS
                      | TOK_COMPRESSED
                      | TOK_COMPRESSION
                      | TOK_CONCURRENT
                      | TOK_CONCURRENCY
                      | TOK_CONDITION_NUMBER
                      | TOK_CONFIG
                      | TOK_CONNECTION_NAME
                      | TOK_CONSTRAINT_CATALOG
                      | TOK_CONSTRAINT_NAME
                      | TOK_CONSTRAINT_SCHEMA
                      | TOK_CONTAINS
                      | TOK_CONTROL
                      | TOK_COPY
                      | TOK_COST
                      | TOK_CPP
                      | TOK_CPU
                      | TOK_CREATE_LIBRARY
                      | TOK_CREATE_MV
                      | TOK_CREATE_MV_GROUP
                      | TOK_CREATE_PROCEDURE
                      | TOK_CREATE_ROUTINE
                      | TOK_CREATE_ROUTINE_ACTION
                      | TOK_CREATE_TABLE
                      | TOK_CREATE_TRIGGER
                      | TOK_CREATE_SYNONYM
                      | TOK_CREATE_VIEW
                      | TOK_CQD
                      | TOK_CURSOR_NAME
                      | TOK_CACHE
                      | TOK_CYCLE
                      | TOK_D                   /* ODBC extension  */
                      | TOK_DATA
                //    | TOK_DATETIME            /* MP syntax--moved to lexer */
                      | TOK_DATETIME_CODE
                      | TOK_DBA
                      | TOK_DCOMPRESS
                      | TOK_DDL
		      | TOK_DE			// MV OZ_REFRESH
                      | TOK_DECADE
                      | TOK_DEFINER
                      | TOK_DEFINITION
                      | TOK_DEFAULTS
                      | TOK_DELAY
                      | TOK_DELIMITER
		      | TOK_DEPENDENT
                      | TOK_DESCENDING
                      | TOK_DETAIL
                      | TOK_DETAILS
		      | TOK_DIRECTEDBY // MV
                      | TOK_DISABLE     
                      | TOK_DISK
                      | TOK_DISPLAY
                      | TOK_DIVISION
                      | TOK_DO
                      | TOK_DOUBLE_IEEE
                      | TOK_DOW
                      | TOK_DOY
                      | TOK_DROP_LIBRARY
                      | TOK_DROP_MV
                      | TOK_DROP_MV_GROUP
                      | TOK_DROP_PROCEDURE
                      | TOK_DROP_ROUTINE
                      | TOK_DROP_ROUTINE_ACTION
                      | TOK_DROP_SYNONYM
                      | TOK_DROP_TABLE
                      | TOK_DROP_TRIGGER
                      | TOK_DROP_VIEW
                      | TOK_DROPPABLE
                      | TOK_DSLACK
                      | TOK_DUPLICATE
                      | TOK_DYNAMIC_FUNCTION
                      | TOK_EID
                      | TOK_ENABLE         
                      | TOK_ENFORCED
                      | TOK_ENFORCERS
                      | TOK_ERROR
                      | TOK_ENTERPRISE
                      | TOK_ENTRY
                      | TOK_ENTRIES
                      | TOK_EPOCH
                      | TOK_ET
                      | TOK_EUROPEAN
                      | TOK_EXCEPTIONS
                      | TOK_EXCEPTION_TABLE
                      | TOK_EXCHANGE
                      | TOK_EXCHANGE_AND_SORT
                      | TOK_EXCLUSIVE
                      | TOK_EXECUTION
                      | TOK_EXIT
                      | TOK_EXPLAIN
                      | TOK_EXTENT
                      | TOK_EXTRACT_SOURCE
                      | TOK_EXTRACT_TARGET
                      | TOK_FAMILY
                      | TOK_FAST
		      | TOK_FEATURE_VERSION_INFO    // Versioning
                      | TOK_FILE
                      | TOK_FINAL
		      | TOK_FIRST_FSCODE
                      | TOK_FLOAT_IEEE
                      | TOK_FOLLOWING
                      | TOK_FOR_MAXRUNTIME
                      | TOK_FORMAT
                      | TOK_FORCE
               //     | TOK_FRACTION             /* MP syntax -- moved to lexer */
                      | TOK_G
                      | TOK_GENERATE
                      | TOK_GENERATED
                      | TOK_GHOST
                      | TOK_GIVE
                      | TOK_GRANTEES
                      | TOK_GRANTED
                      | TOK_HARDWARE
                      | TOK_HASH
                      | TOK_HASH2
                      | TOK_TRAFODION
                      | TOK_HBASE
                      | TOK_HBASE_OPTIONS
                      | TOK_SERIALIZED
		      | TOK_HEADER
                      | TOK_HEADING
                      | TOK_HEADINGS
                      | TOK_HEX
                      | TOK_HEXADECIMAL
                      | TOK_HORIZONTAL
                      | TOK_HIGH_VALUE
		      | TOK_HOURS
                        //                      | TOK_KEY
                      | TOK_SHOW
                      | TOK_SHOWSTATS
		      | TOK_SHOWTRANSACTION
                      | TOK_ICOMPRESS
                      | TOK_IGNORETRIGGERS
                      | TOK_IGNORE_TRIGGER
                      | TOK_IMMUTABLE
                      | TOK_IMPLICIT
                      | TOK_INCREMENT
                      | TOK_INDEX_TABLE
                      | TOK_INDICATOR_DATA
                      | TOK_INDICATOR_POINTER
                      | TOK_INDICATOR_TYPE
                      | TOK_INGEST
		      | TOK_INITIALIZATION // MV
                      | TOK_INITIALIZE
                      | TOK_INITIALIZED 
                      | TOK_INPUTS
                      | TOK_INSERT_ONLY
		      | TOK_INSERTLOG // MV
		      | TOK_INTERNAL // MV REFRESH
                      | TOK_INTERNALSP
                      | TOK_INDEX
                      | TOK_INDEXES
                      | TOK_INS
                      | TOK_INTERVALS
                      | TOK_INVOKER
                      | TOK_IO
                      | TOK_ISLACK
                      | TOK_ISOLATE
		      | TOK_INVALID
		      | TOK_INVALIDATE
                      | TOK_JAVA
                      | TOK_K
     //                 | TOK_LARGEINT   //->nonreserved_datatype
                      | TOK_LABEL
                      | TOK_LABEL_CREATE         
                      | TOK_LABEL_DROP
		      | TOK_LABEL_ALTER
                      | TOK_LABEL_PURGEDATA
                      | TOK_LANGUAGE
	              | TOK_LAST_FSCODE
		      | TOK_LAST_SYSKEY
                      | TOK_LASTSYSKEY
                      | TOK_LEADING_PRECISION
                      | TOK_LEVELS
                      | TOK_EOF
                      | TOK_LIBRARY
                      | TOK_LIBRARIES
                      | TOK_LINE_NUMBER
                      | TOK_LOAD
                      | TOK_LOAD_ID
                      | TOK_LOCATION
                      | TOK_LOCK
                      | TOK_LOCK_ROW
                      | TOK_LOCKING
		      | TOK_LOCKONREFRESH // MV
		      | TOK_LOGGABLE //++ MV
                      | TOK_LOGON
                      | TOK_LZO
                      | TOK_GZIP
		      | TOK_IUDLOG     // MV REFRESH
                      | TOK_IUD_LOG_TABLE    
		      | TOK_RANGE_LOG_TABLE
     //                 | TOK_LONG       //->nonreserved_datatype         
                      | TOK_LOW_VALUE
     //                 | TOK_LSDECIMAL  //->nonreserved_datatype         
                      | TOK_M
                      | TOK_MAP
                      | TOK_MASTER
                      | TOK_MATERIALIZED  
		      | TOK_MAXEXTENTS // Extent Changes : Swati Ambulkar
                      | TOK_MAXRUNTIME
     //               | TOK_MAXSIZE
                      | TOK_MAXVALUE
                      | TOK_MEMORY
                      | TOK_MERGE
                      | TOK_MESSAGE
                      | TOK_MESSAGE_LEN
                      | TOK_MESSAGE_OCTET_LEN
                      | TOK_MESSAGE_TEXT
                      | TOK_METADATA
                      | TOK_MINIMAL
		      | TOK_MINUTES
		      | TOK_MINVALUE
                      | TOK_MODE
                      | TOK_MODULES
                      | TOK_MORE
                      | TOK_MOVE
                      | TOK_MOVEMENT
                      | TOK_MTS
                      | TOK_MV  
                      | TOK_MULTI            /* Long Running */
		      | TOK_MULTIDELTA // MV
                      | TOK_MSCK
		      | TOK_MVATTRIBUTE  // MV
		      | TOK_MVATTRIBUTES // MV
                      | TOK_MV_TABLE  
		      | TOK_MVSTATUS	// MV
		      | TOK_MVS_UMD //
		      | TOK_REGEXP  
		      | TOK_REMOVE //
		      | TOK_OPENBLOWNAWAY //
		      | TOK_REDEFTIME	// Y_TEST
  		      | TOK_MVGROUP  //
  		      | TOK_MVGROUPS
		      | TOK_MVLOG // MV
		      | TOK_MVUID // MV
                      | TOK_NAME
                      | TOK_NAMED
		      | TOK_NAMESPACE
                      | TOK_NAMETYPE          /* Tandem extension */
                      | TOK_NATABLE_CACHE_ENTRIES
                      | TOK_NATIVE
                      | TOK_NECESSARY
                      | TOK_NEEDED
                      | TOK_NEXT
		      | TOK_NODELETE // MV
                      | TOK_NODES
		      | TOK_NOMVLOG // MV
                      | TOK_NOLOG
                      | TOK_NORMAL
                      | TOK_NSK_CODE
                      | TOK_NULLABLE
                      | TOK_NULL_STRING
		      | TOK_NUMBER
                      | TOK_OBSOLETE
                      | TOK_OBJECT
                      | TOK_OBJECTS
                      | TOK_OFFLINE
                      | TOK_OJ                /* ODBC extension  */
                      | TOK_ONLINE
		      | TOK_OPCODE            /* alter opcode */
                      | TOK_OPTIONS
                      | TOK_ORDERED
                      | TOK_OVER
                      | TOK_OVERRIDE
                      | TOK_PACKED
                      | TOK_PAGE
                      | TOK_PAGES
                      | TOK_PARALLEL
                      | TOK_PARALLELISM
                      | TOK_PARENT
                      | TOK_PARSERFLAGS
                      | TOK_ENVVAR
                      | TOK_ENVVARS
                        //                      | TOK_PARTIAL
                      | TOK_PARTITION
                      | TOK_PARTITIONING
                      | TOK_PARTITIONS
                      | TOK_PASS
                      | TOK_PATH
                      | TOK_PERTABLE
		      | TOK_PHASE // MV REFRESH
		      | TOK_PID
		      | TOK_PIPELINE // MV REFRESH
                      | TOK_POOL
		      | TOK_POPULATE
                      | TOK_POS
                      | TOK_PRECEDING
		      | TOK_PREFER_FOR_SCAN_KEY
		      | TOK_PRESERVE
                      | TOK_PRIORITY
                      | TOK_PRIORITY_DELTA
                      | TOK_PRIVATE
                      | TOK_PRIVILEGE
                      | TOK_PROCESS
                      | TOK_PROGRESS
                      | TOK_PROMPT
                      | TOK_QID
                      | TOK_QID_INTERNAL
	              | TOK_QUERY
                      | TOK_QUERY_CACHE
                      | TOK_HYBRID_QUERY_CACHE
                      | TOK_HYBRID_QUERY_CACHE_ENTRIES
                      | TOK_QUERY_CACHE_ENTRIES
                      | TOK_CATMAN_CACHE
		      | TOK_NATABLE_CACHE
		      | TOK_NAROUTINE_CACHE
		      | TOK_NAROUTINE_ACTION_CACHE
                      | TOK_RANGE
		      | TOK_RANGE_N
		      | TOK_RANGELOG   // MV 
                      | TOK_RATE 
                      | TOK_REAL_IEEE
                      | TOK_REBUILD
                      | TOK_RECOMPUTE // MV 
                      | TOK_RECORD_SEPARATOR
                      | TOK_RECOVER
                      | TOK_RECOVERY
                      | TOK_REFRESH // MV
                      | TOK_REGION
                      | TOK_REGISTER
                      | TOK_REGISTERED
                      | TOK_REINITIALIZE
                      | TOK_RELATED
                      | TOK_RELATEDNESS     // Versioning
                      | TOK_RELOAD
                      | TOK_REMOTE
                      | TOK_RENAME
                      | TOK_REPAIR
                      | TOK_REPOSITORY
                      | TOK_REQUEST // MV
                      | TOK_REQUIRED
                      | TOK_RESET
                      | TOK_RETURNED_LENGTH
                      | TOK_RETURNED_OCTET_LENGTH
                      | TOK_RETURNED_SQLSTATE
                      | TOK_REWRITE // MV
                      | TOK_ROLE
                      | TOK_ROLES
                      | TOK_ROW_COUNT
		      | TOK_ROWS_INSERTED // MV REFRESH
		      | TOK_ROWS_DELETED  // MV REFRESH
		      | TOK_ROWS_UPDATED  // MV REFRESH
		      | TOK_ROWS_COVERED  // MV AB_REFRESH
		      | TOK_NUM_OF_RANGES // MV AB_REFRESH
                      | TOK_ROWWISE
		      | TOK_ROWSET_IND_LAYOUT_SIZE
		      | TOK_ROWSET_SIZE
		      | TOK_ROWSET_VAR_LAYOUT_SIZE
//                      | TOK_ROW
                      | TOK_RUN
                      | TOK_SAFE
                      | TOK_SALT
                      | TOK_SAS_FORMAT
                      | TOK_SAS_LOCALE
                      | TOK_SAS_MODEL_INPUT_TABLE
                      | TOK_SCALAR
                      | TOK_SCALE
                      | TOK_SCAN
                      | TOK_SCHEMAS
                      | TOK_SCHEMA_NAME
                      | TOK_SECONDS
                      | TOK_SECURITY
//                      | TOK_SEL
                      | TOK_SELECTIVITY
                      | TOK_SEPARATE
                      | TOK_SERVER_NAME
                      | TOK_SESSIONS
                      | TOK_SG_TABLE
                      | TOK_SHAPE
                      | TOK_SHARE
                      | TOK_SHARED
                      | TOK_SIGNED
		      | TOK_SINGLEDELTA // MV
//                      | TOK_SIZE
                      | TOK_SLACK
                      | TOK_SOFTWARE
                      | TOK_SOURCE
                      | TOK_SNAPSHOT
                      | TOK_SUFFIX
                      | TOK_TARGET
                      | TOK_SOURCE_FILE
                      | TOK_SP_RESULT_SET
                      | TOK_SQL_WARNING
                      | TOK_SQLROW
		      | TOK_START  /* used in nist618 for column name */
		      | TOK_STATE  /* used internally? qat tests */
                      | TOK_STATEMENT
                      | TOK_STATIC
                      | TOK_STATISTICS
                      | TOK_STATS
                      | TOK_STATUS
                      | TOK_STORAGE
                      | TOK_STORE
                      | TOK_STORED
                      | TOK_STRING_SEARCH
                      | TOK_STYLE
                      | TOK_SUBCLASS_ORIGIN
                      | TOK_SUBSYSTEM_ID
                      | TOK_HBMAP_TABLE
                      | TOK_SUSPEND
                      | TOK_SYNONYMS
                      | TOK_T                 /* ODBC extension  */
                      | TOK_TABLE_MAPPING
                      | TOK_TABLE_NAME
		      | TOK_TABLES				// MV 
                      | TOK_TABLESPACE
                      | TOK_TAG
                      | TOK_TEMP_TABLE
                      | TOK_TEXT
                      | TOK_THROUGH
                      | TOK_TIMEOUT    
                      | TOK_TITLE
		      | TOK_TRANSFORM
                      | TOK_TRIGGERS
                      | TOK_TRIGGER_CATALOG
                      | TOK_TRIGGER_NAME
                      | TOK_TRIGGER_SCHEMA
                      | TOK_TS                /* ODBC extension  */
                      | TOK_TYPE
                      | TOK_TYPES
                      | TOK_TYPE_ANSI
                      | TOK_TYPE_FS
                      | TOK_UDF
                      | TOK_UNBOUNDED
                      | TOK_UNCOMMITTED
                      | TOK_UNIVERSAL
                      | TOK_UNLOCK
                      | TOK_UNLOAD
                      | TOK_UNNAMED
                      | TOK_UNREGISTER
                      | TOK_UNSIGNED
                      | TOK_UPD
                      | TOK_UPGRADE
		      | TOK_UPDATE_STATS
                      | TOK_UPDATE_LOB
                      | TOK_UPPERCASE
                      | TOK_USA				
		      | TOK_USE				// MV REFRESH
                      | TOK_USERS
                      | TOK_VALUE
                      | TOK_VARIABLE_DATA
                      | TOK_VARIABLE_POINTER
                      | TOK_VOLATILE			
                      | TOK_VERSION
                      | TOK_VERSIONS
                      | TOK_VPROC
                      | TOK_VERSION_INFO		// Versioning
                      | TOK_VIEWS
                      | TOK_VSBB
                      | TOK_WAITED
                      | TOK_WAITEDIO
                      | TOK_WOM

		      	// New words added can be merged into sorted list above
                      | TOK_INVOKE
		      | TOK_SHOWCONTROL
		      | TOK_SHOWDDL
		      | TOK_SHOWPLAN
		      | TOK_SHOWSHAPE
                      | TOK_SHOWSET 		      
                        // New words for Sampling
                      | TOK_SAMPLE
                      | TOK_PERIODIC
                      | TOK_PERCENT
                      | TOK_BALANCE
                      | TOK_EVERY
                      | TOK_EXISTING
                      | TOK_SORT
                      | TOK_CLUSTERS
                      | TOK_BLOCKS
                        // New words for Sequence Functions
                      | TOK_INCLUSIVE
                      | TOK_SEQUENCE
                      | TOK_SEQUENCES
                      | TOK_SINCE
//		      | TOK_MAINTAIN
                      | TOK_MANAGEMENT
		      | TOK_MANUAL
		      | TOK_MIXED
		      | TOK_MVS  // MV
                      | TOK_PURGEDATA
                      | TOK_INCREMENTAL
                      | TOK_PROCEDURES
                      | TOK_SUMMARY
                      | TOK_SYSTEM
		      | TOK_UNAVAILABLE // MV
		      | TOK_UID
// QSTUFF
                      | TOK_STREAM
                      | TOK_SKIP
		      | TOK_CONFLICT
		      |	TOK_HOLD
// QSTUFF
                      | TOK_VALIDATE
                      | TOK_RMS

// This was added for JIRA Trafodion 2367. There are oddities in
// how PREPARE is parsed vs. how EXPLAIN is parsed, along with
// pecularities in the specific syntax of EXPLAIN that prevent
// us from recognizing the same identifiers for both. In sqlci,
// for example, sqlci's own parser picks off the PREPARE <identifier>
// part, and this parser only sees the query text afterwards. So,
// sqlci has its own rules for what <identifier>s are allowed.
// EXPLAIN on the other hand is fully parsed here in this parser.
// Trafci seems to have different processing yet. EXPLAIN itself
// has some confounding syntax: One can say "EXPLAIN <query text>"
// as well as "EXPLAIN <statement identifier>", so the identifier
// can conflict with any token that can start a statement. This
// anomaly is unique to EXPLAIN. That means that we can't simply
// plug in nonreserved_word as an alternative production for
// explain_identifier; we'll get a boatload of additional
// shift/reduce and reduce/reduce conflicts. It is possible in
// principle to create a subset of nonreserved_word for EXPLAIN,
// but in light of the fact that the PREPARE rules are in different
// parsers (and differ between sqlci and trafci), this seems a
// fool's errand.
// 
// So, up until this JIRA, only regular identifiers (that is,
// non-keywords) and delimited identifiers were allowed for EXPLAIN.
// Unfortunately, C is a keyword, since it is a language name on
// CREATE FUNCTION. So, EXPLAIN C; gives a syntax error. Since
// humans are sometimes prone to using one-letter identifiers,
// this can be highly irritating. So, to remove this irritation,
// we've supplied a separate nonreserved_word production just for
// EXPLAIN that contains all the one-letter tokens.

nonreserved_word_for_explain: TOK_C
                      | TOK_D
                      | TOK_G
                      | TOK_K
                      | TOK_M
                      | TOK_T

// Formerly declared as FUNC_ in ulexer.cpp keywordTable.  Now defined
// as nonreserved_func_word.  This works better and does not increase the
// shift reduce conflicts. When they were FUNC_s they were treated as
// IDENTIFIERs unless they were followed by a '('.  However, there are
// some contexts in which they should be treated as IDENTIFIERs even
// though they are followed by a '('.  For instance: "SELECT * from T
// ABS(a)".  In this case, ABS should be treated as an IDENTIFIER not
// a function name.
//
nonreserved_func_word:  TOK_ABS
                      | TOK_ACOS
                      | TOK_ASCII
                      | TOK_ASIN
                      | TOK_ATAN
                      | TOK_ATAN2
                      | TOK_AUTHNAME
                      | TOK_AUTHTYPE
                      | TOK_BITAND
                      | TOK_BITOR
                      | TOK_BITXOR
                      | TOK_BITNOT
                      | TOK_BITEXTRACT
                      | TOK_CONVERTTOBITS
                      | TOK_CEIL
                      | TOK_CEILING
                      | TOK_CHR
                      | TOK_CODE_VALUE
                      | TOK_COLUMN_CREATE
                      | TOK_COLUMN_LOOKUP
                      | TOK_COLUMN_DISPLAY
                      | TOK_CONCAT
                      | TOK_CONVERTFROMHEX
                      | TOK_CONVERTTIMESTAMP
                      | TOK_CONVERTTOHEX
                      | TOK_CONVERTTOHX_INTN
                      | TOK_COS
                      | TOK_COSH
                      | TOK_CRC32
                      | TOK_CURDATE
                      | TOK_CURTIME
                      | TOK_D_RANK 
                      | TOK_DATABASE
                      | TOK_DATEFORMAT
                      | TOK_DAYNAME
                      | TOK_DAYOFMONTH
                      | TOK_DAYOFWEEK
                      | TOK_DAYOFYEAR
                      | TOK_DEBUG
                      | TOK_DEGREES
                      | TOK_DIFF1
                      | TOK_DIFF2
                      | TOK_ENCODE_KEY
                      | TOK_EXP
                      | TOK_EXTEND
                      | TOK_FIRSTDAYOFYEAR
                      | TOK_FLOOR
                      | TOK_FN
                      | TOK_GREATEST
                      | TOK_GROUPING_ID
                      | TOK_HASHPARTFUNC
                      | TOK_HASH2PARTFUNC
                      | TOK_HBASE_TIMESTAMP
                      | TOK_HBASE_VERSION
                      | TOK_HIVE
                      | TOK_HIVEMD
                      | TOK_INET_ATON
                      | TOK_INET_NTOA
                      | TOK_INITIAL
                      | TOK_INSTR
                      | TOK_ISIPV4
                      | TOK_ISIPV6
                      | TOK_KEY_RANGE_COMPARE
                      | TOK_JSONOBJECTFIELDTEXT
                      | TOK_JULIANTIMESTAMP
                      | TOK_LASTNOTNULL
                      | TOK_LAST_DAY
                      | TOK_LCASE
                      | TOK_LEAST
                      | TOK_LENGTH
                      | TOK_LOCATE
                      | TOK_LOG
                      | TOK_LOG10
                      | TOK_LOG2
                      | TOK_LPAD
                      | TOK_LTRIM
                      | TOK_MAVG
                      | TOK_MCOUNT
                      | TOK_MD5
                      | TOK_MMAX
                      | TOK_MMIN
                      | TOK_MOD
                      | TOK_MONTHNAME
                      | TOK_MONTHS_BETWEEN
                      | TOK_MRANK
                      | TOK_MSTDDEV
                      | TOK_MSUM
                      | TOK_MVARIANCE
                      | TOK_NEXT_DAY
		      | TOK_NOW
                      | TOK_NVL
                      | TOK_NULLIFZERO
                      | TOK_OFFSET
                      | TOK_OS_USERID
                      | TOK_PI
                      | TOK_PIVOT
                      | TOK_PIVOT_GROUP
                      | TOK_POWER
                      | TOK_QUARTER
                      | TOK_QUERYID_EXTRACT
                      | TOK_RADIANS
                      | TOK_RAND
                      | TOK_RANDOM
                      | TOK_RAVG
                      | TOK_RCOUNT
                      | TOK_REPEAT
                      | TOK_RESTORE
                      | TOK_RESUME
                      | TOK_RETRIES
                      | TOK_RETURNS
                      | TOK_RMAX
                      | TOK_RMIN
                      | TOK_ROUND
                      | TOK_ROWNUM
                      | TOK_ROW_NUMBER
                      | TOK_RPAD
                      | TOK_RRANK 
                      | TOK_RRPARTFUNC
                      | TOK_RSTDDEV
                      | TOK_RSUM
                      | TOK_RTRIM
                      | TOK_RVARIANCE
                      | TOK_SEQNUM
                      | TOK_SHA
                      | TOK_SHA1
                      | TOK_SHA2
                      | TOK_SIGN
                      | TOK_SIN
                      | TOK_SINH
                      | TOK_SOUNDEX
                      | TOK_SORT_KEY
                      | TOK_SPACE
                      | TOK_SQRT
                      | TOK_STDDEV
                      | TOK_STOP
			//                      | TOK_SYSDATE
                      | TOK_TAN
                      | TOK_TANH
                      | TOK_THIS
                      | TOK_TOKENSTR
                      | TOK_TO_CHAR
                      | TOK_TO_DATE
                      | TOK_TO_NUMBER
                      | TOK_TO_TIME
                      | TOK_TO_TIMESTAMP
                      | TOK_TRUNC
                      | TOK_TRUNCATE
                      | TOK_TYPECAST
                      | TOK_UCASE
			//                      | TOK_UPSERT
                      | TOK_UNIQUE_ID
                      | TOK_UUID
                      | TOK_SYS_GUID
		      | TOK_USERNAMEINTTOEXT
                      | TOK_VARIANCE
                      | TOK_WEEK
                      | TOK_XMLAGG
                      | TOK_XMLELEMENT
                      | TOK_ZEROIFNULL

                      | TOK_PERFORM
                      | TOK_PARAMETER_MODE
                      | TOK_PARAMETER_ORDINAL_POSITION
                      | TOK_PARAMETER_INDEX
                      | TOK_DATA_OFFSET
                      | TOK_NULL_IND_OFFSET
                      | TOK_ALIGNED_LENGTH

// New SQL functions
                      | TOK_ADD_MONTHS
                      | TOK_DATEADD
                      | TOK_DATE_ADD
                      | TOK_DATE_SUB
                      | TOK_DECODE
                      | TOK_DATE_PART
		      | TOK_DATE_TRUNC
		      | TOK_DATEDIFF
		      | TOK_TIMESTAMPADD
		      | TOK_TIMESTAMPDIFF
                      | TOK_ISNULL
//  These are added to ignore options from other vendors
                      | TOK_CHECKSUM
		      | TOK_FALLBACK
		      | TOK_PROTECTION
		      | TOK_FREESPACE
		      | TOK_JOURNAL
		      | TOK_MULTISET
		      | TOK_CASESPECIFIC
                      | TOK_FIXED
                      | TOK_BUFFERTOLOB
                      | TOK_EXTERNALTOLOB
                      | TOK_FILETOLOB
                      | TOK_FILETOEXTERNAL
                      | TOK_LOADTOLOB
		      | TOK_STRINGTOLOB
                      | TOK_STRINGTOEXTERNAL
                      | TOK_LOB
                      | TOK_LOBLENGTH
                      | TOK_LOBTOBUFFER
		      | TOK_LOBTOFILE
		      | TOK_LOBTOSTRING
                      | TOK_EXTERNALTOSTRING
                      | TOK_EMPTY_CLOB
                      | TOK_EMPTY_BLOB
                      

nonreserved_datatype  : TOK_ANSIVARCHAR
                      | TOK_BIGINT
                      | TOK_BYTE 
                      | TOK_BYTEINT
                      | TOK_LARGEINT
                      | TOK_LONG
                      | TOK_LONGWVARCHAR
                      | TOK_LSDECIMAL
                      | TOK_ROWSET
                      | TOK_TINYINT
                      | TOK_VARBINARY 
                      | TOK_VARWCHAR
                      | TOK_WCHAR

// The following tokens are reserved in SQL/MX, but 'non-reserved' in
// SQL/MP.  Using them as identifiers in SQL/MX will result in an
// ERROR (see transformIdentifier(), but they can be used as
// identifiers in SQL/MP stored text.

MP_nonreserved_word :    
                         TOK_DOUBLE
                       | TOK_ELSE
                       | TOK_END
                       | TOK_FLOAT
                       | TOK_NATIONAL
                       | TOK_NCHAR
                       | TOK_PRECISION
                       | TOK_REAL
//                       | TOK_ROW
                       | TOK_VARCHAR
                       | TOK_VARYING
		       | TOK_NEW
                       | TOK_OLD
		       | TOK_AFTER
		       | TOK_BEFORE
		       | TOK_EACH
		       | TOK_REFERENCING
		       | TOK_SIGNAL
		       | TOK_SQLSTATE
		       | TOK_TRIGGER

MP_nonreserved_func_word : TOK_CAST 
                         | TOK_CHAR_LENGTH
                         | TOK_LOWER
                         | TOK_MIN
                         | TOK_OCTET_LENGTH
                         | TOK_POSITION
                         | TOK_REVERSE
                         | TOK_TRIM
                         | TOK_SUBSTRING
                         | TOK_UPPER
                         | TOK_UPSHIFT

// The following tokens are reserved in SQL/MX, but 'non-reserved' in
// SQL/MP.  However, since they would increase the shift/reduce and/or
// reduce/reduce conflicts in added to the nonreserved_word list they
// cannot be used as identifiers in SQL/MP (or SQL/MX).  Using these
// as identifiers will result in a Syntax ERROR.
//
//
//                       | TOK_COLLATE
//                       | TOK_DATE
//                       | TOK_DAY
//                       | TOK_DEFAULT
//                       | TOK_HOUR
//                       | TOK_INTERVAL
//                       | TOK_MINUTE
//                       | TOK_MONTH
//                       | TOK_RIGHT
//                       | TOK_SECOND
//                       | TOK_THEN
//                       | TOK_TIME
//                       | TOK_TIMESTAMP
//                       | TOK_UNION
//                       | TOK_YEAR
 

//
// Adding to this list? See checklist above for additional things to be done.

/* end of file */
