2011-03-28 48 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