代码之家  ›  专栏  ›  技术社区  ›  y2k-shubham

正在处理Java中的Presto ResultSet:“SQLException:不在有效行上”

  •  0
  • y2k-shubham  · 技术社区  · 6 年前

    我的 Presto plugin 有两个组件:

    • 一个 EventListener 那个 对普雷斯托的询问
    • 一些 UDF s 对于 ( MD5 , SHA1 ) ( varchar , long )返回结果为

    我已经做到了:

    • 集成测试 ( mvn verify
    • 单元测试 散列自定义项

    在UDF组件的集成测试中,我正在尝试通过触发一个查询来断言UDF返回的值

    Connection connection = DriverManager.getConnection(PRESTO_URL, PRESTO_USER, PRESTO_PASSWORD);
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT SHA1(9223372036854775807) AS hash");
    assertEquals("458B642B137E2C76E0B746C6FA43E64C3D4C47F1", resultSet.getString("hash"));
    

    堆栈跟踪 ( PrestoResultSet.checkValidRow )

    注: ExtendedHashFunctionsTestIT.java:39 行是包含 resultSet.getString(..)

    java.sql.SQLException: Not on a valid row
        at com.facebook.presto.jdbc.PrestoResultSet.checkValidRow(PrestoResultSet.java:1658)
        at com.facebook.presto.jdbc.PrestoResultSet.column(PrestoResultSet.java:1690)
        at com.facebook.presto.jdbc.PrestoResultSet.getString(PrestoResultSet.java:370)
        at com.company.plugin.it.udfs.scalar.hash.ExtendedHashFunctionsTestIT.testBody(ExtendedHashFunctionsTestIT.java:39)
        at com.company.plugin.it.AbstractIntegrationTest.test(AbstractIntegrationTest.java:77)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
        at org.testng.TestRunner.privateRun(TestRunner.java:774)
        at org.testng.TestRunner.run(TestRunner.java:624)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
        at org.testng.SuiteRunner.run(SuiteRunner.java:261)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1191)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1116)
        at org.testng.TestNG.run(TestNG.java:1024)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:62)
        at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:141)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
    

    ResultSet ;评论 assertEquals(..)

    更令人不安的是,堆栈跟踪对于几乎所有查询都是相同的:

    • SELECT 'some_string' AS some_alias
    • SHOW SCHEMAS

    Spotify 's dockerfile-maven-plugin 为了测试。我把相关文件放在 this GitHub Gist

    • ExtendedHashFunctionsTestIT.java 简化 集成测试文件)
    • pom.xml
    • Dockerfile
    1 回复  |  直到 6 年前
        1
  •  0
  •   y2k-shubham    6 年前

    我很遗憾,我的两天都被这个错误吞噬了

    Connection connection = DriverManager.getConnection(PRESTO_URL, PRESTO_USER, PRESTO_PASSWORD);
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT SHA1(9223372036854775807) AS hash");
    resultSet.next();
    assertEquals("458B642B137E2C76E0B746C6FA43E64C3D4C47F1", resultSet.getString("hash"));
    

    resultSet.next() 之前 resultSet.getString(..) :-(