This is an automated email from the ASF dual-hosted git repository.

jhyde pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 5b73f3665a762006d41c3aac6a05437e2ccdded3
Author: Julian Hyde <[email protected]>
AuthorDate: Sat May 6 14:44:28 2023 -0700

    In tests, don't allow multi-line strings as argument to 
CalciteAssert.returnsUnordered
    
    `CalciteAssert` sorts the lines (for `returnsUnordered`, but
    not for `returnsOrdered`) and joins them using '\n', so if
    each 'line' is actually multiple lines the sort does not have
    the desired effect.
    
    The simplest solution is to require the 'lines' to be just
    single lines, for both `returnsUnordered` and
    `returnsOrdered`. If this breaks one of your tests, just
    change the concatenated strings to a comma-separated list.
---
 .../java/org/apache/calcite/test/JdbcTest.java     |   4 +-
 .../apache/calcite/test/ReflectiveSchemaTest.java  |   4 +-
 .../org/apache/calcite/test/TableFunctionTest.java |   4 +-
 .../test/enumerable/EnumerableCalcTest.java        |  50 ++++---
 .../test/enumerable/EnumerableJoinTest.java        |  17 +--
 .../test/enumerable/EnumerableRepeatUnionTest.java |   7 +-
 .../enumerable/EnumerableStringComparisonTest.java |  34 ++---
 .../org/apache/calcite/test/DruidAdapter2IT.java   |  90 +++++++-----
 .../org/apache/calcite/test/DruidAdapterIT.java    |  94 +++++++------
 .../org/apache/calcite/test/SparkAdapterTest.java  | 154 +++++++++++++--------
 .../org/apache/calcite/test/CalciteAssert.java     |  23 +++
 11 files changed, 289 insertions(+), 192 deletions(-)

diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java 
b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 4a5425bf4a..ec94130431 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -7772,7 +7772,9 @@ public class JdbcTest {
             + "  EnumerableValues(tuples=[[{ 1, 2 }]])\n"
             + "  EnumerableCalc(expr#0..1=[{inputs}], expr#2=[+($t0, $t1)], 
expr#3=[-($t0, $t1)], EXPR$0=[$t2], EXPR$1=[$t3])\n"
             + "    EnumerableValues(tuples=[[{ 3, 4 }, { 5, 6 }]])\n")
