Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.1.2
-
None
Description
When I am trying to call foo(GString ...), groovy always calls foo(String ...)
import groovy.sql.Sql import org.junit.Test import javax.sql.DataSource import java.sql.Connection import java.sql.DriverManager import static org.testng.Assert.assertTrue class MyGSql extends Sql { MyGSql(DataSource dataSource) { super(dataSource) } MyGSql(Connection connection) { super(connection) } MyGSql(Sql parent) { super(parent) } } class TestGroovyGStringBug { @Test @groovy.transform.CompileStatic void Test() { Class.forName("com.mysql.jdbc.Driver"); def conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/information_schema", "test", "test"); MyGSql mygsql = new MyGSql(conn); Sql sql = (Sql)mygsql def tableName = "TABLES" GString s = "SELECT * FROM ${Sql.expand(tableName)}" assertTrue( ! sql.firstRow(s).isEmpty() ) assertTrue( ! mygsql.firstRow(s).isEmpty() ) } }
The generated code:
@Test @TypeChecked.TypeCheckingInfo(inferredType="AAlDbGFzc05vZGUAAAFWAP////8=", version=1) public void Test() { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/information_schema", "test", "test"); MyGSql mygsql = new MyGSql(conn); Sql sql = mygsql; String tableName = "TABLES"; GString s = new GStringImpl(new Object[] { Sql.expand(tableName) }, new String[] { "SELECT * FROM ", "" }); Assert.assertTrue(!sql.firstRow(s).isEmpty()); null; Assert.assertTrue(!mygsql.firstRow((String)ScriptBytecodeAdapter.castToType(s, String.class), new Object[0]).isEmpty()); null; }
Wrong here:
Assert.assertTrue(!mygsql.firstRow((String)ScriptBytecodeAdapter.castToType(s, String.class), new Object[0]).isEmpty()); null;