--------------------------------------------------------------------------------
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements.  See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership.  The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License.  You may obtain a copy of the License at
--
--   http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied.  See the License for the
-- specific language governing permissions and limitations
-- under the License.
--------------------------------------------------------------------------------

CREATE SCHEMA mdver_utils;
SET search_path = mdver_utils;

BEGIN;

-- Register the functions and views.
 
--------------------------------------------------------------------------------
-- @function: 
--        mdver_utils.__gp_mdver_cache_entries_f()
--
-- @in:
--
-- @out:
--        oid - Oid of versioned object
--        bigint - ddl version
--        bigint - dml version 
--------------------------------------------------------------------------------
   
CREATE FUNCTION mdver_utils.__gp_mdver_cache_entries_f()
       RETURNS RECORD 
       AS 'MODULE_PATHNAME', 'gp_mdver_cache_entries' LANGUAGE C;

--------------------------------------------------------------------------------
-- @view: 
--        mdver_utils.gp_mdver_cache_entries
--
-- @doc:
--        List of all the objects in the Global MDVSN cache and their version
--        
--------------------------------------------------------------------------------

CREATE VIEW mdver_utils.gp_mdver_cache_entries AS
SELECT C.*
		FROM mdver_utils.__gp_mdver_cache_entries_f() AS C (
		oid oid,
		ddlversion bigint,
		dmlversion bigint
        );

COMMIT;
