A constant can be used outside aggregation only queries (#34576)
A constant can now be used outside aggregation only queries. Don't skip an ES query in case of constants-only selects. Loosen the binary pipe restriction of being used only in aggregation queries. Fixes https://github.com/elastic/elasticsearch/issues/31863
This commit is contained in:
parent
0d62f6102c
commit
60b8118d3a
|
@ -41,7 +41,7 @@ public abstract class BinaryPipe extends Pipe {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportedByAggsOnlyQuery() {
|
public boolean supportedByAggsOnlyQuery() {
|
||||||
return left.supportedByAggsOnlyQuery() && right.supportedByAggsOnlyQuery();
|
return left.supportedByAggsOnlyQuery() || right.supportedByAggsOnlyQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class ConstantInput extends LeafInput<Object> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean supportedByAggsOnlyQuery() {
|
public final boolean supportedByAggsOnlyQuery() {
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Grea
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual;
|
||||||
import org.elasticsearch.xpack.sql.plan.logical.Aggregate;
|
import org.elasticsearch.xpack.sql.plan.logical.Aggregate;
|
||||||
|
import org.elasticsearch.xpack.sql.plan.logical.EsRelation;
|
||||||
import org.elasticsearch.xpack.sql.plan.logical.Filter;
|
import org.elasticsearch.xpack.sql.plan.logical.Filter;
|
||||||
import org.elasticsearch.xpack.sql.plan.logical.Limit;
|
import org.elasticsearch.xpack.sql.plan.logical.Limit;
|
||||||
import org.elasticsearch.xpack.sql.plan.logical.LocalRelation;
|
import org.elasticsearch.xpack.sql.plan.logical.LocalRelation;
|
||||||
|
@ -1796,7 +1797,7 @@ public class Optimizer extends RuleExecutor<LogicalPlan> {
|
||||||
if (plan instanceof Project) {
|
if (plan instanceof Project) {
|
||||||
Project p = (Project) plan;
|
Project p = (Project) plan;
|
||||||
List<Object> values = extractConstants(p.projections());
|
List<Object> values = extractConstants(p.projections());
|
||||||
if (values.size() == p.projections().size()) {
|
if (values.size() == p.projections().size() && !(p.child() instanceof EsRelation)) {
|
||||||
return new LocalRelation(p.location(), new SingletonExecutable(p.output(), values.toArray()));
|
return new LocalRelation(p.location(), new SingletonExecutable(p.output(), values.toArray()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,8 @@ public class BinaryPipesTests extends ESTestCase {
|
||||||
Pipe unsupported = new DummyPipe(false);
|
Pipe unsupported = new DummyPipe(false);
|
||||||
|
|
||||||
assertFalse(new DummyBinaryPipe(unsupported, unsupported).supportedByAggsOnlyQuery());
|
assertFalse(new DummyBinaryPipe(unsupported, unsupported).supportedByAggsOnlyQuery());
|
||||||
assertFalse(new DummyBinaryPipe(unsupported, supported).supportedByAggsOnlyQuery());
|
assertTrue(new DummyBinaryPipe(unsupported, supported).supportedByAggsOnlyQuery());
|
||||||
assertFalse(new DummyBinaryPipe(supported, unsupported).supportedByAggsOnlyQuery());
|
assertTrue(new DummyBinaryPipe(supported, unsupported).supportedByAggsOnlyQuery());
|
||||||
assertTrue(new DummyBinaryPipe(supported, supported).supportedByAggsOnlyQuery());
|
assertTrue(new DummyBinaryPipe(supported, supported).supportedByAggsOnlyQuery());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,24 @@ SELECT first_name, last_name FROM "test_emp" ORDER BY emp_no LIMIT 5;
|
||||||
multipleColumnWithAliasWithAndWithoutAsWithLimit
|
multipleColumnWithAliasWithAndWithoutAsWithLimit
|
||||||
SELECT first_name f, last_name AS l FROM "test_emp" ORDER BY emp_no LIMIT 5;
|
SELECT first_name f, last_name AS l FROM "test_emp" ORDER BY emp_no LIMIT 5;
|
||||||
|
|
||||||
|
//
|
||||||
|
// SELECT constant literals with FROM
|
||||||
|
//
|
||||||
|
|
||||||
|
constantWithLimit
|
||||||
|
SELECT 3 FROM "test_emp" LIMIT 5;
|
||||||
|
constantAndColumnWithLimit
|
||||||
|
SELECT 3, first_name, last_name FROM "test_emp" ORDER BY emp_no LIMIT 5;
|
||||||
|
constantComparisonWithLimit
|
||||||
|
SELECT 1=1 AS bool FROM "test_emp" LIMIT 5;
|
||||||
|
constantComparisonAndColumnWithLimit
|
||||||
|
SELECT 1=1 AS bool, first_name, last_name FROM "test_emp" ORDER BY emp_no LIMIT 5;
|
||||||
|
castWithLiteralWithFrom
|
||||||
|
SELECT CAST(1 AS INT) AS constant FROM "test_emp" LIMIT 5;
|
||||||
|
castWithLiteralAndColumnWithFrom
|
||||||
|
SELECT CAST((CAST(languages AS BIT) OR CAST(1 AS BIT)) AS INT) AS bool FROM test_emp LIMIT 5;
|
||||||
|
castWithColumnAndLiteralCombinedAndSelectColumnWithFrom
|
||||||
|
SELECT CAST((CAST(languages AS BIT) OR CAST(1 AS BIT)) AS INT) AS bool, languages FROM test_emp ORDER BY languages LIMIT 5;
|
||||||
|
|
||||||
//
|
//
|
||||||
// SELECT with CAST
|
// SELECT with CAST
|
||||||
|
|
Loading…
Reference in New Issue