Skip to content

Commit 68afc6d

Browse files
authored
Merge pull request IvorySQL#1185 from pierreforstmann/patch_dyn_views
create minimal SYS.V$SESSION view
2 parents ba9c6f3 + 2127b62 commit 68afc6d

3 files changed

Lines changed: 133 additions & 0 deletions

File tree

contrib/ivorysql_ora/expected/ora_sysview.out

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,47 @@ WHERE OBJECT_NAME = 'FUNC_WITH_DEFAULT';
137137

138138
-- clean data
139139
DROP FUNCTION IF EXISTS FUNC_WITH_DEFAULT;
140+
-- Oracle dynamic views
141+
\d SYS.V$SESSION
142+
View "sys.v$session"
143+
Column | Type | Collation | Nullable | Default
144+
-------------------+------------------------+-----------+----------+---------
145+
sid | number | | |
146+
username | varchar2(128) | C | |
147+
status | varchar2(40) | | |
148+
machine | varchar2(128) | | |
149+
program | varchar2(256) | | |
150+
type | varchar2(30) | | |
151+
logon_time | pg_catalog.timestamptz | | |
152+
sql_exec_start | pg_catalog.timestamptz | | |
153+
sql_id | varchar2(19) | | |
154+
sql_text | varchar2(4000) | | |
155+
blocking_session | number | | |
156+
event | varchar2(64) | | |
157+
wait_class | varchar2(64) | | |
158+
transaction_start | pg_catalog.timestamptz | | |
159+
port | number | | |
160+
161+
\d SYS.V$PROCESS
162+
View "sys.v$process"
163+
Column | Type | Collation | Nullable | Default
164+
------------+---------------+-----------+----------+---------
165+
spid | number | | |
166+
username | varchar2(128) | C | |
167+
program | varchar2(256) | | |
168+
pname | varchar2(30) | | |
169+
background | varchar2(1) | | |
170+
171+
SELECT *
172+
FROM SYS.V$PARAMETER
173+
WHERE NAME IN ('listen_addresses','application_name','archive_command','archive_mode','block_size')
174+
ORDER BY NAME;
175+
name | type | value | default_value | isdefault | isses_modifiable | issys_modifiable | description
176+
------------------+------+------------------------+---------------+-----------+------------------+------------------+-------------------------------------------------------------------
177+
application_name | 2 | pg_regress/ora_sysview | | FALSE | TRUE | IMMEDIATE | Sets the application name to be reported in statistics and logs.
178+
archive_command | 2 | (disabled) | | FALSE | FALSE | IMMEDIATE | Sets the shell command that will be called to archive a WAL file.
179+
archive_mode | 2 | off | off | TRUE | FALSE | FALSE | Allows archiving of WAL files using "archive_command".
180+
block_size | 3 | 8192 | 8192 | TRUE | FALSE | FALSE | Shows the size of a disk block.
181+
listen_addresses | 2 | | localhost | FALSE | FALSE | FALSE | Sets the host name or IP address(es) to listen to.
182+
(5 rows)
183+

contrib/ivorysql_ora/sql/ora_sysview.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,11 @@ SELECT ARGUMENT_NAME, IN_OUT, POSITION, DEFAULTED FROM ALL_ARGUMENTS
8282
WHERE OBJECT_NAME = 'FUNC_WITH_DEFAULT';
8383
-- clean data
8484
DROP FUNCTION IF EXISTS FUNC_WITH_DEFAULT;
85+
86+
-- Oracle dynamic views
87+
\d SYS.V$SESSION
88+
\d SYS.V$PROCESS
89+
SELECT *
90+
FROM SYS.V$PARAMETER
91+
WHERE NAME IN ('listen_addresses','application_name','archive_command','archive_mode','block_size')
92+
ORDER BY NAME;

contrib/ivorysql_ora/src/sysview/sysview--1.0.sql

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,3 +1192,84 @@ WHERE
11921192
AND PG_GET_USERBYID(C.RELOWNER) = CURRENT_USER;
11931193
GRANT SELECT ON SYS.USER_VIEWS TO PUBLIC;
11941194

