docker - 在 Java 中处理 Presto ResultSet:“SQLException:不在有效行上”
问题描述
我的Presto
插件有两个组件:
EventListener
记录对 Presto 进行的查询的统计信息- 一些
UDF
s用于散列(MD5
,SHA1
)常见数据类型(varchar
,long
) 并将结果返回为varchar
我已经完成了:
mvn verify
查询日志组件的集成测试( )- 散列 UDF 的单元测试
在 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进行dockerfile-maven-plugin
测试。我已经把相关文件放在这里了GitHub Gist
ExtendedHashFunctionsTestIT.java
(简化的集成测试文件)pom.xml
Dockerfile
解决方案
想到吃掉我 2 天的错误就是这个,我感到很遗憾
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(..)
:-(
推荐阅读
- java - Spring thymeleaf 模板在添加 CORS 配置后不起作用
- abap - 在索引小于停止的循环的循环中循环
- javascript - 未捕获的无效图像,图像字典应包含 dataURL 条目(或 node.js 中的本地文件路径)
- android - 我在 onPostExecute 中更新我的 textView 时遇到问题
- javascript - Semantic-ui 反应模态速记防止按钮关闭模态
- bluetooth-lowenergy - 使用 CoreLocation 时 NFC 被阻止
- c# - 在 AWS 上处理控制台应用程序的关闭
- pandas - pd.read_hdf 文件名或路径包含中文时出错
- android - 如何将 android 设备作为从设备并从 iot 硬件如 Electric Imp、Arduiono 甚至 PC 读取从设备数据?
- microsoft-cognitive - 语音门户不显示日志列表