Skip to content

Commit

Permalink
TEIID-247 ensuring proper resolving with vararg procedures/functions
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Aug 14, 2013
1 parent 7b6a3fb commit c4e3887
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 3 deletions.
Expand Up @@ -345,7 +345,7 @@ private FunctionDescriptor[] getConverts(FunctionMethod method, Class<?>[] types
public boolean isVarArgArrayParam(FunctionMethod method, Class<?>[] types,
int i, Class<?> targetType) {
return i == types.length - 1 && method.isVarArgs() && i == method.getInputParameterCount() - 1
&& types[i].getComponentType() == targetType;
&& types[i].isArray() && targetType.isAssignableFrom(types[i].getComponentType());
}

private Transform getConvertFunctionDescriptor(Class<?> sourceType, Class<?> targetType) throws InvalidFunctionException {
Expand Down
Expand Up @@ -315,7 +315,9 @@ public void visit(Array array) {
for (int i = 0; i < array.getExpressions().size(); i++) {
Expression expr = array.getExpressions().get(i);
setDesiredType(expr, array.getComponentType(), array);
array.getExpressions().set(i, ResolverUtil.convertExpression(expr, type, metadata));
if (array.getComponentType() != DefaultDataClasses.OBJECT) {
array.getExpressions().set(i, ResolverUtil.convertExpression(expr, type, metadata));
}
}
} else {
Class<?> type = null;
Expand Down
Expand Up @@ -29,6 +29,8 @@
import org.teiid.api.exception.query.QueryResolverException;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.resolver.util.ResolverVisitor;
import org.teiid.query.sql.symbol.Constant;
Expand All @@ -39,7 +41,7 @@
import org.teiid.query.sql.symbol.XMLSerialize;
import org.teiid.query.unittest.RealMetadataFactory;


@SuppressWarnings("nls")
public class TestFunctionResolving {

@Test public void testResolveBadConvert() throws Exception {
Expand Down Expand Up @@ -167,4 +169,21 @@ public static Expression getExpression(String sql) throws QueryParserException,
getExpression(sql);
}

public static String vararg(Object... vals) {
return String.valueOf(vals.length);
}

@Test public void testVarArgsFunction() throws Exception {
String ddl = "create foreign function func (VARIADIC z object) returns string options (JAVA_CLASS '"+this.getClass().getName()+"', JAVA_METHOD 'vararg');\n";
TransformationMetadata tm = RealMetadataFactory.fromDDL(ddl, "x", "y");

String sql = "func(('a', 'b'))";

Function func = (Function) QueryParser.getQueryParser().parseExpression(sql);
ResolverVisitor.resolveLanguageObject(func, tm);
assertEquals(1, func.getArgs().length);

assertEquals("2", Evaluator.evaluate(func));
}

}
Expand Up @@ -1095,6 +1095,13 @@ public static TransformationMetadata createMetadata(String ddl) throws Exception
LanguageBridgeFactory lbf = new LanguageBridgeFactory(tm);
Call call = (Call)lbf.translate(sp);
assertEquals("EXEC proc(1)", call.toString());

sql = "call proc (1, (2, 3))"; //$NON-NLS-1$
sp = (StoredProcedure) TestResolver.helpResolve(sql, tm);
assertEquals("EXEC proc(1, (2, 3))", sp.toString());
assertEquals(new Constant(1), sp.getParameter(1).getExpression());
assertEquals(new Array(DataTypeManager.DefaultDataClasses.INTEGER, Arrays.asList((Expression)new Constant(2), new Constant(3))), sp.getParameter(2).getExpression());
assertEquals(SPParameter.RESULT_SET, sp.getParameter(3).getParameterType());
}

@Test public void testVarArgs1() throws Exception {
Expand All @@ -1114,4 +1121,22 @@ public static TransformationMetadata createMetadata(String ddl) throws Exception
assertEquals(0, call.getArguments().size());
}

@Test public void testVarArgs2() throws Exception {
String ddl = "create foreign procedure proc (VARIADIC z object) returns (x string);\n";
TransformationMetadata tm = createMetadata(ddl);

String sql = "call proc ()"; //$NON-NLS-1$
StoredProcedure sp = (StoredProcedure) TestResolver.helpResolve(sql, tm);
assertEquals("EXEC proc()", sp.toString());
assertEquals(new Array(DataTypeManager.DefaultDataClasses.OBJECT, new ArrayList<Expression>(0)), sp.getParameter(1).getExpression());

sql = "call proc (1, (2, 3))"; //$NON-NLS-1$
sp = (StoredProcedure) TestResolver.helpResolve(sql, tm);
assertEquals("EXEC proc(1, (2, 3))", sp.toString());
ArrayList<Expression> expressions = new ArrayList<Expression>();
expressions.add(new Constant(1));
expressions.add(new Array(DataTypeManager.DefaultDataClasses.INTEGER, Arrays.asList((Expression)new Constant(2), new Constant(3))));
assertEquals(new Array(DataTypeManager.DefaultDataClasses.OBJECT, expressions), sp.getParameter(1).getExpression());
}

}

0 comments on commit c4e3887

Please sign in to comment.