Search in sources :

Example 21 with SqlFunction

use of org.apache.calcite.sql.SqlFunction in project Mycat2 by MyCATApache.

the class SqlValidatorImpl method deriveConstructorType.

public RelDataType deriveConstructorType(SqlValidatorScope scope, SqlCall call, SqlFunction unresolvedConstructor, SqlFunction resolvedConstructor, List<RelDataType> argTypes) {
    SqlIdentifier sqlIdentifier = unresolvedConstructor.getSqlIdentifier();
    assert sqlIdentifier != null;
    RelDataType type = catalogReader.getNamedType(sqlIdentifier);
    if (type == null) {
        // TODO jvs 12-Feb-2005:  proper type name formatting
        throw newValidationError(sqlIdentifier, RESOURCE.unknownDatatypeName(sqlIdentifier.toString()));
    }
    if (resolvedConstructor == null) {
        if (call.operandCount() > 0) {
            // no user-defined constructor could be found
            throw handleUnresolvedFunction(call, unresolvedConstructor, argTypes, null);
        }
    } else {
        SqlCall testCall = resolvedConstructor.createCall(call.getParserPosition(), call.getOperandList());
        RelDataType returnType = resolvedConstructor.validateOperands(this, scope, testCall);
        assert type == returnType;
    }
    if (config.identifierExpansion()) {
        if (resolvedConstructor != null) {
            ((SqlBasicCall) call).setOperator(resolvedConstructor);
        } else {
            // fake a fully-qualified call to the default constructor
            ((SqlBasicCall) call).setOperator(new SqlFunction(type.getSqlIdentifier(), ReturnTypes.explicit(type), null, null, null, SqlFunctionCategory.USER_DEFINED_CONSTRUCTOR));
        }
    }
    return type;
}
Also used : SqlBasicCall(org.apache.calcite.sql.SqlBasicCall) SqlCall(org.apache.calcite.sql.SqlCall) RelDataType(org.apache.calcite.rel.type.RelDataType) SqlIdentifier(org.apache.calcite.sql.SqlIdentifier) SqlFunction(org.apache.calcite.sql.SqlFunction)

Example 22 with SqlFunction

use of org.apache.calcite.sql.SqlFunction in project Mycat2 by MyCATApache.

the class SqlValidatorImpl method handleUnresolvedFunction.

public CalciteException handleUnresolvedFunction(SqlCall call, SqlFunction unresolvedFunction, List<RelDataType> argTypes, List<String> argNames) {
    // For builtins, we can give a better error message
    final List<SqlOperator> overloads = new ArrayList<>();
    opTab.lookupOperatorOverloads(unresolvedFunction.getNameAsId(), null, SqlSyntax.FUNCTION, overloads, catalogReader.nameMatcher());
    if (overloads.size() == 1) {
        SqlFunction fun = (SqlFunction) overloads.get(0);
        if ((fun.getSqlIdentifier() == null) && (fun.getSyntax() != SqlSyntax.FUNCTION_ID)) {
            final int expectedArgCount = fun.getOperandCountRange().getMin();
            throw newValidationError(call, RESOURCE.invalidArgCount(call.getOperator().getName(), expectedArgCount));
        }
    }
    AssignableOperandTypeChecker typeChecking = new AssignableOperandTypeChecker(argTypes, argNames);
    String signature = typeChecking.getAllowedSignatures(unresolvedFunction, unresolvedFunction.getName());
    throw newValidationError(call, RESOURCE.validatorUnknownFunction(signature));
}
Also used : AssignableOperandTypeChecker(org.apache.calcite.sql.type.AssignableOperandTypeChecker) SqlOperator(org.apache.calcite.sql.SqlOperator) ArrayList(java.util.ArrayList) BitString(org.apache.calcite.util.BitString) SqlFunction(org.apache.calcite.sql.SqlFunction)

Example 23 with SqlFunction

use of org.apache.calcite.sql.SqlFunction in project druid by apache.

the class ExpressionsTest method testTruncate.

