blob: 58ee46f6e37d97b36f0ffbc0b23b69d969a615dc [file] [log] [blame]
/**********************************************************************
// @@@ 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: ExprNode.C
* Description: Expression nodes (relational nodes and item expression nodes)
*
* Created: 5/13/94 (Friday, 13, keep that in mind when reading the file)
* Language: C++
*
*
*
******************************************************************************
*/
#include "ExprNode.h"
// -----------------------------------------------------------------------
// method for class OperatorType
// -----------------------------------------------------------------------
NABoolean OperatorType::match(OperatorTypeEnum wildcard) const
{
if (op_ == wildcard)
return TRUE; // that was easy!
else
{
#ifndef NDEBUG
// the method assumes that only "wildcard" can contain a wildcard!!
assert (!(OperatorType(op_).isWildcard()));
#endif
// now the actual logic to match wildcards
switch (wildcard)
{
case ITM_ANY_AGGREGATE:
switch (op_)
{
case ITM_AVG:
case ITM_MAX:
case ITM_MIN:
case ITM_MAX_ORDERED:
case ITM_MIN_ORDERED:
case ITM_SUM:
case ITM_COUNT:
case ITM_COUNT_NONULL:
case ITM_STDDEV:
case ITM_VARIANCE:
//##? Do we want to add Austin group's Sequence-Functions here
//##? (moving and running sums, counts, averages, etc) ?
return TRUE;
default:
return FALSE;
}
case ITM_ANY_CAST:
switch (op_)
{
case ITM_CAST:
case ITM_CAST_CONVERT:
case ITM_INSTANTIATE_NULL:
case ITM_NARROW:
case ITM_CAST_TYPE:
return TRUE;
default:
return FALSE;
}
case ITM_WILDCARD_EQ_NE:
switch (op_)
{
case ITM_EQUAL:
case ITM_NOT_EQUAL:
case ITM_EQUAL_ALL:
case ITM_EQUAL_ANY:
case ITM_NOT_EQUAL_ALL:
case ITM_NOT_EQUAL_ANY:
return TRUE;
default:
return FALSE;
}
case REL_ANY_LEAF_OP:
switch (op_)
{
case REL_SCAN:
case REL_EXPLAIN:
case REL_TUPLE:
case REL_TUPLE_LIST:
case REL_LEAF_INSERT:
case REL_LEAF_UPDATE:
case REL_LEAF_DELETE:
case REL_ISOLATED_SCALAR_UDF:
case REL_LEAF_TABLE_MAPPING_UDF:
case REL_HIVE_INSERT:
case REL_HBASE_INSERT:
case REL_SP_PROXY:
return TRUE;
default:
return FALSE;
}
case REL_FORCE_ANY_SCAN:
switch (op_)
{
case REL_SCAN:
case REL_FILE_SCAN:
case REL_HBASE_ACCESS:
return TRUE;
default:
return FALSE;
}
case REL_ANY_UNARY_OP:
switch (op_)
{
case REL_UNARY_INSERT:
case REL_UNARY_UPDATE:
case REL_UNARY_DELETE:
case REL_GROUPBY:
case REL_RENAME_TABLE:
case REL_FILTER:
case REL_ROOT:
case REL_SORT:
case REL_EXCHANGE:
case REL_MAP_VALUEIDS:
case REL_ORDERED_GROUPBY:
case REL_HASHED_GROUPBY:
case REL_INSERT_CURSOR:
case REL_DELETE_CURSOR:
case REL_UPDATE_CURSOR:
case REL_MATERIALIZE_SIMPLE:
case REL_MATERIALIZE_HASHED:
case REL_MATERIALIZE_ORDERED:
case REL_UNPACKROWS:
case REL_PACK:
case REL_TRANSPOSE:
case REL_SEQUENCE:
case REL_SAMPLE:
case REL_UNARY_TABLE_MAPPING_UDF:
return TRUE;
default:
return FALSE;
}
case REL_ANY_ROUTINE:
switch (op_)
{
case REL_TABLE_VALUED_FUNCTION:
case REL_BUILTIN_TABLE_VALUED_FUNCTION:
case REL_TABLE_VALUED_UDF:
case REL_ISOLATED_NON_TABLE_UDR:
case REL_ISOLATED_SCALAR_UDF:
case REL_EXPLAIN:
case REL_STATISTICS:
case REL_CALLSP:
case REL_LEAF_TABLE_MAPPING_UDF:
case REL_UNARY_TABLE_MAPPING_UDF:
case REL_BINARY_TABLE_MAPPING_UDF:
case REL_TABLE_MAPPING_BUILTIN_LOG_READER:
case REL_TABLE_MAPPING_BUILTIN_SERIES:
case REL_TABLE_MAPPING_BUILTIN_TIMESERIES:
case REL_TABLE_MAPPING_BUILTIN_JDBC:
return TRUE;
default:
return FALSE;
}
case REL_ANY_SCALAR_UDF_ROUTINE:
case REL_FORCE_ANY_SCALAR_UDF:
switch (op_)
{
case REL_ISOLATED_NON_TABLE_UDR:
case REL_ISOLATED_SCALAR_UDF:
return TRUE;
default:
return FALSE;
}
case REL_ANY_GEN_UPDATE:
switch (op_)
{
case REL_UNARY_INSERT:
case REL_UNARY_UPDATE:
case REL_UNARY_DELETE:
case REL_LEAF_INSERT:
case REL_LEAF_UPDATE:
case REL_LEAF_DELETE:
case REL_INSERT_CURSOR:
case REL_DELETE_CURSOR:
case REL_UPDATE_CURSOR:
case REL_HIVE_INSERT:
case REL_HBASE_INSERT:
case REL_HBASE_DELETE:
case REL_HBASE_UPDATE:
return TRUE;
default:
return FALSE;
}
case REL_ANY_LEAF_GEN_UPDATE:
switch (op_)
{
case REL_LEAF_INSERT:
case REL_LEAF_UPDATE:
case REL_LEAF_DELETE:
case REL_HIVE_INSERT:
case REL_HBASE_INSERT:
case REL_HBASE_DELETE:
case REL_HBASE_UPDATE:
return TRUE;
default:
return FALSE;
}
case REL_ANY_UNARY_GEN_UPDATE:
switch (op_)
{
case REL_UNARY_INSERT:
case REL_UNARY_UPDATE:
case REL_UNARY_DELETE:
case REL_INSERT_CURSOR:
case REL_DELETE_CURSOR:
case REL_UPDATE_CURSOR:
case REL_HBASE_INSERT:
case REL_HBASE_UPDATE:
case REL_HBASE_DELETE:
case REL_CALLSP:
return TRUE;
default:
return FALSE;
}
case REL_ANY_UPDATE_DELETE:
switch (op_)
{
case REL_UNARY_UPDATE:
case REL_UNARY_DELETE:
case REL_LEAF_UPDATE:
case REL_LEAF_DELETE:
case REL_DELETE_CURSOR:
case REL_UPDATE_CURSOR:
case REL_HBASE_UPDATE:
case REL_HBASE_DELETE:
return TRUE;
default:
return FALSE;
}
case REL_ANY_DELETE:
switch (op_)
{
case REL_UNARY_DELETE:
case REL_LEAF_DELETE:
case REL_DELETE_CURSOR:
case REL_HBASE_DELETE:
return TRUE;
default:
return FALSE;
}
case REL_ANY_HBASE:
{
switch (op_)
{
case REL_HBASE_INSERT:
case REL_HBASE_DELETE:
case REL_HBASE_UPDATE:
case REL_HBASE_ACCESS:
return TRUE;
default:
return FALSE;
}
}
case REL_ANY_HBASE_GEN_UPDATE:
{
switch (op_)
{
case REL_HBASE_INSERT:
case REL_HBASE_DELETE:
case REL_HBASE_UPDATE:
return TRUE;
default:
return FALSE;
}
}
case REL_ANY_GROUP:
switch (op_)
{
case REL_GROUPBY:
case REL_AGGREGATE:
case REL_ORDERED_GROUPBY:
case REL_HASHED_GROUPBY:
case REL_SHORTCUT_GROUPBY:
return TRUE;
default:
return FALSE;
}
case REL_FORCE_EXCHANGE:
switch (op_)
{
case REL_EXCHANGE:
return TRUE;
default:
return FALSE;
}
case REL_ANY_BINARY_OP:
switch (op_)
{
case REL_JOIN:
case REL_TSJ:
case REL_ROUTINE_JOIN:
case REL_INDEX_JOIN:
case REL_SEMIJOIN:
case REL_SEMITSJ:
case REL_ANTI_SEMIJOIN:
case REL_ANTI_SEMITSJ:
case REL_LEFT_JOIN:
case REL_LEFT_TSJ:
case REL_UNION:
case REL_NESTED_JOIN:
case REL_LEFT_NESTED_JOIN:
case REL_NESTED_SEMIJOIN:
case REL_NESTED_ANTI_SEMIJOIN:
case REL_MERGE_JOIN:
case REL_LEFT_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_MERGE_ANTI_SEMIJOIN:
case REL_HASH_JOIN:
case REL_LEFT_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_HASH_ANTI_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
case REL_MERGE_UNION:
case REL_INTERSECT:
case REL_EXCEPT:
case REL_BINARY_TABLE_MAPPING_UDF:
return TRUE;
default:
return FALSE;
}
case REL_ANY_JOIN:
case REL_FORCE_JOIN:
switch (op_)
{
case REL_JOIN:
case REL_TSJ:
case REL_ROUTINE_JOIN:
case REL_INDEX_JOIN:
case REL_SEMIJOIN:
case REL_SEMITSJ:
case REL_ANTI_SEMIJOIN:
case REL_ANTI_SEMITSJ:
case REL_LEFT_JOIN:
case REL_LEFT_TSJ:
case REL_RIGHT_JOIN:
case REL_NESTED_JOIN:
case REL_LEFT_NESTED_JOIN:
case REL_NESTED_SEMIJOIN:
case REL_NESTED_ANTI_SEMIJOIN:
case REL_MERGE_JOIN:
case REL_LEFT_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_MERGE_ANTI_SEMIJOIN:
case REL_HASH_JOIN:
case REL_LEFT_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_HASH_ANTI_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
case REL_FULL_JOIN:
case REL_INTERSECT:
case REL_EXCEPT:
return TRUE;
default:
return FALSE;
}
case REL_ANY_INNER_JOIN:
switch (op_)
{
case REL_JOIN:
case REL_TSJ:
case REL_ROUTINE_JOIN:
case REL_INDEX_JOIN:
case REL_SEMIJOIN:
case REL_SEMITSJ:
case REL_NESTED_JOIN:
case REL_NESTED_SEMIJOIN:
case REL_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_NON_TS_INNER_JOIN:
switch (op_)
{
case REL_JOIN:
case REL_INDEX_JOIN:
case REL_SEMIJOIN:
case REL_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_NON_TSJ_JOIN:
switch (op_)
{
case REL_JOIN:
case REL_INDEX_JOIN:
case REL_SEMIJOIN:
case REL_ANTI_SEMIJOIN:
case REL_LEFT_JOIN:
case REL_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_LEFT_MERGE_JOIN:
case REL_MERGE_ANTI_SEMIJOIN:
case REL_HASH_JOIN:
case REL_LEFT_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_HASH_ANTI_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_TSJ:
case REL_FORCE_NESTED_JOIN:
switch (op_)
{
//case REL_JOIN: // Needed for fbcqs.
case REL_TSJ:
case REL_TSJ_FLOW:
case REL_ROUTINE_JOIN:
case REL_LEFT_TSJ:
case REL_SEMITSJ:
case REL_ANTI_SEMITSJ:
case REL_NESTED_JOIN:
case REL_NESTED_SEMIJOIN:
case REL_NESTED_ANTI_SEMIJOIN:
case REL_LEFT_NESTED_JOIN:
case REL_NESTED_JOIN_FLOW:
return TRUE;
default:
return FALSE;
}
case REL_ANY_FULL_JOIN:
switch (op_)
{
case REL_FULL_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_LEFT_JOIN:
switch (op_)
{
case REL_LEFT_JOIN:
case REL_LEFT_TSJ:
case REL_LEFT_NESTED_JOIN:
case REL_LEFT_MERGE_JOIN:
case REL_LEFT_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_FULL_JOIN: // is left join as well
return TRUE;
default:
return FALSE;
}
case REL_ANY_RIGHT_JOIN:
switch (op_)
{
case REL_RIGHT_JOIN:
case REL_FULL_JOIN: // is right join as well
case REL_FULL_HYBRID_HASH_JOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_SEMIJOIN:
switch (op_)
{
case REL_SEMIJOIN:
case REL_SEMITSJ:
case REL_NESTED_SEMIJOIN:
case REL_MERGE_SEMIJOIN:
case REL_HASH_SEMIJOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_ORDERED_HASH_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_ANTI_SEMIJOIN:
switch (op_)
{
case REL_ANTI_SEMIJOIN:
case REL_ANTI_SEMITSJ:
case REL_NESTED_ANTI_SEMIJOIN:
case REL_MERGE_ANTI_SEMIJOIN:
case REL_HASH_ANTI_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
case REL_EXCEPT:
return TRUE;
default:
return FALSE;
}
case REL_ANY_SEMITSJ:
switch (op_)
{
case REL_SEMITSJ:
case REL_NESTED_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_ANTI_SEMITSJ:
switch (op_)
{
case REL_ANTI_SEMITSJ:
case REL_NESTED_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_NESTED_JOIN :
switch (op_)
{
case REL_NESTED_JOIN:
case REL_NESTED_SEMIJOIN:
case REL_NESTED_ANTI_SEMIJOIN:
case REL_LEFT_NESTED_JOIN:
case REL_NESTED_JOIN_FLOW:
return TRUE;
default:
return FALSE;
}
case REL_ANY_HASH_JOIN:
case REL_FORCE_HASH_JOIN:
switch (op_)
{
case REL_HASH_JOIN:
case REL_LEFT_HASH_JOIN:
case REL_HASH_SEMIJOIN:
case REL_HASH_ANTI_SEMIJOIN:
case REL_HYBRID_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
case REL_ORDERED_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_FORCE_HYBRID_HASH_JOIN:
switch (op_)
{
case REL_HASH_JOIN:
case REL_HYBRID_HASH_JOIN:
case REL_LEFT_HYBRID_HASH_JOIN:
case REL_FULL_HYBRID_HASH_JOIN:
case REL_HYBRID_HASH_SEMIJOIN:
case REL_HYBRID_HASH_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_FORCE_ORDERED_CROSS_PRODUCT:
switch (op_)
{
case REL_HASH_JOIN:
case REL_HYBRID_HASH_JOIN:
return TRUE;
default:
return FALSE;
}
case REL_FORCE_ORDERED_HASH_JOIN:
switch (op_)
{
case REL_HASH_JOIN:
case REL_ORDERED_HASH_JOIN:
case REL_LEFT_ORDERED_HASH_JOIN:
case REL_ORDERED_HASH_SEMIJOIN:
case REL_ORDERED_HASH_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_MERGE_JOIN:
case REL_FORCE_MERGE_JOIN:
switch (op_)
{
case REL_MERGE_JOIN:
case REL_LEFT_MERGE_JOIN:
case REL_MERGE_SEMIJOIN:
case REL_MERGE_ANTI_SEMIJOIN:
return TRUE;
default:
return FALSE;
}
case REL_ANY_TABLE_MAPPING_UDF:
switch (op_)
{
case REL_LEAF_TABLE_MAPPING_UDF:
case REL_UNARY_TABLE_MAPPING_UDF:
case REL_BINARY_TABLE_MAPPING_UDF:
case REL_TABLE_MAPPING_BUILTIN_LOG_READER:
case REL_TABLE_MAPPING_BUILTIN_SERIES:
case REL_TABLE_MAPPING_BUILTIN_TIMESERIES:
case REL_TABLE_MAPPING_BUILTIN_JDBC:
return TRUE;
default:
return FALSE;
}
case REL_ANY_LEAF_TABLE_MAPPING_UDF:
switch (op_)
{
case REL_LEAF_TABLE_MAPPING_UDF:
case REL_TABLE_MAPPING_BUILTIN_LOG_READER:
case REL_TABLE_MAPPING_BUILTIN_JDBC:
return TRUE;
default:
return FALSE;
}
case REL_ANY_UNARY_TABLE_MAPPING_UDF:
switch (op_)
{
case REL_UNARY_TABLE_MAPPING_UDF:
case REL_TABLE_MAPPING_BUILTIN_TIMESERIES:
return TRUE;
default:
return FALSE;
}
case REL_ANY_BINARY_TABLE_MAPPING_UDF:
switch (op_)
{
case REL_BINARY_TABLE_MAPPING_UDF:
return TRUE;
default:
return FALSE;
}
case REL_ANY_EXTRACT:
switch (op_)
{
case REL_FAST_EXTRACT:
case REL_HIVE_INSERT:
return TRUE;
default:
return FALSE;
}
case ANY_REL_OR_ITM_OP:
ABORT("internal error in OperatorType::match()");
default:
return FALSE; // operators don't match
}
}
}
NABoolean OperatorType::isWildcard() const
{
switch (op_)
{
case ANY_REL_OR_ITM_OP:
case ITM_ANY_AGGREGATE:
case ITM_ANY_CAST:
case ITM_WILDCARD_EQ_NE:
case REL_ANY_BINARY_OP:
case REL_ANY_GEN_UPDATE:
case REL_ANY_GROUP:
case REL_ANY_INNER_JOIN:
case REL_ANY_JOIN:
case REL_ANY_LEAF_GEN_UPDATE:
case REL_ANY_LEAF_OP:
case REL_ANY_LEFT_JOIN:
case REL_ANY_NON_TS_INNER_JOIN:
case REL_ANY_SEMIJOIN:
case REL_ANY_SEMITSJ:
case REL_ANY_ANTI_SEMITSJ:
case REL_ANY_ANTI_SEMIJOIN:
case REL_ANY_TSJ:
case REL_ANY_UNARY_GEN_UPDATE:
case REL_ANY_UNARY_OP:
case REL_FORCE_ANY_SCAN:
case REL_ANY_ROUTINE:
case REL_ANY_SCALAR_UDF_ROUTINE:
case REL_ANY_EXTRACT:
return TRUE;
default:
return FALSE;
}
}
// -----------------------------------------------------------------------
// methods for class ExprNode
// -----------------------------------------------------------------------
// default constructor (assuming the max arity in the system is 2)
ExprNode::ExprNode(OperatorTypeEnum otype )
: operator_(otype), bound_(FALSE), transformed_(FALSE),
normalized_(FALSE), preCodeGenned_(FALSE), normalized4Cache_(FALSE),
cacheable_(MAYBECACHEABLE), semanticQueryOptimized_(FALSE)
{}
ExprNode::ExprNode(const ExprNode& s)
: NABasicObject(s)
, operator_(s.operator_)
, bound_(s.bound_)
, transformed_(s.transformed_)
, normalized_(s.normalized_)
, preCodeGenned_(s.preCodeGenned_)
, normalized4Cache_(s.normalized4Cache_)
, cacheable_(s.cacheable_)
, semanticQueryOptimized_(s.semanticQueryOptimized_)
{}
ExprNode::~ExprNode() {}
ExprNode * ExprNode::getChild(Lng32 )
{
ABORT("virtual function ExprNode::getChild() must be redefined");
return NULL;
} // ExprNode::getChild()
const ExprNode * ExprNode::getConstChild(Lng32 ) const
{
ABORT("virtual function const ExprNode::getConstChild() const must be redefined");
return NULL;
} // ExprNode::getChild()
void ExprNode::setChild(Lng32 , ExprNode *)
{
ABORT("virtual function ExprNode::setChild() must be redefined");
} // ExprNode::setChild()
ElemDDLNode * ExprNode::castToElemDDLNode()
{
return NULL;
}
const ElemDDLNode * ExprNode::castToElemDDLNode() const
{
return NULL;
}
RelExpr * ExprNode::castToRelExpr()
{
return NULL;
}
const RelExpr * ExprNode::castToRelExpr() const
{
return NULL;
}
ItemExpr * ExprNode::castToItemExpr()
{
return NULL;
}
const ItemExpr * ExprNode::castToItemExpr() const
{
return NULL;
}
StmtDDLNode * ExprNode::castToStmtDDLNode()
{
return NULL;
}
const StmtDDLNode * ExprNode::castToStmtDDLNode() const
{
return NULL;
}
StmtNode * ExprNode::castToStatementExpr()
{
return NULL;
}
const StmtNode * ExprNode::castToStatementExpr() const
{
return NULL;
}
Int32 ExprNode::getArity() const
{
ABORT("virtual function ExprNode::getArity() must be redefined");
return 0;
} // ExprNode::getArity()
const NAString ExprNode::getText() const
{
ABORT("virtual function ExprNode::getText() must be redefined");
return NAString("unknown??");
} // ExprNode::getText()
// the displayTree() method is defined in file DisplayTree.C
void ExprNode::print(FILE * f,
const char * prefix,
const char *) const
{
// print operator text
fprintf(f,"%sExprNode(%s)\n", prefix, (const char *) getText());
}
void ExprNode::unparse(NAString &,
PhaseEnum,
UnparseFormatEnum,
TableDesc * tabId) const
{
ABORT("ExprNode::unparse() must be redefined");
}
void ExprNode::addLocalExpr(LIST(ExprNode *) &,
LIST(NAString) &) const
{
// the default implementation is to do nothing
}