@@ -5955,7 +5955,7 @@ public void testDoubleInlineStatsWithEvalGetsPrunedEntirely() {
59555955 }
59565956 var plan = optimizedPlan (query );
59575957
5958- var project = as (plan , EsqlProject .class );
5958+ var project = as (plan , Project .class );
59595959 assertThat (Expressions .names (project .projections ()), is (List .of ("emp_no" , "count" )));
59605960 var topN = as (project .child (), TopN .class );
59615961 assertThat (topN .order ().size (), is (1 ));
@@ -6070,22 +6070,26 @@ public void testTripleInlineStatsGetsPrunedPartially() {
60706070 }
60716071
60726072 /*
6073- * EsqlProject[[emp_no{f}#864, salaryK{r}#836, count{r}#838, min{r}#852]]
6074- * \_TopN[[Order[emp_no{f}#864,ASC,LAST]],5[INTEGER]]
6075- * \_InlineJoin[LEFT,[salaryK{r}#836],[salaryK{r}#836],[salaryK{r}#836]]
6076- * |_Dissect[hire_date_string{r}#842,Parser[pattern=%{date}, appendSeparator=,
6077- * parser=org.elasticsearch.dissect.DissectParser@27d57d5e],[date{r}#847]] <-- TODO: Dissect & Eval could/should be dropped
6078- * | \_Eval[[TOSTRING(hire_date{f}#865) AS hire_date_string#842]]
6079- * | \_InlineJoin[LEFT,[salaryK{r}#836],[salaryK{r}#836],[salaryK{r}#836]]
6080- * | |_Eval[[salary{f}#866 / 10000[INTEGER] AS salaryK#836]]
6081- * | | \_EsRelation[employees][emp_no{f}#864, hire_date{f}#865, languages{f}#860, ..]
6082- * | \_Aggregate[[salaryK{r}#836],[COUNT(*[KEYWORD],true[BOOLEAN]) AS count#838, salaryK{r}#836]]
6083- * | \_StubRelation[[emp_no{f}#864, hire_date{f}#865, languages{f}#860, languages.byte{f}#861, languages.long{f}#863,
6084- * languages.short{f}#862, salary{f}#866, salaryK{r}#836]]
6085- * \_Aggregate[[salaryK{r}#836],[MIN($$MV_COUNT(langua>$MIN$0{r$}#867,true[BOOLEAN]) AS min#852, salaryK{r}#836]]
6086- * \_Eval[[MVCOUNT(languages{f}#860) AS $$MV_COUNT(langua>$MIN$0#867]]
6087- * \_StubRelation[[emp_no{f}#864, hire_date{f}#865, languages{f}#860, languages.byte{f}#861, languages.long{f}#863,
6088- * languages.short{f}#862, salary{f}#866, count{r}#838, salaryK{r}#836, sum{r}#845, hire_date_string{r}#842, date{r}#847]]
6073+ * EsqlProject[[emp_no{f}#26, salaryK{r}#4, count{r}#6, min{r}#19]]
6074+ * \_TopN[[Order[emp_no{f}#26,ASC,LAST]],5[INTEGER]]
6075+ * \_InlineJoin[LEFT,[salaryK{r}#4],[salaryK{r}#4]]
6076+ * |_EsqlProject[[_meta_field{f}#32, emp_no{f}#26, first_name{f}#27, gender{f}#28, hire_date{f}#33, job{f}#34, job.raw{f}#35,
6077+ * languages{f}#29, last_name{f}#30, long_noidx{f}#36, salary{f}#31, count{r}#6, salaryK{r}#4, hire_date_string{r}#10,
6078+ * date{r}#15]]
6079+ * | \_Dissect[hire_date_string{r}#10,Parser[pattern=%{date}, appendSeparator=,
6080+ * parser=org.elasticsearch.dissect.DissectParser@77d1afc3],[date{r}#15]] <-- TODO: Dissect & Eval could/should be dropped
6081+ * | \_Eval[[TOSTRING(hire_date{f}#33) AS hire_date_string#10]]
6082+ * | \_InlineJoin[LEFT,[salaryK{r}#4],[salaryK{r}#4]]
6083+ * | |_Eval[[salary{f}#31 / 10000[INTEGER] AS salaryK#4]]
6084+ * | | \_EsRelation[test][_meta_field{f}#32, emp_no{f}#26, first_name{f}#27, ..]
6085+ * | \_Aggregate[[salaryK{r}#4],[COUNT(*[KEYWORD],true[BOOLEAN]) AS count#6, salaryK{r}#4]]
6086+ * | \_StubRelation[[_meta_field{f}#32, emp_no{f}#26, first_name{f}#27, gender{f}#28, hire_date{f}#33, job{f}#34,
6087+ * job.raw{f}#35, languages{f}#29, last_name{f}#30, long_noidx{f}#36, salary{f}#31, salaryK{r}#4]]
6088+ * \_Aggregate[[salaryK{r}#4],[MIN($$MV_COUNT(langua>$MIN$0{r$}#37,true[BOOLEAN]) AS min#19, salaryK{r}#4]]
6089+ * \_Eval[[MVCOUNT(languages{f}#29) AS $$MV_COUNT(langua>$MIN$0#37]]
6090+ * \_StubRelation[[_meta_field{f}#32, emp_no{f}#26, first_name{f}#27, gender{f}#28, hire_date{f}#33, job{f}#34, job.raw{f}#35,
6091+ * languages{f}#29, last_name{f}#30, long_noidx{f}#36, salary{f}#31, count{r}#6, salaryK{r}#4, sum{r}#13,
6092+ * hire_date_string{r}#10, date{r}#15, $$MV_COUNT(langua>$MIN$0{r$}#37]]
60896093 */
60906094 public void testTripleInlineStatsMultipleAssignmentsGetsPrunedPartially () {
60916095 // TODO: reenable 1st sort, pull the 2nd further up when #132417 is in
@@ -6121,7 +6125,7 @@ public void testTripleInlineStatsMultipleAssignmentsGetsPrunedPartially() {
61216125 "salary"
61226126 );
61236127
6124- var project = as (plan , EsqlProject .class );
6128+ var project = as (plan , Project .class );
61256129 assertThat (Expressions .names (project .projections ()), is (List .of ("emp_no" , "salaryK" , "count" , "min" )));
61266130 var topN = as (project .child (), TopN .class );
61276131 var outerinline = as (topN .child (), InlineJoin .class );
@@ -6130,7 +6134,8 @@ public void testTripleInlineStatsMultipleAssignmentsGetsPrunedPartially() {
61306134 expectedOutterOutput .addAll (List .of ("count" , "hire_date_string" , "date" , "min" , "salaryK" ));
61316135 assertThat (Expressions .names (outerinline .output ()), is (expectedOutterOutput ));
61326136 // outer left
6133- var dissect = as (outerinline .left (), Dissect .class );
6137+ var outerProject = as (outerinline .left (), Project .class );
6138+ var dissect = as (outerProject .child (), Dissect .class );
61346139 var eval = as (dissect .child (), Eval .class );
61356140 var innerinline = as (eval .child (), InlineJoin .class );
61366141 var expectedInnerOutput = new ArrayList <>(employeesFields );
@@ -6176,7 +6181,7 @@ public void testTripleInlineStatsMultipleAssignmentsGetsPrunedEntirely() {
61766181 }
61776182 var plan = optimizedPlan (query );
61786183
6179- var project = as (plan , EsqlProject .class );
6184+ var project = as (plan , Project .class );
61806185 assertThat (Expressions .names (project .projections ()), is (List .of ("emp_no" )));
61816186 var topN = as (project .child (), TopN .class );
61826187 var dissect = as (topN .child (), Dissect .class );
@@ -6425,7 +6430,7 @@ public void testInlineStatsWithRow() {
64256430 }
64266431 var plan = optimizedPlan (query );
64276432
6428- var esqlProject = as (plan , EsqlProject .class );
6433+ var esqlProject = as (plan , Project .class );
64296434 assertThat (Expressions .names (esqlProject .projections ()), is (List .of ("emp_no" )));
64306435 var limit = asLimit (esqlProject .child (), 1000 , false );
64316436 var localRelation = as (limit .child (), LocalRelation .class );
@@ -6514,6 +6519,30 @@ public void testInlineStatsWithLimitAndAgg() {
65146519 var stub = as (agg .child (), StubRelation .class );
65156520 }
65166521
6522+ /*
6523+ * EsqlProject[[c{r}#7, b{r}#5, a{r}#14]]
6524+ * \_Eval[[[KEYWORD] AS a#14]]
6525+ * \_Limit[1000[INTEGER],false]
6526+ * \_LocalRelation[[a{r}#3, b{r}#5, c{r}#7],Page{blocks=[ConstantNullBlock[positions=1], IntVectorBlock[vector=ConstantIntVector[p
6527+ * ositions=1, value=0]], BytesRefVectorBlock[vector=ConstantBytesRefVector[positions=1, value=[]]]]}]
6528+ */
6529+ public void testInlineStatsWithShadowedOutput () {
6530+ var query = """
6531+ ROW a = null, b = 0, c = ""
6532+ | INLINE STATS a = MAX(c) BY b
6533+ | EVAL a = c
6534+ """ ;
6535+ if (releaseBuildForInlineStats (query )) {
6536+ return ;
6537+ }
6538+ var plan = optimizedPlan (query );
6539+ var project = as (plan , Project .class );
6540+ assertThat (Expressions .names (project .projections ()), is (List .of ("c" , "b" , "a" )));
6541+ var eval = as (project .child (), Eval .class );
6542+ var limit = asLimit (eval .child (), 1000 , false );
6543+ var localRelation = as (limit .child (), LocalRelation .class );
6544+ }
6545+
65176546 /**
65186547 * Expects
65196548 *
0 commit comments