Я не знаю, что вы хотите сделать, не могли бы вы дать четкое объяснение?
Ни одна функция не может принимать table
в качестве параметра, параметры должны иметь определенный тип, String, Int или другие. Таким образом, constants
и columns
можно использовать в качестве параметров. Если вы имеете в виду имя таблицы в качестве параметра, sql должен быть следующим:
SELECT MYTEST22(a), MYTEST(a), MYTEST1(a), COUNT(*)
FROM alisis.table1
WHERE a=max_dt('alisis.table1')
GROUP BY MYTEST22(a),MYTEST(a),MYTEST1(a)
Насколько мне известно, все поддерживаемые функции Calcite (версия 1.11) определены в SqlStdOperatorTable
. Если вы хотите поддерживать другие функции, вы можете реализовать класс, расширяющий SqlStdOperatorTable
, например:
public class TestOperatorTable extends SqlStdOperatorTable {
private static volatile TestOperatorTable instance;
public static TestOperatorTable instance() {
if (instance == null) {
synchronized(TestOperatorTable.class) {
if (instance == null) {
instance = new TestOperatorTable();
// Use reflection to register the expressions stored in public fields.
instance.init();
}
}
}
return instance;
}
/** Follow add your functions */
public static SqlFunction LTRIM = new SqlTrimFunction("LTRIM");
}
SqlTrimFunction
следующим образом:
public class SqlTrimFunction extends SqlFunction {
public SqlTrimFunction(String funcName) {
super(
funcName,
SqlKind.OTHER_FUNCTION,
ReturnTypes.VARCHAR_2000, // return type is String
InferTypes.FIRST_KNOWN,
OperandTypes.STRING, // parameter type is String
SqlFunctionCategory.STRING
);
}
}
Когда вы создаете SqlValidator, например SqlValidatorImpl
, вы должны использовать TestOperatorTable
в качестве его первого параметра.
person
inferno
schedule
05.07.2017