Explorar o código

HPCC-12839 Fix crash when row being looked up in a dictionary is aliased

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday %!s(int64=10) %!d(string=hai) anos
pai
achega
26d559c9c8
Modificáronse 2 ficheiros con 16 adicións e 2 borrados
  1. 13 2
      ecl/hqlcpp/hqlcset.cpp
  2. 3 0
      ecl/hqlcpp/hqlcset.ipp

+ 13 - 2
ecl/hqlcpp/hqlcset.cpp

@@ -721,6 +721,16 @@ InlineLinkedDictionaryCursor::InlineLinkedDictionaryCursor(HqlCppTranslator & _t
 {
 }
 
+IHqlExpression * InlineLinkedDictionaryCursor::getFirstSearchValue(IHqlExpression * searchExpr, IHqlExpression * searchRecord)
+{
+    if (searchExpr->getOperator() == no_alias)
+        searchExpr = searchExpr->queryChild(0);
+
+    IHqlExpression * matched = getExtractSelect(searchExpr->queryChild(0), queryFirstField(searchRecord));
+    assertex(matched);
+    return matched;
+}
+
 BoundRow * InlineLinkedDictionaryCursor::buildSelectMap(BuildCtx & ctx, IHqlExpression * mapExpr)
 {
     Owned<BoundRow> tempRow = translator.declareLinkedRow(ctx, mapExpr, false);
@@ -767,7 +777,7 @@ BoundRow * InlineLinkedDictionaryCursor::buildSelectMap(BuildCtx & ctx, IHqlExpr
     if (optimizedLookupFunc.length())
     {
         args.add(*LINK(dictionary), 0);
-        args.append(*getExtractSelect(searchExpr->queryChild(0), queryFirstField(searchRecord)));
+        args.append(*getFirstSearchValue(searchExpr, searchRecord));
         args.append(*::createRow(no_null, LINK(record))); // the default record
         lookupFunction = createIdAtom(optimizedLookupFunc);
     }
@@ -793,6 +803,7 @@ void InlineLinkedDictionaryCursor::buildInDataset(BuildCtx & ctx, IHqlExpression
     IHqlExpression *record = ds->queryRecord();
     IHqlExpression *dictionary = inExpr->queryChild(1);
     IHqlExpression *searchExpr = inExpr->queryChild(0);
+
     HqlExprArray args;
 
     OwnedHqlExpr searchRecord = getDictionarySearchRecord(record);
@@ -831,7 +842,7 @@ void InlineLinkedDictionaryCursor::buildInDataset(BuildCtx & ctx, IHqlExpression
     if (optimizedLookupFunc.length())
     {
         args.add(*LINK(dictionary), 0);
-        args.append(*getExtractSelect(searchExpr->queryChild(0), queryFirstField(searchRecord)));
+        args.append(*getFirstSearchValue(searchExpr, searchRecord));
         lookupFunction = createIdAtom(optimizedLookupFunc);
     }
     else

+ 3 - 0
ecl/hqlcpp/hqlcset.ipp

@@ -93,6 +93,9 @@ public:
     virtual void buildIterateClass(BuildCtx & ctx, StringBuffer & cursorName, BuildCtx * initctx) { throwUnexpected(); }
     virtual void buildCountDict(BuildCtx & ctx, CHqlBoundExpr & tgt);
     virtual void buildExistsDict(BuildCtx & ctx, CHqlBoundExpr & tgt);
+
+private:
+    IHqlExpression * getFirstSearchValue(IHqlExpression * searchExpr, IHqlExpression * searchRecord);
 };
 
 class MultiLevelDatasetCursor : public BaseDatasetCursor