PostgreSQL的一个非常奇怪的SQL

PostgreSQL的一个非常奇怪的SQL,sql,postgresql,Sql,Postgresql,我们的PostgreSQL SERVER版本8.4中有一个奇怪的SQL。它看起来像是一个由PG服务器执行的系统sql!我不知道这个sql?有人知道吗 --奇怪的sql SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME, CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'

我们的PostgreSQL SERVER版本8.4中有一个奇怪的SQL。它看起来像是一个由PG服务器执行的系统sql!我不知道这个sql?有人知道吗

--奇怪的sql

SELECT NULL AS TABLE_CAT, 
       n.nspname AS TABLE_SCHEM, 
       c.relname AS TABLE_NAME,  
       CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema'  
          WHEN true THEN 
            CASE 
               WHEN n.nspname = 'pg_catalog' OR n.nspname = 'information_schema' THEN 
                 CASE c.relkind   
                   WHEN 'r' THEN 'SYSTEM TABLE'   
                   WHEN 'v' THEN 'SYSTEM VIEW'   
                   WHEN 'i' THEN 'SYSTEM INDEX'   
                   ELSE NULL   
                 END  
               WHEN n.nspname = 'pg_toast' THEN 
                 CASE c.relkind 
                   WHEN 'r' THEN 'SYSTEM TOAST TABLE'   
                   WHEN 'i' THEN 'SYSTEM TOAST INDEX'   
                   ELSE NULL   
                 END  
               ELSE 
                 CASE c.relkind   
                   WHEN 'r' THEN 'TEMPORARY TABLE'   
                   WHEN 'i' THEN 'TEMPORARY INDEX'   
                   ELSE NULL   
                 END  
             END  
             WHEN false THEN 
               CASE c.relkind  
                 WHEN 'r' THEN 'TABLE'  
                 WHEN 'i' THEN 'INDEX'  
                 WHEN 'S' THEN 'SEQUENCE'  
                 WHEN 'v' THEN 'VIEW'  
                 ELSE NULL  
               END  
             ELSE NULL  
           END  AS TABLE_TYPE, 
           d.description AS REMARKS  
      FROM pg_catalog.pg_namespace n, 
           pg_catalog.pg_class c  
 LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid 
                                      AND d.objsubid = 0)  
 LEFT JOIN pg_catalog.pg_class dc ON (d.classoid = dc.oid 
                                 AND dc.relname='pg_class'

它是postgresql JDBC驱动程序中的
getTables()
实现的一部分

更新


虽然Google Code Search在这个答案最初发布几年后就退役了,但您今天可以在中看到这个逻辑。

当您的应用程序使用一些连接管理器(如c3p0)时,也会出现这个问题。C3P0具有选项
preferredTestQuery
,该选项定义了从连接池获取连接之前要执行的查询


如果您没有设置此选项,它将执行一些奇怪的sql查询,否则您可以告诉它使用
preferredTestQuery=SELECT 1

我的眼睛。。请在编辑器中使用正确的编码标记对其进行格式化,以使其可读。再次发布类似的未匹配代码,我将不提供帮助。如果SO无法阅读您的问题,SO将无济于事。您是在查询中谈论
CASE n.nspname~'^pg'
?对不起,我下次会格式化。@francs,您已经发布了七个问题,没有一次投票选出一个好的答案,也从未接受过答案。这是一个社区,这样的行为不会让人们高兴地帮助你。唯一的“影响”是你得到一个表格列表。享受!:-)您好,intgr,您在产品数据库中看到这个SQL了吗?函数getTables()什么时候执行?它是由应用程序代码控制的?@francs司机可能只是在做一些内部工作。这个查询在我的postgres安装上甚至不起作用,所以它在我的日志上显示了很多。不知道这是否也是您的情况,但我会尝试切换到不同版本的驱动程序来修复它。请看:仍然是JDBC驱动程序运行该语句,因为c3p0有一个非常愚蠢的默认配置,它使用
getTables()
来验证连接。我想这是c3p0的问题,而不是JDBC驱动程序,
getTables()
正常工作。我们的应用程序中有相同的查询,但不使用c3p0。所以我想这不完全是原因。