trinodb / trino

Official repository of Trino, the distributed SQL query engine for big data, formerly known as PrestoSQL (https://trino.io)
https://trino.io
Apache License 2.0
9.88k stars 2.86k forks source link

Type inference failure when using reduce with decimal values #2760

Open martint opened 4 years ago

martint commented 4 years ago
SELECT reduce(ARRAY [1.0], 0, (s, x) -> x + s , s -> s);

fails with:

com.google.common.base.VerifyException: SignatureBinder.iterativeSolve does not converge after 4 iterations.
    at io.prestosql.metadata.SignatureBinder.iterativeSolve(SignatureBinder.java:413)
    at io.prestosql.metadata.SignatureBinder.bindVariables(SignatureBinder.java:124)
    at io.prestosql.metadata.SignatureBinder.bind(SignatureBinder.java:101)
    at io.prestosql.metadata.FunctionResolver.identifyApplicableFunctions(FunctionResolver.java:181)
    at io.prestosql.metadata.FunctionResolver.matchFunction(FunctionResolver.java:151)
    at io.prestosql.metadata.FunctionResolver.matchFunctionExact(FunctionResolver.java:141)
    at io.prestosql.metadata.FunctionResolver.resolveFunction(FunctionResolver.java:112)
    at io.prestosql.metadata.MetadataManager.lambda$resolveFunction$19(MetadataManager.java:1344)
    at java.base/java.util.Optional.orElseGet(Optional.java:369)
    at io.prestosql.metadata.MetadataManager.resolveFunction(MetadataManager.java:1344)
    at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitFunctionCall(ExpressionAnalyzer.java:896)
    at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitFunctionCall(ExpressionAnalyzer.java:313)
    at io.prestosql.sql.tree.FunctionCall.accept(FunctionCall.java:110)
    at io.prestosql.sql.tree.StackableAstVisitor.process(StackableAstVisitor.java:27)
    at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.process(ExpressionAnalyzer.java:336)
    at io.prestosql.sql.analyzer.ExpressionAnalyzer.analyze(ExpressionAnalyzer.java:279)
    at io.prestosql.sql.analyzer.ExpressionAnalyzer.analyzeExpression(ExpressionAnalyzer.java:1575)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.analyzeExpression(StatementAnalyzer.java:2346)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.analyzeSelectSingleColumn(StatementAnalyzer.java:2174)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.analyzeSelect(StatementAnalyzer.java:1998)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:1172)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:287)
    at io.prestosql.sql.tree.QuerySpecification.accept(QuerySpecification.java:144)
    at io.prestosql.sql.tree.AstVisitor.process(AstVisitor.java:27)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:302)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:312)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:860)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:287)
    at io.prestosql.sql.tree.Query.accept(Query.java:107)
    at io.prestosql.sql.tree.AstVisitor.process(AstVisitor.java:27)
    at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:302)
    at io.prestosql.sql.analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:279)
    at io.prestosql.sql.analyzer.Analyzer.analyze(Analyzer.java:83)
    at io.prestosql.sql.analyzer.Analyzer.analyze(Analyzer.java:75)
    at io.prestosql.execution.SqlQueryExecution.analyze(SqlQueryExecution.java:221)
    at io.prestosql.execution.SqlQueryExecution.<init>(SqlQueryExecution.java:180)
    at io.prestosql.execution.SqlQueryExecution.<init>(SqlQueryExecution.java:97)
    at io.prestosql.execution.SqlQueryExecution$SqlQueryExecutionFactory.createQueryExecution(SqlQueryExecution.java:732)
    at io.prestosql.dispatcher.LocalDispatchQueryFactory.lambda$createDispatchQuery$0(LocalDispatchQueryFactory.java:119)
    at io.prestosql.$gen.Presto_null__testversion____20200207_174938_4.call(Unknown Source)
    at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
    at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:57)
    at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
yuokada commented 4 years ago

link: https://github.com/prestodb/presto/issues/14066

levand commented 3 years ago

This also happens when an intermediate state is a decimal:

SELECT reduce(ARRAY [1], 0, (s, x) -> 0.5 * s , s -> s)

> com.google.common.base.VerifyException: SignatureBinder.iterativeSolve does not converge after 4 iterations.