1.Hive Server2对execute和executeQuery的码解处理
Hive Server2对execute和executeQuery的处理
实现SparkSQL的SQL Server服务时,需兼容Hive的码解JDBC Driver,以便通过beeline连接服务。码解Java的码解JDBC标准提供execute和executeQuery两类接口。execute用于DDL(数据定义语言)操作,码解源码哥论坛模板返回true/false,码解excellbrary.dll源码而executeQuery则处理查询,码解返回ResultSet结果集。码解
在thrift接口实现中,码解对DDL操作,码解直接将结果置空并设置setHasResultSet为false。码解然而,码解beeline客户端始终显示错误,码解珠宝玉器 源码因为其使用了beeline的码解JDBC驱动。通过源码调试发现,码解在Hive的JDBC实现中,executeQuery直接调用execute。推饼游戏源码如果返回false,则抛出异常:The query did not generate a result set!
在执行SQL后,beeline客户端会通过GetOperationStatus获取操作状态。在类似while true的linux 内核源码udp循环中,直到操作结束,开始获取结果集。关键在于,如果isHasResultSet为false,execute会直接抛出异常。因此,isHasResultSet必须返回true,后端在封装thrift结果集时,需调整逻辑。
通常,设置setHasResultSet为false且设置setHasResultSetIsSet为true即可。但实践中发现,两者关联影响结果。最终解决方案是,对无结果集的DDL执行,手动生成相应返回。
Hive在处理execute和executeQuery时,存在实现上的不完美之处。