/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.db;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.h2.constant.ErrorCode;
import org.h2.test.TestBase;
/**
* Tests for overloaded user defined functions.
*
* @author Gary Tong
*/
public class TestFunctionOverload extends TestBase {
private static final String ME = TestFunctionOverload.class.getName();
private Connection conn;
private DatabaseMetaData meta;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws SQLException {
deleteDb("functionOverload");
conn = getConnection("functionOverload");
meta = conn.getMetaData();
testControl();
testOverload();
testOverloadNamedArgs();
testOverloadWithConnection();
testOverloadError();
conn.close();
deleteDb("functionOverload");
}
private void testOverloadError() throws SQLException {
Statement stat = conn.createStatement();
assertThrows(ErrorCode.METHODS_MUST_HAVE_DIFFERENT_PARAMETER_COUNTS_2, stat).
execute("create alias overloadError for \"" + ME + ".overloadError\"");
}
private void testControl() throws SQLException {
Statement stat = conn.createStatement();
stat.execute("create alias overload0 for \"" + ME + ".overload0\"");
ResultSet rs = stat.executeQuery("select overload0() from dual");
assertTrue(rs.next());
assertEquals("0 args", 0, rs.getInt(1));
assertFalse(rs.next());
rs = meta.getProcedures(null, null, "OVERLOAD0");
rs.next();
assertFalse(rs.next());
}
private void testOverload() throws SQLException {
Statement stat = conn.createStatement();
stat.execute("create alias overload1or2 for \"" + ME + ".overload1or2\"");
ResultSet rs = stat.executeQuery("select overload1or2(1) from dual");
rs.next();
assertEquals("1 arg", 1, rs.getInt(1));
assertFalse(rs.next());
rs = stat.executeQuery("select overload1or2(1, 2) from dual");
rs.next();
assertEquals("2 args", 3, rs.getInt(1));
assertFalse(rs.next());
rs = meta.getProcedures(null, null, "OVERLOAD1OR2");
rs.next();
assertEquals(1, rs.getInt("NUM_INPUT_PARAMS"));
rs.next();
assertEquals(2, rs.getInt("NUM_INPUT_PARAMS"));
assertFalse(rs.next());
}
private void testOverloadNamedArgs() throws SQLException {
Statement stat = conn.createStatement();
stat.execute("create alias overload1or2Named for \"" + ME + ".overload1or2(int)\"");
ResultSet rs = stat.executeQuery("select overload1or2Named(1) from dual");
assertTrue("First Row", rs.next());
assertEquals("1 arg", 1, rs.getInt(1));
assertFalse("Second Row", rs.next());
rs.close();
assertThrows(ErrorCode.METHOD_NOT_FOUND_1, stat).
executeQuery("select overload1or2Named(1, 2) from dual");
stat.close();
}
private void testOverloadWithConnection() throws SQLException {
Statement stat = conn.createStatement();
stat.execute("create alias overload1or2WithConn for \"" + ME + ".overload1or2WithConn\"");
ResultSet rs = stat.executeQuery("select overload1or2WithConn(1) from dual");
rs.next();
assertEquals("1 arg", 1, rs.getInt(1));
assertFalse(rs.next());
rs.close();
rs = stat.executeQuery("select overload1or2WithConn(1, 2) from dual");
rs.next();
assertEquals("2 args", 3, rs.getInt(1));
assertFalse(rs.next());
rs.close();
stat.close();
}
/**
* This method is called via reflection from the database.
*
* @return 0
*/
public static int overload0() {
return 0;
}
/**
* This method is called via reflection from the database.
*
* @param one the value
* @return the value
*/
public static int overload1or2(int one) {
return one;
}
/**
* This method is called via reflection from the database.
*
* @param one the first value
* @param two the second value
* @return the sum of both
*/
public static int overload1or2(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*
* @param conn the connection
* @param one the value
* @return the value
*/
public static int overload1or2WithConn(Connection conn, int one) throws SQLException {
conn.createStatement().executeQuery("select 1 from dual");
return one;
}
/**
* This method is called via reflection from the database.
*
* @param one the first value
* @param two the second value
* @return the sum of both
*/
public static int overload1or2WithConn(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*
* @param one the first value
* @param two the second value
* @return the sum of both
*/
public static int overloadError(int one, int two) {
return one + two;
}
/**
* This method is called via reflection from the database.
*
* @param one the first value
* @param two the second value
* @return the sum of both
*/
public static int overloadError(double one, double two) {
return (int) (one + two);
}
}