瀏覽代碼

Related to bug 92226 optimizing x IN IF(a,b,c)

Fixes found when the checking was improved.  The original problem in
the legacy sources is not in the 3.x code.

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 13 年之前
父節點
當前提交
5363885933
共有 4 個文件被更改,包括 19 次插入7 次删除
  1. 13 1
      ecl/hql/hqlexpr.cpp
  2. 1 1
      ecl/hqlcpp/hqlcpp.cpp
  3. 1 1
      ecl/hqlcpp/hqlhtcpp.cpp
  4. 4 4
      ecl/hqlcpp/hqlsource.cpp

+ 13 - 1
ecl/hql/hqlexpr.cpp

@@ -60,6 +60,7 @@
 //#define TRACE_THIS
 //#define CONSISTENCY_CHECK
 //#define GATHER_LINK_STATS
+//#define VERIFY_EXPR_INTEGRITY
 
 #ifdef _DEBUG
 //#define DEBUG_SCOPE
@@ -70,6 +71,7 @@
 //#define SEARCH_IEXPR 0x03289048
 //#define CHECK_SELSEQ_CONSISTENCY
 //#define GATHER_COMMON_STATS
+#define VERIFY_EXPR_INTEGRITY
 
 #if defined(SEARCH_NAME1) || defined(SEARCH_NAME2)
 static void debugMatchedName() {}
@@ -3099,7 +3101,7 @@ void CHqlExpression::updateFlagsAfterOperands()
         }
     }
 
-#ifdef _DEBUG
+#ifdef VERIFY_EXPR_INTEGRITY
 switch (op)
     {
     case no_select:
@@ -3164,6 +3166,16 @@ switch (op)
     case no_getgraphloopresult:
         assertex(!isAction());
         break;
+    case no_in:
+    case no_notin:
+    case no_eq:
+    case no_ne:
+    case no_ge:
+    case no_gt:
+    case no_le:
+    case no_lt:
+        assertex(type->getTypeCode() == type_boolean);
+        break;
     case no_alias:
         assertex(queryChild(0)->getOperator() != no_alias);
         break;

+ 1 - 1
ecl/hqlcpp/hqlcpp.cpp

@@ -5295,7 +5295,7 @@ void HqlCppTranslator::doBuildExprAbs(BuildCtx & ctx, IHqlExpression * expr, CHq
             buildTempExpr(ctx, expr->queryChild(0), temp);
 
             ITypeInfo * type = expr->getType();
-            IHqlExpression * cond = createValue(no_ge, temp.expr.getLink(), createConstant(type->castFrom(true, 0)));
+            IHqlExpression * cond = createValue(no_ge, makeBoolType(), temp.expr.getLink(), createConstant(type->castFrom(true, 0)));
             tgt.expr.setown(createValue(no_if, type, cond, temp.expr.getLink(), createValue(no_negate, LINK(type), temp.expr.getLink())));
         }
         break;

+ 1 - 1
ecl/hqlcpp/hqlhtcpp.cpp

@@ -16226,7 +16226,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityInlineTable(BuildCtx & ctx, IH
         {
             OwnedHqlExpr whichRow = createVariable("row", LINK(unsignedType));
             BuildCtx subctx(funcctx);
-            OwnedHqlExpr test = createValue(no_ge, LINK(whichRow), getSizetConstant(maxRows));
+            OwnedHqlExpr test = createValue(no_ge, makeBoolType(), LINK(whichRow), getSizetConstant(maxRows));
             subctx.addFilter(test);
             buildReturn(subctx, queryZero());
             OwnedHqlExpr ds = bound.getTranslatedExpr();

+ 4 - 4
ecl/hqlcpp/hqlsource.cpp

@@ -5436,7 +5436,7 @@ bool MonitorExtractor::extractSimpleCompareFilter(KeyConditionInfo & matches, IH
         node_operator newOp = getModifiedOp(op, duplicate);
         if (newOp != no_none)
         {
-            OwnedHqlExpr newFilter = createValue(newOp, LINK(l), LINK(r));
+            OwnedHqlExpr newFilter = createValue(newOp, expr->getType(), LINK(l), LINK(r));
             result.setown(new KeyCondition(matchedSelector, newFilter, keyedKind));
         }
     }
@@ -5449,7 +5449,7 @@ bool MonitorExtractor::extractSimpleCompareFilter(KeyConditionInfo & matches, IH
             node_operator newOp = getModifiedOp(getReverseOp(op), duplicate);
             if (newOp != no_none)
             {
-                OwnedHqlExpr newFilter = createValue(newOp, LINK(r), LINK(l));
+                OwnedHqlExpr newFilter = createValue(newOp, expr->getType(), LINK(r), LINK(l));
                 result.setown(new KeyCondition(matchedSelector, newFilter, keyedKind));
             }
         }
@@ -5469,7 +5469,7 @@ bool MonitorExtractor::extractSimpleCompareFilter(KeyConditionInfo & matches, IH
             }
             else if (!leftHasSelects && rightHasSelects && (op != no_in) && (op != no_notin))
             {
-                OwnedHqlExpr newFilter = createValue(getReverseOp(op), LINK(r), LINK(l));
+                OwnedHqlExpr newFilter = createValue(getReverseOp(op), expr->getType(), LINK(r), LINK(l));
                 result.setown(createTranslatedCondition(newFilter, keyedKind));
             }
         }
@@ -5734,7 +5734,7 @@ bool MonitorExtractor::extractBoolFieldFilter(KeyConditionInfo & matches, IHqlEx
     {
         if (isKeySelect(selector) && okToKey(selector, keyedKind))
         {
-            OwnedHqlExpr newFilter = createValue(no_eq, LINK(selector), createConstant(compareValue));
+            OwnedHqlExpr newFilter = createValue(no_eq, makeBoolType(), LINK(selector), createConstant(compareValue));
             matches.appendCondition(*new KeyCondition(selector, newFilter, keyedKind));
             return true;
         }