Skip to content

Commit 7412485

Browse files
committed
test: add PostgreSQL mode test for Oracle keywords
Verify that Oracle-specific keywords (ROWNUM, ROWID, etc.) have no special meaning in PostgreSQL mode: - Can be used as column names - Can be used as column/table aliases - Can be used as function parameters and variables - Can be used as CTE names This ensures Oracle-specific functionality doesn't leak into PostgreSQL mode.
1 parent 61d2053 commit 7412485

3 files changed

Lines changed: 230 additions & 0 deletions

File tree

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
--
2+
-- ORA_KEYWORDS_PG
3+
-- Test that Oracle-specific keywords have no special meaning in PostgreSQL mode.
4+
-- In PostgreSQL mode, these should be treated as regular identifiers.
5+
--
6+
-- This test verifies that IvorySQL's Oracle-specific functionality
7+
-- (ROWNUM, ROWID, etc.) does not leak into PostgreSQL mode.
8+
--
9+
-- Test 1: rownum as column name
10+
CREATE TABLE rownum_test (
11+
id int,
12+
rownum int, -- rownum is just a regular column name
13+
name text
14+
);
15+
INSERT INTO rownum_test VALUES (1, 100, 'Alice');
16+
INSERT INTO rownum_test VALUES (2, 200, 'Bob');
17+
INSERT INTO rownum_test VALUES (3, 300, 'Charlie');
18+
SELECT id, rownum, name FROM rownum_test ORDER BY id;
19+
id | rownum | name
20+
----+--------+---------
21+
1 | 100 | Alice
22+
2 | 200 | Bob
23+
3 | 300 | Charlie
24+
(3 rows)
25+
26+
-- Test 2: rownum as column alias (without AS)
27+
SELECT id, name rownum FROM rownum_test ORDER BY id;
28+
id | rownum
29+
----+---------
30+
1 | Alice
31+
2 | Bob
32+
3 | Charlie
33+
(3 rows)
34+
35+
-- Test 3: rownum as column alias (with AS)
36+
SELECT id, name AS rownum FROM rownum_test ORDER BY id;
37+
id | rownum
38+
----+---------
39+
1 | Alice
40+
2 | Bob
41+
3 | Charlie
42+
(3 rows)
43+
44+
-- Test 4: rownum as table alias
45+
SELECT r.id, r.rownum, r.name FROM rownum_test rownum, rownum_test r WHERE rownum.id = r.id ORDER BY r.id;
46+
id | rownum | name
47+
----+--------+---------
48+
1 | 100 | Alice
49+
2 | 200 | Bob
50+
3 | 300 | Charlie
51+
(3 rows)
52+
53+
-- Test 5: rownum as subquery alias
54+
SELECT sub.id, sub.rownum FROM (SELECT * FROM rownum_test) rownum, (SELECT * FROM rownum_test) sub WHERE rownum.id = sub.id ORDER BY sub.id;
55+
id | rownum
56+
----+--------
57+
1 | 100
58+
2 | 200
59+
3 | 300
60+
(3 rows)
61+
62+
-- Test 6: Verify rownum column contains actual data, not row numbers
63+
SELECT id, rownum FROM rownum_test WHERE rownum > 150 ORDER BY id;
64+
id | rownum
65+
----+--------
66+
2 | 200
67+
3 | 300
68+
(2 rows)
69+
70+
-- Test 7: rownum in expressions (should use column value, not row number)
71+
SELECT id, rownum, rownum * 2 AS doubled FROM rownum_test ORDER BY id;
72+
id | rownum | doubled
73+
----+--------+---------
74+
1 | 100 | 200
75+
2 | 200 | 400
76+
3 | 300 | 600
77+
(3 rows)
78+
79+
-- Test 8: rownum as function parameter name (PL/pgSQL)
80+
CREATE OR REPLACE FUNCTION test_rownum_param(rownum int) RETURNS int AS $$
81+
BEGIN
82+
RETURN rownum * 10;
83+
END;
84+
$$ LANGUAGE plpgsql;
85+
SELECT test_rownum_param(5);
86+
test_rownum_param
87+
-------------------
88+
50
89+
(1 row)
90+
91+
SELECT test_rownum_param(rownum) FROM rownum_test ORDER BY id;
92+
test_rownum_param
93+
-------------------
94+
1000
95+
2000
96+
3000
97+
(3 rows)
98+
99+
-- Test 9: rownum as variable in PL/pgSQL
100+
DO $$
101+
DECLARE
102+
rownum int := 42;
103+
BEGIN
104+
RAISE NOTICE 'rownum variable value: %', rownum;
105+
END;
106+
$$;
107+
NOTICE: rownum variable value: 42
108+
-- Test 10: rownum in CTE
109+
WITH rownum AS (
110+
SELECT id, name FROM rownum_test WHERE id <= 2
111+
)
112+
SELECT * FROM rownum ORDER BY id;
113+
id | name
114+
----+-------
115+
1 | Alice
116+
2 | Bob
117+
(2 rows)
118+
119+
-- Test 11: ROWID as column name (also should have no special meaning)
120+
CREATE TABLE rowid_test (
121+
rowid int,
122+
data text
123+
);
124+
INSERT INTO rowid_test VALUES (1, 'first');
125+
INSERT INTO rowid_test VALUES (2, 'second');
126+
SELECT rowid, data FROM rowid_test ORDER BY rowid;
127+
rowid | data
128+
-------+--------
129+
1 | first
130+
2 | second
131+
(2 rows)
132+
133+
-- Test 12: rowid as alias
134+
SELECT data rowid FROM rowid_test ORDER BY rowid;
135+
rowid
136+
--------
137+
first
138+
second
139+
(2 rows)
140+
141+
-- Cleanup
142+
DROP FUNCTION test_rownum_param(int);
143+
DROP TABLE rownum_test;
144+
DROP TABLE rowid_test;