1195+
------------------------------------------------
1196+
-- V$ DYNAMIC VIEWS
1197+
------------------------------------------------
1198+
1199+
-- V$SESSION:
1200+
-- 1. For SID we use PG_STAT_ACTIVITY.PID and do not set SERIAL#:
1201+
-- we should avoid implementing "killing by SID" without either an additional counter or second factor like PG_STAT_ACTIVITY.BACKEND_START.
1202+
-- 2. SQL_ID is based on PG_STAT_ACTIVITY.QUERY_ID which depends on compute_query_id setting: SQL_ID is NULL if compute_query_id is 'off'.
1203+
-- SQL_ID is incompatible with Oracle because QUERY_ID a integer string in PostgreSQL and in Oracle SQL_ID is 13-character base32-encoded
1204+
-- hash.
1205+
--
1206+
-- We do not grant SELECT privilege on V$SESSION to PUBLIC because SQL_TEXT is retrieved.
1207+
-- We do not grant SELECT privilege on V$PROCESS or on V$PARAMETER to PUBLIC
1208+
-- because it contradicts with least security privilege principle.
1209+
1210+
CREATE OR REPLACE VIEW SYS.V$SESSION AS
1211+
SELECT
1212+
PG_STAT_ACTIVITY.PID::NUMBER AS SID,
1213+
USENAME::VARCHAR2(128) AS USERNAME,
1214+
CASE WHEN STATE = 'active' OR STATE = 'fastpath function call' THEN 'ACTIVE'
1215+
WHEN STATE = 'idle' OR STATE = 'idle in transaction'
1216+
OR STATE = 'idle in transaction (aborted)' THEN 'INACTIVE'
1217+
ELSE 'INACTIVE'
1218+
END::VARCHAR2(40) AS STATUS,
1219+
COALESCE(CLIENT_HOSTNAME, HOST(CLIENT_ADDR),CLIENT_ADDR::TEXT)::VARCHAR2(128) AS MACHINE,
1220+
APPLICATION_NAME::VARCHAR2(256) AS PROGRAM,
1221+
CASE WHEN BACKEND_TYPE = 'client backend' THEN 'USER'
1222+
ELSE 'BACKGROUND'
1223+
END::VARCHAR2(30) AS TYPE,
1224+
BACKEND_START AS LOGON_TIME,
1225+
QUERY_START AS SQL_EXEC_START,
1226+
QUERY_ID::VARCHAR2(19) AS SQL_ID,
1227+
QUERY::VARCHAR2(4000) AS SQL_TEXT,
1228+
(PG_CATALOG.PG_BLOCKING_PIDS(PID))[1]::NUMBER AS BLOCKING_SESSION,
1229+
WAIT_EVENT::VARCHAR2(64) AS EVENT,
1230+
WAIT_EVENT_TYPE::VARCHAR2(64) AS WAIT_CLASS,
1231+
XACT_START AS TRANSACTION_START,
1232+
CLIENT_PORT::NUMBER AS PORT
1233+
FROM PG_STAT_ACTIVITY;
1234+
1235+
1236+
-- V$PROCESS: USERNAME maps to the database username (pg_stat_activity.usename),
1237+
-- not the OS username as in Oracle V$PROCESS.
1238+
CREATE OR REPLACE VIEW SYS.V$PROCESS AS
1239+
SELECT
1240+
PID::NUMBER AS SPID,
1241+
USENAME::VARCHAR2(128) AS USERNAME,
1242+
APPLICATION_NAME::VARCHAR2(256) AS PROGRAM,
1243+
BACKEND_TYPE::VARCHAR2(30) AS PNAME,
1244+
CASE WHEN BACKEND_TYPE = 'client backend' THEN NULL
1245+
ELSE '1'
1246+
END::VARCHAR2(1) AS BACKGROUND
1247+
FROM PG_STAT_ACTIVITY;
1248+
1249+
CREATE OR REPLACE VIEW SYS.V$PARAMETER AS
1250+
SELECT
1251+
NAME::VARCHAR2(80) AS NAME,
1252+
CASE
1253+
WHEN VARTYPE = 'bool' THEN 1
1254+
WHEN VARTYPE = 'integer' THEN 3
1255+
ELSE 2
1256+
END::NUMBER AS TYPE,
1257+
SETTING::VARCHAR2(4000) AS VALUE,
1258+
BOOT_VAL::VARCHAR2(255) AS DEFAULT_VALUE,
1259+
-- Mapping update levels
1260+
CASE
1261+
WHEN setting IS NOT DISTINCT FROM boot_val THEN 'TRUE'
1262+
ELSE 'FALSE'
1263+
END::VARCHAR2(5) AS ISDEFAULT,
1264+
CASE
1265+
WHEN CONTEXT IN ('user', 'superuser') THEN 'TRUE'
1266+
ELSE 'FALSE'
1267+
END::VARCHAR2(5) AS ISSES_MODIFIABLE,
1268+
CASE
1269+
WHEN CONTEXT IN ('user', 'superuser','sighup') THEN 'IMMEDIATE'
1270+
WHEN CONTEXT IN ('postmaster','internal') THEN 'FALSE'
1271+
ELSE 'DEFERRED'
1272+
END::VARCHAR2(9) AS ISSYS_MODIFIABLE,
1273+
SHORT_DESC::VARCHAR2(255) AS DESCRIPTION
1274+
FROM PG_SETTINGS;
1275+

0 commit comments

Comments
 (0)