-- --------------------------------------
-- test first external Oid initialization
-- --------------------------------------

-- start_matchsubs
--                                                                                               
-- # create a match/subs expression to handle ip addresses that change
--
-- m/.*inserted tuple to heap table pg_class \(oid \d+, relname table_xl\).*/
-- s/oid \d+/oid SOME_OID/
--
-- m/.*deleted tuple oid=\d+ from heap table pg_class.*/
-- s/oid=\d+/oid=OID/
--
-- end_matchsubs

-- Create function that returns the first external Oid boundary
CREATE OR REPLACE FUNCTION min_external_oid() RETURNS oid
  AS '@SHARE_LIBRARY_PATH@', 'min_external_oid'
  LANGUAGE C;

-- Create function that returns the current external Oid
CREATE OR REPLACE FUNCTION get_next_external_oid() RETURNS oid
  AS '@SHARE_LIBRARY_PATH@', 'get_next_external_oid'
  LANGUAGE C;

-- Create function that sets the current external Oid
CREATE OR REPLACE FUNCTION set_next_external_oid(ext_oid oid) RETURNS oid
  AS '@SHARE_LIBRARY_PATH@', 'set_next_external_oid'
  LANGUAGE C;

-- Create function to insert and scan in-memory data to pg_class
CREATE OR REPLACE FUNCTION load_json_data(filename text) RETURNS text
  AS '@SHARE_LIBRARY_PATH@', 'load_json_data'
  LANGUAGE C;

-- Create function that inserts tuple with given Oid
CREATE OR REPLACE FUNCTION caql_insert_into_heap_pg_class(relid oid, tblname text) RETURNS text
  AS '@SHARE_LIBRARY_PATH@', 'caql_insert_into_heap_pg_class'
  LANGUAGE C;

-- Create function that inserts tuple with given Oid
CREATE OR REPLACE FUNCTION caql_delete_from_heap_pg_class(relid oid) RETURNS text
  AS '@SHARE_LIBRARY_PATH@', 'caql_delete_from_heap_pg_class'
  LANGUAGE C;

-- --------------------------------------
-- Test hcat table external oid initialization
-- --------------------------------------
-- Boundary should be at FirstExternalObjectId
--SELECT min_external_oid();
-- NextExternalObjectId is uninitialized
SELECT get_next_external_oid();
SELECT load_json_data('@abs_datadir@/single_table.json');
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;

BEGIN TRANSACTION;
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
-- load default.mytable -> +3 oids
-- 1 oid for namespace 'default', 1 oid for relation 'mytable', 1 oid for reltype
SELECT load_json_data('@abs_datadir@/single_table.json');
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
-- load db1.ht1, db2.ht1, db2.ht2 -> +8 oids
-- oids: db1, ht1(db1), db2, ht1(db2), ht2, reltype(ht1, ht1, ht2)
SELECT load_json_data('@abs_datadir@/multi_table.json');
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
END TRANSACTION;

-- New transaction will reset external Oid start point
-- Yields the same result as previous transaction
BEGIN TRANSACTION;
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
SELECT load_json_data('@abs_datadir@/single_table.json');
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
SELECT load_json_data('@abs_datadir@/multi_table.json');
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
END TRANSACTION;

-- --------------------------------------
-- Test external oid rollover
-- --------------------------------------
BEGIN TRANSACTION;
SELECT get_next_external_oid()::bigint - min_external_oid()::bigint;
SELECT set_next_external_oid( oid(min_external_oid()::bigint + (10*power(2,20))::bigint - 8 + 1) ) > 0;
SELECT load_json_data('@abs_datadir@/multi_table.json');
-- Used up external Oids result in Oid overflow
SELECT get_next_external_oid();
-- Rollover disallowed!
SELECT load_json_data('@abs_datadir@/single_table.json');
END TRANSACTION;

-- --------------------------------------
-- Test external Oid boundary
-- --------------------------------------
-- Create a tuple with Oid larger than FirstExternalObjectId
-- Will fail during next session when try to query HCatalog
-- Because external Oid boundary is violated
SELECT caql_insert_into_heap_pg_class(min_external_oid()::bigint + 20, 'table_xl');

-- cleanup
SELECT caql_delete_from_heap_pg_class(min_external_oid()::bigint + 20);

DROP FUNCTION caql_delete_from_heap_pg_class(relid oid);
DROP FUNCTION caql_insert_into_heap_pg_class(relid oid, tblname text);
DROP FUNCTION load_json_data(filename text);
DROP FUNCTION get_next_external_oid();
DROP FUNCTION set_next_external_oid(ext_oid oid);
DROP FUNCTION min_external_oid();
