Skip to content

Commit 5562628

Browse files
committed
DRILL-4047: add function category for table functions
1 parent aec1cb1 commit 5562628

11 files changed

Lines changed: 95 additions & 28 deletions

File tree

core/src/main/codegen/templates/Parser.jj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,13 +1846,13 @@ void ColumnType(List<SqlNode> list) :
18461846
SqlNode TableFunctionCall(SqlParserPos pos) :
18471847
{
18481848
SqlNode call;
1849-
SqlFunctionCategory funcType = SqlFunctionCategory.USER_DEFINED_FUNCTION;
1849+
SqlFunctionCategory funcType = SqlFunctionCategory.USER_DEFINED_TABLE_FUNCTION;
18501850
}
18511851
{
18521852
[
18531853
<SPECIFIC>
18541854
{
1855-
funcType = SqlFunctionCategory.USER_DEFINED_SPECIFIC_FUNCTION;
1855+
funcType = SqlFunctionCategory.USER_DEFINED_TABLE_SPECIFIC_FUNCTION;
18561856
}
18571857
]
18581858
{

core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060

6161
import java.util.ArrayList;
6262
import java.util.Collection;
63+
import java.util.Iterator;
6364
import java.util.List;
6465
import java.util.Map;
6566
import java.util.NavigableSet;
@@ -234,6 +235,18 @@ public void lookupOperatorOverloads(final SqlIdentifier opName,
234235
return;
235236
}
236237
final Collection<Function> functions = getFunctionsFrom(opName.names);
238+
for (Iterator<Function> iterator = functions.iterator(); iterator.hasNext();) {
239+
Function function = iterator.next();
240+
if (function instanceof TableMacro || function instanceof TableFunction) {
241+
if (category == null || !category.isTableFunction()) {
242+
iterator.remove();
243+
}
244+
} else {
245+
if (category != null && category.isTableFunction()) {
246+
iterator.remove();
247+
}
248+
}
249+
}
237250
if (functions.isEmpty()) {
238251
return;
239252
}

core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,7 @@ private Object toJson(RexNode node) {
338338
map.put("type", toJson(node.getType()));
339339
}
340340
if (call.getOperator() instanceof SqlFunction) {
341-
switch (((SqlFunction) call.getOperator()).getFunctionType()) {
342-
case USER_DEFINED_CONSTRUCTOR:
343-
case USER_DEFINED_FUNCTION:
344-
case USER_DEFINED_PROCEDURE:
345-
case USER_DEFINED_SPECIFIC_FUNCTION:
341+
if (((SqlFunction) call.getOperator()).getFunctionType().isUserdefined()) {
346342
map.put("class", call.getOperator().getClass().getName());
347343
}
348344
}

core/src/main/java/org/apache/calcite/sql/SqlFunctionCategory.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,53 @@ public enum SqlFunctionCategory {
3131
USER_DEFINED_PROCEDURE("UDP", "User-defined procedure"),
3232
USER_DEFINED_CONSTRUCTOR("UDC", "User-defined constructor"),
3333
USER_DEFINED_SPECIFIC_FUNCTION("UDF_SPECIFIC",
34-
"User-defined function with SPECIFIC name");
34+
"User-defined function with SPECIFIC name"),
35+
USER_DEFINED_TABLE_FUNCTION("TABLE_UDF", "User-defined table function"),
36+
USER_DEFINED_TABLE_SPECIFIC_FUNCTION("TABLE_UDF_SPECIFIC",
37+
"User-defined table function with SPECIFIC name");
3538

3639
SqlFunctionCategory(String abbrev, String description) {
3740
Util.discard(abbrev);
3841
Util.discard(description);
3942
}
43+
44+
public final boolean isUserdefined() {
45+
return isOneOf(
46+
USER_DEFINED_FUNCTION,
47+
USER_DEFINED_PROCEDURE,
48+
USER_DEFINED_CONSTRUCTOR,
49+
USER_DEFINED_SPECIFIC_FUNCTION,
50+
USER_DEFINED_TABLE_FUNCTION,
51+
USER_DEFINED_TABLE_SPECIFIC_FUNCTION);
52+
}
53+
54+
public final boolean isTableFunction() {
55+
return isOneOf(
56+
USER_DEFINED_TABLE_FUNCTION,
57+
USER_DEFINED_TABLE_SPECIFIC_FUNCTION);
58+
}
59+
60+
public final boolean isSpecific() {
61+
return isOneOf(
62+
USER_DEFINED_SPECIFIC_FUNCTION,
63+
USER_DEFINED_TABLE_SPECIFIC_FUNCTION);
64+
}
65+
66+
public final boolean isUnresolvedUserDefinedFunction() {
67+
return isOneOf(
68+
USER_DEFINED_FUNCTION,
69+
USER_DEFINED_TABLE_FUNCTION);
70+
}
71+
72+
public final boolean isOneOf(SqlFunctionCategory... categories) {
73+
for (SqlFunctionCategory category : categories) {
74+
if (category == this) {
75+
return true;
76+
}
77+
}
78+
return false;
79+
}
80+
4081
}
4182

4283
// End SqlFunctionCategory.java

core/src/main/java/org/apache/calcite/sql/SqlUtil.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,7 @@ public static void unparseFunctionSyntax(
228228
if (operator instanceof SqlFunction) {
229229
SqlFunction function = (SqlFunction) operator;
230230

231-
switch (function.getFunctionType()) {
232-
case USER_DEFINED_SPECIFIC_FUNCTION:
231+
if (function.getFunctionType().isSpecific()) {
233232
writer.keyword("SPECIFIC");
234233
}
235234
SqlIdentifier id = function.getSqlIdentifier();

core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ protected SqlCall createCall(
361361
/// name when regenerating SQL).
362362
if (funName.isSimple()) {
363363
final List<SqlOperator> list = Lists.newArrayList();
364-
opTab.lookupOperatorOverloads(funName, null, SqlSyntax.FUNCTION, list);
364+
opTab.lookupOperatorOverloads(funName, funcType, SqlSyntax.FUNCTION, list);
365365
if (list.size() == 1) {
366366
fun = list.get(0);
367367
}

core/src/main/java/org/apache/calcite/sql/util/ListSqlOperatorTable.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ public void lookupOperatorOverloads(SqlIdentifier opName,
6969
} else {
7070
functionCategory = SqlFunctionCategory.SYSTEM;
7171
}
72-
if (category != functionCategory
73-
&& category != SqlFunctionCategory.USER_DEFINED_FUNCTION) {
72+
if (category != functionCategory && !category.isUnresolvedUserDefinedFunction()) {
7473
continue;
7574
}
7675
operatorList.add(operator);

core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818

1919
import org.apache.calcite.sql.SqlCall;
2020
import org.apache.calcite.sql.SqlFunction;
21-
import org.apache.calcite.sql.SqlFunctionCategory;
2221
import org.apache.calcite.sql.SqlKind;
2322
import org.apache.calcite.sql.SqlNode;
2423
import org.apache.calcite.sql.SqlOperator;
2524
import org.apache.calcite.sql.SqlOperatorTable;
26-
import org.apache.calcite.sql.SqlSyntax;
2725
import org.apache.calcite.sql.util.SqlBasicVisitor;
2826
import org.apache.calcite.util.Util;
2927

28+
import static org.apache.calcite.sql.SqlKind.QUERY;
29+
import static org.apache.calcite.sql.SqlSyntax.FUNCTION;
30+
3031
import com.google.common.collect.Lists;
3132

3233
import java.util.List;
@@ -91,19 +92,20 @@ public Void visit(SqlCall call) {
9192
throw new Util.FoundOne(call);
9293
}
9394
// User-defined function may not be resolved yet.
94-
if (operator instanceof SqlFunction
95-
&& ((SqlFunction) operator).getFunctionType()
96-
== SqlFunctionCategory.USER_DEFINED_FUNCTION) {
97-
final List<SqlOperator> list = Lists.newArrayList();
98-
opTab.lookupOperatorOverloads(((SqlFunction) operator).getSqlIdentifier(),
99-
SqlFunctionCategory.USER_DEFINED_FUNCTION, SqlSyntax.FUNCTION, list);
100-
for (SqlOperator sqlOperator : list) {
101-
if (sqlOperator.isAggregator()) {
102-
throw new Util.FoundOne(call);
95+
if (operator instanceof SqlFunction) {
96+
SqlFunction sqlFunction = (SqlFunction) operator;
97+
if (sqlFunction.getFunctionType().isUnresolvedUserDefinedFunction()) {
98+
final List<SqlOperator> list = Lists.newArrayList();
99+
opTab.lookupOperatorOverloads(sqlFunction.getSqlIdentifier(),
100+
sqlFunction.getFunctionType(), FUNCTION, list);
101+
for (SqlOperator sqlOperator : list) {
102+
if (sqlOperator.isAggregator()) {
103+
throw new Util.FoundOne(call);
104+
}
103105
}
104106
}
105107
}
106-
if (call.isA(SqlKind.QUERY)) {
108+
if (call.isA(QUERY)) {
107109
// don't traverse into queries
108110
return null;
109111
}

core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedFunction.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,25 @@ public SqlUserDefinedFunction(SqlIdentifier opName,
4747
SqlOperandTypeChecker operandTypeChecker,
4848
List<RelDataType> paramTypes,
4949
Function function) {
50+
this(opName,
51+
returnTypeInference,
52+
operandTypeInference,
53+
operandTypeChecker,
54+
paramTypes,
55+
function,
56+
SqlFunctionCategory.USER_DEFINED_FUNCTION);
57+
}
58+
59+
public SqlUserDefinedFunction(SqlIdentifier opName,
60+
SqlReturnTypeInference returnTypeInference,
61+
SqlOperandTypeInference operandTypeInference,
62+
SqlOperandTypeChecker operandTypeChecker,
63+
List<RelDataType> paramTypes,
64+
Function function,
65+
SqlFunctionCategory category) {
5066
super(Util.last(opName.names), opName, SqlKind.OTHER_FUNCTION,
5167
returnTypeInference, operandTypeInference, operandTypeChecker,
52-
paramTypes, SqlFunctionCategory.USER_DEFINED_FUNCTION);
68+
paramTypes, category);
5369
this.function = function;
5470
}
5571

core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableFunction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.calcite.rel.type.RelDataType;
2020
import org.apache.calcite.rel.type.RelDataTypeFactory;
2121
import org.apache.calcite.schema.TableFunction;
22+
import org.apache.calcite.sql.SqlFunctionCategory;
2223
import org.apache.calcite.sql.SqlIdentifier;
2324
import org.apache.calcite.sql.SqlNode;
2425
import org.apache.calcite.sql.type.SqlOperandTypeChecker;
@@ -42,7 +43,7 @@ public SqlUserDefinedTableFunction(SqlIdentifier opName,
4243
List<RelDataType> paramTypes,
4344
TableFunction function) {
4445
super(opName, returnTypeInference, operandTypeInference, operandTypeChecker,
45-
paramTypes, function);
46+
paramTypes, function, SqlFunctionCategory.USER_DEFINED_TABLE_FUNCTION);
4647
}
4748

4849
/**

0 commit comments

Comments
 (0)