PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写

项目从Oracle移植到PostgreSQL(9.4版)后,这几天又出现故障,经跟踪定位,确定原因是调用PgDatabaseMetaData.getPrimaryKeys()接口返回了空集。

众所周知,大多数情况下SQL语句对表名、列名都是大小写不敏感(据本人经验,linux平台的MySql默认对表名区分大小写,可算是个例外)。对应的,各数据库JDBC也理应对大小写不敏感,但实际情况是:PostgreSQL的JDBC的部分接口只认全部小写的表名、列名,而对全大写、大小写混合的情况都不支持。

PostgreSQL在其数据字典里存放的都是全小写的表名、列名,,但JDBC的接口在处理时却没有进行大小写转换。以下是参考PostgreSQL-JDBC的源码而改造得来的查询某表主键的SQL代码:

select pg_attribute.attname as colname,pg_type.typname as typename,pg_constraint.conname as pk_name
from pg_constraint
inner join pg_class
  on pg_constraint.conrelid = pg_class.oid
inner join pg_attribute
  on pg_attribute.attrelid = pg_class.oid
    and  pg_attribute.attnum = pg_constraint.conkey[1]
inner join pg_type
  on pg_type.oid = pg_attribute.atttypid
where pg_class.relname = ‘table_name‘
  and pg_constraint.contype=‘p‘;

当table_name为全小写时,可以获得正确结果,其它情况结果均为空。

也许PostgreSQL方面因某种原因而刻意为之,但本人倾向于认为这是bug。毕竟,其它主流数据库的JDBC都能正确应对这种情况。

经简单测试,本项目涉及的接口包括:

//获取表主键
public ResultSet getPrimaryKeys(String catalog, String schema, String table)  throws SQLException;

//获取表外键
public ResultSet getImportedKeys(String catalog, String schema, String table)  throws SQLException;

//获取列名
public String getColumnName(int column);

受影响的接口应该还有不少,很可能也不止PgDatabaseMetaData一个类;另外猜测,模式名、用户名、数据库名等可能也在影响之列。

但因项目时间紧迫没有核实,大家在使用时留心这个问题,在应用程序中加入大小写转换的代码。

时间: 2024-08-01 20:41:55

PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写的相关文章

Unity (疑似)BUG LayerMask GetMask Default

发现一个Unity 的疑似 BUG, LayerMask的GetMask方法在对除"Default"层以外的其他层调用时, 都能正确返回2的该层编号N次方作为掩码. 而在例如 LayerMask.GetMask("Default");//return 0, 而不是1 的代码中, 返回的是0, 而不是2的N次方1. 此BUG可能导致部分处理Default层的代码出错.

Jmeter将JDBC Request查询结果作为下一个接口参数方法

现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_info表结构如下图 分析: 1.要查出username和count(*),那么首先就要有1个或者2个 jdbc request,连接本地数据看,分别查询出我们需要的username和count(*): 2.rank小于某个值,这个值我们可以做一个变量,方便管理.不管这个值是多少,我们查出来的cou

疑似网易泄露用户密码事件浅析

事件概述 2015年10月19日下午,乌云漏洞报告平台宣布接到一起惊人的数据泄密报告,网易的用户数据库疑似泄露,影响到网易163/126邮箱过亿数据,泄露信息包括用户名.密码MD5值.密码密保信息MD5值.登陆IP地址以及用户生日等,解开后测试大部分邮箱依旧还可登陆. 乌云建议用户登陆reg.163.com用户中心,在风险提示处查询近一个月的异常登录记录,以及异地登陆提醒邮件.如有异常,需尽快修改密码,改密码的同时也将密码提示答案进行更新修改,同时开启邮箱的安全防护功能. 另外,对于已被破解的网

SQL Server AlwaysON 同步模式的疑似陷阱

SQL Server 2012 推出的最重要的功能之一Alwayson,是一个集之前Cluster和Mirror于一体的新功能,即解决了Cluster依赖共享存储的问题,又解决了镜像不能实时读以及转移后连接串需要添加转移IP的问题,看起来的确很实用. 而且Alwayson多副本的功能为实现读写分离提供了可能,试想一下,当主副本压力比较大的时候,是否可以将读操作引向辅助副本呢?答案一般来讲是肯定的,请注意,是一般! Alwayson有两个同步模式,同步和异步,即然是同步,理所当然的我认为他是实时的

马云被宗庆后董明珠炮轰 疑似强硬回应:是你的不行了

原文链接:http://finance.ifeng.com/a/20161231/15116356_0.shtml 马云 12月29日,马云出席“江苏省浙江商会十周年大会”,针对近期备受争议的“宗庆后谈五新胡扯”事件,马云,企业家必须学习和思考“五新”趋势,否则这个企业将要被落后的思想淘汰,而不是被技术淘汰,对于企业家来说“五新”也是一个学习的过程,疑似回击宗庆后和董明珠. 马云认为,实体经济和虚拟经济不是对立关系,企业家切不可活在昨天,抱怨明天.实体经济只有经历住新科技的挑战.转型和创新的洗礼

猪八戒上发现疑似传销任务贴,月息30%

猪八戒上发现疑似传销任务贴,月息30% 今天在猪八戒上看到一个疑似传销的任务贴,月息30%:http://task.zhubajie.com/6250935/ 看了下说明:http://china-mmm.kr.com/cn/what_is_mmm/ ,月息30%, 感觉很像传销,大家觉得呢? 版权声明:本文为博主原创文章,未经博主允许不得转载.

小米雷军:疑似偷学华为,400亿美金背后的人才密码

大家都知道小米很成功,但是大家知道成功的模式是参考谁的吗?下面吐槽哥根据时代信息整理的内容,分享给大家! 1.向华为学习:奋斗者,团队第一,产品第二 企业成功最重要的因素是什么? 最重要的是团队,其次才是产品,有好的团队才有可能做出好产品. 公司的竞争本质不是人才竞争,而是人才背后的机制竞争. 华为为何强大?华为86%的精英成为公司的“奋斗者”,就是合伙人!这些人玩命的干,竞争对手没法比! 所以,公司20%的精英骨干必须发展成为合伙人,我一直强调,不想当合伙人的员工不是好员工!我们不需要打工仔!

[20140804] 疑似存储上线导致数据库一致性问题

背景: 同一个存储设备提供了2块存储,1块已经在使用 a,另外一块没有使用b. 疑似: 当b初始化,上线之后,导致在a存储的数据库文件出现一致性问题. 解决方法: 幸好有数据库镜像,打算切换数据库镜像,然后备份数据库镜像,还原到原来的master. 然后创建数据库镜像,在切换到原来的master上. [20140804] 疑似存储上线导致数据库一致性问题,布布扣,bubuko.com

C#进阶系列——WebApi 接口参数不再困惑:传参详解

C#进阶系列--WebApi 接口参数不再困惑:传参详解