@Test
public void testTruncate() {
    final SqlFunction truncateFunction = new TruncateOperatorConversion().calciteOperator();
    testHelper.testExpression(truncateFunction, testHelper.makeInputRef("a"), DruidExpression.ofExpression(ColumnType.LONG, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 1,'long'),'double') / 1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "a"))), 10.0);
    testHelper.testExpression(truncateFunction, testHelper.makeInputRef("x"), DruidExpression.ofExpression(ColumnType.FLOAT, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 1,'long'),'double') / 1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "x"))), 2.0);
    testHelper.testExpression(truncateFunction, testHelper.makeInputRef("y"), DruidExpression.ofExpression(ColumnType.LONG, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 1,'long'),'double') / 1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "y"))), 3.0);
    testHelper.testExpression(truncateFunction, testHelper.makeInputRef("z"), DruidExpression.ofExpression(ColumnType.FLOAT, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 1,'long'),'double') / 1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "z"))), -2.0);
    testHelper.testExpressionString(truncateFunction, ImmutableList.of(testHelper.makeInputRef("x"), testHelper.makeLiteral(1)), DruidExpression.ofExpression(ColumnType.FLOAT, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 10.0,'long'),'double') / 10.0)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "x"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(1)))), 2.2);
    testHelper.testExpressionString(truncateFunction, ImmutableList.of(testHelper.makeInputRef("z"), testHelper.makeLiteral(1)), DruidExpression.ofExpression(ColumnType.FLOAT, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 10.0,'long'),'double') / 10.0)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "z"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(1)))), -2.2);
    testHelper.testExpressionString(truncateFunction, ImmutableList.of(testHelper.makeInputRef("b"), testHelper.makeLiteral(-1)), DruidExpression.ofExpression(ColumnType.LONG, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 0.1,'long'),'double') / 0.1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "b"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(-1)))), 20.0);
    testHelper.testExpressionString(truncateFunction, ImmutableList.of(testHelper.makeInputRef("z"), testHelper.makeLiteral(-1)), DruidExpression.ofExpression(ColumnType.FLOAT, (args) -> "(cast(cast(" + args.get(0).getExpression() + " * 0.1,'long'),'double') / 0.1)", ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "z"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(-1)))), 0.0);
}
Also used : RPadOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RPadOperatorConversion) SqlTrimFunction(org.apache.calcite.sql.fun.SqlTrimFunction) TimeUnit(org.apache.calcite.avatica.util.TimeUnit) ReverseOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.ReverseOperatorConversion) BigDecimal(java.math.BigDecimal) SearchQueryDimFilter(org.apache.druid.query.filter.SearchQueryDimFilter) TimeParseOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeParseOperatorConversion) Map(java.util.Map) LeftOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.LeftOperatorConversion) RoundOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RoundOperatorConversion) IAE(org.apache.druid.java.util.common.IAE) ContainsOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.ContainsOperatorConversion) TimeFloorOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeFloorOperatorConversion) StringFormatOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.StringFormatOperatorConversion) DateTimes(org.apache.druid.java.util.common.DateTimes) RegexDimFilter(org.apache.druid.query.filter.RegexDimFilter) ImmutableMap(com.google.common.collect.ImmutableMap) RegexpExtractOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RegexpExtractOperatorConversion) TestExprMacroTable(org.apache.druid.query.expression.TestExprMacroTable) RegexDimExtractionFn(org.apache.druid.query.extraction.RegexDimExtractionFn) TimeCeilOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeCeilOperatorConversion) SqlStdOperatorTable(org.apache.calcite.sql.fun.SqlStdOperatorTable) TruncateOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TruncateOperatorConversion) RegexpLikeOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RegexpLikeOperatorConversion) RightOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RightOperatorConversion) DateTruncOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.DateTruncOperatorConversion) RepeatOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RepeatOperatorConversion) TimeUnitRange(org.apache.calcite.avatica.util.TimeUnitRange) ImmutableList(com.google.common.collect.ImmutableList) TimeExtractOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeExtractOperatorConversion) ExpressionVirtualColumn(org.apache.druid.segment.virtual.ExpressionVirtualColumn) HumanReadableFormatOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.HumanReadableFormatOperatorConversion) Before(org.junit.Before) TimeShiftOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeShiftOperatorConversion) SqlIntervalQualifier(org.apache.calcite.sql.SqlIntervalQualifier) SqlParserPos(org.apache.calcite.sql.parser.SqlParserPos) Period(org.joda.time.Period) SqlTypeName(org.apache.calcite.sql.type.SqlTypeName) TimeFormatOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TimeFormatOperatorConversion) LPadOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.LPadOperatorConversion) Test(org.junit.Test) StrposOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.StrposOperatorConversion) SqlFunction(org.apache.calcite.sql.SqlFunction) NullHandling(org.apache.druid.common.config.NullHandling) RowSignature(org.apache.druid.segment.column.RowSignature) ParseLongOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.ParseLongOperatorConversion) ColumnType(org.apache.druid.segment.column.ColumnType) ContainsSearchQuerySpec(org.apache.druid.query.search.ContainsSearchQuerySpec) Collections(java.util.Collections) TruncateOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.TruncateOperatorConversion) SqlFunction(org.apache.calcite.sql.SqlFunction) Test(org.junit.Test)