-        .returnsUnordered("X=11; Y=-1\nX=1; Y=2\nX=7; Y=-1");
+        .returnsUnordered("X=11; Y=-1",
+            "X=1; Y=2",
+            "X=7; Y=-1");
   }
 
   /** Test case for
diff --git 
a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java 
b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
index 36bffc61b6..d6d15d92b9 100644
--- a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
+++ b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
@@ -904,7 +904,9 @@ public class ReflectiveSchemaTest {
         .withSchema("s", CATCHALL)
         .query("select (\"value\" = 3 and unknown) or ( \"value\"  = 3 ) "
             + "from \"s\".\"primesCustomBoxed\"")
-        .returnsUnordered("EXPR$0=false\nEXPR$0=false\nEXPR$0=true");
+        .returnsUnordered("EXPR$0=false",
+            "EXPR$0=false",
+            "EXPR$0=true");
   }
 
   @Test void testDecimalNegate() {
diff --git a/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java 
b/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java
index ab50be530c..2ac6a96d72 100644
--- a/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java
+++ b/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java
@@ -480,7 +480,9 @@ class TableFunctionTest {
     final String q = "select \"N\" + 1 as c\n"
         + "from table(\"s\".\"fibonacci2\"(3))\n"
         + "group by \"N\"";
-    with().query(q).returnsUnordered("C=2\nC=3\nC=4");
+    with().query(q).returnsUnordered("C=2",
+        "C=3",
+        "C=4");
   }
 
   @Test void testCrossApply() {
diff --git 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java
index 42b8c3123f..7e801e18f8 100644
--- 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java
@@ -61,37 +61,46 @@ class EnumerableCalcTest {
    * Posix regex operators cannot be used within RelBuilder</a>.
    */
   @Test void testPosixRegexCaseSensitive() {
-    checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE,
-        "empid=200; name=Eric");
-    checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE, 
"");
+    checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE)
+        .returnsUnordered("empid=200; name=Eric");
+    checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE)
+        .returnsUnordered();
   }
 
   @Test void testPosixRegexCaseInsensitive() {
-    checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE,
-        "empid=200; name=Eric");
-    checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE,
-        "empid=200; name=Eric");
+    checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE)
+        .returnsUnordered("empid=200; name=Eric");
+    checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE)
+        .returnsUnordered("empid=200; name=Eric");
   }
 
   @Test void testNegatedPosixRegexCaseSensitive() {
-    checkPosixRegex("E..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE,
-        "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; 
name=Sebastian");
-    checkPosixRegex("e..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE,
-        "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; 
name=Sebastian", "empid=200; name=Eric");
+    checkPosixRegex("E..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE)
+        .returnsUnordered("empid=100; name=Bill",
+            "empid=110; name=Theodore",
+            "empid=150; name=Sebastian");
+    checkPosixRegex("e..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE)
+        .returnsUnordered("empid=100; name=Bill",
+            "empid=110; name=Theodore",
+            "empid=150; name=Sebastian",
+            "empid=200; name=Eric");
   }
 
   @Test void testNegatedPosixRegexCaseInsensitive() {
-    checkPosixRegex("E..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE,
-        "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; 
name=Sebastian");
-    checkPosixRegex("e..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE,
-        "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; 
name=Sebastian");
+    checkPosixRegex("E..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE)
+        .returnsUnordered("empid=100; name=Bill",
+            "empid=110; name=Theodore",
+            "empid=150; name=Sebastian");
+    checkPosixRegex("e..c", 
SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE)
+        .returnsUnordered("empid=100; name=Bill",
+            "empid=110; name=Theodore",
+            "empid=150; name=Sebastian");
   }
 
-  private void checkPosixRegex(
+  private CalciteAssert.AssertQuery checkPosixRegex(
       String literalValue,
-      SqlOperator operator,
-      String... expectedResult) {
-    CalciteAssert.that()
+      SqlOperator operator) {
+    return CalciteAssert.that()
         .withSchema("s", new ReflectiveSchema(new HrSchema()))
         .withRel(
             builder -> builder
@@ -104,7 +113,6 @@ class EnumerableCalcTest {
                 .project(
                     builder.field("empid"),
                     builder.field("name"))
-                .build())
-        .returnsUnordered(expectedResult);
+                .build());
   }
 }
diff --git 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java
index 81aef12448..30f69f1034 100644
--- 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java
@@ -211,9 +211,8 @@ class EnumerableJoinTest {
             + "    EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "      EnumerableCalc(expr#0..3=[{inputs}], 
proj#0..1=[{exprs}])\n"
             + "        EnumerableTableScan(table=[[s, depts]])\n")
-        .returnsUnordered(""
-            + "empid=110; name=Theodore; dept_name=Sales; e_deptno=10; 
d_deptno=10\n"
-            + "empid=150; name=Sebastian; dept_name=Sales; e_deptno=10; 
d_deptno=10");
+        .returnsUnordered("empid=110; name=Theodore; dept_name=Sales; 
e_deptno=10; d_deptno=10",
+            "empid=150; name=Sebastian; dept_name=Sales; e_deptno=10; 
d_deptno=10");
   }
 
   /** Test case for
@@ -250,7 +249,10 @@ class EnumerableJoinTest {
             + "    EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], 
dir1=[ASC])\n"
             + "      EnumerableCalc(expr#0..4=[{inputs}], deptno=[$t1], 
commission=[$t4])\n"
             + "        EnumerableTableScan(table=[[s, emps]])\n")
-        .returnsUnordered("empid=100\nempid=110\nempid=150\nempid=200");
+        .returnsUnordered("empid=100",
+            "empid=110",
+            "empid=150",
+            "empid=200");
   }
 
   /** Test case for
@@ -326,10 +328,9 @@ class EnumerableJoinTest {
             + "        EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "          EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], 
name=[$t2])\n"
             + "            EnumerableTableScan(table=[[s, emps]])\n")
-        .returnsUnordered(""
-            + "empid=2; name=Emp2\n"
-            + "empid=3; name=Emp3\n"
-            + "empid=5; name=Emp5");
+        .returnsUnordered("empid=2; name=Emp2",
+            "empid=3; name=Emp3",
+            "empid=5; name=Emp5");
   }
 
   private CalciteAssert.AssertThat tester(boolean forceDecorrelate,
diff --git 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java
 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java
index b7c18f4a33..4ee3f51cee 100644
--- 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java
@@ -313,9 +313,8 @@ class EnumerableRepeatUnionTest {
             + "              BindableTableScan(table=[[#DELTA#]])\n"
             + "        EnumerableCalc(expr#0..4=[{inputs}], expr#5=[$cor1], 
expr#6=[$t5.subordinateid], expr#7=[=($t6, $t0)], empid=[$t0], name=[$t2], 
$condition=[$t7])\n"
             + "          EnumerableTableScan(table=[[s, emps]])\n")
-        .returnsUnordered(""
-            + "empid=2; name=Emp2\n"
-            + "empid=3; name=Emp3\n"
-            + "empid=5; name=Emp5");
+        .returnsUnordered("empid=2; name=Emp2",
+            "empid=3; name=Emp3",
+            "empid=5; name=Emp5");
   }
 }
diff --git 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
index 6f0fd0273a..fd12311b49 100644
--- 
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
@@ -111,11 +111,11 @@ class EnumerableStringComparisonTest {
         .explainHookMatches(""
             + "EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "  EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'hr' 
}, { 'Administration' }, { 'MARKETING' }]])\n")
-        .returnsOrdered("name=Administration\n"
-            + "name=Legal\n"
-            + "name=MARKETING\n"
-            + "name=hr\n"
-            + "name=presales");
+        .returnsOrdered("name=Administration",
+            "name=Legal",
+            "name=MARKETING",
+            "name=hr",
+            "name=presales");
   }
 
   @Test void testSortStringSpecialCollation() {
@@ -130,11 +130,11 @@ class EnumerableStringComparisonTest {
         .explainHookMatches(""
             + "EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "  EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'hr' 
}, { 'Administration' }, { 'MARKETING' }]])\n")
-        .returnsOrdered("name=Administration\n"
-            + "name=hr\n"
-            + "name=Legal\n"
-            + "name=MARKETING\n"
-            + "name=presales");
+        .returnsOrdered("name=Administration",
+            "name=hr",
+            "name=Legal",
+            "name=MARKETING",
+            "name=presales");
   }
 
   @Test void testMergeJoinOnStringSpecialCollation() {
@@ -162,8 +162,8 @@ class EnumerableStringComparisonTest {
             + "    EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 
'HR' }, { 'Administration' }, { 'Marketing' }]])\n"
             + "  EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "    EnumerableValues(tuples=[[{ 'Marketing' }, { 'bureaucracy' 
}, { 'Sales' }, { 'HR' }]])\n")
-        .returnsOrdered("name=HR; name0=HR\n"
-            + "name=Marketing; name0=Marketing");
+        .returnsOrdered("name=HR; name0=HR",
+            "name=Marketing; name0=Marketing");
   }
 
   /** Test case for
@@ -193,11 +193,11 @@ class EnumerableStringComparisonTest {
             + "      EnumerableValues(tuples=[[{ 'facilities' }, { 'HR' }, { 
'administration' }, { 'Marketing' }]])\n"
             + "  EnumerableSort(sort0=[$0], dir0=[ASC])\n"
             + "    EnumerableValues(tuples=[[{ 'Marketing' }, { 
'administration' }, { 'presales' }, { 'HR' }]])\n")
-        .returnsOrdered("name=administration\n"
-            + "name=facilities\n"
-            + "name=HR\n"
-            + "name=Marketing\n"
-            + "name=presales");
+        .returnsOrdered("name=administration",
+            "name=facilities",
+            "name=HR",
+            "name=Marketing",
+            "name=presales");
   }
 
   /** Test case for
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java 
b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
index a98ba3998d..021a9d0041 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java
@@ -650,7 +650,7 @@ public class DruidAdapter2IT {
         + "  DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], 
aggs=[[COUNT()]])";
     final String sql = "select count(*) from \"foodmart\"";
     sql(sql)
-        .returns("EXPR$0=86829\n")
+        .returnsUnordered("EXPR$0=86829")
         .queryContains(new DruidChecker(druidQuery))
         .explainContains(explain);
   }
@@ -1562,11 +1562,13 @@ public class DruidAdapter2IT {
         + "'direction':'ascending','dimensionOrder':'numeric'}]},"
         + "'aggregations':[{'type':'count','name':'C'},{'type':'longSum',"
         + "'name':'S','fieldName':'unit_sales'}]";
-    sql(sqlQuery).returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; 
S=36\ntimestamp=1997-12-29"
-        + " 00:00:00; C=321; S=982\ntimestamp=1997-12-28 00:00:00; C=480; "
-        + "S=1496\ntimestamp=1997-12-27 00:00:00; C=363; 
S=1156\ntimestamp=1997-12-26 00:00:00; "
-        + "C=144; S=420").queryContains(new DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36",
+            "timestamp=1997-12-29 00:00:00; C=321; S=982",
+            "timestamp=1997-12-28 00:00:00; C=480; S=1496",
+            "timestamp=1997-12-27 00:00:00; C=363; S=1156",
+            "timestamp=1997-12-26 00:00:00; C=144; S=420")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testNumericOrderingOfOrderByOperatorTimeExtract() {
@@ -1581,10 +1583,13 @@ public class DruidAdapter2IT {
         + "'direction':'ascending','dimensionOrder':'numeric'},"
         + "{'dimension':'extract_year','direction':'descending',"
         + "'dimensionOrder':'numeric'}]}";
-    sql(sqlQuery).returnsOrdered("D=30; M=3; Y=1997; C=114; S=351\nD=30; M=5; 
Y=1997; "
-        + "C=24; S=34\nD=30; M=6; Y=1997; C=73; S=183\nD=30; M=7; Y=1997; 
C=29; S=54\nD=30; M=8; "
-        + "Y=1997; C=137; S=422").queryContains(new 
DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("D=30; M=3; Y=1997; C=114; S=351",
+            "D=30; M=5; Y=1997; C=24; S=34",
+            "D=30; M=6; Y=1997; C=73; S=183",
+            "D=30; M=7; Y=1997; C=29; S=54",
+            "D=30; M=8; Y=1997; C=137; S=422")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testNumericOrderingOfOrderByOperatorStringDims() {
@@ -1594,10 +1599,13 @@ public class DruidAdapter2IT {
     final String druidSubQuery = "'limitSpec':{'type':'default','limit':5,"
         + "'columns':[{'dimension':'brand_name','direction':'descending',"
         + "'dimensionOrder':'lexicographic'}]}";
-    sql(sqlQuery).returnsOrdered("brand_name=Washington; C=576; 
S=1775\nbrand_name=Walrus; C=457;"
-        + " S=1399\nbrand_name=Urban; C=299; S=924\nbrand_name=Tri-State; 
C=2339; "
-        + "S=7270\nbrand_name=Toucan; C=123; S=380").queryContains(new 
DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("brand_name=Washington; C=576; S=1775",
+            "brand_name=Walrus; C=457; S=1399",
+            "brand_name=Urban; C=299; S=924",
+            "brand_name=Tri-State; C=2339; S=7270",
+            "brand_name=Toucan; C=123; S=380")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testGroupByWeekExtract() {
@@ -1622,7 +1630,10 @@ public class DruidAdapter2IT {
         + "'timeZone':'UTC','locale':'en-US'}}]}]},"
         + "'aggregations':[],"
         + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
-    sql(sql).returnsOrdered("EXPR$0=10\nEXPR$0=11").queryContains(new 
DruidChecker(druidQuery));
+    sql(sql)
+        .returnsOrdered("EXPR$0=10",
+            "EXPR$0=11")
+        .queryContains(new DruidChecker(druidQuery));
   }
 
   /** Test case for
@@ -2388,9 +2399,9 @@ public class DruidAdapter2IT {
             new DruidChecker("\"queryType\":\"groupBy\"", 
"{\"type\":\"bound\","
                 + 
"\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
                 + "\"ordering\":\"numeric\"}"));
-    q.returnsUnordered("EXPR$0=10.16; product_id=1554\n"
-        + "EXPR$0=45.05; product_id=1556\n"
-        + "EXPR$0=88.5; product_id=1555");
+    q.returnsUnordered("EXPR$0=10.16; product_id=1554",
+        "EXPR$0=45.05; product_id=1556",
+        "EXPR$0=88.5; product_id=1555");
   }
 
   @Test void testFilterClauseWithMetricAndTimeAndAggregates() {
@@ -2403,10 +2414,10 @@ public class DruidAdapter2IT {
             new DruidChecker("\"queryType\":\"groupBy\"", 
"{\"type\":\"bound\","
                 + 
"\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
                 + "\"ordering\":\"numeric\"}"))
-        .returnsUnordered("EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=13.25; product_id=1556");
+        .returnsUnordered("EXPR$0=10.6; product_id=1556",
+            "EXPR$0=10.6; product_id=1556",
+            "EXPR$0=10.6; product_id=1556",
+            "EXPR$0=13.25; product_id=1556");
   }
 
   /** Tests that an aggregate with a nested filter clause has its filter
@@ -3331,9 +3342,9 @@ public class DruidAdapter2IT {
             + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
     sql(sql)
         .runs()
-        .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; 
D=2\n"
-            + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2\n"
-            + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2")
+        .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; 
D=2",
+            "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2",
+            "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  BindableSort(sort0=[$2], dir0=[ASC], fetch=[3])\n"
             + "    DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3347,9 +3358,9 @@ public class DruidAdapter2IT {
             + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
     sql(sql)
         .runs()
-        .returnsOrdered("EXPR$0=0.5357357987441458; D=2\n"
-            + "EXPR$0=0.22760480207557643; D=2\n"
-            + "EXPR$0=0.11259322182897047; D=2")
+        .returnsOrdered("EXPR$0=0.5357357987441458; D=2",
+            "EXPR$0=0.22760480207557643; D=2",
+            "EXPR$0=0.11259322182897047; D=2")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  BindableSort(sort0=[$1], dir0=[ASC], fetch=[3])\n"
             + "    DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
@@ -3511,8 +3522,11 @@ public class DruidAdapter2IT {
     final String sql =
         "SELECT \"product_id\", SUBSTRING(\"product_id\" from 1 for 2) FROM " 
+ FOODMART_TABLE
             + " GROUP BY \"product_id\"";
-    sql(sql).limit(3).returnsOrdered(
-        "product_id=1; EXPR$1=1\nproduct_id=10; EXPR$1=10\nproduct_id=100; 
EXPR$1=10")
+    sql(sql)
+        .limit(3)
+        .returnsOrdered("product_id=1; EXPR$1=1",
+            "product_id=10; EXPR$1=10",
+            "product_id=100; EXPR$1=10")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
             + "2992-01-10T00:00:00.000Z]], projects=[[$1]], groups=[{0}], 
aggs=[[]], "
@@ -3755,10 +3769,10 @@ public class DruidAdapter2IT {
                     + 
"{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}],"
                     + 
"\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
                 "QUARTER"));
-    q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05\n"
-        + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
-        + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
-        + "EXPR$0=4; product_id=1; EXPR$2=48.45");
+    q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05",
+        "EXPR$0=2; product_id=1; EXPR$2=62.7",
+        "EXPR$0=3; product_id=1; EXPR$2=88.35",
+        "EXPR$0=4; product_id=1; EXPR$2=48.45");
   }
 
   @Test void testExtractQuarter() {
@@ -3773,10 +3787,10 @@ public class DruidAdapter2IT {
                     + 
"\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}],"
                     + 
"\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
                 "QUARTER"));
-    q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35\n"
-        + "EXPR$0=2; EXPR$1=132666.27\n"
-        + "EXPR$0=3; EXPR$1=140271.89\n"
-        + "EXPR$0=4; EXPR$1=152671.62");
+    q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35",
+        "EXPR$0=2; EXPR$1=132666.27",
+        "EXPR$0=3; EXPR$1=140271.89",
+        "EXPR$0=4; EXPR$1=152671.62");
   }
 
   @Test void testCastTimestamp1() {
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java 
b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
index 6aab15f328..d45f4169a8 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -920,7 +920,7 @@ public class DruidAdapterIT {
         + "2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])";
     final String sql = "select count(*) from \"foodmart\"";
     sql(sql)
-        .returns("EXPR$0=86829\n")
+        .returnsUnordered("EXPR$0=86829")
         .queryContains(new DruidChecker(druidQuery))
         .explainContains(explain);
   }
@@ -1859,11 +1859,13 @@ public class DruidAdapterIT {
         + "'direction':'ascending','dimensionOrder':'numeric'}]},"
         + "'aggregations':[{'type':'count','name':'C'},{'type':'longSum',"
         + "'name':'S','fieldName':'unit_sales'}]";
-    sql(sqlQuery).returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; 
S=36\ntimestamp=1997-12-29"
-        + " 00:00:00; C=321; S=982\ntimestamp=1997-12-28 00:00:00; C=480; "
-        + "S=1496\ntimestamp=1997-12-27 00:00:00; C=363; 
S=1156\ntimestamp=1997-12-26 00:00:00; "
-        + "C=144; S=420").queryContains(new DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36",
+            "timestamp=1997-12-29 00:00:00; C=321; S=982",
+            "timestamp=1997-12-28 00:00:00; C=480; S=1496",
+            "timestamp=1997-12-27 00:00:00; C=363; S=1156",
+            "timestamp=1997-12-26 00:00:00; C=144; S=420")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testNumericOrderingOfOrderByOperatorTimeExtract() {
@@ -1878,10 +1880,13 @@ public class DruidAdapterIT {
         + "'direction':'ascending','dimensionOrder':'numeric'},"
         + "{'dimension':'extract_year','direction':'descending',"
         + "'dimensionOrder':'numeric'}]}";
-    sql(sqlQuery).returnsOrdered("D=30; M=3; Y=1997; C=114; S=351\nD=30; M=5; 
Y=1997; "
-        + "C=24; S=34\nD=30; M=6; Y=1997; C=73; S=183\nD=30; M=7; Y=1997; 
C=29; S=54\nD=30; M=8; "
-        + "Y=1997; C=137; S=422").queryContains(new 
DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("D=30; M=3; Y=1997; C=114; S=351",
+            "D=30; M=5; Y=1997; C=24; S=34",
+            "D=30; M=6; Y=1997; C=73; S=183",
+            "D=30; M=7; Y=1997; C=29; S=54",
+            "D=30; M=8; Y=1997; C=137; S=422")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testNumericOrderingOfOrderByOperatorStringDims() {
@@ -1891,10 +1896,13 @@ public class DruidAdapterIT {
     final String druidSubQuery = "'limitSpec':{'type':'default','limit':5,"
         + "'columns':[{'dimension':'brand_name','direction':'descending',"
         + "'dimensionOrder':'lexicographic'}]}";
-    sql(sqlQuery).returnsOrdered("brand_name=Washington; C=576; 
S=1775\nbrand_name=Walrus; C=457;"
-        + " S=1399\nbrand_name=Urban; C=299; S=924\nbrand_name=Tri-State; 
C=2339; "
-        + "S=7270\nbrand_name=Toucan; C=123; S=380").queryContains(new 
DruidChecker(druidSubQuery));
-
+    sql(sqlQuery)
+        .returnsOrdered("brand_name=Washington; C=576; S=1775",
+            "brand_name=Walrus; C=457; S=1399",
+            "brand_name=Urban; C=299; S=924",
+            "brand_name=Tri-State; C=2339; S=7270",
+            "brand_name=Toucan; C=123; S=380")
+        .queryContains(new DruidChecker(druidSubQuery));
   }
 
   @Test void testGroupByWeekExtract() {
@@ -1919,7 +1927,10 @@ public class DruidAdapterIT {
         + "'timeZone':'UTC','locale':'en-US'}}]}]},"
         + "'aggregations':[],"
         + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}";
-    sql(sql).returnsOrdered("EXPR$0=10\nEXPR$0=11").queryContains(new 
DruidChecker(druidQuery));
+    sql(sql)
+        .returnsOrdered("EXPR$0=10",
+            "EXPR$0=11")
+        .queryContains(new DruidChecker(druidQuery));
   }
 
   /** Test case for
@@ -2708,9 +2719,9 @@ public class DruidAdapterIT {
             new DruidChecker("\"queryType\":\"groupBy\"", 
"{\"type\":\"bound\","
                 + 
"\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
                 + "\"ordering\":\"numeric\"}"));
-    q.returnsUnordered("EXPR$0=10.16; product_id=1554\n"
-        + "EXPR$0=45.05; product_id=1556\n"
-        + "EXPR$0=88.5; product_id=1555");
+    q.returnsUnordered("EXPR$0=10.16; product_id=1554",
+        "EXPR$0=45.05; product_id=1556",
+        "EXPR$0=88.5; product_id=1555");
   }
 
   @Test void testFilterClauseWithMetricAndTimeAndAggregates() {
@@ -2725,10 +2736,10 @@ public class DruidAdapterIT {
             new DruidChecker("\"queryType\":\"groupBy\"", 
"{\"type\":\"bound\","
                 + 
"\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true,"
                 + "\"ordering\":\"numeric\"}"))
-        .returnsUnordered("EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=10.6; product_id=1556\n"
-            + "EXPR$0=13.25; product_id=1556");
+        .returnsUnordered("EXPR$0=10.6; product_id=1556",
+            "EXPR$0=10.6; product_id=1556",
+            "EXPR$0=10.6; product_id=1556",
+            "EXPR$0=13.25; product_id=1556");
   }
 
   /** Tests that an aggregate with a nested filter clause has its filter
@@ -3991,9 +4002,9 @@ public class DruidAdapterIT {
             + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
     sql(sql, FOODMART)
         .runs()
-        .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; 
D=2\n"
-            + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2\n"
-            + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2")
+        .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; 
D=2",
+            "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2",
+            "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  BindableSort(sort0=[$2], dir0=[ASC], fetch=[3])\n"
             + "    DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
@@ -4007,9 +4018,9 @@ public class DruidAdapterIT {
             + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3";
     sql(sql, FOODMART)
         .runs()
-        .returnsOrdered("EXPR$0=0.5357357987441458; D=2\n"
-            + "EXPR$0=0.22760480207557643; D=2\n"
-            + "EXPR$0=0.11259322182897047; D=2")
+        .returnsOrdered("EXPR$0=0.5357357987441458; D=2",
+            "EXPR$0=0.22760480207557643; D=2",
+            "EXPR$0=0.11259322182897047; D=2")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  BindableSort(sort0=[$1], dir0=[ASC], fetch=[3])\n"
             + "    DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
@@ -4047,8 +4058,8 @@ public class DruidAdapterIT {
     final String sql = "SELECT SUM(-\"store_sales\" * 2) as S FROM " + 
FOODMART_TABLE
         + "Group by \"timestamp\" order by s LIMIT 2";
     sql(sql, FOODMART)
-        .returnsOrdered("S=-15918.02\n"
-            + "S=-14115.96")
+        .returnsOrdered("S=-15918.02",
+            "S=-14115.96")
         .explainContains("PLAN=EnumerableCalc(expr#0..1=[{inputs}], S=[$t1])\n"
             + "  EnumerableInterpreter\n"
             + "    DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
@@ -4181,8 +4192,11 @@ public class DruidAdapterIT {
     final String sql =
         "SELECT \"product_id\", SUBSTRING(\"product_id\" from 1 for 2) FROM " 
+ FOODMART_TABLE
             + " GROUP BY \"product_id\"";
-    sql(sql, FOODMART).limit(3).returnsOrdered(
-        "product_id=1; EXPR$1=1\nproduct_id=10; EXPR$1=10\nproduct_id=100; 
EXPR$1=10")
+    sql(sql, FOODMART)
+        .limit(3)
+        .returnsOrdered("product_id=1; EXPR$1=1",
+            "product_id=10; EXPR$1=10",
+            "product_id=100; EXPR$1=10")
         .explainContains("PLAN=EnumerableInterpreter\n"
             + "  DruidQuery(table=[[foodmart, foodmart]], 
intervals=[[1900-01-09T00:00:00.000Z/"
             + "2992-01-10T00:00:00.000Z]], projects=[[$1]], groups=[{0}], 
aggs=[[]], "
@@ -4449,10 +4463,10 @@ public class DruidAdapterIT {
                     + 
"{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}],"
                     + 
"\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
                 "QUARTER"));
-    q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05\n"
-        + "EXPR$0=2; product_id=1; EXPR$2=62.7\n"
-        + "EXPR$0=3; product_id=1; EXPR$2=88.35\n"
-        + "EXPR$0=4; product_id=1; EXPR$2=48.45");
+    q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05",
+        "EXPR$0=2; product_id=1; EXPR$2=62.7",
+        "EXPR$0=3; product_id=1; EXPR$2=88.35",
+        "EXPR$0=4; product_id=1; EXPR$2=48.45");
   }
 
   @Test void testExtractQuarter() {
@@ -4467,10 +4481,10 @@ public class DruidAdapterIT {
                     + 
"\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}],"
                     + 
"\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",",
                 "QUARTER"));
-    q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35\n"
-        + "EXPR$0=2; EXPR$1=132666.27\n"
-        + "EXPR$0=3; EXPR$1=140271.89\n"
-        + "EXPR$0=4; EXPR$1=152671.62");
+    q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35",
+        "EXPR$0=2; EXPR$1=132666.27",
+        "EXPR$0=3; EXPR$1=140271.89",
+        "EXPR$0=4; EXPR$1=152671.62");
   }
 
 
diff --git a/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java 
b/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java
index 559ee34135..468dee9463 100644
--- a/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java
+++ b/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java
@@ -63,10 +63,12 @@ class SparkAdapterTest {
     final String plan = "PLAN="
         + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])";
 
-    final String expectedResult = "EXPR$0=1; EXPR$1=a\n"
-        + "EXPR$0=2; EXPR$1=b\n";
+    final String[] expectedResult = {
+        "EXPR$0=1; EXPR$1=a",
+        "EXPR$0=2; EXPR$1=b"
+    };
 
-    sql(sql).returns(expectedResult)
+    sql(sql).returnsOrdered(expectedResult)
         .explainContains(plan);
   }
 
@@ -76,13 +78,13 @@ class SparkAdapterTest {
         + "from " + VALUES1 + "\n"
         + "where x < 2";
 
-    final String expectedResult = "X=1; Y=a\n";
+    final String[] expectedResult = {"X=1; Y=a"};
 
     final String plan = "PLAN="
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[2], expr#3=[<($t0, 
$t2)], proj#0..1=[{exprs}], $condition=[$t3])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n";
 
-    sql(sql).returns(expectedResult)
+    sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
   }
 
@@ -94,10 +96,12 @@ class SparkAdapterTest {
         + "EnumerableAggregate(group=[{0, 1}])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -118,8 +122,10 @@ class SparkAdapterTest {
         + "      EnumerableAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]], 
SUM_X=[$SUM0($0)], MIN_Y=[MIN($1)], MAX_Y=[MAX($1)], CNT_Y=[COUNT()], 
$g=[GROUPING($0, $1)])\n"
         + "        EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' 
}, { 2, 'c' }, { 2, 'c' }]])\n";
 
-    final String expectedResult = "SUM_X=2; MIN_Y=a; MAX_Y=b; CNT_Y=2; 
CNT_DIST_Y=2\n"
-        + "SUM_X=6; MIN_Y=b; MAX_Y=c; CNT_Y=3; CNT_DIST_Y=2";
+    final String[] expectedResult = {
+        "SUM_X=2; MIN_Y=a; MAX_Y=b; CNT_Y=2; CNT_DIST_Y=2",
+        "SUM_X=6; MIN_Y=b; MAX_Y=c; CNT_Y=3; CNT_DIST_Y=2"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -233,13 +239,15 @@ class SparkAdapterTest {
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -257,10 +265,12 @@ class SparkAdapterTest {
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -278,8 +288,10 @@ class SparkAdapterTest {
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=2; Y=b";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=2; Y=b"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -380,11 +392,13 @@ class SparkAdapterTest {
         + "    EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"
         + "    EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "Y=a; Z=a\n"
-        + "Y=b; Z=a\n"
-        + "Y=b; Z=b\n"
-        + "Y=c; Z=b\n"
-        + "Y=c; Z=b";
+    final String[] expectedResult = {
+        "Y=a; Z=a",
+        "Y=b; Z=a",
+        "Y=b; Z=b",
+        "Y=c; Z=b",
+        "Y=c; Z=b"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -403,11 +417,13 @@ class SparkAdapterTest {
         + "    EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"
         + "    EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "Z=a\n"
-        + "Z=a\n"
-        + "Z=b\n"
-        + "Z=b\n"
-        + "Z=b";
+    final String[] expectedResult = {
+        "Z=a",
+        "Z=a",
+        "Z=b",
+        "Z=b",
+        "Z=b"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -477,8 +493,10 @@ class SparkAdapterTest {
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[[3..4]]], 
expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 3, 'b' }, { 
4, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=3; Y=b\n"
-        + "X=4; Y=c";
+    final String[] expectedResult = {
+        "X=3; Y=b",
+        "X=4; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -493,8 +511,10 @@ class SparkAdapterTest {
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[3, 4]], 
expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 3, 'b' }, { 
4, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=3; Y=b\n"
-        + "X=4; Y=c";
+    final String[] expectedResult = {
+        "X=3; Y=b",
+        "X=4; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -508,11 +528,13 @@ class SparkAdapterTest {
     final String plan = "PLAN="
         + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 
'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -541,11 +563,13 @@ class SparkAdapterTest {
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[1, 2]], 
expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -559,11 +583,13 @@ class SparkAdapterTest {
     final String plan = "PLAN="
         + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 
'c' }, { 2, 'c' }]])\n\n";
 
-    final String expectedResult = "X=1; Y=a\n"
-        + "X=1; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=1; Y=a",
+        "X=1; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -601,10 +627,12 @@ class SparkAdapterTest {
         + "  EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], expr#3=[>($t0, 
$t2)], proj#0..1=[{exprs}], $condition=[$t3])\n"
         + "    EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 
2, 'c' }, { 2, 'c' }]])\n";
 
-    final String expectedResult = "X=2; Y=b\n"
-        + "X=2; Y=b\n"
-        + "X=2; Y=c\n"
-        + "X=2; Y=c";
+    final String[] expectedResult = {
+        "X=2; Y=b",
+        "X=2; Y=b",
+        "X=2; Y=c",
+        "X=2; Y=c"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -643,8 +671,10 @@ class SparkAdapterTest {
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], expr#3=[+($t0, 
$t2)], expr#4=[>($t3, $t2)], X=[$t0], $condition=[$t4])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n\n";
 
-    final String expectedResult = "X=1\n"
-        + "X=2";
+    final String[] expectedResult = {
+        "X=1",
+        "X=2"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
@@ -689,8 +719,10 @@ class SparkAdapterTest {
         + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[/($t0, $t0)], 
expr#3=[1], expr#4=[=($t2, $t3)], X=[$t0], $condition=[$t4])\n"
         + "  EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n\n";
 
-    final String expectedResult = "X=1\n"
-        + "X=2";
+    final String[] expectedResult = {
+        "X=1",
+        "X=2"
+    };
 
     sql(sql).returnsUnordered(expectedResult)
         .explainContains(plan);
diff --git a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java 
b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java
index b5a0adaf57..2d72e41447 100644
--- a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java
+++ b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java
@@ -406,9 +406,32 @@ public class CalciteAssert {
   /** Checks that the {@link ResultSet} returns the given set of lines,
    * optionally sorting.
    *
+   * <p>The lines must not contain line breaks. If you have written
+   *
+   * <pre>{@code
+   * checkUnordered("line1\n"
+   *     + "line2")
+   * }</pre>
+   *
+   * <p>you should instead write
+   *
+   * <pre>{@code
+   * checkUnordered("line1",
+   *     "line2")
+   * }</pre>
+   *
+   * <p>so that result-checking is order-independent.
+   *
    * @see Matchers#returnsUnordered(String...) */
   static Consumer<ResultSet> checkResult(final boolean sort,
       final boolean head, final String... lines) {
+    // Check that none of the lines contains a line break.
+    for (String line : lines) {
+      if (line.contains("\n")) {
+        throw new AssertionError("expected line has line breaks: " + line);
+      }
+    }
+
     return resultSet -> {
       try {
         final List<String> expectedList = Lists.newArrayList(lines);


Reply via email to