Где ЧИСЛОВАЯ точность и масштаб для поля в таблицах pg_catalog?

В PostgreSQL данные столбца для структуры таблицы хранятся в pg_attribute, с несколькими полями в pg_class и парой в pg_attrdef.

Но я не вижу точности или масштаба для типа поля NUMERIC, хранящегося там где угодно.

Его можно найти в таблицах INFORMATION_SCHEMA, но я стараюсь их избегать, так как они не используют oids для простого присоединения к таблицам pg_catalog.

Итак, возникает вопрос: где в системных таблицах postgreSQL хранятся точность и масштаб столбцов?


person David    schedule 28.07.2010    source источник


Ответы (1)


Он хранится в pg_attribute, в столбце atttypmod. Вся информация доступна в представлении information_schema.columns. В этом представлении используются некоторые запросы для вычисления значений, это основные принципы:

SELECT
  CASE atttypid
         WHEN 21 /*int2*/ THEN 16
         WHEN 23 /*int4*/ THEN 32
         WHEN 20 /*int8*/ THEN 64
         WHEN 1700 /*numeric*/ THEN
              CASE WHEN atttypmod = -1
                   THEN null
                   ELSE ((atttypmod - 4) >> 16) & 65535     -- calculate the precision
                   END
         WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
         WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
         ELSE null
  END   AS numeric_precision,
  CASE 
    WHEN atttypid IN (21, 23, 20) THEN 0
    WHEN atttypid IN (1700) THEN            
        CASE 
            WHEN atttypmod = -1 THEN null       
            ELSE (atttypmod - 4) & 65535            -- calculate the scale  
        END
       ELSE null
  END AS numeric_scale,
  *
FROM 
    pg_attribute ;
person Frank Heikens    schedule 28.07.2010
comment
Большое тебе спасибо. Был ли этот фрагмент кода извлечен из определения представления information_schema.columns? - person Rdbhost; 28.07.2010
comment
Да, а также из функций, которые использует это представление. Используйте pg_view и pg_proc, чтобы получить подробности. - person Frank Heikens; 28.07.2010