Skip to content

Commit 018504b

Browse files
committed
feat: add Oracle-compatible ALL_TAB_COLUMNS view
1 parent 0da228b commit 018504b

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

src/backend/catalog/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ install-data: installdirs
5757
$(INSTALL_DATA) $(srcdir)/system_views.sql '$(DESTDIR)$(datadir)/system_views.sql'
5858
$(INSTALL_DATA) $(srcdir)/information_schema.sql '$(DESTDIR)$(datadir)/information_schema.sql'
5959
$(INSTALL_DATA) $(srcdir)/sql_features.txt '$(DESTDIR)$(datadir)/sql_features.txt'
60+
$(INSTALL_DATA) $(srcdir)/ora_all_tab_columns.sql '$(DESTDIR)$(datadir)/ora_all_tab_columns.sql'
61+
6062

6163
installdirs:
6264
$(MKDIR_P) '$(DESTDIR)$(datadir)'
6365

6466
.PHONY: uninstall-data
6567
uninstall-data:
66-
rm -f $(addprefix '$(DESTDIR)$(datadir)'/, system_functions.sql system_views.sql information_schema.sql sql_features.txt)
68+
rm -f $(addprefix '$(DESTDIR)$(datadir)'/, system_functions.sql system_views.sql information_schema.sql sql_features.txt ora_all_tab_columns.sql)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
-- src/backend/catalog/ora_all_tab_columns.sql
2+
-- Oracle兼容 ALL_TAB_COLUMNS 系统视图定义
3+
CREATE OR REPLACE VIEW pg_catalog.ALL_TAB_COLUMNS
4+
(
5+
OWNER, -- 模式名(对应Oracle的所有者)
6+
TABLE_NAME, -- 表/视图名
7+
COLUMN_NAME, -- 列名
8+
COLUMN_ID, -- 列序号
9+
DATA_TYPE, -- 数据类型
10+
DATA_LENGTH, -- 数据长度
11+
DATA_PRECISION, -- 数值精度
12+
DATA_SCALE, -- 小数位
13+
NULLABLE, -- 空值标识(Y/N)
14+
DATA_DEFAULT, -- 默认值
15+
TABLE_TYPE, -- 表类型(TABLE/VIEW)
16+
CHAR_LENGTH, -- 字符长度
17+
CHAR_USED, -- 字符使用方式(BYTE/CHAR)
18+
DBA_COLUMN_ID -- 兼容Oracle的DBA级列ID
19+
)
20+
AS
21+
SELECT
22+
n.nspname::varchar,
23+
c.relname::varchar,
24+
a.attname::varchar,
25+
a.attnum::numeric,
26+
CASE
27+
-- Oracle数据类型 → IvorySQL映射(关键兼容点)
28+
WHEN t.typname = 'int4' THEN 'NUMBER'
29+
WHEN t.typname = 'varchar' THEN 'VARCHAR2'
30+
WHEN t.typname = 'text' THEN 'CLOB'
31+
WHEN t.typname = 'timestamp' THEN 'DATE'
32+
ELSE t.typname::varchar
33+
END,
34+
-- 修正:保证DATA_LENGTH非负
35+
CASE WHEN a.atttypmod > 0 THEN GREATEST(a.atttypmod - 4, 0) ELSE NULL END::numeric,
36+
CASE WHEN t.typname IN ('numeric', 'decimal') THEN (a.atttypmod >> 16) & 65535 ELSE NULL END::numeric,
37+
CASE WHEN t.typname IN ('numeric', 'decimal') THEN a.atttypmod & 65535 ELSE NULL END::numeric,
38+
CASE WHEN a.attnotnull THEN 'N' ELSE 'Y' END::varchar,
39+
-- 修正:默认值NULL时显示空字符串,对齐Oracle
40+
COALESCE(pg_get_expr(ad.adbin, ad.adrelid)::varchar, '')::varchar,
41+
CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'v' THEN 'VIEW' ELSE NULL END::varchar,
42+
-- 修正:保证CHAR_LENGTH非负
43+
CASE WHEN t.typname IN ('varchar', 'char') THEN GREATEST(a.atttypmod - 4, 0) ELSE NULL END::numeric,
44+
CASE WHEN t.typname IN ('varchar', 'char') THEN 'CHAR' ELSE 'BYTE' END::varchar,
45+
a.attnum::numeric
46+
FROM
47+
pg_namespace n
48+
JOIN pg_class c ON n.oid = c.relnamespace
49+
JOIN pg_attribute a ON c.oid = a.attrelid
50+
JOIN pg_type t ON a.atttypid = t.oid
51+
LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
52+
WHERE
53+
c.relkind IN ('r', 'v') -- 仅表和视图
54+
AND a.attnum > 0 -- 排除系统隐藏列
55+
AND NOT a.attisdropped; -- 排除已删除列;
56+
57+
-- 授予所有用户查询权限(对齐Oracle的PUBLIC权限)
58+
GRANT SELECT ON pg_catalog.ALL_TAB_COLUMNS TO PUBLIC;
59+
60+
-- 修正:IvorySQL兼容的PUBLIC同义词语法
61+
CREATE OR REPLACE SYNONYM ALL_TAB_COLUMNS FOR pg_catalog.ALL_TAB_COLUMNS;

0 commit comments

Comments
 (0)