| /********************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| // @@@ END COPYRIGHT @@@ |
| **********************************************************************/ |
| /* -*-C++-*- |
| ***************************************************************************** |
| * |
| * File: <file> |
| * Description: |
| * |
| * |
| * Created: 7/10/95 |
| * Language: C++ |
| * |
| * |
| * |
| * |
| ***************************************************************************** |
| */ |
| |
| #include "Platform.h" |
| |
| |
| #include "exp_stdh.h" |
| #include "exp_clause_derived.h" |
| #include "exp_function.h" |
| #include "exp_interval.h" |
| #include "SQLTypeDefs.h" |
| |
| __declspec(dllimport) NABoolean ExExprComputeSpace(ex_tcb * tcb); |
| |
| static void getCaseDatatypes(short attr_type1, Lng32 attr_len1, short &type_op1, |
| short attr_type2, Lng32 attr_len2, short &type_op2, |
| Lng32 scaleDifference) |
| { |
| type_op1 = attr_type1; |
| type_op2 = attr_type2; |
| // |
| // If an operand is an interval, get its end field. |
| // |
| rec_datetime_field endField1; |
| rec_datetime_field endField2; |
| if ((type_op1 >= REC_MIN_INTERVAL) && (type_op1 <= REC_MAX_INTERVAL) && |
| (ExpInterval::getIntervalEndField(type_op1, endField1) != 0)) |
| return; |
| if ((type_op2 >= REC_MIN_INTERVAL) && (type_op2 <= REC_MAX_INTERVAL) && |
| (ExpInterval::getIntervalEndField(type_op2, endField2) != 0)) |
| return; |
| // |
| // If an operand is an interval and the other is an exact numeric or |
| // datetime, treat the interval as numeric. If both operands are intervals |
| // and they have the same end fields and the same fraction precision, |
| // treat them both as numeric. If an interval operand remains after |
| // these transformations, map it to a canonical type. |
| // |
| if ((type_op1 >= REC_MIN_INTERVAL) && (type_op1 <= REC_MAX_INTERVAL)) |
| { |
| if ( ((type_op2 >= REC_MIN_BINARY) && (type_op2 <= REC_MAX_BINARY)) || |
| ((type_op2 >= REC_MIN_DECIMAL) && (type_op2 <= REC_MAX_DECIMAL)) || |
| (type_op2 == REC_DATETIME) || |
| ((type_op2 >= REC_MIN_INTERVAL) && (type_op2 <= REC_MAX_INTERVAL) && |
| (endField1 == endField2) && (scaleDifference == 0)) ) |
| { |
| switch (attr_len1) |
| { |
| case SQL_SMALL_SIZE: |
| type_op1 = REC_BIN16_SIGNED; |
| break; |
| case SQL_INT_SIZE: |
| type_op1 = REC_BIN32_SIGNED; |
| break; |
| case SQL_LARGE_SIZE: |
| type_op1 = REC_BIN64_SIGNED; |
| break; |
| default: |
| assert(0); |
| break; |
| } |
| } |
| |
| // if type_op1 remained an interval datatype, convert it to canonical form |
| // (since internal representation only depends on end field) |
| |
| switch(type_op1) |
| { |
| case REC_INT_YEAR_MONTH: |
| type_op1 = REC_INT_MONTH; |
| break; |
| case REC_INT_DAY_HOUR: |
| type_op1 = REC_INT_HOUR; |
| break; |
| case REC_INT_DAY_MINUTE: |
| case REC_INT_HOUR_MINUTE: |
| type_op1 = REC_INT_MINUTE; |
| break; |
| case REC_INT_DAY_SECOND: |
| case REC_INT_HOUR_SECOND: |
| case REC_INT_MINUTE_SECOND: |
| type_op1 = REC_INT_SECOND; |
| break; |
| default: |
| break; // leave it unchanged |
| } |
| |
| } // end if type_op1 is an interval |
| |
| if ((type_op2 >= REC_MIN_INTERVAL) && (type_op2 <= REC_MAX_INTERVAL)) |
| { |
| if ( ((type_op1 >= REC_MIN_BINARY) && (type_op1 <= REC_MAX_BINARY)) || |
| ((type_op1 >= REC_MIN_DECIMAL) && (type_op1 <= REC_MAX_DECIMAL)) || |
| (type_op1 == REC_DATETIME) ) |
| { |
| switch (attr_len2) |
| { |
| case SQL_SMALL_SIZE: |
| type_op2 = REC_BIN16_SIGNED; |
| break; |
| case SQL_INT_SIZE: |
| type_op2 = REC_BIN32_SIGNED; |
| break; |
| case SQL_LARGE_SIZE: |
| type_op2 = REC_BIN64_SIGNED; |
| break; |
| } |
| } |
| |
| switch(type_op2) |
| { |
| case REC_INT_YEAR_MONTH: |
| type_op2 = REC_INT_MONTH; |
| break; |
| case REC_INT_DAY_HOUR: |
| type_op2 = REC_INT_HOUR; |
| break; |
| case REC_INT_DAY_MINUTE: |
| case REC_INT_HOUR_MINUTE: |
| type_op2 = REC_INT_MINUTE; |
| break; |
| case REC_INT_DAY_SECOND: |
| case REC_INT_HOUR_SECOND: |
| case REC_INT_MINUTE_SECOND: |
| type_op2 = REC_INT_SECOND; |
| break; |
| default: |
| break; // leave it unchanged |
| } |
| |
| } // end if type_op2 is an interval |
| } |
| |
| static void getConvCaseDatatypes(short attr_type1, Lng32 attr_len1, short &type_op1, |
| short attr_type2, Lng32 attr_len2, short &type_op2, |
| Lng32 scaleDifference) |
| { |
| // |
| // If an operand is ASCII and other is interval, just return |
| // some interval type (so as to not add multiple entries in |
| // the convert case array). At actual conversion time, the |
| // correct conversion is done based on the start and end fields. |
| // Lets make that 'fixed' datatype to be REC_INT_YEAR. |
| // |
| if ((attr_type1 >= REC_MIN_INTERVAL) && (attr_type1 <= REC_MAX_INTERVAL) && |
| (attr_type2 >= REC_MIN_CHARACTER) && (attr_type2 <= REC_MAX_CHARACTER)) |
| { |
| type_op1 = REC_INT_YEAR; |
| type_op2 = attr_type2; |
| } |
| else |
| if ((attr_type2 >= REC_MIN_INTERVAL) && (attr_type2 <= REC_MAX_INTERVAL) && |
| (attr_type1 >= REC_MIN_CHARACTER) && (attr_type1 <= REC_MAX_CHARACTER)) |
| { |
| type_op2 = REC_INT_YEAR; |
| type_op1 = attr_type1; |
| } |
| else |
| getCaseDatatypes(attr_type1, attr_len1, type_op1, |
| attr_type2, attr_len2, type_op2, |
| scaleDifference); |
| } |
| |
| ex_expr::exp_return_type ex_expr::fixup(Lng32 /*base*/, unsigned short mode, |
| const ex_tcb * tcb, |
| Space * space, |
| CollHeap * exHeap, |
| NABoolean computeSpaceOnly, |
| ex_globals * glob) |
| { |
| exp_return_type retcode = EXPR_OK; |
| |
| setHeap(exHeap); |
| myTcb_ = tcb; |
| |
| // The check for space is to prevent allocating off the heap in DP2. |
| if (space && tempsAreaLength_ > 0) // temps used |
| { |
| char * tempAllocArea = new(space) char[tempsAreaLength_]; |
| if (NOT computeSpaceOnly) |
| tempsArea_ = tempAllocArea; |
| } |
| |
| ex_clause *clause = clauses_; |
| while (clause) |
| { |
| retcode = clause->fixup(space, exHeap, |
| constantsArea_, tempsArea_, persistentArea_, |
| (short)getFixupConstsAndTemps(), |
| computeSpaceOnly); |
| clause->setProcessNulls(); |
| if (retcode == EXPR_ERROR) |
| return retcode; |
| |
| clause->setExeGlobals(glob); |
| |
| clause = clause->getNextClause(); |
| } |
| |
| // Set the fast evaluation pointer |
| if (!computeSpaceOnly) |
| setEvalPtr( TRUE /* isSamePrimary */ ); |
| |
| if (mode & INJECT_ERROR) |
| errorInjection_ = TRUE; |
| else |
| if (mode & INJECT_WARNING) |
| warningInjection_ = TRUE; |
| |
| return EXPR_OK; |
| }; |
| |
| ex_expr::exp_return_type ex_expr_lean::fixup(Lng32 /*base*/, |
| unsigned short mode, |
| const ex_tcb * tcb, |
| Space * space, |
| CollHeap * exHeap, |
| NABoolean computeSpaceOnly) |
| { |
| exp_return_type retcode = EXPR_OK; |
| |
| // The check for space is to prevent allocating off the heap in DP2. |
| if (space && tempsAreaLength_ > 0) // temps used |
| { |
| char * tempAllocArea = new(space) char[tempsAreaLength_]; |
| if (NOT computeSpaceOnly) |
| tempsArea_ = tempAllocArea; |
| } |
| |
| setHeap(exHeap); |
| |
| return retcode; |
| }; |
| |
| ex_expr::exp_return_type AggrExpr::fixup(Lng32 base, unsigned short mode, |
| const ex_tcb * tcb, |
| Space * space, |
| CollHeap * exHeap, |
| NABoolean computeSpaceOnly, |
| ex_globals * glob) |
| { |
| ex_expr::exp_return_type retcode; |
| |
| if (initExpr_) |
| { |
| if ((retcode = initExpr_->fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) != EXPR_OK) |
| return retcode; |
| } |
| |
| if (perrecExpr_) |
| { |
| if ((retcode = perrecExpr_->fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) != EXPR_OK) |
| return retcode; |
| } |
| |
| if (finalNullExpr_) |
| { |
| if ((retcode = finalNullExpr_->fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) |
| != EXPR_OK) |
| return retcode; |
| } |
| |
| if (finalExpr_) |
| { |
| if ((retcode = finalExpr_->fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) != EXPR_OK) |
| return retcode; |
| } |
| |
| if (groupingExpr_) |
| { |
| if ((retcode = groupingExpr_->fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) != EXPR_OK) |
| return retcode; |
| } |
| |
| // fixup the expression to do perrec aggregate evaluation. |
| if ((retcode = ex_expr::fixup(base, mode, tcb, space, |
| exHeap, computeSpaceOnly, glob)) != EXPR_OK) |
| return retcode; |
| |
| return EXPR_OK; |
| } |
| |
| ///////////////////////////////////////////////////////// |
| // clause fixup |
| ///////////////////////////////////////////////////////// |
| ex_expr::exp_return_type ex_clause::fixup(Space * space, |
| CollHeap * exHeap, |
| char * constantsArea, |
| char * tempsArea, |
| char * persistentArea, |
| short fixupFlag, |
| NABoolean spaceCompOnly) |
| { |
| for (Lng32 i=0; i<numOperands_;i++) |
| if (op_[i]) |
| op_[i]->fixup(space, |
| constantsArea, |
| tempsArea, |
| persistentArea, |
| fixupFlag, |
| spaceCompOnly); |
| |
| return ex_expr::EXPR_OK; |
| }; |
| |
| |
| ex_expr::exp_return_type ex_branch_clause::fixup(Space * space, |
| CollHeap * exHeap, |
| char * constantsArea, |
| char * tempsArea, |
| char * persistentArea, |
| short fixupFlag, |
| NABoolean spaceCompOnly) { |
| if (getNextClause() != saved_next_clause) |
| setNextClause(saved_next_clause); |
| return ex_clause::fixup(space, exHeap, constantsArea,tempsArea, persistentArea, fixupFlag, spaceCompOnly); |
| } |
| |
| |
| const ex_arith_clause::ArithInstrStruct ex_arith_clause::arithInstrInfo[] = |
| { |
| // op op1 datatype op2 datatype result datatype case statement index |
| {ITM_PLUS, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(ADD_BIN16S_BIN16S_BIN16S)}, |
| {ITM_PLUS, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(ADD_BIN16S_BIN16S_BIN32S)}, |
| {ITM_PLUS, REC_BIN16_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(ADD_BIN16S_BIN32S_BIN32S)}, |
| {ITM_PLUS, REC_BIN32_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(ADD_BIN32S_BIN16S_BIN32S)}, |
| {ITM_PLUS, REC_BIN32_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(ADD_BIN32S_BIN32S_BIN32S)}, |
| {ITM_PLUS, REC_BIN32_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN32S_BIN64S_BIN64S)}, |
| {ITM_PLUS, REC_BIN64_SIGNED, REC_BIN32_SIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN64S_BIN32S_BIN64S)}, |
| {ITM_PLUS, REC_BIN64_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN64S_BIN64S_BIN64S)}, |
| |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN16U)}, |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN16U)}, |
| {ITM_PLUS, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN16U)}, |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN32U_BIN32U)}, |
| {ITM_PLUS, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN32U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BPINT_UNSIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BPINTU_BIN64S_BIN64S)}, |
| {ITM_PLUS, REC_BIN64_SIGNED, REC_BPINT_UNSIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN64S_BPINTU_BIN64S)}, |
| |
| {ITM_PLUS, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN16U)}, |
| {ITM_PLUS, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN16U_BIN32U_BIN32U)}, |
| {ITM_PLUS, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN32U_BIN16U_BIN32U)}, |
| {ITM_PLUS, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(ADD_BIN32U_BIN32U_BIN32U)}, |
| {ITM_PLUS, REC_BIN32_UNSIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN32U_BIN64S_BIN64S)}, |
| {ITM_PLUS, REC_BIN64_SIGNED, REC_BIN32_UNSIGNED, REC_BIN64_SIGNED, instrAndText(ADD_BIN64S_BIN32U_BIN64S)}, |
| |
| {ITM_PLUS, REC_FLOAT32, REC_FLOAT32, REC_FLOAT32, instrAndText(ADD_FLOAT32_FLOAT32_FLOAT32)}, |
| {ITM_PLUS, REC_FLOAT64, REC_FLOAT64, REC_FLOAT64, instrAndText(ADD_FLOAT64_FLOAT64_FLOAT64)}, |
| {ITM_PLUS, REC_DATETIME, REC_BIN16_SIGNED, REC_DATETIME, instrAndText(ADD_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_PLUS, REC_DATETIME, REC_BIN32_SIGNED, REC_DATETIME, instrAndText(ADD_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_PLUS, REC_DATETIME, REC_BIN64_SIGNED, REC_DATETIME, instrAndText(ADD_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_PLUS, REC_BIN16_SIGNED, REC_DATETIME, REC_DATETIME, instrAndText(ADD_INTERVAL_DATETIME_DATETIME)}, |
| {ITM_PLUS, REC_BIN32_SIGNED, REC_DATETIME, REC_DATETIME, instrAndText(ADD_INTERVAL_DATETIME_DATETIME)}, |
| {ITM_PLUS, REC_BIN64_SIGNED, REC_DATETIME, REC_DATETIME, instrAndText(ADD_INTERVAL_DATETIME_DATETIME)}, |
| |
| {ITM_PLUS, REC_UNKNOWN, REC_UNKNOWN, REC_UNKNOWN, instrAndText(ADD_COMPLEX)}, |
| |
| |
| {ITM_MINUS, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(SUB_BIN16S_BIN16S_BIN16S)}, |
| {ITM_MINUS, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(SUB_BIN16S_BIN16S_BIN32S)}, |
| {ITM_MINUS, REC_BIN16_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(SUB_BIN16S_BIN32S_BIN32S)}, |
| {ITM_MINUS, REC_BIN32_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(SUB_BIN32S_BIN16S_BIN32S)}, |
| {ITM_MINUS, REC_BIN32_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(SUB_BIN32S_BIN32S_BIN32S)}, |
| {ITM_MINUS, REC_BIN64_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(SUB_BIN64S_BIN64S_BIN64S)}, |
| {ITM_MINUS, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN16U)}, |
| {ITM_MINUS, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN16U)}, |
| {ITM_MINUS, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN16U)}, |
| {ITM_MINUS, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN32U_BIN32U)}, |
| {ITM_MINUS, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN32U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN16U)}, |
| {ITM_MINUS, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN16U_BIN32U_BIN32U)}, |
| {ITM_MINUS, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN32U_BIN16U_BIN32U)}, |
| {ITM_MINUS, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(SUB_BIN32U_BIN32U_BIN32U)}, |
| {ITM_MINUS, REC_FLOAT32, REC_FLOAT32, REC_FLOAT32, instrAndText(SUB_FLOAT32_FLOAT32_FLOAT32)}, |
| {ITM_MINUS, REC_FLOAT64, REC_FLOAT64, REC_FLOAT64, instrAndText(SUB_FLOAT64_FLOAT64_FLOAT64)}, |
| {ITM_MINUS, REC_DATETIME, REC_BIN16_SIGNED, REC_DATETIME, instrAndText(SUB_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_MINUS, REC_DATETIME, REC_BIN32_SIGNED, REC_DATETIME, instrAndText(SUB_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_MINUS, REC_DATETIME, REC_BIN64_SIGNED, REC_DATETIME, instrAndText(SUB_DATETIME_INTERVAL_DATETIME)}, |
| {ITM_MINUS, REC_DATETIME, REC_DATETIME, REC_BIN16_SIGNED, instrAndText(SUB_DATETIME_DATETIME_INTERVAL)}, |
| {ITM_MINUS, REC_DATETIME, REC_DATETIME, REC_BIN32_SIGNED, instrAndText(SUB_DATETIME_DATETIME_INTERVAL)}, |
| {ITM_MINUS, REC_DATETIME, REC_DATETIME, REC_BIN64_SIGNED, instrAndText(SUB_DATETIME_DATETIME_INTERVAL)}, |
| {ITM_MINUS, REC_UNKNOWN, REC_UNKNOWN, REC_UNKNOWN, instrAndText(SUB_COMPLEX)}, |
| |
| |
| {ITM_TIMES, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(MUL_BIN16S_BIN16S_BIN16S)}, |
| {ITM_TIMES, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(MUL_BIN16S_BIN16S_BIN32S)}, |
| {ITM_TIMES, REC_BIN16_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(MUL_BIN16S_BIN32S_BIN32S)}, |
| {ITM_TIMES, REC_BIN32_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(MUL_BIN32S_BIN16S_BIN32S)}, |
| {ITM_TIMES, REC_BIN32_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(MUL_BIN32S_BIN32S_BIN32S)}, |
| {ITM_TIMES, REC_BIN64_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(MUL_BIN64S_BIN64S_BIN64S)}, |
| {ITM_TIMES, REC_BIN16_SIGNED, REC_BIN32_SIGNED, REC_BIN64_SIGNED, instrAndText(MUL_BIN16S_BIN32S_BIN64S)}, |
| {ITM_TIMES, REC_BIN32_SIGNED, REC_BIN16_SIGNED, REC_BIN64_SIGNED, instrAndText(MUL_BIN32S_BIN16S_BIN64S)}, |
| {ITM_TIMES, REC_BIN32_SIGNED, REC_BIN32_SIGNED, REC_BIN64_SIGNED, instrAndText(MUL_BIN32S_BIN32S_BIN64S)}, |
| {ITM_TIMES, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN16U)}, |
| {ITM_TIMES, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN16U)}, |
| {ITM_TIMES, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN16U)}, |
| {ITM_TIMES, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN32U_BIN32U)}, |
| {ITM_TIMES, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN32U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN16U)}, |
| {ITM_TIMES, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN16U_BIN32U_BIN32U)}, |
| {ITM_TIMES, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN32U_BIN16U_BIN32U)}, |
| {ITM_TIMES, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(MUL_BIN32U_BIN32U_BIN32U)}, |
| {ITM_TIMES, REC_FLOAT32, REC_FLOAT32, REC_FLOAT32, instrAndText(MUL_FLOAT32_FLOAT32_FLOAT32)}, |
| {ITM_TIMES, REC_FLOAT64, REC_FLOAT64, REC_FLOAT64, instrAndText(MUL_FLOAT64_FLOAT64_FLOAT64)}, |
| {ITM_TIMES, REC_UNKNOWN, REC_UNKNOWN, REC_UNKNOWN, instrAndText(MUL_COMPLEX)}, |
| |
| |
| {ITM_DIVIDE, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(DIV_BIN16S_BIN16S_BIN16S)}, |
| {ITM_DIVIDE, REC_BIN16_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(DIV_BIN16S_BIN16S_BIN32S)}, |
| {ITM_DIVIDE, REC_BIN16_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(DIV_BIN16S_BIN32S_BIN32S)}, |
| {ITM_DIVIDE, REC_BIN32_SIGNED, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(DIV_BIN32S_BIN16S_BIN32S)}, |
| {ITM_DIVIDE, REC_BIN32_SIGNED, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(DIV_BIN32S_BIN32S_BIN32S)}, |
| {ITM_DIVIDE, REC_BIN64_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(DIV_BIN64S_BIN64S_BIN64S)}, |
| {ITM_DIVIDE, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN16U)}, |
| {ITM_DIVIDE, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN16U)}, |
| {ITM_DIVIDE, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN16U)}, |
| {ITM_DIVIDE, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN32U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN32U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN16U)}, |
| {ITM_DIVIDE, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN16U_BIN32U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN32U_BIN16U_BIN32U)}, |
| {ITM_DIVIDE, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(DIV_BIN32U_BIN32U_BIN32U)}, |
| {ITM_DIVIDE, REC_FLOAT64, REC_FLOAT64, REC_FLOAT64, instrAndText(DIV_FLOAT64_FLOAT64_FLOAT64)}, |
| {ITM_DIVIDE, REC_UNKNOWN, REC_UNKNOWN, REC_UNKNOWN, instrAndText(DIV_COMPLEX)}, |
| |
| {ITM_DIVIDE, REC_BIN64_SIGNED, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(DIV_BIN64S_BIN64S_BIN64S_ROUND)}, |
| |
| {ITM_NEGATE, REC_BOOLEAN, REC_BOOLEAN, REC_BOOLEAN, instrAndText(NEGATE_BOOLEAN)}, |
| |
| }; |
| |
| const ex_arith_clause::ArithInstrStruct * ex_arith_clause::getMatchingRow(OperatorTypeEnum op, |
| short datatype1, |
| short datatype2, |
| short resulttype) |
| { |
| Int32 max_array_size = sizeof(arithInstrInfo) / sizeof(ArithInstrStruct); |
| |
| Int32 i = 0; |
| Int32 found = 0; |
| while ((i < max_array_size) && (!found)) |
| if ((arithInstrInfo[i].op == op) && |
| (arithInstrInfo[i].type_op1 == datatype1) && |
| (arithInstrInfo[i].type_op2 == datatype2) && |
| (arithInstrInfo[i].type_op0 == resulttype)) |
| found = -1; |
| else |
| i++; |
| |
| if (found) |
| { |
| setInstrArrayIndex(i); |
| return &arithInstrInfo[i]; |
| } |
| else |
| return 0; |
| } |
| |
| Lng32 ex_arith_clause::findIndexIntoInstrArray(ArithInstruction ci) |
| { |
| Int32 max_array_size = sizeof(arithInstrInfo) / sizeof(ArithInstrStruct); |
| |
| Int32 i = 0; |
| while ((i < max_array_size) && |
| (arithInstrInfo[i].instruction != ci)) |
| { |
| i++; |
| } |
| |
| if (i < max_array_size) |
| return i; |
| |
| return -1; // not found |
| } |
| |
| const ArithInstruction ex_arith_clause::computeCaseIndex(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2, |
| Attributes * result) |
| { |
| ArithInstruction instruction = ARITH_NOT_SUPPORTED; |
| |
| short type_op1 = -1; |
| short type_op2 = -1; |
| short type_result = -1; |
| getCaseDatatypes(attr1->getDatatype(), attr1->getLength(), type_op1, |
| result->getDatatype(), result->getLength(), type_result, |
| 0 /* don't need to take scale difference into account here */); |
| |
| // attr2 eill be null for unary operands. |
| // Some methods below expect 2 operands. Change oper2 to be the same as oper1 |
| // to avoid null pointer exception. |
| if (!attr2) |
| attr2 = attr1; |
| getCaseDatatypes(attr2->getDatatype(), attr2->getLength(), type_op2, |
| result->getDatatype(), result->getLength(), type_result, |
| 0 /* don't need to take scale difference into account here */); |
| |
| const ArithInstrStruct * as = getMatchingRow(op, |
| type_op1, |
| type_op2, |
| type_result); |
| |
| if (as) |
| { |
| instruction = as->instruction; |
| |
| // for binary numeric and interval datatypes, arith done only if scales |
| // are the same and operation is addition or subtraction |
| if (((op == ITM_PLUS) || (op == ITM_MINUS)) && |
| (((result->getDatatype() >= REC_MIN_BINARY) && |
| (result->getDatatype() <= REC_MAX_BINARY)) || |
| ((result->getDatatype() >= REC_MIN_INTERVAL) && |
| (result->getDatatype() <= REC_MAX_INTERVAL)))) |
| { |
| // numeric or interval types |
| if (attr1->getScale() != attr2->getScale()) |
| { |
| instruction = ARITH_NOT_SUPPORTED; |
| setInstrArrayIndex(-1); |
| } |
| |
| } // numeric or interval types |
| else if ((op == ITM_DIVIDE) && |
| (arithRoundingMode_ != 0)) |
| { |
| if (instruction == DIV_BIN64S_BIN64S_BIN64S) |
| { |
| instruction = DIV_BIN64S_BIN64S_BIN64S_ROUND; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| else |
| { |
| instruction = ARITH_NOT_SUPPORTED; |
| setInstrArrayIndex(-1); |
| } |
| } |
| } |
| |
| if (instruction == ARITH_NOT_SUPPORTED) |
| setInstrArrayIndex(-1); |
| |
| return instruction; |
| } |
| |
| void ex_arith_clause::setInstruction() |
| { |
| ArithInstruction instruction = ARITH_NOT_SUPPORTED; |
| setInstrArrayIndex(-1); |
| |
| if (getOperand(0)->isComplexType()) |
| { |
| switch (getOperType()) |
| { |
| case ITM_PLUS: |
| instruction = ADD_COMPLEX; |
| break; |
| |
| case ITM_MINUS: |
| instruction = SUB_COMPLEX; |
| break; |
| |
| case ITM_TIMES: |
| instruction = MUL_COMPLEX; |
| break; |
| |
| case ITM_DIVIDE: |
| instruction = DIV_COMPLEX; |
| break; |
| |
| default: |
| break; |
| } |
| |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| else |
| { |
| // Simple types are handled here. |
| instruction = computeCaseIndex(getOperType(), |
| getOperand(1), |
| (getNumOperands() == 3 ? getOperand(2) : NULL), |
| getOperand(0)); |
| } |
| |
| if ((instruction == ARITH_NOT_SUPPORTED) && |
| (getInstrArrayIndex() >= 0)) |
| { |
| // this is an error, reset instr array index |
| setInstrArrayIndex(-1); |
| } |
| } |
| |
| void ex_arith_clause::setInstruction(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2, |
| Attributes * result) |
| { |
| // Only simple types are handled here. |
| ArithInstruction instruction = computeCaseIndex(op, attr1, attr2, result); |
| |
| if ((instruction == ARITH_NOT_SUPPORTED) && |
| (getInstrArrayIndex() >= 0)) |
| { |
| // this is an error, reset instr array index |
| setInstrArrayIndex(-1); |
| } |
| } |
| |
| short ex_arith_clause::isArithSupported(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2, |
| Attributes * result) |
| { |
| if (computeCaseIndex(op, attr1, attr2, result) |
| == ARITH_NOT_SUPPORTED) |
| return 0; |
| else |
| return -1; |
| } |
| |
| ex_expr::exp_return_type ex_arith_clause::fixup(Space * space, |
| CollHeap * exHeap, |
| char * constants_area, |
| char * temps_area, |
| char * persistentArea, |
| short fixupConstsAndTemps, |
| NABoolean spaceCompOnly) |
| { |
| setInstruction(); |
| return ex_clause::fixup(space, exHeap, constants_area, temps_area, |
| persistentArea, |
| fixupConstsAndTemps, spaceCompOnly); |
| } |
| |
| const ex_comp_clause::CompInstrStruct ex_comp_clause::compInstrInfo[] = |
| { |
| // op op1 datatype op2 datatype instruction+str |
| |
| // ITM_ANY_COMP entries are generic entries needed to get the corresponding |
| // instructions added to this array. |
| {ITM_ANY_COMP, REC_UNKNOWN, REC_UNKNOWN, instrAndText(ASCII_COMP)}, |
| {ITM_ANY_COMP, REC_UNKNOWN, REC_UNKNOWN, instrAndText(COMP_COMPLEX)}, |
| |
| {ITM_EQUAL, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(EQ_BIN8S_BIN8S)}, |
| {ITM_EQUAL, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(EQ_BIN8U_BIN8U)}, |
| |
| {ITM_EQUAL, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(EQ_BIN16S_BIN16S)}, |
| {ITM_EQUAL, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(EQ_BIN16S_BIN32S)}, |
| {ITM_EQUAL, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(EQ_BIN16S_BIN16U)}, |
| {ITM_EQUAL, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(EQ_BIN16S_BIN16U)}, |
| {ITM_EQUAL, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(EQ_BIN16S_BIN32U)}, |
| |
| {ITM_EQUAL, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(EQ_BIN16U_BIN16S)}, |
| {ITM_EQUAL, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(EQ_BIN16U_BIN32S)}, |
| {ITM_EQUAL, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(EQ_BIN16U_BIN16U)}, |
| {ITM_EQUAL, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(EQ_BIN16U_BIN16U)}, |
| {ITM_EQUAL, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(EQ_BIN16U_BIN32U)}, |
| |
| {ITM_EQUAL, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(EQ_BIN16U_BIN16S)}, |
| {ITM_EQUAL, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(EQ_BIN16U_BIN32S)}, |
| {ITM_EQUAL, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(EQ_BIN16U_BIN16U)}, |
| {ITM_EQUAL, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(EQ_BIN16U_BIN16U)}, |
| {ITM_EQUAL, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(EQ_BIN16U_BIN32U)}, // Was BIN32S. Error? ANS |
| |
| {ITM_EQUAL, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(EQ_BIN32S_BIN16S)}, |
| {ITM_EQUAL, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(EQ_BIN32S_BIN32S)}, |
| {ITM_EQUAL, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(EQ_BIN32S_BIN16U)}, |
| {ITM_EQUAL, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(EQ_BIN32S_BIN16U)}, |
| {ITM_EQUAL, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(EQ_BIN32S_BIN32U)}, // Was BIN32S. Error? ANS |
| |
| {ITM_EQUAL, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(EQ_BIN32U_BIN16S)}, |
| {ITM_EQUAL, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(EQ_BIN32U_BIN32S)}, |
| {ITM_EQUAL, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(EQ_BIN32U_BIN16U)}, |
| {ITM_EQUAL, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(EQ_BIN32U_BIN16U)}, |
| {ITM_EQUAL, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(EQ_BIN32U_BIN32U)}, // Was BIN32S. Error? ANS |
| |
| {ITM_EQUAL, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(EQ_BIN64S_BIN64S)}, |
| {ITM_EQUAL, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(EQ_BIN64U_BIN64U)}, |
| {ITM_EQUAL, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(EQ_BIN64S_BIN64U)}, |
| {ITM_EQUAL, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(EQ_BIN64U_BIN64S)}, |
| |
| {ITM_EQUAL, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(EQ_DECU_DECU)}, |
| {ITM_EQUAL, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(EQ_DECS_DECS)}, |
| |
| {ITM_EQUAL, REC_FLOAT32, REC_FLOAT32, instrAndText(EQ_FLOAT32_FLOAT32)}, |
| {ITM_EQUAL, REC_FLOAT64, REC_FLOAT64, instrAndText(EQ_FLOAT64_FLOAT64)}, |
| |
| {ITM_EQUAL, REC_DATETIME, REC_DATETIME, instrAndText(EQ_DATETIME_DATETIME)}, |
| |
| {ITM_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(EQ_ASCII_F_F)}, |
| |
| {ITM_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(EQ_ASCII_COMP)}, |
| {ITM_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(EQ_ASCII_COMP)}, |
| |
| {ITM_EQUAL,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(EQ_UNICODE_F_F)}, |
| {ITM_EQUAL, REC_NCHAR_F_UNICODE,REC_NCHAR_V_UNICODE,instrAndText(UNICODE_COMP)}, |
| {ITM_EQUAL, REC_NCHAR_V_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(UNICODE_COMP)}, |
| {ITM_EQUAL, REC_NCHAR_V_UNICODE,REC_NCHAR_V_UNICODE,instrAndText(UNICODE_COMP)}, |
| |
| {ITM_EQUAL, REC_BLOB,REC_BLOB,instrAndText(EQ_BLOB)}, |
| |
| {ITM_EQUAL, REC_BOOLEAN, REC_BOOLEAN, instrAndText(EQ_BOOL_BOOL)}, |
| |
| {ITM_NOT_EQUAL, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(NE_BIN8S_BIN8S)}, |
| {ITM_NOT_EQUAL, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(NE_BIN8U_BIN8U)}, |
| |
| {ITM_NOT_EQUAL, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(NE_BIN16S_BIN16S)}, |
| {ITM_NOT_EQUAL, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(NE_BIN16S_BIN32S)}, |
| {ITM_NOT_EQUAL, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(NE_BIN16S_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(NE_BIN16S_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(NE_BIN16S_BIN32U)}, //Was 32S. Error? ANS |
| |
| {ITM_NOT_EQUAL, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(NE_BIN16U_BIN16S)}, |
| {ITM_NOT_EQUAL, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(NE_BIN16U_BIN32S)}, |
| {ITM_NOT_EQUAL, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(NE_BIN16U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(NE_BIN16U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(NE_BIN16U_BIN32U)}, //Was 32S. Error? ANS |
| |
| {ITM_NOT_EQUAL, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(NE_BIN16U_BIN16S)}, |
| {ITM_NOT_EQUAL, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(NE_BIN16U_BIN32S)}, |
| {ITM_NOT_EQUAL, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(NE_BIN16U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(NE_BIN16U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(NE_BIN16U_BIN32U)}, //Was 32S. Error? ANS |
| |
| {ITM_NOT_EQUAL, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(NE_BIN32S_BIN16S)}, |
| {ITM_NOT_EQUAL, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(NE_BIN32S_BIN32S)}, |
| {ITM_NOT_EQUAL, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(NE_BIN32S_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(NE_BIN32S_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(NE_BIN32S_BIN32U)}, //Was 32S. Error? ANS |
| |
| {ITM_NOT_EQUAL, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(NE_BIN32U_BIN16S)}, |
| {ITM_NOT_EQUAL, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(NE_BIN32U_BIN32S)}, |
| {ITM_NOT_EQUAL, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(NE_BIN32U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(NE_BIN32U_BIN16U)}, |
| {ITM_NOT_EQUAL, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(NE_BIN32U_BIN32U)}, //Was 32S. Error? ANS |
| |
| {ITM_NOT_EQUAL, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(NE_BIN64S_BIN64S)}, |
| {ITM_NOT_EQUAL, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(NE_BIN64U_BIN64U)}, |
| {ITM_NOT_EQUAL, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(NE_BIN64S_BIN64U)}, |
| {ITM_NOT_EQUAL, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(NE_BIN64U_BIN64S)}, |
| |
| {ITM_NOT_EQUAL, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(NE_DECU_DECU)}, |
| {ITM_NOT_EQUAL, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(NE_DECS_DECS)}, |
| |
| {ITM_NOT_EQUAL, REC_FLOAT32, REC_FLOAT32, instrAndText(NE_FLOAT32_FLOAT32)}, |
| {ITM_NOT_EQUAL, REC_FLOAT64, REC_FLOAT64, instrAndText(NE_FLOAT64_FLOAT64)}, |
| |
| {ITM_NOT_EQUAL, REC_DATETIME, REC_DATETIME, instrAndText(NE_DATETIME_DATETIME)}, |
| |
| {ITM_NOT_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(NE_ASCII_F_F)}, |
| |
| {ITM_NOT_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(NE_ASCII_COMP)}, |
| {ITM_NOT_EQUAL, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(NE_ASCII_COMP)}, |
| |
| {ITM_NOT_EQUAL,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(NE_UNICODE_F_F)}, |
| {ITM_NOT_EQUAL, REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_NOT_EQUAL, REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_NOT_EQUAL, REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| |
| {ITM_NOT_EQUAL, REC_BOOLEAN, REC_BOOLEAN, instrAndText(NE_BOOL_BOOL)}, |
| |
| {ITM_LESS, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(LT_BIN8S_BIN8S)}, |
| {ITM_LESS, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(LT_BIN8U_BIN8U)}, |
| |
| {ITM_LESS, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(LT_BIN16S_BIN16S)}, |
| {ITM_LESS, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(LT_BIN16S_BIN32S)}, |
| {ITM_LESS, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(LT_BIN16S_BIN16U)}, |
| {ITM_LESS, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(LT_BIN16S_BIN16U)}, |
| {ITM_LESS, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(LT_BIN16S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LT_BIN16U_BIN16S)}, |
| {ITM_LESS, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LT_BIN16U_BIN32S)}, |
| {ITM_LESS, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LT_BIN16U_BIN16U)}, |
| {ITM_LESS, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LT_BIN16U_BIN16U)}, |
| {ITM_LESS, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LT_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LT_BIN16U_BIN16S)}, |
| {ITM_LESS, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LT_BIN16U_BIN32S)}, |
| {ITM_LESS, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LT_BIN16U_BIN16U)}, |
| {ITM_LESS, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LT_BIN16U_BIN16U)}, |
| {ITM_LESS, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LT_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(LT_BIN32S_BIN16S)}, |
| {ITM_LESS, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(LT_BIN32S_BIN32S)}, |
| {ITM_LESS, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(LT_BIN32S_BIN16U)}, |
| {ITM_LESS, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(LT_BIN32S_BIN16U)}, |
| {ITM_LESS, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(LT_BIN32S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LT_BIN32U_BIN16S)}, |
| {ITM_LESS, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LT_BIN32U_BIN32S)}, |
| {ITM_LESS, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LT_BIN32U_BIN16U)}, |
| {ITM_LESS, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LT_BIN32U_BIN16U)}, |
| {ITM_LESS, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LT_BIN32U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(LT_BIN64S_BIN64S)}, |
| {ITM_LESS, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(LT_BIN64U_BIN64U)}, |
| {ITM_LESS, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(LT_BIN64S_BIN64U)}, |
| {ITM_LESS, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(LT_BIN64U_BIN64S)}, |
| |
| {ITM_LESS, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(LT_DECU_DECU)}, |
| {ITM_LESS, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(LT_DECS_DECS)}, |
| |
| {ITM_LESS, REC_FLOAT32, REC_FLOAT32, instrAndText(LT_FLOAT32_FLOAT32)}, |
| {ITM_LESS, REC_FLOAT64, REC_FLOAT64, instrAndText(LT_FLOAT64_FLOAT64)}, |
| |
| {ITM_LESS, REC_DATETIME, REC_DATETIME, instrAndText(LT_DATETIME_DATETIME)}, |
| |
| {ITM_LESS, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(LT_ASCII_F_F)}, |
| |
| {ITM_LESS, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(LT_ASCII_COMP)}, |
| {ITM_LESS,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(LT_UNICODE_F_F)}, |
| {ITM_LESS, REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_LESS, REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_LESS, REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| |
| |
| {ITM_LESS_EQ, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(LE_BIN8S_BIN8S)}, |
| {ITM_LESS_EQ, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(LE_BIN8U_BIN8U)}, |
| |
| {ITM_LESS_EQ, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(LE_BIN16S_BIN16S)}, |
| {ITM_LESS_EQ, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(LE_BIN16S_BIN32S)}, |
| {ITM_LESS_EQ, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(LE_BIN16S_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(LE_BIN16S_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(LE_BIN16S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS_EQ, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LE_BIN16U_BIN16S)}, |
| {ITM_LESS_EQ, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LE_BIN16U_BIN32S)}, |
| {ITM_LESS_EQ, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LE_BIN16U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LE_BIN16U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LE_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS_EQ, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LE_BIN16U_BIN16S)}, |
| {ITM_LESS_EQ, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LE_BIN16U_BIN32S)}, |
| {ITM_LESS_EQ, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LE_BIN16U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LE_BIN16U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LE_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS_EQ, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(LE_BIN32S_BIN16S)}, |
| {ITM_LESS_EQ, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(LE_BIN32S_BIN32S)}, |
| {ITM_LESS_EQ, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(LE_BIN32S_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(LE_BIN32S_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(LE_BIN32S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS_EQ, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(LE_BIN32U_BIN16S)}, |
| {ITM_LESS_EQ, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(LE_BIN32U_BIN32S)}, |
| {ITM_LESS_EQ, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(LE_BIN32U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(LE_BIN32U_BIN16U)}, |
| {ITM_LESS_EQ, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(LE_BIN32U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_LESS_EQ, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(LE_BIN64S_BIN64S)}, |
| {ITM_LESS_EQ, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(LE_BIN64U_BIN64U)}, |
| {ITM_LESS_EQ, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(LE_BIN64S_BIN64U)}, |
| {ITM_LESS_EQ, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(LE_BIN64U_BIN64S)}, |
| |
| {ITM_LESS_EQ, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(LE_DECU_DECU)}, |
| {ITM_LESS_EQ, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(LE_DECS_DECS)}, |
| |
| {ITM_LESS_EQ, REC_FLOAT32, REC_FLOAT32, instrAndText(LE_FLOAT32_FLOAT32)}, |
| {ITM_LESS_EQ, REC_FLOAT64, REC_FLOAT64, instrAndText(LE_FLOAT64_FLOAT64)}, |
| |
| {ITM_LESS_EQ, REC_DATETIME, REC_DATETIME, instrAndText(LE_DATETIME_DATETIME)}, |
| |
| {ITM_LESS_EQ, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(LE_ASCII_F_F)}, |
| |
| {ITM_LESS_EQ, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(LE_ASCII_COMP)}, |
| {ITM_LESS_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(LE_ASCII_COMP)}, |
| |
| {ITM_LESS_EQ,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(LE_UNICODE_F_F)}, |
| {ITM_LESS_EQ, REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_LESS_EQ, REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_LESS_EQ, REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| |
| |
| {ITM_GREATER, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(GT_BIN8S_BIN8S)}, |
| {ITM_GREATER, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(GT_BIN8U_BIN8U)}, |
| |
| {ITM_GREATER, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(GT_BIN16S_BIN16S)}, |
| {ITM_GREATER, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(GT_BIN16S_BIN32S)}, |
| {ITM_GREATER, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(GT_BIN16S_BIN16U)}, |
| {ITM_GREATER, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(GT_BIN16S_BIN16U)}, |
| {ITM_GREATER, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(GT_BIN16S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GT_BIN16U_BIN16S)}, |
| {ITM_GREATER, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GT_BIN16U_BIN32S)}, |
| {ITM_GREATER, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GT_BIN16U_BIN16U)}, |
| {ITM_GREATER, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GT_BIN16U_BIN16U)}, |
| {ITM_GREATER, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GT_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GT_BIN16U_BIN16S)}, |
| {ITM_GREATER, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GT_BIN16U_BIN32S)}, |
| {ITM_GREATER, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GT_BIN16U_BIN16U)}, |
| {ITM_GREATER, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GT_BIN16U_BIN16U)}, |
| {ITM_GREATER, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GT_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(GT_BIN32S_BIN16S)}, |
| {ITM_GREATER, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(GT_BIN32S_BIN32S)}, |
| {ITM_GREATER, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(GT_BIN32S_BIN16U)}, |
| {ITM_GREATER, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(GT_BIN32S_BIN16U)}, |
| {ITM_GREATER, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(GT_BIN32S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GT_BIN32U_BIN16S)}, |
| {ITM_GREATER, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GT_BIN32U_BIN32S)}, |
| {ITM_GREATER, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GT_BIN32U_BIN16U)}, |
| {ITM_GREATER, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GT_BIN32U_BIN16U)}, |
| {ITM_GREATER, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GT_BIN32U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(GT_BIN64S_BIN64S)}, |
| {ITM_GREATER, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(GT_BIN64U_BIN64U)}, |
| {ITM_GREATER, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(GT_BIN64S_BIN64U)}, |
| {ITM_GREATER, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(GT_BIN64U_BIN64S)}, |
| |
| {ITM_GREATER, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(GT_DECU_DECU)}, |
| {ITM_GREATER, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(GT_DECS_DECS)}, |
| |
| {ITM_GREATER, REC_FLOAT32, REC_FLOAT32, instrAndText(GT_FLOAT32_FLOAT32)}, |
| {ITM_GREATER, REC_FLOAT64, REC_FLOAT64, instrAndText(GT_FLOAT64_FLOAT64)}, |
| |
| {ITM_GREATER, REC_DATETIME, REC_DATETIME, instrAndText(GT_DATETIME_DATETIME)}, |
| |
| {ITM_GREATER, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(GT_ASCII_F_F)}, |
| |
| {ITM_GREATER, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(GT_ASCII_COMP)}, |
| {ITM_GREATER, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(GT_ASCII_COMP)}, |
| |
| {ITM_GREATER,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(GT_UNICODE_F_F)}, |
| {ITM_GREATER, REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_GREATER, REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_GREATER, REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| |
| |
| {ITM_GREATER_EQ, REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(GE_BIN8S_BIN8S)}, |
| {ITM_GREATER_EQ, REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(GE_BIN8U_BIN8U)}, |
| |
| {ITM_GREATER_EQ, REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(GE_BIN16S_BIN16S)}, |
| {ITM_GREATER_EQ, REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(GE_BIN16S_BIN32S)}, |
| {ITM_GREATER_EQ, REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(GE_BIN16S_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(GE_BIN16S_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(GE_BIN16S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER_EQ, REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GE_BIN16U_BIN16S)}, |
| {ITM_GREATER_EQ, REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GE_BIN16U_BIN32S)}, |
| {ITM_GREATER_EQ, REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GE_BIN16U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GE_BIN16U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GE_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER_EQ, REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GE_BIN16U_BIN16S)}, |
| {ITM_GREATER_EQ, REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GE_BIN16U_BIN32S)}, |
| {ITM_GREATER_EQ, REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GE_BIN16U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GE_BIN16U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GE_BIN16U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER_EQ, REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(GE_BIN32S_BIN16S)}, |
| {ITM_GREATER_EQ, REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(GE_BIN32S_BIN32S)}, |
| {ITM_GREATER_EQ, REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(GE_BIN32S_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(GE_BIN32S_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(GE_BIN32S_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER_EQ, REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(GE_BIN32U_BIN16S)}, |
| {ITM_GREATER_EQ, REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(GE_BIN32U_BIN32S)}, |
| {ITM_GREATER_EQ, REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(GE_BIN32U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(GE_BIN32U_BIN16U)}, |
| {ITM_GREATER_EQ, REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(GE_BIN32U_BIN32U)}, // Was 32S. Error? ANS |
| |
| {ITM_GREATER_EQ, REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(GE_BIN64S_BIN64S)}, |
| {ITM_GREATER_EQ, REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(GE_BIN64U_BIN64U)}, |
| {ITM_GREATER_EQ, REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(GE_BIN64S_BIN64U)}, |
| {ITM_GREATER_EQ, REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(GE_BIN64U_BIN64S)}, |
| |
| {ITM_GREATER_EQ, REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(GE_DECU_DECU)}, |
| {ITM_GREATER_EQ, REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(GE_DECS_DECS)}, |
| |
| {ITM_GREATER_EQ, REC_FLOAT32, REC_FLOAT32, instrAndText(GE_FLOAT32_FLOAT32)}, |
| {ITM_GREATER_EQ, REC_FLOAT64, REC_FLOAT64, instrAndText(GE_FLOAT64_FLOAT64)}, |
| |
| {ITM_GREATER_EQ, REC_DATETIME, REC_DATETIME, instrAndText(GE_DATETIME_DATETIME)}, |
| |
| {ITM_GREATER_EQ, REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(GE_ASCII_F_F)}, |
| |
| {ITM_GREATER_EQ, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(GE_ASCII_COMP)}, |
| {ITM_GREATER_EQ, REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(GE_ASCII_COMP)}, |
| |
| {ITM_GREATER_EQ,REC_NCHAR_F_UNICODE,REC_NCHAR_F_UNICODE,instrAndText(GE_UNICODE_F_F)}, |
| {ITM_GREATER_EQ, REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_GREATER_EQ, REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(UNICODE_COMP)}, |
| {ITM_GREATER_EQ, REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(UNICODE_COMP)}, |
| |
| }; |
| |
| |
| const ex_comp_clause::CompInstrStruct * ex_comp_clause::getMatchingRow(OperatorTypeEnum op, |
| short datatype1, |
| short datatype2) |
| { |
| Int32 max_array_size = sizeof(compInstrInfo) / sizeof(CompInstrStruct); |
| |
| Int32 i = 0; |
| |
| Int32 found = 0; |
| while ((i < max_array_size) && (!found)) |
| if ((compInstrInfo[i].op == op) && |
| (compInstrInfo[i].type_op1 == datatype1) && |
| (compInstrInfo[i].type_op2 == datatype2)) |
| found = -1; |
| else |
| i++; |
| |
| if (found) |
| { |
| setInstrArrayIndex(i); |
| return &compInstrInfo[i]; |
| } |
| else |
| return 0; |
| } |
| |
| Lng32 ex_comp_clause::findIndexIntoInstrArray(CompInstruction ci) |
| { |
| Int32 max_array_size = sizeof(compInstrInfo) / sizeof(CompInstrStruct); |
| |
| Int32 i = 0; |
| while ((i < max_array_size) && |
| (compInstrInfo[i].instruction != ci)) |
| { |
| i++; |
| } |
| |
| if (i < max_array_size) |
| return i; |
| |
| return -1; // not found |
| } |
| |
| const CompInstruction ex_comp_clause::computeCaseIndex(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2) |
| { |
| CompInstruction instruction = COMP_NOT_SUPPORTED; |
| |
| short type_op1; |
| short type_op2; |
| getCaseDatatypes(attr1->getDatatype(), attr1->getLength(), type_op1, |
| attr2->getDatatype(), attr2->getLength(), type_op2, |
| 0 /* don't need to take into account scale difference here */); |
| |
| const CompInstrStruct * cs = getMatchingRow(op, |
| type_op1, |
| type_op2); |
| if (cs) |
| { |
| instruction = cs->instruction; |
| |
| // Further checks are needed. Do them. |
| if ((attr1->getDatatype() == REC_BYTE_F_ASCII) && |
| (attr2->getDatatype() == REC_BYTE_F_ASCII)) |
| { |
| if (attr1->getLength() != attr2->getLength()) |
| { |
| instruction = ASCII_COMP; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| |
| if ((attr1->getDatatype() == REC_NCHAR_F_UNICODE) && |
| (attr2->getDatatype() == REC_NCHAR_F_UNICODE)) |
| { |
| if (attr1->getLength() != attr2->getLength()) |
| { |
| instruction = UNICODE_COMP; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| |
| // for all numeric, datetime and interval datatypes, comparison done |
| // only if scale is the same |
| if (((attr1->getDatatype() >= REC_MIN_BINARY) && |
| (attr1->getDatatype() <= REC_MAX_BINARY)) || |
| ((attr1->getDatatype() >= REC_DECIMAL_UNSIGNED) && |
| (attr1->getDatatype() <= REC_DECIMAL_LSE)) || |
| (attr1->getDatatype() == REC_DATETIME) || |
| ((attr1->getDatatype() >= REC_MIN_INTERVAL) && |
| (attr1->getDatatype() <= REC_MAX_INTERVAL))) |
| { |
| // numeric, datetime or interval types |
| if (attr1->getScale() != attr2->getScale()) |
| instruction = COMP_NOT_SUPPORTED; |
| |
| // for decimal datatypes, comparison done only if lengths are same. |
| if ((attr1->getDatatype() >= REC_DECIMAL_UNSIGNED) && |
| (attr1->getDatatype() <= REC_DECIMAL_LSE)) |
| { |
| if (attr1->getLength() != attr2->getLength()) |
| instruction = COMP_NOT_SUPPORTED; |
| } |
| } // numeric, datetime or interval types |
| } // comparison supported |
| |
| if (instruction == COMP_NOT_SUPPORTED) |
| setInstrArrayIndex(-1); |
| |
| return instruction; |
| } |
| |
| void ex_comp_clause::setInstruction() |
| { |
| CompInstruction instruction = COMP_NOT_SUPPORTED; |
| setInstrArrayIndex(-1); |
| |
| if ((getOperand(1)->isComplexType()) || (getOperand(2)->isComplexType())) |
| { |
| // complex comparison supported only if both operands are complex with |
| // same datatype |
| if ((getOperand(1)->isComplexType()) && (getOperand(2)->isComplexType()) && |
| (getOperand(1)->getDatatype() == getOperand(2)->getDatatype())) |
| { |
| instruction = COMP_COMPLEX; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| else |
| { |
| // Simple types are handled here. |
| instruction = computeCaseIndex(getOperType(), getOperand(1), getOperand(2)); |
| } // simple type |
| |
| if ((instruction == COMP_NOT_SUPPORTED) && |
| (getInstrArrayIndex() >= 0)) |
| { |
| // this is an error, reset instr array index |
| setInstrArrayIndex(-1); |
| } |
| } |
| |
| void ex_comp_clause::setInstruction(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2) |
| { |
| // Only simple types are handled here. |
| CompInstruction instruction = computeCaseIndex(op, attr1, attr2); |
| |
| if ((instruction == COMP_NOT_SUPPORTED) && |
| (getInstrArrayIndex() >= 0)) |
| { |
| // this is an error, reset instr array index |
| setInstrArrayIndex(-1); |
| } |
| } |
| |
| short ex_comp_clause::isComparisonSupported(OperatorTypeEnum op, |
| Attributes * attr1, |
| Attributes * attr2) |
| { |
| if (computeCaseIndex(op, attr1, attr2) |
| == COMP_NOT_SUPPORTED) |
| return 0; |
| else |
| return -1; |
| } |
| |
| ex_expr::exp_return_type ex_comp_clause::fixup(Space * space, |
| CollHeap * exHeap, |
| char * constants_area, |
| char * temps_area, |
| char * persistentArea, |
| short fixupConstsAndTemps, |
| NABoolean spaceCompOnly) |
| { |
| setInstruction(); |
| return ex_clause::fixup(space, exHeap, constants_area, temps_area, |
| persistentArea, |
| fixupConstsAndTemps, spaceCompOnly); |
| } |
| |
| // Entries in this struct must group same src datatypes together. |
| const ex_conv_clause::ConvInstrStruct ex_conv_clause::convInstrInfo[] = { |
| //----------------------------------------------------------------------- |
| // src datatype tgt datatype instruction and indexStr |
| //----------------------------------------------------------------------- |
| {REC_UNKNOWN, REC_UNKNOWN, instrAndText(CONV_COMPLEX_TO_COMPLEX)}, |
| {REC_UNKNOWN, REC_UNKNOWN, instrAndText(CONV_SIMPLE_TO_COMPLEX)}, |
| {REC_UNKNOWN, REC_UNKNOWN, instrAndText(CONV_COMPLEX_TO_SIMPLE)}, |
| |
| {REC_BPINT_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BPINTU_BPINTU)}, |
| {REC_BPINT_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN16U_BIN16S)}, |
| {REC_BPINT_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN16U_BIN16U)}, |
| {REC_BPINT_UNSIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN16U_BIN32S)}, |
| {REC_BPINT_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN16U_BIN32U)}, |
| {REC_BPINT_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN16U_BIN64S)}, |
| {REC_BPINT_UNSIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN16U_DECS)}, |
| {REC_BPINT_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN16U_DECS)}, |
| {REC_BPINT_UNSIGNED, REC_FLOAT32, instrAndText(CONV_BIN16U_FLOAT32)}, |
| {REC_BPINT_UNSIGNED, REC_FLOAT64, instrAndText(CONV_BIN16U_FLOAT64)}, |
| {REC_BPINT_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN16U_BIGNUM)}, |
| {REC_BPINT_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN16U_BIGNUM)}, |
| {REC_BPINT_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BPINT_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BPINT_UNSIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BPINT_UNSIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN16U_UNICODE)}, |
| {REC_BPINT_UNSIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN16U_UNICODE)}, |
| |
| {REC_BIN8_SIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN8S_BIN16S)}, |
| {REC_BIN8_SIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN8S_BIN32S)}, |
| {REC_BIN8_SIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN8S_BIN64S)}, |
| {REC_BIN8_SIGNED, REC_BIN8_SIGNED, instrAndText(CONV_BIN8S_BIN8S)}, |
| {REC_BIN8_SIGNED, REC_BIN8_UNSIGNED, instrAndText(CONV_BIN8S_BIN8U)}, |
| {REC_BIN8_SIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN8S_ASCII)}, |
| {REC_BIN8_SIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN8S_ASCII)}, |
| |
| {REC_BIN8_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN8U_BIN16U)}, |
| {REC_BIN8_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN8U_BIN32U)}, |
| {REC_BIN8_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(CONV_BIN8U_BIN64U)}, |
| {REC_BIN8_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN8U_BIN16S)}, |
| {REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(CONV_BIN8U_BIN8U)}, |
| {REC_BIN8_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN8U_ASCII)}, |
| {REC_BIN8_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN8U_ASCII)}, |
| {REC_BIN8_UNSIGNED, REC_BIN8_SIGNED, instrAndText(CONV_BIN8U_BIN8S)}, |
| |
| {REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIN16S_BPINTU)}, |
| {REC_BIN16_SIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN16S_BIN16S)}, |
| {REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN16S_BIN16U)}, |
| {REC_BIN16_SIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN16S_BIN32S)}, |
| {REC_BIN16_SIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN16S_BIN32U)}, |
| {REC_BIN16_SIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN16S_BIN64S)}, |
| {REC_BIN16_SIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN16S_DECS)}, |
| {REC_BIN16_SIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN16S_DECU)}, |
| {REC_BIN16_SIGNED, REC_FLOAT32, instrAndText(CONV_BIN16S_FLOAT32)}, |
| {REC_BIN16_SIGNED, REC_FLOAT64, instrAndText(CONV_BIN16S_FLOAT64)}, |
| {REC_BIN16_SIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN16S_BIGNUMU)}, |
| {REC_BIN16_SIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN16S_BIGNUM)}, |
| {REC_BIN16_SIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN16S_ASCII)}, |
| {REC_BIN16_SIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN16S_ASCII)}, |
| {REC_BIN16_SIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN16S_ASCII)}, |
| {REC_BIN16_SIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN16S_UNICODE)}, |
| {REC_BIN16_SIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN16S_UNICODE)}, |
| |
| {REC_BIN16_SIGNED, REC_BIN8_SIGNED, instrAndText(CONV_BIN16S_BIN8S)}, |
| {REC_BIN16_SIGNED, REC_BIN8_UNSIGNED, instrAndText(CONV_BIN16S_BIN8U)}, |
| |
| {REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIN16U_BPINTU)}, |
| {REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN16U_BIN16S)}, |
| {REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN16U_BIN16U)}, |
| {REC_BIN16_UNSIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN16U_BIN32S)}, |
| {REC_BIN16_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN16U_BIN32U)}, |
| {REC_BIN16_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN16U_BIN64S)}, |
| {REC_BIN16_UNSIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN16U_DECS)}, |
| {REC_BIN16_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN16U_DECS)}, |
| {REC_BIN16_UNSIGNED, REC_FLOAT32, instrAndText(CONV_BIN16U_FLOAT32)}, |
| {REC_BIN16_UNSIGNED, REC_FLOAT64, instrAndText(CONV_BIN16U_FLOAT64)}, |
| {REC_BIN16_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN16U_BIGNUM)}, |
| {REC_BIN16_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN16U_BIGNUM)}, |
| {REC_BIN16_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BIN16_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BIN16_UNSIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN16U_ASCII)}, |
| {REC_BIN16_UNSIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN16U_UNICODE)}, |
| {REC_BIN16_UNSIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN16U_UNICODE)}, |
| |
| {REC_BIN16_UNSIGNED, REC_BIN8_SIGNED, instrAndText(CONV_BIN16U_BIN8S)}, |
| {REC_BIN16_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(CONV_BIN16U_BIN8U)}, |
| |
| {REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIN32S_BPINTU)}, |
| {REC_BIN32_SIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN32S_BIN16S)}, |
| {REC_BIN32_SIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN32S_BIN16U)}, |
| {REC_BIN32_SIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN32S_BIN32S)}, |
| {REC_BIN32_SIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN32S_BIN32U)}, |
| {REC_BIN32_SIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN32S_BIN64S)}, |
| {REC_BIN32_SIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN32S_DECS)}, |
| {REC_BIN32_SIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN32S_DECU)}, |
| {REC_BIN32_SIGNED, REC_FLOAT32, instrAndText(CONV_BIN32S_FLOAT32)}, |
| {REC_BIN32_SIGNED, REC_FLOAT64, instrAndText(CONV_BIN32S_FLOAT64)}, |
| {REC_BIN32_SIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN32S_BIGNUMU)}, |
| {REC_BIN32_SIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN32S_BIGNUM)}, |
| {REC_BIN32_SIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN32S_ASCII)}, |
| {REC_BIN32_SIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN32S_ASCII)}, |
| {REC_BIN32_SIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN32S_ASCII)}, |
| {REC_BIN32_SIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN32S_UNICODE)}, |
| {REC_BIN32_SIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN32S_UNICODE)}, |
| |
| {REC_BIN32_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIN32U_BPINTU)}, |
| {REC_BIN32_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN32U_BIN16S)}, |
| {REC_BIN32_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN32U_BIN16U)}, |
| {REC_BIN32_UNSIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN32U_BIN32S)}, |
| {REC_BIN32_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN32U_BIN32U)}, |
| {REC_BIN32_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN32U_BIN64S)}, |
| {REC_BIN32_UNSIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN32U_DECS)}, |
| {REC_BIN32_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN32U_DECS)}, |
| {REC_BIN32_UNSIGNED, REC_FLOAT32, instrAndText(CONV_BIN32U_FLOAT32)}, |
| {REC_BIN32_UNSIGNED, REC_FLOAT64, instrAndText(CONV_BIN32U_FLOAT64)}, |
| {REC_BIN32_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN32U_BIGNUM)}, |
| {REC_BIN32_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN32U_BIGNUM)}, |
| {REC_BIN32_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN32U_ASCII)}, |
| {REC_BIN32_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN32U_ASCII)}, |
| {REC_BIN32_UNSIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN32U_ASCII)}, |
| {REC_BIN32_UNSIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN32U_UNICODE)}, |
| {REC_BIN32_UNSIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN32U_UNICODE)}, |
| |
| {REC_BIN32_UNSIGNED, REC_BIN8_SIGNED, instrAndText(CONV_NUMERIC_BIN8S)}, |
| {REC_BIN32_UNSIGNED, REC_BIN8_UNSIGNED, instrAndText(CONV_NUMERIC_BIN8U)}, |
| |
| {REC_BIN64_SIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIN64S_BPINTU)}, |
| {REC_BIN64_SIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIN64S_BIN16S)}, |
| {REC_BIN64_SIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIN64S_BIN16U)}, |
| {REC_BIN64_SIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIN64S_BIN32S)}, |
| {REC_BIN64_SIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIN64S_BIN32U)}, |
| {REC_BIN64_SIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN64S_BIN64S)}, |
| {REC_BIN64_SIGNED, REC_BIN64_UNSIGNED, instrAndText(CONV_BIN64S_BIN64U)}, |
| {REC_BIN64_SIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIN64S_DECS)}, |
| {REC_BIN64_SIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIN64S_DECU)}, |
| {REC_BIN64_SIGNED, REC_FLOAT32, instrAndText(CONV_BIN64S_FLOAT32)}, |
| {REC_BIN64_SIGNED, REC_FLOAT64, instrAndText(CONV_BIN64S_FLOAT64)}, |
| {REC_BIN64_SIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN64S_BIGNUMU)}, |
| {REC_BIN64_SIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN64S_BIGNUM)}, |
| {REC_BIN64_SIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN64S_ASCII)}, |
| {REC_BIN64_SIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN64S_ASCII)}, |
| {REC_BIN64_SIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIN64S_ASCII)}, |
| {REC_BIN64_SIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIN64S_UNICODE)}, |
| {REC_BIN64_SIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIN64S_UNICODE)}, |
| {REC_BIN64_SIGNED, REC_DATETIME, instrAndText(CONV_BIN64S_DATETIME)}, |
| |
| {REC_BIN64_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIN64U_BIN64S)}, |
| {REC_BIN64_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(CONV_BIN64U_BIN64U)}, |
| {REC_BIN64_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIN64U_BIGNUM)}, |
| {REC_BIN64_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIN64U_BIGNUM)}, |
| {REC_BIN64_UNSIGNED, REC_FLOAT32, instrAndText(CONV_BIN64U_FLOAT32)}, |
| {REC_BIN64_UNSIGNED, REC_FLOAT64, instrAndText(CONV_BIN64U_FLOAT64)}, |
| {REC_BIN64_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIN64U_ASCII)}, |
| {REC_BIN64_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIN64U_ASCII)}, |
| |
| {REC_DECIMAL_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_UNSIGNED, REC_BIN32_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_DECS_BIN64S)}, |
| {REC_DECIMAL_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_DECS_DECU)}, |
| {REC_DECIMAL_UNSIGNED, REC_DECIMAL_LSE, instrAndText(CONV_DECS_DECS)}, |
| {REC_DECIMAL_UNSIGNED, REC_FLOAT32, instrAndText(CONV_DECS_FLOAT32)}, |
| {REC_DECIMAL_UNSIGNED, REC_FLOAT64, instrAndText(CONV_DECS_FLOAT64)}, |
| {REC_DECIMAL_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_UNSIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_UNSIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_DECS_UNICODE)}, |
| {REC_DECIMAL_UNSIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_DECS_UNICODE)}, |
| |
| {REC_DECIMAL_LSE, REC_BPINT_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_LSE, REC_BIN16_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_LSE, REC_BIN16_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_LSE, REC_BIN32_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_LSE, REC_BIN32_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_LSE, REC_BIN64_SIGNED, instrAndText(CONV_DECS_BIN64S)}, |
| {REC_DECIMAL_LSE, REC_DECIMAL_LSE, instrAndText(CONV_DECS_DECS)}, |
| {REC_DECIMAL_LSE, REC_DECIMAL_UNSIGNED, instrAndText(CONV_DECS_DECU)}, |
| {REC_DECIMAL_LSE, REC_FLOAT32, instrAndText(CONV_DECS_FLOAT32)}, |
| {REC_DECIMAL_LSE, REC_FLOAT64, instrAndText(CONV_DECS_FLOAT64)}, |
| {REC_DECIMAL_LSE, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_DECS_BIN32U)}, |
| {REC_DECIMAL_LSE, REC_NUM_BIG_SIGNED, instrAndText(CONV_DECS_BIN32S)}, |
| {REC_DECIMAL_LSE, REC_DECIMAL_LS, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_LSE, REC_BYTE_F_ASCII, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_LSE, REC_BYTE_V_ASCII, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_LSE, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_DECS_ASCII)}, |
| {REC_DECIMAL_LSE, REC_NCHAR_F_UNICODE, instrAndText(CONV_DECS_UNICODE)}, |
| {REC_DECIMAL_LSE, REC_NCHAR_V_UNICODE, instrAndText(CONV_DECS_UNICODE)}, |
| |
| {REC_FLOAT32, REC_BPINT_UNSIGNED, instrAndText(CONV_FLOAT32_BPINTU)}, |
| {REC_FLOAT32, REC_BIN16_SIGNED, instrAndText(CONV_FLOAT32_BIN16S)}, |
| {REC_FLOAT32, REC_BIN16_UNSIGNED, instrAndText(CONV_FLOAT32_BIN16U)}, |
| {REC_FLOAT32, REC_BIN32_SIGNED, instrAndText(CONV_FLOAT32_BIN32S)}, |
| {REC_FLOAT32, REC_BIN32_UNSIGNED, instrAndText(CONV_FLOAT32_BIN32U)}, |
| {REC_FLOAT32, REC_BIN64_SIGNED, instrAndText(CONV_FLOAT32_BIN64S)}, |
| {REC_FLOAT32, REC_BIN64_UNSIGNED, instrAndText(CONV_FLOAT32_BIN64U)}, |
| {REC_FLOAT32, REC_DECIMAL_LSE, instrAndText(CONV_FLOAT32_DECS)}, |
| {REC_FLOAT32, REC_DECIMAL_UNSIGNED, instrAndText(CONV_FLOAT32_DECU)}, |
| {REC_FLOAT32, REC_FLOAT32, instrAndText(CONV_FLOAT32_FLOAT32)}, |
| {REC_FLOAT32, REC_FLOAT64, instrAndText(CONV_FLOAT32_FLOAT64)}, |
| {REC_FLOAT32, REC_BYTE_F_ASCII, instrAndText(CONV_FLOAT32_ASCII)}, |
| {REC_FLOAT32, REC_BYTE_V_ASCII, instrAndText(CONV_FLOAT32_ASCII)}, |
| {REC_FLOAT32, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_FLOAT32_ASCII)}, |
| {REC_FLOAT32, REC_NCHAR_F_UNICODE, instrAndText(CONV_FLOAT32_UNICODE)}, |
| {REC_FLOAT32, REC_NCHAR_V_UNICODE, instrAndText(CONV_FLOAT32_UNICODE)}, |
| |
| {REC_FLOAT64, REC_BPINT_UNSIGNED, instrAndText(CONV_FLOAT64_BPINTU)}, |
| {REC_FLOAT64, REC_BIN16_SIGNED, instrAndText(CONV_FLOAT64_BIN16S)}, |
| {REC_FLOAT64, REC_BIN16_UNSIGNED, instrAndText(CONV_FLOAT64_BIN16U)}, |
| {REC_FLOAT64, REC_BIN32_SIGNED, instrAndText(CONV_FLOAT64_BIN32S)}, |
| {REC_FLOAT64, REC_BIN32_UNSIGNED, instrAndText(CONV_FLOAT64_BIN32U)}, |
| {REC_FLOAT64, REC_BIN64_SIGNED, instrAndText(CONV_FLOAT64_BIN64S)}, |
| {REC_FLOAT64, REC_BIN64_UNSIGNED, instrAndText(CONV_FLOAT64_BIN64U)}, |
| {REC_FLOAT64, REC_DECIMAL_LSE, instrAndText(CONV_FLOAT64_DECS)}, |
| {REC_FLOAT64, REC_DECIMAL_UNSIGNED, instrAndText(CONV_FLOAT64_DECU)}, |
| {REC_FLOAT64, REC_FLOAT32, instrAndText(CONV_FLOAT64_FLOAT32)}, |
| {REC_FLOAT64, REC_FLOAT64, instrAndText(CONV_FLOAT64_FLOAT64)}, |
| {REC_FLOAT64, REC_BYTE_F_ASCII, instrAndText(CONV_FLOAT64_ASCII)}, |
| {REC_FLOAT64, REC_BYTE_V_ASCII, instrAndText(CONV_FLOAT64_ASCII)}, |
| {REC_FLOAT64, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_FLOAT64_ASCII)}, |
| {REC_FLOAT64, REC_NCHAR_F_UNICODE, instrAndText(CONV_FLOAT64_UNICODE)}, |
| {REC_FLOAT64, REC_NCHAR_V_UNICODE, instrAndText(CONV_FLOAT64_UNICODE)}, |
| |
| {REC_NUM_BIG_UNSIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIGNUM_BIN16U)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIGNUM_BIN16S)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIGNUM_BIN16U)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIGNUM_BIN32S)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIGNUM_BIN32U)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIGNUM_BIN64S)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BIN64_UNSIGNED, instrAndText(CONV_BIGNUM_BIN64U)}, |
| {REC_NUM_BIG_UNSIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIGNUM_DECS)}, |
| {REC_NUM_BIG_UNSIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIGNUM_DECU)}, |
| {REC_NUM_BIG_UNSIGNED, REC_FLOAT32, instrAndText(CONV_BIGNUM_FLOAT32)}, |
| {REC_NUM_BIG_UNSIGNED, REC_FLOAT64, instrAndText(CONV_BIGNUM_FLOAT64)}, |
| {REC_NUM_BIG_UNSIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIGNUM_BIGNUM)}, |
| {REC_NUM_BIG_UNSIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIGNUM_BIGNUM)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_UNSIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_UNSIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIGNUM_UNICODE)}, |
| {REC_NUM_BIG_UNSIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIGNUM_UNICODE)}, |
| |
| {REC_NUM_BIG_SIGNED, REC_BPINT_UNSIGNED, instrAndText(CONV_BIGNUM_BIN16U)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN16_SIGNED, instrAndText(CONV_BIGNUM_BIN16S)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN16_UNSIGNED, instrAndText(CONV_BIGNUM_BIN16U)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN32_SIGNED, instrAndText(CONV_BIGNUM_BIN32S)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN32_UNSIGNED, instrAndText(CONV_BIGNUM_BIN32U)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN64_SIGNED, instrAndText(CONV_BIGNUM_BIN64S)}, |
| {REC_NUM_BIG_SIGNED, REC_BIN64_UNSIGNED, instrAndText(CONV_BIGNUM_BIN64U)}, |
| {REC_NUM_BIG_SIGNED, REC_DECIMAL_LSE, instrAndText(CONV_BIGNUM_DECS)}, |
| {REC_NUM_BIG_SIGNED, REC_DECIMAL_UNSIGNED, instrAndText(CONV_BIGNUM_DECU)}, |
| {REC_NUM_BIG_SIGNED, REC_FLOAT32, instrAndText(CONV_BIGNUM_FLOAT32)}, |
| {REC_NUM_BIG_SIGNED, REC_FLOAT64, instrAndText(CONV_BIGNUM_FLOAT64)}, |
| {REC_NUM_BIG_SIGNED, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_BIGNUM_BIGNUM)}, |
| {REC_NUM_BIG_SIGNED, REC_NUM_BIG_SIGNED, instrAndText(CONV_BIGNUM_BIGNUM)}, |
| {REC_NUM_BIG_SIGNED, REC_BYTE_F_ASCII, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_SIGNED, REC_BYTE_V_ASCII, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_SIGNED, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_BIGNUM_ASCII)}, |
| {REC_NUM_BIG_SIGNED, REC_NCHAR_F_UNICODE, instrAndText(CONV_BIGNUM_UNICODE)}, |
| {REC_NUM_BIG_SIGNED, REC_NCHAR_V_UNICODE, instrAndText(CONV_BIGNUM_UNICODE)}, |
| |
| // leading sign seperate decimal is identical to ascii representation. |
| // Thus, use instrAndText(CONV_ASCII_DEC) to convert it to decimal |
| {REC_DECIMAL_LS, REC_DECIMAL_LSE, instrAndText(CONV_ASCII_DEC)}, |
| {REC_DECIMAL_LS, REC_DECIMAL_LS, instrAndText(CONV_DECLS_DECLS)}, |
| {REC_DECIMAL_LS, REC_BYTE_F_ASCII, instrAndText(CONV_DECLS_ASCII)}, |
| {REC_DECIMAL_LS, REC_DECIMAL_UNSIGNED, instrAndText(CONV_DECLS_DECU)}, |
| |
| {REC_DATETIME, REC_DATETIME, instrAndText(CONV_DATETIME_DATETIME)}, |
| {REC_DATETIME, REC_BYTE_F_ASCII, instrAndText(CONV_DATETIME_ASCII)}, |
| {REC_DATETIME, REC_BYTE_V_ASCII, instrAndText(CONV_DATETIME_ASCII)}, |
| {REC_DATETIME, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_DATETIME_ASCII)}, |
| {REC_DATETIME, REC_NCHAR_F_UNICODE, instrAndText(CONV_DATETIME_UNICODE)}, |
| {REC_DATETIME, REC_NCHAR_V_UNICODE, instrAndText(CONV_DATETIME_UNICODE)}, |
| |
| {REC_DATETIME, REC_BIN64_SIGNED, instrAndText(CONV_DATETIME_BIN64S)}, |
| |
| {REC_INT_YEAR, REC_INT_MONTH, instrAndText(CONV_INTERVALY_INTERVALMO)}, |
| |
| {REC_INT_YEAR, REC_BYTE_F_ASCII, instrAndText(CONV_INTERVAL_ASCII)}, |
| {REC_INT_YEAR, REC_BYTE_V_ASCII, instrAndText(CONV_INTERVAL_ASCII)}, |
| {REC_INT_YEAR, REC_NCHAR_F_UNICODE, instrAndText(CONV_INTERVAL_UNICODE)}, |
| {REC_INT_YEAR, REC_NCHAR_V_UNICODE, instrAndText(CONV_INTERVAL_UNICODE)}, |
| |
| {REC_INT_MONTH, REC_INT_YEAR, instrAndText(CONV_INTERVALMO_INTERVALY)}, |
| |
| {REC_INT_DAY, REC_INT_HOUR, instrAndText(CONV_INTERVALD_INTERVALH)}, |
| {REC_INT_DAY, REC_INT_MINUTE, instrAndText(CONV_INTERVALD_INTERVALM)}, |
| {REC_INT_DAY, REC_INT_SECOND, instrAndText(CONV_INTERVALD_INTERVALS)}, |
| |
| {REC_INT_HOUR, REC_INT_DAY, instrAndText(CONV_INTERVALH_INTERVALD)}, |
| {REC_INT_HOUR, REC_INT_MINUTE, instrAndText(CONV_INTERVALH_INTERVALM)}, |
| {REC_INT_HOUR, REC_INT_SECOND, instrAndText(CONV_INTERVALH_INTERVALS)}, |
| |
| {REC_INT_MINUTE, REC_INT_DAY, instrAndText(CONV_INTERVALM_INTERVALD)}, |
| {REC_INT_MINUTE, REC_INT_HOUR, instrAndText(CONV_INTERVALM_INTERVALH)}, |
| {REC_INT_MINUTE, REC_INT_SECOND, instrAndText(CONV_INTERVALM_INTERVALS)}, |
| |
| {REC_INT_SECOND, REC_INT_DAY, instrAndText(CONV_INTERVALS_INTERVALD)}, |
| {REC_INT_SECOND, REC_INT_HOUR, instrAndText(CONV_INTERVALS_INTERVALH)}, |
| {REC_INT_SECOND, REC_INT_MINUTE, instrAndText(CONV_INTERVALS_INTERVALM)}, |
| |
| // on the next one, we have to consider scale difference also to distinguish |
| // between CONV_INTERVALS_INTERVALS_DIV and CONV_INTERVALS_INTERVALS_MULT |
| {REC_INT_SECOND, REC_INT_SECOND, instrAndText(CONV_INTERVALS_INTERVALS_DIV)}, |
| {REC_INT_SECOND, REC_INT_SECOND, instrAndText(CONV_INTERVALS_INTERVALS_MULT)}, |
| |
| {REC_BYTE_F_ASCII, REC_BPINT_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_F_ASCII, REC_BIN8_SIGNED, instrAndText(CONV_ASCII_BIN8S)}, |
| {REC_BYTE_F_ASCII, REC_BIN8_UNSIGNED, instrAndText(CONV_ASCII_BIN8U)}, |
| {REC_BYTE_F_ASCII, REC_BIN16_SIGNED, instrAndText(CONV_ASCII_BIN16S)}, |
| {REC_BYTE_F_ASCII, REC_BIN16_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_F_ASCII, REC_BIN32_SIGNED, instrAndText(CONV_ASCII_BIN32S)}, |
| {REC_BYTE_F_ASCII, REC_BIN32_UNSIGNED, instrAndText(CONV_ASCII_BIN32U)}, |
| {REC_BYTE_F_ASCII, REC_BIN64_SIGNED, instrAndText(CONV_ASCII_BIN64S)}, |
| {REC_BYTE_F_ASCII, REC_BIN64_UNSIGNED, instrAndText(CONV_ASCII_BIN64U)}, |
| {REC_BYTE_F_ASCII, REC_DECIMAL_LSE, instrAndText(CONV_ASCII_DEC)}, |
| {REC_BYTE_F_ASCII, REC_DECIMAL_UNSIGNED, instrAndText(CONV_ASCII_DEC)}, |
| |
| {REC_BYTE_F_ASCII, REC_FLOAT32, instrAndText(CONV_ASCII_FLOAT32)}, |
| {REC_BYTE_F_ASCII, REC_FLOAT64, instrAndText(CONV_ASCII_FLOAT64)}, |
| |
| {REC_BYTE_F_ASCII, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_F_ASCII, REC_NUM_BIG_SIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, instrAndText(CONV_ASCII_F_F)}, |
| {REC_BYTE_F_ASCII, REC_BYTE_V_ASCII, instrAndText(CONV_ASCII_F_V)}, |
| {REC_BYTE_F_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_ASCII_F_V)}, |
| {REC_BYTE_F_ASCII, REC_BYTE_V_ANSI, instrAndText(CONV_ASCII_TO_ANSI_V)}, |
| {REC_BYTE_F_ASCII, REC_DATETIME, instrAndText(CONV_ASCII_DATETIME)}, |
| |
| {REC_BYTE_F_ASCII, REC_INT_YEAR, instrAndText(CONV_ASCII_INTERVAL)}, |
| {REC_BYTE_F_ASCII, REC_NCHAR_F_UNICODE, instrAndText(CONV_ASCII_UNICODE_F)}, |
| {REC_BYTE_F_ASCII, REC_NCHAR_V_UNICODE, instrAndText(CONV_ASCII_UNICODE_V)}, |
| {REC_BYTE_F_ASCII, REC_NCHAR_V_ANSI_UNICODE, instrAndText(CONV_ASCII_TO_ANSI_V_UNICODE)}, |
| |
| {REC_BYTE_F_ASCII, REC_BOOLEAN, instrAndText(CONV_ASCII_BOOL)}, |
| {REC_NCHAR_F_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(CONV_UNICODE_F_F)}, |
| {REC_NCHAR_F_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(CONV_UNICODE_F_V)}, |
| {REC_NCHAR_F_UNICODE, REC_BYTE_F_ASCII, instrAndText(CONV_UNICODE_F_ASCII_F)}, |
| {REC_NCHAR_F_UNICODE, REC_MBYTE_F_SJIS, instrAndText(CONV_UNICODE_F_SJIS_F)}, |
| {REC_NCHAR_F_UNICODE, REC_MBYTE_V_SJIS, instrAndText(CONV_UNICODE_F_SJIS_V)}, |
| {REC_NCHAR_F_UNICODE, REC_MBYTE_LOCALE_F, instrAndText(CONV_UNICODE_F_MBYTE_LOCALE_F)}, |
| {REC_NCHAR_F_UNICODE, REC_SBYTE_LOCALE_F, instrAndText(CONV_UNICODE_F_SBYTE_LOCALE_F)}, |
| {REC_NCHAR_F_UNICODE, REC_DATETIME, instrAndText(CONV_UNICODE_DATETIME)}, |
| {REC_NCHAR_F_UNICODE, REC_BIN16_SIGNED, instrAndText(CONV_UNICODE_BIN16S)}, |
| {REC_NCHAR_F_UNICODE, REC_BIN16_UNSIGNED, instrAndText(CONV_UNICODE_BIN16U)}, |
| {REC_NCHAR_F_UNICODE, REC_BPINT_UNSIGNED, instrAndText(CONV_UNICODE_BIN16U)}, |
| {REC_NCHAR_F_UNICODE, REC_BIN32_UNSIGNED, instrAndText(CONV_UNICODE_BIN32U)}, |
| {REC_NCHAR_F_UNICODE, REC_BIN32_SIGNED, instrAndText(CONV_UNICODE_BIN32S)}, |
| {REC_NCHAR_F_UNICODE, REC_BIN64_SIGNED, instrAndText(CONV_UNICODE_BIN64S)}, |
| {REC_NCHAR_F_UNICODE, REC_FLOAT32, instrAndText(CONV_UNICODE_FLOAT32)}, |
| {REC_NCHAR_F_UNICODE, REC_FLOAT64, instrAndText(CONV_UNICODE_FLOAT64)}, |
| {REC_NCHAR_F_UNICODE, REC_DECIMAL_LSE, instrAndText(CONV_UNICODE_DEC)}, |
| {REC_NCHAR_F_UNICODE, REC_DECIMAL_UNSIGNED, instrAndText(CONV_UNICODE_DEC)}, |
| {REC_NCHAR_F_UNICODE, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_UNICODE_BIGNUM)}, |
| {REC_NCHAR_F_UNICODE, REC_NUM_BIG_SIGNED, instrAndText(CONV_UNICODE_BIGNUM)}, |
| {REC_NCHAR_F_UNICODE, REC_INT_YEAR, instrAndText(CONV_UNICODE_INTERVAL)}, |
| {REC_NCHAR_F_UNICODE, REC_BYTE_V_ASCII, instrAndText(CONV_UNICODE_F_ASCII_V)}, |
| {REC_NCHAR_F_UNICODE, REC_NCHAR_V_ANSI_UNICODE,instrAndText(CONV_UNICODE_TO_ANSI_V_UNICODE)}, |
| {REC_NCHAR_F_UNICODE, REC_BYTE_V_ANSI, instrAndText(CONV_UNICODE_F_ANSI_V)}, |
| |
| {REC_NCHAR_V_UNICODE, REC_BYTE_F_ASCII, instrAndText(CONV_UNICODE_V_ASCII_F)}, |
| {REC_NCHAR_V_UNICODE, REC_MBYTE_F_SJIS, instrAndText(CONV_UNICODE_V_SJIS_F)}, |
| {REC_NCHAR_V_UNICODE, REC_MBYTE_V_SJIS, instrAndText(CONV_UNICODE_V_SJIS_V)}, |
| {REC_NCHAR_V_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(CONV_UNICODE_V_F)}, |
| {REC_NCHAR_V_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(CONV_UNICODE_V_V)}, |
| {REC_NCHAR_V_UNICODE, REC_MBYTE_LOCALE_F, instrAndText(CONV_UNICODE_V_MBYTE_LOCALE_F)}, |
| {REC_NCHAR_V_UNICODE, REC_SBYTE_LOCALE_F, instrAndText(CONV_UNICODE_V_SBYTE_LOCALE_F)}, |
| {REC_NCHAR_V_UNICODE, REC_DATETIME, instrAndText(CONV_UNICODE_DATETIME)}, |
| {REC_NCHAR_V_UNICODE, REC_BIN16_SIGNED, instrAndText(CONV_UNICODE_BIN16S)}, |
| {REC_NCHAR_V_UNICODE, REC_BIN16_UNSIGNED, instrAndText(CONV_UNICODE_BIN16U)}, |
| {REC_NCHAR_V_UNICODE, REC_BPINT_UNSIGNED, instrAndText(CONV_UNICODE_BIN16U)}, |
| {REC_NCHAR_V_UNICODE, REC_BIN32_UNSIGNED, instrAndText(CONV_UNICODE_BIN32U)}, |
| {REC_NCHAR_V_UNICODE, REC_BIN32_SIGNED, instrAndText(CONV_UNICODE_BIN32S)}, |
| {REC_NCHAR_V_UNICODE, REC_BIN64_SIGNED, instrAndText(CONV_UNICODE_BIN64S)}, |
| {REC_NCHAR_V_UNICODE, REC_FLOAT32, instrAndText(CONV_UNICODE_FLOAT32)}, |
| {REC_NCHAR_V_UNICODE, REC_FLOAT64, instrAndText(CONV_UNICODE_FLOAT64)}, |
| {REC_NCHAR_V_UNICODE, REC_DECIMAL_LSE, instrAndText(CONV_UNICODE_DEC)}, |
| {REC_NCHAR_V_UNICODE, REC_DECIMAL_UNSIGNED, instrAndText(CONV_UNICODE_DEC)}, |
| {REC_NCHAR_V_UNICODE, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_UNICODE_BIGNUM)}, |
| {REC_NCHAR_V_UNICODE, REC_NUM_BIG_SIGNED, instrAndText(CONV_UNICODE_BIGNUM)}, |
| {REC_NCHAR_V_UNICODE, REC_INT_YEAR, instrAndText(CONV_UNICODE_INTERVAL)}, |
| {REC_NCHAR_V_UNICODE, REC_BYTE_V_ASCII, instrAndText(CONV_UNICODE_V_ASCII_V)}, |
| {REC_NCHAR_V_UNICODE, REC_NCHAR_V_ANSI_UNICODE,instrAndText(CONV_UNICODE_TO_ANSI_V_UNICODE)}, |
| {REC_NCHAR_V_UNICODE, REC_BYTE_V_ANSI, instrAndText(CONV_UNICODE_V_ANSI_V)}, |
| |
| |
| {REC_BYTE_V_ASCII, REC_BPINT_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_V_ASCII, REC_BIN8_SIGNED, instrAndText(CONV_ASCII_BIN8S)}, |
| {REC_BYTE_V_ASCII, REC_BIN8_UNSIGNED, instrAndText(CONV_ASCII_BIN8U)}, |
| {REC_BYTE_V_ASCII, REC_BIN16_SIGNED, instrAndText(CONV_ASCII_BIN16S)}, |
| {REC_BYTE_V_ASCII, REC_BIN16_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_V_ASCII, REC_BIN32_SIGNED, instrAndText(CONV_ASCII_BIN32S)}, |
| {REC_BYTE_V_ASCII, REC_BIN32_UNSIGNED, instrAndText(CONV_ASCII_BIN32U)}, |
| {REC_BYTE_V_ASCII, REC_BIN64_SIGNED, instrAndText(CONV_ASCII_BIN64S)}, |
| {REC_BYTE_V_ASCII, REC_BIN64_UNSIGNED, instrAndText(CONV_ASCII_BIN64U)}, |
| {REC_BYTE_V_ASCII, REC_DECIMAL_LSE, instrAndText(CONV_ASCII_DEC)}, |
| {REC_BYTE_V_ASCII, REC_DECIMAL_UNSIGNED, instrAndText(CONV_ASCII_DEC)}, |
| |
| {REC_BYTE_V_ASCII, REC_FLOAT32, instrAndText(CONV_ASCII_FLOAT32)}, |
| {REC_BYTE_V_ASCII, REC_FLOAT64, instrAndText(CONV_ASCII_FLOAT64)}, |
| |
| {REC_BYTE_V_ASCII, REC_DATETIME, instrAndText(CONV_ASCII_DATETIME)}, |
| {REC_BYTE_V_ASCII, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_V_ASCII, REC_NUM_BIG_SIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_V_ASCII, REC_BYTE_F_ASCII, instrAndText(CONV_ASCII_V_F)}, |
| {REC_BYTE_V_ASCII, REC_BYTE_V_ASCII, instrAndText(CONV_ASCII_V_V)}, |
| {REC_BYTE_V_ASCII, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_ASCII_V_V)}, |
| {REC_BYTE_V_ASCII, REC_BYTE_V_ANSI, instrAndText(CONV_ASCII_TO_ANSI_V)}, |
| |
| {REC_BYTE_V_ASCII, REC_INT_YEAR, instrAndText(CONV_ASCII_INTERVAL)}, |
| |
| {REC_BYTE_V_ASCII, REC_NCHAR_F_UNICODE, instrAndText(CONV_ASCII_UNICODE_F)}, |
| {REC_BYTE_V_ASCII, REC_NCHAR_V_UNICODE, instrAndText(CONV_ASCII_UNICODE_V)}, |
| {REC_BYTE_V_ASCII, REC_NCHAR_V_ANSI_UNICODE, instrAndText(CONV_ASCII_TO_ANSI_V_UNICODE)}, |
| |
| {REC_BYTE_V_ASCII, REC_BOOLEAN, instrAndText(CONV_ASCII_BOOL)}, |
| |
| {REC_BYTE_V_ASCII_LONG, REC_BPINT_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BIN16_SIGNED, instrAndText(CONV_ASCII_BIN16S)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BIN16_UNSIGNED, instrAndText(CONV_ASCII_BIN16U)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BIN32_SIGNED, instrAndText(CONV_ASCII_BIN32S)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BIN32_UNSIGNED, instrAndText(CONV_ASCII_BIN32U)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BIN64_SIGNED, instrAndText(CONV_ASCII_BIN64S)}, |
| {REC_BYTE_V_ASCII_LONG, REC_DECIMAL_LSE, instrAndText(CONV_ASCII_DEC)}, |
| {REC_BYTE_V_ASCII_LONG, REC_DECIMAL_UNSIGNED, instrAndText(CONV_ASCII_DEC)}, |
| |
| {REC_BYTE_V_ASCII_LONG, REC_FLOAT32, instrAndText(CONV_ASCII_FLOAT32)}, |
| {REC_BYTE_V_ASCII_LONG, REC_FLOAT64, instrAndText(CONV_ASCII_FLOAT64)}, |
| |
| {REC_BYTE_V_ASCII_LONG, REC_DATETIME, instrAndText(CONV_ASCII_DATETIME)}, |
| {REC_BYTE_V_ASCII_LONG, REC_NUM_BIG_UNSIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_V_ASCII_LONG, REC_NUM_BIG_SIGNED, instrAndText(CONV_ASCII_BIGNUM)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BYTE_F_ASCII, instrAndText(CONV_ASCII_V_F)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII, instrAndText(CONV_ASCII_V_V)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_ASCII_V_V)}, |
| {REC_BYTE_V_ASCII_LONG, REC_BYTE_V_ANSI, instrAndText(CONV_ASCII_TO_ANSI_V)}, |
| |
| {REC_BYTE_V_ANSI, REC_BYTE_F_ASCII, instrAndText(CONV_ANSI_V_TO_ASCII_F)}, |
| {REC_BYTE_V_ANSI, REC_BYTE_V_ASCII, instrAndText(CONV_ANSI_V_TO_ASCII_V)}, |
| {REC_BYTE_V_ANSI, REC_BYTE_V_ASCII_LONG, instrAndText(CONV_ANSI_V_TO_ASCII_V)}, |
| {REC_BYTE_V_ANSI, REC_BYTE_V_ANSI, instrAndText(CONV_ANSI_V_TO_ANSI_V)}, |
| |
| {REC_NCHAR_V_ANSI_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(CONV_ANSI_V_UNICODE_TO_UNICODE_V)}, |
| {REC_NCHAR_V_ANSI_UNICODE, REC_NCHAR_V_ANSI_UNICODE, instrAndText(CONV_ANSI_V_UNICODE_TO_ANSI_V_UNICODE)}, |
| {REC_NCHAR_V_ANSI_UNICODE, REC_BYTE_V_ASCII, instrAndText(CONV_ANSI_V_UNICODE_TO_ASCII_V)}, |
| {REC_NCHAR_V_ANSI_UNICODE, REC_BYTE_F_ASCII, instrAndText(CONV_ANSI_V_UNICODE_TO_ASCII_F)}, |
| {REC_NCHAR_V_ANSI_UNICODE, REC_NCHAR_F_UNICODE, instrAndText(CONV_ANSI_V_UNICODE_TO_UNICODE_F)}, |
| {REC_NCHAR_V_ANSI_UNICODE, REC_NCHAR_V_UNICODE, instrAndText(CONV_ANSI_V_UNICODE_TO_UNICODE_V)}, |
| |
| {REC_BLOB, REC_BLOB, instrAndText(CONV_BLOB_BLOB)}, |
| {REC_BLOB, REC_BYTE_F_ASCII, instrAndText(CONV_BLOB_ASCII_F)}, |
| |
| {REC_CLOB, REC_CLOB, instrAndText(CONV_BLOB_BLOB)}, |
| {REC_CLOB, REC_BYTE_F_ASCII, instrAndText(CONV_BLOB_ASCII_F)}, |
| |
| {REC_BOOLEAN, REC_BOOLEAN, instrAndText(CONV_BOOL_BOOL)}, |
| {REC_BOOLEAN, REC_BYTE_F_ASCII, instrAndText(CONV_BOOL_ASCII)}, |
| {REC_BOOLEAN, REC_BYTE_V_ASCII, instrAndText(CONV_BOOL_ASCII)}, |
| |
| }; |
| |
| Lng32 ex_conv_clause::findIndexIntoInstrArray(ConvInstruction ci) |
| { |
| Int32 max_array_size = sizeof(convInstrInfo) / sizeof(ConvInstrStruct); |
| |
| Int32 i = 0; |
| while ((i < max_array_size) && |
| (convInstrInfo[i].instruction != ci)) |
| { |
| i++; |
| } |
| |
| if (i < max_array_size) |
| return i; |
| |
| return -1; // not found |
| } |
| |
| bool ex_conv_clause::sv_instrOffsetIndexPopulated = false; |
| short ex_conv_clause::sv_MaxOpTypeValue = -1; |
| int *ex_conv_clause::sv_convIndexSparse = 0; |
| |
| /* |
| * Scans convInstrInfo[] and populates a |
| * sparsely populated index: sv_convIndexSparse. |
| * |
| * For a given op type: op_type, |
| * if (sv_convIndexSparse[op_type>] != -1) then |
| * it contains the offset into the first row of |
| * convInstrInfo[] |
| */ |
| void ex_conv_clause::populateInstrOffsetIndex() |
| { |
| if (sv_instrOffsetIndexPopulated) { |
| return; |
| } |
| |
| typedef struct convInstrIndexStruct { |
| short type_op1; |
| short offset; |
| } convInstrIndexDef; |
| |
| short lv_MaxIndex = -1; |
| |
| // Currently, the number of distinct 'type_op1' values in the convInstrInf[] is 32 |
| const int lv_MaxIndexCapacity = 100; |
| convInstrIndexDef lv_convIndex[lv_MaxIndexCapacity]; |
| |
| Int32 i = 0; |
| Int32 lv_source_type = -1; |
| Int32 lv_max_array_size = sizeof(ex_conv_clause::convInstrInfo) / sizeof(ex_conv_clause::ConvInstrStruct); |
| |
| // collect distinct type_op1 values and their 1st offset in convInstrInfo[] |
| while (i < lv_max_array_size) { |
| if (ex_conv_clause::convInstrInfo[i].type_op1 != lv_source_type) { |
| lv_source_type = ex_conv_clause::convInstrInfo[i].type_op1; |
| if ((lv_source_type > -1) && |
| (lv_MaxIndex < (lv_MaxIndexCapacity - 1))) { |
| lv_convIndex[++lv_MaxIndex].type_op1 = lv_source_type; |
| lv_convIndex[lv_MaxIndex].offset = i; |
| } |
| } |
| i++; |
| } |
| |
| // Find the max op type value in lv_convIndex |
| int j = 0; |
| while (j <= lv_MaxIndex) { |
| if (sv_MaxOpTypeValue < lv_convIndex[j].type_op1) { |
| sv_MaxOpTypeValue = lv_convIndex[j].type_op1; |
| } |
| j++; |
| } |
| |
| // just in case some op type has been assigned a pretty large value |
| // we dont want to allocate a very large sparse value |
| if (sv_MaxOpTypeValue > 8000) { |
| sv_MaxOpTypeValue = 8000; |
| } |
| |
| // Allocate a sparsely populated array |
| int *lv_convIndexSparse = (int *) calloc(sizeof(int), |
| (sv_MaxOpTypeValue+1)); |
| // Initialize to -1 |
| for (j = 0; j <= sv_MaxOpTypeValue; j++) { |
| lv_convIndexSparse[j] = -1; |
| } |
| |
| // Setup the sparsely populated array |
| j = 0; |
| while (j <= lv_MaxIndex) { |
| lv_convIndexSparse[lv_convIndex[j].type_op1] = lv_convIndex[j].offset; |
| j++; |
| } |
| |
| sv_convIndexSparse = lv_convIndexSparse; |
| sv_instrOffsetIndexPopulated = true; |
| } |
| |
| /* returns the offset into the convInstrInfo[] (the first row where the |
| * src data type equals the parameter pv_op1) |
| */ |
| int ex_conv_clause::getInstrOffset(short pv_op1) |
| { |
| if ((pv_op1 < 0) || |
| (pv_op1 > sv_MaxOpTypeValue)) { |
| return -1; |
| } |
| |
| return sv_convIndexSparse[pv_op1]; |
| } |
| |
| ConvInstruction ex_conv_clause::findInstruction(short sourceType, Lng32 sourceLen, |
| short targetType, Lng32 targetLen, |
| Lng32 scaleDifference) |
| { |
| ConvInstruction instruction = CONV_NOT_SUPPORTED; |
| setInstrArrayIndex(-1); |
| |
| getConvCaseDatatypes(sourceType, sourceLen, sourceType, |
| targetType, targetLen, targetType, scaleDifference); |
| |
| Int32 max_array_size = sizeof(convInstrInfo) / sizeof(ConvInstrStruct); |
| |
| Int32 i = 0; |
| i = getInstrOffset(sourceType); |
| if (i < 0) { |
| i = 0; |
| while ((i < max_array_size) && (convInstrInfo[i].type_op1 != sourceType)) { |
| i++; |
| } |
| } |
| |
| NABoolean done = FALSE; |
| while ((!done) && (i < max_array_size)) { |
| if (convInstrInfo[i].type_op1 != sourceType) |
| done = TRUE; |
| else if (convInstrInfo[i].type_op2 == targetType) { |
| done = TRUE; |
| instruction = convInstrInfo[i].instruction; |
| setInstrArrayIndex(i); |
| } |
| else |
| i++; |
| }; // while |
| |
| if (instruction == CONV_INTERVALS_INTERVALS_DIV) |
| { |
| |
| // have to look at scale difference to distinguish whether |
| // to divide or multiply by the scale factor |
| if (scaleDifference < 0) |
| { |
| instruction = CONV_INTERVALS_INTERVALS_MULT; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| |
| // if this is a conversion from numeric to tinyint and not handled |
| // above, then add a generic conv to tinyint index. |
| // At runtime, actual conversion will be done based on source datatype. |
| // This is done to handle the case where target is a key column used |
| // in a predicate and conversion is being done to its datatype. |
| // In this case, we dont want to return a conversion error. |
| // See handling of dataConversionErrorFlag in exp_conv.cpp. |
| if (instruction == CONV_NOT_SUPPORTED) |
| { |
| if ((DFS2REC::isNumeric(sourceType)) && |
| (DFS2REC::isTinyint(targetType))) |
| { |
| if (targetType == REC_BIN8_SIGNED) |
| { |
| instruction = CONV_NUMERIC_BIN8S; |
| } |
| else |
| { |
| instruction = CONV_NUMERIC_BIN8U; |
| } |
| |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| |
| return (enum ConvInstruction)instruction; |
| |
| }; |
| |
| NABoolean ex_conv_clause::isConversionSupported |
| (short sourceType, Lng32 sourceLen, short targetType, Lng32 targetLen) |
| { |
| ConvInstruction ci = |
| findInstruction(sourceType, sourceLen, targetType, targetLen, 0); |
| if (ci == CONV_NOT_SUPPORTED) |
| return FALSE; |
| else |
| return TRUE; |
| } |
| |
| void ex_conv_clause::setInstruction() { |
| ConvInstruction instruction = CONV_NOT_SUPPORTED; |
| |
| // Test added to allow conditional union to be rowset-aware |
| if((getOperand(0)->getRowsetSize() > 0) && (getOperand(1)->getRowsetSize() > 0)) |
| { |
| instruction = CONV_ASCII_F_F; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| |
| SimpleType *op0 = (SimpleType *) getOperand(0); |
| SimpleType *op1 = (SimpleType *) getOperand(1); |
| if (!(op0->getUseTotalRowsetSize())) { |
| op0->setLength(sizeof(Lng32) + (op0->getLength() * op0->getRowsetSize())); |
| op0->setUseTotalRowsetSize(); |
| op1->setUseTotalRowsetSize(); |
| } |
| op1->setLength(op0->getLength()); |
| } |
| else |
| instruction = findInstruction(getOperand(1)->getDatatype(), |
| getOperand(1)->getLength(), |
| getOperand(0)->getDatatype(), |
| getOperand(0)->getLength(), |
| getOperand(1)->getScale() - getOperand(0)->getScale()); |
| |
| if (instruction == CONV_NOT_SUPPORTED) |
| { |
| if ((getOperand(0)->isComplexType()) && !(getOperand(1)->isComplexType())) |
| { |
| instruction = CONV_SIMPLE_TO_COMPLEX; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| else if (! (getOperand(0)->isComplexType()) && (getOperand(1)->isComplexType())) |
| { |
| instruction = CONV_COMPLEX_TO_SIMPLE; |
| setInstrArrayIndex(findIndexIntoInstrArray(instruction)); |
| } |
| } |
| |
| if ((instruction == CONV_NOT_SUPPORTED) && |
| (getInstrArrayIndex() >= 0)) |
| { |
| // this is an error, reset instr array index |
| setInstrArrayIndex(-1); |
| } |
| }; |
| |
| ex_expr::exp_return_type ex_conv_clause::fixup(Space * space, |
| CollHeap * exHeap, |
| char * constants_area, |
| char * temps_area, |
| char * persistentArea, |
| short fixupConstsAndTemps, |
| NABoolean spaceCompOnly) |
| { |
| setInstruction(); |
| return ex_clause::fixup(space, exHeap, constants_area, temps_area, |
| persistentArea, |
| fixupConstsAndTemps, spaceCompOnly); |
| } |