Example 24 with SqlFunction

use of org.apache.calcite.sql.SqlFunction in project druid by apache.

the class ExpressionsTest method testRound.

@Test
public void testRound() {
    final SqlFunction roundFunction = new RoundOperatorConversion().calciteOperator();
    testHelper.testExpression(roundFunction, testHelper.makeInputRef("a"), DruidExpression.ofExpression(ColumnType.LONG, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "a"))), 10L);
    testHelper.testExpression(roundFunction, testHelper.makeInputRef("b"), DruidExpression.ofExpression(ColumnType.LONG, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "b"))), 25L);
    testHelper.testExpressionString(roundFunction, ImmutableList.of(testHelper.makeInputRef("b"), testHelper.makeLiteral(-1)), DruidExpression.ofExpression(ColumnType.LONG, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "b"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(-1)))), 30L);
    testHelper.testExpression(roundFunction, testHelper.makeInputRef("x"), DruidExpression.ofExpression(ColumnType.FLOAT, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "x"))), 2.0);
    testHelper.testExpressionString(roundFunction, ImmutableList.of(testHelper.makeInputRef("x"), testHelper.makeLiteral(1)), DruidExpression.ofExpression(ColumnType.FLOAT, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "x"), DruidExpression.ofLiteral(ColumnType.LONG, DruidExpression.numberLiteral(1)))), 2.3);
    testHelper.testExpression(roundFunction, testHelper.makeInputRef("y"), DruidExpression.ofExpression(ColumnType.LONG, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.LONG, "y"))), 3.0);
    testHelper.testExpression(roundFunction, testHelper.makeInputRef("z"), DruidExpression.ofExpression(ColumnType.FLOAT, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "z"))), -2.0);
}
Also used : RoundOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RoundOperatorConversion) SqlFunction(org.apache.calcite.sql.SqlFunction) Test(org.junit.Test)

Example 25 with SqlFunction

use of org.apache.calcite.sql.SqlFunction in project druid by apache.

the class ExpressionsTest method testRoundWithInvalidSecondArgument.

@Test
public void testRoundWithInvalidSecondArgument() {
    final SqlFunction roundFunction = new RoundOperatorConversion().calciteOperator();
    expectException(IAE.class, "The second argument to the function[round] should be integer type but got the type: STRING");
    testHelper.testExpressionString(roundFunction, ImmutableList.of(testHelper.makeInputRef("x"), testHelper.makeLiteral("foo")), DruidExpression.ofExpression(ColumnType.FLOAT, DruidExpression.functionCall("round"), ImmutableList.of(DruidExpression.ofColumn(ColumnType.FLOAT, "x"), DruidExpression.ofStringLiteral("foo"))), "IAE Exception");
}
Also used : RoundOperatorConversion(org.apache.druid.sql.calcite.expression.builtin.RoundOperatorConversion) SqlFunction(org.apache.calcite.sql.SqlFunction) Test(org.junit.Test)

Aggregations

SqlFunction (org.apache.calcite.sql.SqlFunction)57 SqlOperator (org.apache.calcite.sql.SqlOperator)26 ArrayList (java.util.ArrayList)13 RoundOperatorConversion (org.apache.druid.sql.calcite.expression.builtin.RoundOperatorConversion)12 Test (org.junit.Test)12 RexNode (org.apache.calcite.rex.RexNode)8 SqlCall (org.apache.calcite.sql.SqlCall)8 SqlIdentifier (org.apache.calcite.sql.SqlIdentifier)8 AssignableOperandTypeChecker (org.apache.calcite.sql.type.AssignableOperandTypeChecker)6 BitString (org.apache.calcite.util.BitString)6 ImmutableList (com.google.common.collect.ImmutableList)5 RelDataType (org.apache.calcite.rel.type.RelDataType)5 SqlBasicCall (org.apache.calcite.sql.SqlBasicCall)5 RexCall (org.apache.calcite.rex.RexCall)4 RexLiteral (org.apache.calcite.rex.RexLiteral)4 FunctionDefinition (org.apache.flink.table.functions.FunctionDefinition)4 ScalarFunctionDefinition (org.apache.flink.table.functions.ScalarFunctionDefinition)4 BigDecimal (java.math.BigDecimal)3 TimeUnitRange (org.apache.calcite.avatica.util.TimeUnitRange)3 SqlTypeName (org.apache.calcite.sql.type.SqlTypeName)3