| 488 | |
| 489 | template<typename T> |
| 490 | T ExpressionUtil::evaluateLiteral(main::ClientContext* context, |
| 491 | std::shared_ptr<Expression> expression, const common::LogicalType& type, |
| 492 | validate_param_func<T> validateParamFunc) { |
| 493 | if (!canEvaluateAsLiteral(*expression)) { |
| 494 | std::string errMsg; |
| 495 | switch (expression->expressionType) { |
| 496 | case ExpressionType::PARAMETER: { |
| 497 | errMsg = std::format( |
| 498 | "The expression: '{}' is a parameter expression. Please assign it a value.", |
| 499 | expression->toString()); |
| 500 | } break; |
| 501 | default: { |
| 502 | errMsg = std::format("The expression: '{}' must be a parameter/literal expression.", |
| 503 | expression->toString()); |
| 504 | ; |
| 505 | } break; |
| 506 | } |
| 507 | throw RuntimeException{errMsg}; |
| 508 | } |
| 509 | if (expression->getDataType() != type) { |
| 510 | binder::Binder binder{context}; |
| 511 | auto literalExpr = std::make_shared<LiteralExpression>( |
| 512 | ExpressionUtil::evaluateAsLiteralValue(*expression), expression->getUniqueName()); |
| 513 | expression = binder.getExpressionBinder()->implicitCast(literalExpr, type.copy()); |
| 514 | expression = binder.getExpressionBinder()->foldExpression(expression); |
| 515 | } |
| 516 | auto value = evaluateAsLiteralValue(*expression); |
| 517 | return getExpressionVal(*expression, value, type, validateParamFunc); |
| 518 | } |
| 519 | |
| 520 | std::shared_ptr<Expression> ExpressionUtil::applyImplicitCastingIfNecessary( |
| 521 | main::ClientContext* context, std::shared_ptr<Expression> expr, |
nothing calls this directly
no test coverage detected