2011-03-28 51 views
5

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

--Strange 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' 
+0

我的眼睛..请在编辑器,以便其可读正确的编码标签进行格式化。 – stefan 2011-03-28 02:17:11

+0

再次发布未格式化的代码,我不会帮忙。如果SO无法解读您的问题,那么SO无法提供帮助。 – 2011-03-28 02:19:04

+0

你是在说查询中的CASE n.nspname〜'^ pg_''吗? – 2011-03-28 02:25:02

回答

7

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

Google codesearch将带你到达它。

+0

谢谢,这对PostgreSQL SERVER有什么影响吗? – francs 2011-03-28 03:14:15

+0

唯一的“影响”是你得到一张表的列表。请享用! :-) – intgr 2011-03-28 07:03:38

+0

嗨,intgr,你有没有看到你的产品数据库中的这个SQL? – francs 2011-03-28 09:49:27

1

当您的应用程序使用某些连接管理器(如c3p0)时,也会发生此问题。 C3P0具有选项preferredTestQuery,它定义了在从连接池获取连接之前要执行的查询。

如果您没有设置该选项,会做一些奇怪的SQL查询,否则你可以告诉它使用preferredTestQuery=SELECT 1

+0

它仍然是运行该语句的JDBC驱动程序,因为c3p0有一个相当愚蠢的默认配置,它使用'getTables ()'来验证连接。 – 2016-01-22 12:09:00

+0

我想这是c3p0的问题,而不是JDBC驱动程序,'getTables()'应该像它应该那样工作。 – Raman 2016-01-22 12:26:29

+0

这可能是为什么它发生的众多原因之一的答案 – Raman 2016-01-22 13:04:41