/*
 * 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.
 */
#ifndef _GP_VERSION_H_
#define _GP_VERSION_H_

#include "catalog/genbki.h"
/*
 * Defines for gp_version table
 */
#define GpVersionRelationName		"gp_version_at_initdb"

/* TIDYCAT_BEGINFAKEDEF

   CREATE TABLE gp_version_at_initdb
   with (shared=true, oid=false, relid=5003)
   (
    schemaversion   smallint ,
	productversion  text      
   );

   TIDYCAT_ENDFAKEDEF
*/


#define GpVersionRelationId 5003

CATALOG(gp_version_at_initdb,5003) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
{
	int2		schemaversion;
	text		productversion;
} FormData_gp_version;

#define Natts_gp_version				2
#define Anum_gp_version_schemaversion		1
#define Anum_gp_version_productversion		2

DATA(insert ( 2  "$$Name:  $$" ));

#endif /*_GP_VERSION_H_*/
