Selaa lähdekoodia

HPCC-14988 Projecting fields into embeds

Changes following review.

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 9 vuotta sitten
vanhempi
commit
1934a75bad
3 muutettua tiedostoa jossa 13 lisäystä ja 14 poistoa
  1. 1 1
      ecl/hql/hqlgram2.cpp
  2. 6 7
      ecl/hqlcpp/hqlttcpp.cpp
  3. 6 6
      testing/regress/ecl/mysqlembed.ecl

+ 1 - 1
ecl/hql/hqlgram2.cpp

@@ -943,7 +943,7 @@ IHqlExpression * HqlGram::processEmbedBody(const attribute & errpos, IHqlExpress
         if (projectedAttr)
         if (projectedAttr)
         {
         {
             IHqlExpression *projectedSearch = projectedAttr->queryChild(0);
             IHqlExpression *projectedSearch = projectedAttr->queryChild(0);
-            if (!projectedSearch || !isStringType(projectedSearch->queryType()))
+            if (!projectedSearch || !(isStringType(projectedSearch->queryType()) || isUnicodeType(projectedSearch->queryType())))
                 reportError(ERR_EMBEDPROJECT_INVALID, errpos, "PROJECTED attribute requires a string parameter");
                 reportError(ERR_EMBEDPROJECT_INVALID, errpos, "PROJECTED attribute requires a string parameter");
             else
             else
             {
             {

+ 6 - 7
ecl/hqlcpp/hqlttcpp.cpp

@@ -6200,6 +6200,11 @@ IHqlExpression * WorkflowTransformer::extractCommonWorkflow(IHqlExpression * exp
     return getValue.getClear();
     return getValue.getClear();
 }
 }
 
 
+static bool isInternalEmbedAttr(IAtom *name)
+{
+    return name == languageAtom || name == projectedAtom || name == streamedAtom || name == _linkCounted_Atom ||name == importAtom;
+}
+
 IHqlExpression * WorkflowTransformer::transformInternalFunction(IHqlExpression * newFuncDef)
 IHqlExpression * WorkflowTransformer::transformInternalFunction(IHqlExpression * newFuncDef)
 {
 {
     IHqlExpression * body = newFuncDef->queryChild(0);
     IHqlExpression * body = newFuncDef->queryChild(0);
@@ -6236,13 +6241,7 @@ IHqlExpression * WorkflowTransformer::transformInternalFunction(IHqlExpression *
         ForEachChild(idx, bodyCode)
         ForEachChild(idx, bodyCode)
         {
         {
             IHqlExpression *child = bodyCode->queryChild(idx);
             IHqlExpression *child = bodyCode->queryChild(idx);
-            if (child->isAttribute() &&
-                child->queryName() != languageAtom &&
-                child->queryName() != projectedAtom &&
-                child->queryName() != streamedAtom &&
-                child->queryName() != _linkCounted_Atom &&
-                child->queryName() != importAtom
-               )
+            if (child->isAttribute() && !isInternalEmbedAttr(child->queryName()))
             {
             {
                 StringBuffer attrParam;
                 StringBuffer attrParam;
                 if (attrArgs.ordinality())
                 if (attrArgs.ordinality())

+ 6 - 6
testing/regress/ecl/mysqlembed.ecl

@@ -70,17 +70,17 @@ initializeUtf8() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   INSERT INTO tbl1 values ('utf8test', 1, 1, 1.2, 3.4, 'aa55aa55', 1234567.89, 'Straße', 'Straße', '2019-02-01 23:59:59');
   INSERT INTO tbl1 values ('utf8test', 1, 1, 1.2, 3.4, 'aa55aa55', 1234567.89, 'Straße', 'Straße', '2019-02-01 23:59:59');
 ENDEMBED;
 ENDEMBED;
 
 
-dataset(childrec) testMySQLDS() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
-  SELECT OUTPUTFIELDS() from tbl1;
+dataset(childrec) testMySQLDS() := EMBED(mysql : server(myServer),user(myUser),database(myDB),PROJECTED('OUTPUTFIELDS'))
+  SELECT OUTPUTFIELDS from tbl1;
 ENDEMBED;
 ENDEMBED;
 
 
-dataset(childrec) testMySQLDS2() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
-  SELECT OUTPUTFIELDS() from tbl1 where u1='Straße';
+dataset(childrec) testMySQLDS2() := EMBED(mysql : server(myServer),user(myUser),database(myDB),PROJECTED('[]'))
+  SELECT [] from tbl1 where u1='Straße';
 ENDEMBED;
 ENDEMBED;
 
 
-ds3query := 'SELECT ** FROM tbl1;' : STORED('ds3query');
+ds3query := u'SELECT ** FROM tbl1;' : STORED('ds3query');
 
 
-dataset(childrec) testMySQLDS3() := EMBED(mysql, ds3query : server(myServer),user(myUser),database(myDB),PROJECTED('**'));
+dataset(childrec) testMySQLDS3() := EMBED(mysql, ds3query : server(myServer),user(myUser),database(myDB),PROJECTED(u'**'));
 
 
 childrec testMySQLRow() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
 childrec testMySQLRow() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1 LIMIT 1;
   SELECT * from tbl1 LIMIT 1;