Steps to add a function to the catalogs
========================================

The steps listed below should be followed if a new function needs to be added 
to the catalog. For instance, if we want to add a new function, fn_sql(),
that will expose the backend function, fn_be() as a built_in function,
the following steps are needed. Note, the same set of steps need to be 
followed if adding a new type.

1. Get an unused OID by running the script unused_oids located in 
   src/include/catalog/unused_oids. Claim an unused OID. For eg, for our
   example we are claiming 5075.

2. Add the new function definition in src/include/catalog/pg_proc.sql.
   An example function definition: 
   	CREATE FUNCTION fn_sql(int4, int4) RETURNS bool LANGUAGE 
  		internal VOLATILE NO SQL AS 'fn_be' 
		WITH (OID=5075, DESCRIPTION="Description of the function");
   If adding a new type, the type definition needs to be added to pg_type.sql.

3. In src/include/catalog make pg_type.h and pg_proc.h writable 
   by opening them 
	p4 edit pg_type.h
	p4 edit pg_proc.h 
   Note, the above step needs to be done when adding a type, or a function, or both.

4. Run the following command in src/include/catalog:

   $ perl catullus.pl -procdef pg_proc.sql -prochdr pg_proc.h -typedef pg_type.sql -typehdr pg_type.h

  catullus.pl will re-generate the pg_proc.h file with the appropriate 
  DATA statement for the fn_sql function definition. If a new type 
  was being added in pg_type.sql, pg_type.h would be updated with the 
  appropriate DATA statements. 

  For more information on catullus.pl, please refer to 
  src/include/catalog/README.tidycat.

5. Since the catalogs are being modified, the catalog number in 
   src/include/catalog/catversion.h should be bumped up. This is to 
   indicate an initdb is required so the version number in the backend matches
   the version number on disk.
 
   Since catversion is bumped up, we have to regenerate the catalog json file,
   tools/bin/gppylib/data/X.X.json. Otherwise, catversion test would fail.

   $ perl tidycat.pl -dd foo.json -df json *.h

   After tidycat.pl generates foo.json, rename it with the major release version 
   and move it to tools/bin/gppylib/data/


6. Adding a new function to the catalog has an impact on upgrade. Add a new 
   entry to the appropriate upgrade script. For instance if the new function 
   was being added in 4.2, modify the 
   src/test/regress/data/upgrade42/upg2_catupgrade_42.sql.in
   script and add the following SQL to add the function, fn_sql, under
   the schema, pg_catalog, to it: 

   	CREATE FUNCTION @gpupgradeschemaname@.fn_sql(int4, int4) 
		RETURNS bool LANGUAGE internal IMMUTABLE STRICT 
		AS 'fn_be' WITH (OID=5075);
	COMMENT ON FUNCTION @gpupgradeschemaname@.fn_sql(int4, int4) 
		IS 'Description of the function';

7. Run make distclean, make, gpinitsystem and you should be able to see your 
   newly added function in pg_proc. Newly added types will be visible in
   pg_type.

8. Make sure you run and possibly repair the upgrade regression test in 
   install-chek.

9. Don't forget to checkin the generated files, pg_type.h and pg_proc.h, along
   with any modified files. 
