log_fdw--1.4--1.5.sql (65 lines of code) (raw):
/* log_fdw--1.4--1.5 */
/*
* Creates foreign table for a given server log file.
*/
CREATE OR REPLACE FUNCTION create_foreign_table_for_log_file(
table_name TEXT,
server_name TEXT,
log_file_name TEXT,
if_not_exists BOOL)
RETURNS void AS
$BODY$
DECLARE
l_exists_str text := '';
BEGIN
IF if_not_exists
THEN
l_exists_str := 'IF NOT EXISTS';
END IF;
IF $3 LIKE '%.csv' or $3 LIKE '%.csv.gz'
THEN
EXECUTE format('CREATE FOREIGN TABLE %s %I (
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
backend_type text,
leader_pid integer,
query_id bigint
) SERVER %I
OPTIONS (filename %L)',
l_exists_str, $1, $2, $3);
ELSE
EXECUTE format('CREATE FOREIGN TABLE %s %I (
log_entry text
) SERVER %I
OPTIONS (filename %L)',
l_exists_str, $1, $2, $3);
END IF;
END
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION create_foreign_table_for_log_file(
table_name TEXT,
server_name TEXT,
log_file_name TEXT)
RETURNS void
LANGUAGE sql
BEGIN ATOMIC
SELECT create_foreign_table_for_log_file(table_name, server_name, log_file_name, false);
END;