src/test/regress/parallel_schedule

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,6 @@ test: fast_default
140140
# run tablespace test at the end because it drops the tablespace created during
141141
# setup that other tests may use.
142142
test: tablespace
143+
144+
# Test that Oracle keywords (ROWNUM, ROWID, etc.) have no special meaning in PostgreSQL mode
145+
test: ora_keywords_pg
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
--
2+
-- ORA_KEYWORDS_PG
3+
-- Test that Oracle-specific keywords have no special meaning in PostgreSQL mode.
4+
-- In PostgreSQL mode, these should be treated as regular identifiers.
5+
--
6+
-- This test verifies that IvorySQL's Oracle-specific functionality
7+
-- (ROWNUM, ROWID, etc.) does not leak into PostgreSQL mode.
8+
--
9+
10+
-- Test 1: rownum as column name
11+
CREATE TABLE rownum_test (
12+
id int,
13+
rownum int, -- rownum is just a regular column name
14+
name text
15+
);
16+
17+
INSERT INTO rownum_test VALUES (1, 100, 'Alice');
18+
INSERT INTO rownum_test VALUES (2, 200, 'Bob');
19+
INSERT INTO rownum_test VALUES (3, 300, 'Charlie');
20+
21+
SELECT id, rownum, name FROM rownum_test ORDER BY id;
22+
23+
-- Test 2: rownum as column alias (without AS)
24+
SELECT id, name rownum FROM rownum_test ORDER BY id;
25+
26+
-- Test 3: rownum as column alias (with AS)
27+
SELECT id, name AS rownum FROM rownum_test ORDER BY id;
28+
29+
-- Test 4: rownum as table alias
30+
SELECT r.id, r.rownum, r.name FROM rownum_test rownum, rownum_test r WHERE rownum.id = r.id ORDER BY r.id;
31+
32+
-- Test 5: rownum as subquery alias
33+
SELECT sub.id, sub.rownum FROM (SELECT * FROM rownum_test) rownum, (SELECT * FROM rownum_test) sub WHERE rownum.id = sub.id ORDER BY sub.id;
34+
35+
-- Test 6: Verify rownum column contains actual data, not row numbers
36+
SELECT id, rownum FROM rownum_test WHERE rownum > 150 ORDER BY id;
37+
38+
-- Test 7: rownum in expressions (should use column value, not row number)
39+
SELECT id, rownum, rownum * 2 AS doubled FROM rownum_test ORDER BY id;
40+
41+
-- Test 8: rownum as function parameter name (PL/pgSQL)
42+
CREATE OR REPLACE FUNCTION test_rownum_param(rownum int) RETURNS int AS $$
43+
BEGIN
44+
RETURN rownum * 10;
45+
END;
46+
$$ LANGUAGE plpgsql;
47+
48+
SELECT test_rownum_param(5);
49+
SELECT test_rownum_param(rownum) FROM rownum_test ORDER BY id;
50+
51+
-- Test 9: rownum as variable in PL/pgSQL
52+
DO $$
53+
DECLARE
54+
rownum int := 42;
55+
BEGIN
56+
RAISE NOTICE 'rownum variable value: %', rownum;
57+
END;
58+
$$;
59+
60+
-- Test 10: rownum in CTE
61+
WITH rownum AS (
62+
SELECT id, name FROM rownum_test WHERE id <= 2
63+
)
64+
SELECT * FROM rownum ORDER BY id;
65+
66+
-- Test 11: ROWID as column name (also should have no special meaning)
67+
CREATE TABLE rowid_test (
68+
rowid int,
69+
data text
70+
);
71+
72+
INSERT INTO rowid_test VALUES (1, 'first');
73+
INSERT INTO rowid_test VALUES (2, 'second');
74+
75+
SELECT rowid, data FROM rowid_test ORDER BY rowid;
76+
77+
-- Test 12: rowid as alias
78+
SELECT data rowid FROM rowid_test ORDER BY rowid;
79+
80+
-- Cleanup
81+
DROP FUNCTION test_rownum_param(int);
82+
DROP TABLE rownum_test;
83+
DROP TABLE rowid_test;

0 commit comments

Comments
 (0)