[
https://issues.apache.org/jira/browse/CALCITE-937?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Julian Hyde updated CALCITE-937:
--------------------------------
Description:
Unable to use user-defined function within view.
Steps to reproduce:
Create a new schema with User Defined Function and View.
Use the new user defined function in the View SQL
Execute query with UDF
=> Success // UDF is registered successfully
Execute query on VIEW
=> Error : No match found for function signature MY_INCREMENT(<NUMERIC>,
<NUMERIC>
Oct 26, 2015 10:21:43 PM org.apache.calcite.sql.validate.SqlValidatorException
<init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Test Code:
*************************************************
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.calcite.adapter.java.ReflectiveSchema;
import org.apache.calcite.schema.Function;
import org.apache.calcite.schema.ScalarFunction;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.schema.impl.ScalarFunctionImpl;
import org.apache.calcite.schema.impl.ViewTable;
import org.apache.calcite.util.Util;
import com.google.common.collect.ImmutableList;
public class TestViewWithUDF {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new TestViewWithUDF().run();
}
public void run() throws ClassNotFoundException, SQLException {
Class.forName("org.apache.calcite.jdbc.Driver");
Connection connection =
DriverManager.getConnection("jdbc:calcite:");
CalciteConnection calciteConnection = connection
.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
ReflectiveSchema refSchema = new ReflectiveSchema(new Hr());
rootSchema.add("hr", new ReflectiveSchema(new Hr()));
SchemaPlus post = rootSchema.add("POST", new AbstractSchema());
ScalarFunction myIncrFunc = ScalarFunctionImpl.create(
MyIncrement.class, "eval");
post.add("MY_INCREMENT", myIncrFunc);
post.add(
"V_EMP",
ViewTable
.viewMacro(
post,
"select
\"empid\" as EMPLOYEE_ID, \"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
+ "\"salary\" as EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as
INCREMENTED_SALARY \n"
+ "from \"hr\".\"emps\"",
ImmutableList.<String> of(), null));
Statement statement = connection.createStatement();
ResultSet resultSet = statement
.executeQuery("select \"empid\" as EMPLOYEE_ID,
\"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
+ "\"salary\" as
EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as INCREMENTED_SALARY \n"
+ "from \"hr\".\"emps\"");
printRS(resultSet);
ResultSet viewResultSet = statement.executeQuery("select * \n"
+ "from \"POST\".\"V_EMP\"");
printRS(viewResultSet);
resultSet.close();
statement.close();
connection.close();
}
public void printRS (ResultSet resultSet) throws SQLException{
final StringBuilder buf = new StringBuilder();
while (resultSet.next()) {
int n = resultSet.getMetaData().getColumnCount();
for (int i = 1; i <= n; i++) {
buf.append(i > 1 ? "; " : "")
.append(resultSet.getMetaData().getColumnLabel(i))
.append("=")
.append(resultSet.getObject(i));
}
System.out.println(buf.toString());
buf.setLength(0);
}
}
/** Object that will be used via reflection to create the "hr"
schema. */
public static class Hr {
public final Employee[] emps = {
new Employee(100, "Bill",900),
new Employee(200, "Eric",1000),
new Employee(150, "Sebastian",1100),
};
}
/** Object that will be used via reflection to create the "emps"
table. */
public static class Employee {
public final int empid;
public final String name;
public final int salary;
public Employee(int empid, String name, int salary) {
this.empid = empid;
this.name = name;
this.salary = salary;
}
}
public static class MyIncrement {
public float eval(int x, int y) {
return x + x*y/100;
}
}
}
*************************************
Error Stack trace :
Oct 26, 2015 10:21:43 PM org.apache.calcite.sql.validate.SqlValidatorException
<init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Oct 26, 2015 10:21:43 PM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 2, column
35 to line 2, column 60: No match found for function signature
MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Exception in thread "main" java.sql.SQLException: error while executing SQL
"select *
from "POST"."V_EMP"": From line 2, column 35 to line 2, column 60: No match
found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:112)
at
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:130)
at org.apache.calcite.jdbc.TestViewWithUDF.run(TestViewWithUDF.java:59)
at org.apache.calcite.jdbc.TestViewWithUDF.main(TestViewWithUDF.java:24)
Caused by: org.apache.calcite.runtime.CalciteContextException: From line 2,
column 35 to line 2, column 60: No match found for function signature
MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
at
org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:688)
at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:673)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3845)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.handleUnresolvedFunction(SqlValidatorImpl.java:1543)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:287)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:211)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
at
org.apache.calcite.sql.SqlAsOperator.deriveType(SqlAsOperator.java:122)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:433)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:3352)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2956)
at
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
at
org.apache.calcite.prepare.CalcitePrepareImpl.parse_(CalcitePrepareImpl.java:269)
at
org.apache.calcite.prepare.CalcitePrepareImpl.analyzeView(CalcitePrepareImpl.java:245)
at org.apache.calcite.schema.Schemas.analyzeView(Schemas.java:330)
at
org.apache.calcite.schema.impl.ViewTable$ViewTableMacro.apply(ViewTable.java:163)
at
org.apache.calcite.jdbc.CalciteSchema.getTableBasedOnNullaryFunction(CalciteSchema.java:461)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTableFrom(CalciteCatalogReader.java:118)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:99)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:1)
at
org.apache.calcite.sql.validate.EmptyScope.getTableNamespace(EmptyScope.java:75)
at
org.apache.calcite.sql.validate.DelegatingScope.getTableNamespace(DelegatingScope.java:124)
at
org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl(IdentifierNamespace.java:104)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2743)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2728)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2946)
at
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
at
org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:532)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:222)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:188)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:671)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:572)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:541)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:173)
at
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:561)
at
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:477)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:110)
... 3 more
Caused by: org.apache.calcite.sql.validate.SqlValidatorException: No match
found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
at
org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:514)
... 64 more
was:
Steps to reproduce:
Create a new schema with User Defined Function and View.
Use the new user defined function in the View SQL
Execute query with UDF
=> Success // UDF is registered successfully
Execute query on VIEW
=> Error : No match found for function signature MY_INCREMENT(<NUMERIC>,
<NUMERIC>
Oct 26, 2015 10:21:43 PM org.apache.calcite.sql.validate.SqlValidatorException
<init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Test Code:
*************************************************
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.calcite.adapter.java.ReflectiveSchema;
import org.apache.calcite.schema.Function;
import org.apache.calcite.schema.ScalarFunction;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.schema.impl.ScalarFunctionImpl;
import org.apache.calcite.schema.impl.ViewTable;
import org.apache.calcite.util.Util;
import com.google.common.collect.ImmutableList;
public class TestViewWithUDF {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new TestViewWithUDF().run();
}
public void run() throws ClassNotFoundException, SQLException {
Class.forName("org.apache.calcite.jdbc.Driver");
Connection connection =
DriverManager.getConnection("jdbc:calcite:");
CalciteConnection calciteConnection = connection
.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
ReflectiveSchema refSchema = new ReflectiveSchema(new Hr());
rootSchema.add("hr", new ReflectiveSchema(new Hr()));
SchemaPlus post = rootSchema.add("POST", new AbstractSchema());
ScalarFunction myIncrFunc = ScalarFunctionImpl.create(
MyIncrement.class, "eval");
post.add("MY_INCREMENT", myIncrFunc);
post.add(
"V_EMP",
ViewTable
.viewMacro(
post,
"select
\"empid\" as EMPLOYEE_ID, \"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
+ "\"salary\" as EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as
INCREMENTED_SALARY \n"
+ "from \"hr\".\"emps\"",
ImmutableList.<String> of(), null));
Statement statement = connection.createStatement();
ResultSet resultSet = statement
.executeQuery("select \"empid\" as EMPLOYEE_ID,
\"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
+ "\"salary\" as
EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as INCREMENTED_SALARY \n"
+ "from \"hr\".\"emps\"");
printRS(resultSet);
ResultSet viewResultSet = statement.executeQuery("select * \n"
+ "from \"POST\".\"V_EMP\"");
printRS(viewResultSet);
resultSet.close();
statement.close();
connection.close();
}
public void printRS (ResultSet resultSet) throws SQLException{
final StringBuilder buf = new StringBuilder();
while (resultSet.next()) {
int n = resultSet.getMetaData().getColumnCount();
for (int i = 1; i <= n; i++) {
buf.append(i > 1 ? "; " : "")
.append(resultSet.getMetaData().getColumnLabel(i))
.append("=")
.append(resultSet.getObject(i));
}
System.out.println(buf.toString());
buf.setLength(0);
}
}
/** Object that will be used via reflection to create the "hr"
schema. */
public static class Hr {
public final Employee[] emps = {
new Employee(100, "Bill",900),
new Employee(200, "Eric",1000),
new Employee(150, "Sebastian",1100),
};
}
/** Object that will be used via reflection to create the "emps"
table. */
public static class Employee {
public final int empid;
public final String name;
public final int salary;
public Employee(int empid, String name, int salary) {
this.empid = empid;
this.name = name;
this.salary = salary;
}
}
public static class MyIncrement {
public float eval(int x, int y) {
return x + x*y/100;
}
}
}
*************************************
Error Stack trace :
Oct 26, 2015 10:21:43 PM org.apache.calcite.sql.validate.SqlValidatorException
<init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Oct 26, 2015 10:21:43 PM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 2, column
35 to line 2, column 60: No match found for function signature
MY_INCREMENT(<NUMERIC>, <NUMERIC>)
Exception in thread "main" java.sql.SQLException: error while executing SQL
"select *
from "POST"."V_EMP"": From line 2, column 35 to line 2, column 60: No match
found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:112)
at
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:130)
at org.apache.calcite.jdbc.TestViewWithUDF.run(TestViewWithUDF.java:59)
at org.apache.calcite.jdbc.TestViewWithUDF.main(TestViewWithUDF.java:24)
Caused by: org.apache.calcite.runtime.CalciteContextException: From line 2,
column 35 to line 2, column 60: No match found for function signature
MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
at
org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:688)
at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:673)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3845)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.handleUnresolvedFunction(SqlValidatorImpl.java:1543)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:287)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:211)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
at
org.apache.calcite.sql.SqlAsOperator.deriveType(SqlAsOperator.java:122)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:433)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:3352)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2956)
at
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
at
org.apache.calcite.prepare.CalcitePrepareImpl.parse_(CalcitePrepareImpl.java:269)
at
org.apache.calcite.prepare.CalcitePrepareImpl.analyzeView(CalcitePrepareImpl.java:245)
at org.apache.calcite.schema.Schemas.analyzeView(Schemas.java:330)
at
org.apache.calcite.schema.impl.ViewTable$ViewTableMacro.apply(ViewTable.java:163)
at
org.apache.calcite.jdbc.CalciteSchema.getTableBasedOnNullaryFunction(CalciteSchema.java:461)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTableFrom(CalciteCatalogReader.java:118)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:99)
at
org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:1)
at
org.apache.calcite.sql.validate.EmptyScope.getTableNamespace(EmptyScope.java:75)
at
org.apache.calcite.sql.validate.DelegatingScope.getTableNamespace(DelegatingScope.java:124)
at
org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl(IdentifierNamespace.java:104)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2743)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2728)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2946)
at
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
at
org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:532)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:222)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:188)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:671)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:572)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:541)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:173)
at
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:561)
at
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:477)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:110)
... 3 more
Caused by: org.apache.calcite.sql.validate.SqlValidatorException: No match
found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
at
org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:514)
... 64 more
> User-defined function within view
> ---------------------------------
>
> Key: CALCITE-937
> URL: https://issues.apache.org/jira/browse/CALCITE-937
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.4.0-incubating
> Reporter: Ng Jiunn Jye
> Assignee: Julian Hyde
> Priority: Minor
> Fix For: 1.5.0
>
>
> Unable to use user-defined function within view.
> Steps to reproduce:
> Create a new schema with User Defined Function and View.
> Use the new user defined function in the View SQL
> Execute query with UDF
> => Success // UDF is registered successfully
> Execute query on VIEW
> => Error : No match found for function signature MY_INCREMENT(<NUMERIC>,
> <NUMERIC>
> Oct 26, 2015 10:21:43 PM
> org.apache.calcite.sql.validate.SqlValidatorException <init>
> SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
> for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> Test Code:
> *************************************************
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> import org.apache.calcite.adapter.java.ReflectiveSchema;
> import org.apache.calcite.schema.Function;
> import org.apache.calcite.schema.ScalarFunction;
> import org.apache.calcite.schema.SchemaPlus;
> import org.apache.calcite.schema.impl.AbstractSchema;
> import org.apache.calcite.schema.impl.ScalarFunctionImpl;
> import org.apache.calcite.schema.impl.ViewTable;
> import org.apache.calcite.util.Util;
> import com.google.common.collect.ImmutableList;
> public class TestViewWithUDF {
> public static void main(String[] args) throws Exception {
> // TODO Auto-generated method stub
> new TestViewWithUDF().run();
> }
> public void run() throws ClassNotFoundException, SQLException {
> Class.forName("org.apache.calcite.jdbc.Driver");
> Connection connection =
> DriverManager.getConnection("jdbc:calcite:");
> CalciteConnection calciteConnection = connection
> .unwrap(CalciteConnection.class);
> SchemaPlus rootSchema = calciteConnection.getRootSchema();
> ReflectiveSchema refSchema = new ReflectiveSchema(new Hr());
> rootSchema.add("hr", new ReflectiveSchema(new Hr()));
> SchemaPlus post = rootSchema.add("POST", new AbstractSchema());
> ScalarFunction myIncrFunc = ScalarFunctionImpl.create(
> MyIncrement.class, "eval");
> post.add("MY_INCREMENT", myIncrFunc);
> post.add(
> "V_EMP",
> ViewTable
> .viewMacro(
> post,
> "select
> \"empid\" as EMPLOYEE_ID, \"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
>
> + "\"salary\" as EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as
> INCREMENTED_SALARY \n"
>
> + "from \"hr\".\"emps\"",
>
> ImmutableList.<String> of(), null));
>
> Statement statement = connection.createStatement();
> ResultSet resultSet = statement
> .executeQuery("select \"empid\" as EMPLOYEE_ID,
> \"name\" || ' ' || \"name\" as EMPLOYEE_NAME, \n"
> + "\"salary\" as
> EMPLOYEE_SALARY, POST.MY_INCREMENT(\"salary\", 10) as INCREMENTED_SALARY \n"
> + "from \"hr\".\"emps\"");
> printRS(resultSet);
> ResultSet viewResultSet = statement.executeQuery("select * \n"
> + "from \"POST\".\"V_EMP\"");
> printRS(viewResultSet);
> resultSet.close();
> statement.close();
> connection.close();
> }
>
> public void printRS (ResultSet resultSet) throws SQLException{
> final StringBuilder buf = new StringBuilder();
> while (resultSet.next()) {
> int n = resultSet.getMetaData().getColumnCount();
> for (int i = 1; i <= n; i++) {
> buf.append(i > 1 ? "; " : "")
> .append(resultSet.getMetaData().getColumnLabel(i))
> .append("=")
> .append(resultSet.getObject(i));
> }
> System.out.println(buf.toString());
> buf.setLength(0);
> }
> }
> /** Object that will be used via reflection to create the "hr"
> schema. */
> public static class Hr {
> public final Employee[] emps = {
> new Employee(100, "Bill",900),
> new Employee(200, "Eric",1000),
> new Employee(150, "Sebastian",1100),
> };
> }
> /** Object that will be used via reflection to create the "emps"
> table. */
> public static class Employee {
> public final int empid;
> public final String name;
> public final int salary;
> public Employee(int empid, String name, int salary) {
> this.empid = empid;
> this.name = name;
> this.salary = salary;
> }
> }
>
> public static class MyIncrement {
> public float eval(int x, int y) {
> return x + x*y/100;
> }
> }
> }
> *************************************
> Error Stack trace :
> Oct 26, 2015 10:21:43 PM
> org.apache.calcite.sql.validate.SqlValidatorException <init>
> SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match found
> for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> Oct 26, 2015 10:21:43 PM org.apache.calcite.runtime.CalciteException <init>
> SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 2,
> column 35 to line 2, column 60: No match found for function signature
> MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> Exception in thread "main" java.sql.SQLException: error while executing SQL
> "select *
> from "POST"."V_EMP"": From line 2, column 35 to line 2, column 60: No match
> found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:112)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:130)
> at org.apache.calcite.jdbc.TestViewWithUDF.run(TestViewWithUDF.java:59)
> at org.apache.calcite.jdbc.TestViewWithUDF.main(TestViewWithUDF.java:24)
> Caused by: org.apache.calcite.runtime.CalciteContextException: From line 2,
> column 35 to line 2, column 60: No match found for function signature
> MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
> at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
> at
> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
> at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:688)
> at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:673)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3845)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.handleUnresolvedFunction(SqlValidatorImpl.java:1543)
> at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:287)
> at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:211)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
> at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
> at
> org.apache.calcite.sql.SqlAsOperator.deriveType(SqlAsOperator.java:122)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4184)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
> at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:130)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1461)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1444)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:433)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:3352)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2956)
> at
> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
> at
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
> at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.parse_(CalcitePrepareImpl.java:269)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.analyzeView(CalcitePrepareImpl.java:245)
> at org.apache.calcite.schema.Schemas.analyzeView(Schemas.java:330)
> at
> org.apache.calcite.schema.impl.ViewTable$ViewTableMacro.apply(ViewTable.java:163)
> at
> org.apache.calcite.jdbc.CalciteSchema.getTableBasedOnNullaryFunction(CalciteSchema.java:461)
> at
> org.apache.calcite.prepare.CalciteCatalogReader.getTableFrom(CalciteCatalogReader.java:118)
> at
> org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:99)
> at
> org.apache.calcite.prepare.CalciteCatalogReader.getTable(CalciteCatalogReader.java:1)
> at
> org.apache.calcite.sql.validate.EmptyScope.getTableNamespace(EmptyScope.java:75)
> at
> org.apache.calcite.sql.validate.DelegatingScope.getTableNamespace(DelegatingScope.java:124)
> at
> org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl(IdentifierNamespace.java:104)
> at
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2743)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2728)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2946)
> at
> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
> at
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:843)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:829)
> at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:803)
> at
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:517)
> at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:532)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:222)
> at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:188)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:671)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:572)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:541)
> at
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:173)
> at
> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:561)
> at
> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:477)
> at
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:110)
> ... 3 more
> Caused by: org.apache.calcite.sql.validate.SqlValidatorException: No match
> found for function signature MY_INCREMENT(<NUMERIC>, <NUMERIC>)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
> at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:436)
> at
> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
> at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:514)
> ... 64 more
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)