Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using BETWEEN with varchar cast to date fails #14954

Closed
hashhar opened this issue Nov 8, 2022 · 2 comments · Fixed by #14958
Closed

Using BETWEEN with varchar cast to date fails #14954

hashhar opened this issue Nov 8, 2022 · 2 comments · Fixed by #14958
Labels
bug Something isn't working

Comments

@hashhar
Copy link
Member

hashhar commented Nov 8, 2022

with  t as (select '2022-01-01' as start_date,'2022-02-01' as end_date )
select  * from t 
where Date('2022-01-01') between date(start_date) and date(end_date)

Running above SQL fails with following stack trace.

Query 20221108_160922_00000_w2jf2 failed: class io.trino.sql.tree.GenericLiteral cannot be cast to class io.trino.sql.tree.Cast (io.trino.sql.tree.GenericLiteral and io.trino.sql.tree.Cast are in unnamed module of loader 'app')
java.lang.ClassCastException: class io.trino.sql.tree.GenericLiteral cannot be cast to class io.trino.sql.tree.Cast (io.trino.sql.tree.GenericLiteral and io.trino.sql.tree.Cast are in unnamed module of loader 'app')
	at io.trino.sql.planner.DomainTranslator$Visitor.createVarcharCastToDateComparisonExtractionResult(DomainTranslator.java:612)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitComparisonExpression(DomainTranslator.java:514)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitComparisonExpression(DomainTranslator.java:332)
	at io.trino.sql.tree.ComparisonExpression.accept(ComparisonExpression.java:71)
	at io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)
	at io.trino.sql.planner.DomainTranslator$Visitor.lambda$visitLogicalExpression$0(DomainTranslator.java:387)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitLogicalExpression(DomainTranslator.java:388)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitLogicalExpression(DomainTranslator.java:332)
	at io.trino.sql.tree.LogicalExpression.accept(LogicalExpression.java:80)
	at io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitBetweenPredicate(DomainTranslator.java:1037)
	at io.trino.sql.planner.DomainTranslator$Visitor.visitBetweenPredicate(DomainTranslator.java:332)
	at io.trino.sql.tree.BetweenPredicate.accept(BetweenPredicate.java:71)
	at io.trino.sql.tree.AstVisitor.process(AstVisitor.java:27)
	at io.trino.sql.planner.DomainTranslator.getExtractionResult(DomainTranslator.java:329)
	at io.trino.sql.planner.optimizations.PropertyDerivations$Visitor.visitFilter(PropertyDerivations.java:720)
	at io.trino.sql.planner.optimizations.PropertyDerivations$Visitor.visitFilter(PropertyDerivations.java:170)
	at io.trino.sql.planner.plan.FilterNode.accept(FilterNode.java:72)
	at io.trino.sql.planner.optimizations.PropertyDerivations.deriveProperties(PropertyDerivations.java:144)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.deriveProperties(AddExchanges.java:1341)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.deriveProperties(AddExchanges.java:1335)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.withDerivedProperties(AddExchanges.java:1330)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.rebaseAndDeriveProperties(AddExchanges.java:1306)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.visitFilter(AddExchanges.java:587)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.visitFilter(AddExchanges.java:147)
	at io.trino.sql.planner.plan.FilterNode.accept(FilterNode.java:72)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.planChild(AddExchanges.java:1301)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.visitOutput(AddExchanges.java:193)
	at io.trino.sql.planner.optimizations.AddExchanges$Rewriter.visitOutput(AddExchanges.java:147)
	at io.trino.sql.planner.plan.OutputNode.accept(OutputNode.java:83)
	at io.trino.sql.planner.optimizations.AddExchanges.optimize(AddExchanges.java:143)
	at io.trino.sql.planner.optimizations.StatsRecordingPlanOptimizer.optimize(StatsRecordingPlanOptimizer.java:54)
	at io.trino.sql.planner.LogicalPlanner.plan(LogicalPlanner.java:247)
	at io.trino.sql.planner.LogicalPlanner.plan(LogicalPlanner.java:222)
	at io.trino.sql.planner.LogicalPlanner.plan(LogicalPlanner.java:217)
	at io.trino.execution.SqlQueryExecution.doPlanQuery(SqlQueryExecution.java:475)
	at io.trino.execution.SqlQueryExecution.planQuery(SqlQueryExecution.java:456)
	at io.trino.execution.SqlQueryExecution.start(SqlQueryExecution.java:397)
	at io.trino.execution.SqlQueryManager.createQuery(SqlQueryManager.java:249)
	at io.trino.dispatcher.LocalDispatchQuery.lambda$startExecution$7(LocalDispatchQuery.java:143)
	at io.trino.$gen.Trino_402____20221108_160916_2.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)

Changing BETWEEN to > and < works. i.e. following SQL works

with  t as (select '2022-01-01' as start_date,'2022-02-01' as end_date )
select  * from t
where Date('2022-01-01') > date(start_date) and Date('2022-01-01') <= date(end_date);
@hashhar hashhar added the bug Something isn't working label Nov 8, 2022
@martint
Copy link
Member

martint commented Nov 8, 2022

Seems to be caused by #13567

@martint
Copy link
Member

martint commented Nov 8, 2022

It happens because visitComparisonExpression is operating on a normalized form of the comparison expression resulting from toNormalizedSimpleComparison, but createVarcharCastToDateComparisonExtractionResult pulls the elements from the unnormalized ComparisonExpression node.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Development

Successfully merging a pull request may close this issue.

2 participants