Skip to content

Avg function on varchar column cause exception #363

@morningman

Description

@morningman

Describe the bug
avg on varchar column throw exception:

java.lang.IllegalStateException: Failed analysis after expr substitution.
        at com.baidu.palo.analysis.Expr.substituteList(Expr.java:640) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.ExprSubstitutionMap.compose(ExprSubstitutionMap.java:103) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.SelectStmt.analyzeAggregation(SelectStmt.java:853) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.SelectStmt.analyze(SelectStmt.java:348) ~[palo-fe.jar:?]
        at com.baidu.palo.qe.StmtExecutor.analyze(StmtExecutor.java:395) [palo-fe.jar:?]
        at com.baidu.palo.qe.StmtExecutor.execute(StmtExecutor.java:200) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:159) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.dispatch(ConnectProcessor.java:249) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.processOnce(ConnectProcessor.java:380) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.loop(ConnectProcessor.java:390) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectScheduler$LoopHandler.run(ConnectScheduler.java:170) [palo-fe.jar:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_131]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_131]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: com.baidu.palo.common.AnalysisException: SUM requires a numeric parameter: sum(`k4`)
        at com.baidu.palo.analysis.FunctionCallExpr.analyzeBuiltinAggFunction(FunctionCallExpr.java:358) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.FunctionCallExpr.analyzeImpl(FunctionCallExpr.java:466) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.Expr.analyze(Expr.java:354) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.Expr.analyze(Expr.java:348) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.Expr.trySubstitute(Expr.java:599) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.Expr.trySubstituteList(Expr.java:629) ~[palo-fe.jar:?]
        at com.baidu.palo.analysis.Expr.substituteList(Expr.java:638) ~[palo-fe.jar:?]
        ... 15 more
2018-11-28 17:23:36,909 WARN 216 [StmtExecutor.execute():279] execute Exception.
com.baidu.palo.common.AnalysisException: Unexpected exception: Failed analysis after expr substitution.
        at com.baidu.palo.qe.StmtExecutor.analyze(StmtExecutor.java:469) ~[palo-fe.jar:?]
        at com.baidu.palo.qe.StmtExecutor.execute(StmtExecutor.java:200) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:159) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.dispatch(ConnectProcessor.java:249) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.processOnce(ConnectProcessor.java:380) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectProcessor.loop(ConnectProcessor.java:390) [palo-fe.jar:?]
        at com.baidu.palo.qe.ConnectScheduler$LoopHandler.run(ConnectScheduler.java:170) [palo-fe.jar:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_131]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_131]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

To Reproduce

CREATE EXTERNAL TABLE `table_mysql` (
  `k1` date COMMENT "",
  `k2` int(11) COMMENT "",
  `k3` smallint(6) COMMENT "",
  `k4` varchar(2048) COMMENT "",
  `k5` datetime COMMENT ""
) ENGINE=MYSQL
PROPERTIES (
"host" = "127.0.0.1",
"port" = "8239",
"user" = "mysql_user",
"password" = "",
"database" = "mysql_db_test",
"table" = "mysql_table_test"
);

select avg(k4) from table_mysql

Expected behavior
avg is not supported on varchar column. but we should make our mistake info more friendly.

Metadata

Metadata

Labels

kind/fixCategorizes issue or PR as related to a bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions