Steve Singer ssinger at ca.afilias.info
Tue Jul 27 08:32:04 PDT 2010
    Merged from REL_2_0_STABLE added support for more pg versions +
    accounted for that prepareTableForCopy is in the version specific file

   - add_empty_table_to_replication will call TruncateOnlyTable instead of 'truncate' This is the behaviour this function would want.
   -adding support for v84 specific behaviour + listing 9.0 as supported.
---
 src/backend/slony1_funcs.sql     |    3 +-
 src/backend/slony1_funcs.v73.sql |   13 ++++
 src/backend/slony1_funcs.v74.sql |   14 ++++
 src/backend/slony1_funcs.v80.sql |   16 ++++-
 src/backend/slony1_funcs.v81.sql |   17 ++++-
 src/backend/slony1_funcs.v84.sql |  149 ++++++++++++++++++++++++++++++++++++++
 src/slonik/slonik.c              |   36 ++++++----
 7 files changed, 231 insertions(+), 17 deletions(-)
 create mode 100644 src/backend/slony1_funcs.v84.sql

diff --git a/src/backend/slony1_funcs.sql b/src/backend/slony1_funcs.sql
index 32b44aa..59d95f8 100644
--- a/src/backend/slony1_funcs.sql
+++ b/src/backend/slony1_funcs.sql
@@ -6092,8 +6092,7 @@ begin
 	end if;
    else
 	-- On other nodes, TRUNCATE the table
-        v_query := ''truncate '' || v_fqname || '';'';
-	execute v_query;
+		perform @NAMESPACE at .TruncateOnlyTable(v_fqname);
    end if;
 -- If p_idxname is NULL, then look up the PK index, and RAISE EXCEPTION if one does not exist
    if p_idxname is NULL then
diff --git a/src/backend/slony1_funcs.v73.sql b/src/backend/slony1_funcs.v73.sql
index 80e9366..36ec2cf 100644
--- a/src/backend/slony1_funcs.v73.sql
+++ b/src/backend/slony1_funcs.v73.sql
@@ -111,3 +111,16 @@ create or replace function @NAMESPACE at .make_function_strict (text, text) returns
 
 comment on function @NAMESPACE at .make_function_strict (text, text) is
 'Equivalent to 8.1+ ALTER FUNCTION ... STRICT';
+
+
+create or replace function @NAMESPACE at .TruncateOnlyTable ( name) returns void as
+$$
+begin
+	execute 'truncate '|| @NAMESPACE at .slon_quote_input($1);
+end;
+$$
+LANGUAGE plpgsql;
+
+
+comment on function @NAMESPACE at .TruncateOnlyTable(name) is
+'Calls TRUNCATE with out specifying ONLY, syntax supported in versions 8.3 and below';
\ No newline at end of file
diff --git a/src/backend/slony1_funcs.v74.sql b/src/backend/slony1_funcs.v74.sql
index 0ea2d24..e6ee65d 100644
--- a/src/backend/slony1_funcs.v74.sql
+++ b/src/backend/slony1_funcs.v74.sql
@@ -113,3 +113,17 @@ end
 
 comment on function @NAMESPACE at .make_function_strict (text, text) is
 'Equivalent to 8.1+ ALTER FUNCTION ... STRICT';
+
+
+
+create or replace function @NAMESPACE at .TruncateOnlyTable ( name) returns void as
+$$
+begin
+	execute 'truncate '|| @NAMESPACE at .slon_quote_input($1);
+end;
+$$
+LANGUAGE plpgsql;
+
+
+comment on function @NAMESPACE at .TruncateOnlyTable(name) is
+'Calls TRUNCATE with out specifying ONLY, syntax supported in versions 8.3 and below';
\ No newline at end of file
diff --git a/src/backend/slony1_funcs.v80.sql b/src/backend/slony1_funcs.v80.sql
index 064a109..ec623a5 100644
--- a/src/backend/slony1_funcs.v80.sql
+++ b/src/backend/slony1_funcs.v80.sql
@@ -51,7 +51,7 @@ begin
 	-- Try using truncate to empty the table and fallback to
 	-- delete on error.
 	-- ----
-	execute ''truncate '' || @NAMESPACE at .slon_quote_input(v_tab_fqname);
+	perform @NAMESPACE at .TruncateOnlyTable(v_tab_fqname);
 	raise notice ''truncate of % succeeded'', v_tab_fqname;
 	return 1;
 	exception when others then
@@ -126,3 +126,17 @@ end
 
 comment on function @NAMESPACE at .make_function_strict (text, text) is
 'Equivalent to 8.1+ ALTER FUNCTION ... STRICT';
+
+
+
+create or replace function @NAMESPACE at .TruncateOnlyTable ( name) returns void as
+$$
+begin
+	execute 'truncate '|| @NAMESPACE at .slon_quote_input($1);
+end;
+$$
+LANGUAGE plpgsql;
+
+
+comment on function @NAMESPACE at .TruncateOnlyTable(name) is
+'Calls TRUNCATE with out specifying ONLY, syntax supported in versions 8.3 and below';
\ No newline at end of file
diff --git a/src/backend/slony1_funcs.v81.sql b/src/backend/slony1_funcs.v81.sql
index d5ea13e..a5c8cb5 100644
--- a/src/backend/slony1_funcs.v81.sql
+++ b/src/backend/slony1_funcs.v81.sql
@@ -43,7 +43,7 @@ begin
 	-- Try using truncate to empty the table and fallback to
 	-- delete on error.
 	-- ----
-	execute ''truncate '' || @NAMESPACE at .slon_quote_input(v_tab_fqname);
+	perform @NAMESPACE at .TruncateOnlyTable(v_tab_fqname);
 	raise notice ''truncate of % succeeded'', v_tab_fqname;
 
 	-- ----
@@ -131,3 +131,18 @@ end
 
 comment on function @NAMESPACE at .make_function_strict (text, text) is
 'Equivalent to 8.1+ ALTER FUNCTION ... STRICT';
+
+
+
+
+create or replace function @NAMESPACE at .TruncateOnlyTable ( name) returns void as
+$$
+begin
+	execute 'truncate '|| @NAMESPACE at .slon_quote_input($1);
+end;
+$$
+LANGUAGE plpgsql;
+
+
+comment on function @NAMESPACE at .TruncateOnlyTable(name) is
+'Calls TRUNCATE with out specifying ONLY, syntax supported in versions 8.3 and below';
\ No newline at end of file
diff --git a/src/backend/slony1_funcs.v84.sql b/src/backend/slony1_funcs.v84.sql
new file mode 100644
index 0000000..669ed88
--- /dev/null
+++ b/src/backend/slony1_funcs.v84.sql
@@ -0,0 +1,149 @@
+-- ----------------------------------------------------------------------
+-- slony1_funcs.v83.sql
+--
+--    Version 8.3 specific part of the replication support functions.
+--
+--	Copyright (c) 2007-2009, PostgreSQL Global Development Group
+--	Author: Jan Wieck, Afilias USA INC.
+--
+-- $Id: slony1_funcs.v84.sql,v 1.1.2.3 2010-05-17 17:15:19 ssinger Exp $
+-- ----------------------------------------------------------------------
+
+
+-- ----------------------------------------------------------------------
+-- FUNCTION prepareTableForCopy(tab_id)
+--
+--	Remove all content from a table before the subscription
+--	content is loaded via COPY and disable index maintenance.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .prepareTableForCopy(int4)
+returns int4
+as '
+declare
+	p_tab_id		alias for $1;
+	v_tab_oid		oid;
+	v_tab_fqname	text;
+begin
+	-- ----
+	-- Get the OID and fully qualified name for the table
+	-- ---
+	select	PGC.oid,
+			@NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
+			@NAMESPACE at .slon_quote_brute(PGC.relname) as tab_fqname
+		into v_tab_oid, v_tab_fqname
+			from @NAMESPACE at .sl_table T,
+				"pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN
+				where T.tab_id = p_tab_id
+				and T.tab_reloid = PGC.oid
+				and PGC.relnamespace = PGN.oid;
+	if not found then
+		raise exception ''Table with ID % not found in sl_table'', p_tab_id;
+	end if;
+
+	-- ----
+	-- Try using truncate to empty the table and fallback to
+	-- delete on error.
+	-- ----
+	perform @NAMESPACE at .TruncateOnlyTable(v_tab_fqname);
+	raise notice ''truncate of % succeeded'', v_tab_fqname;
+
+	-- ----
+	-- Setting pg_class.relhasindex to false will cause copy not to
+	-- maintain any indexes. At the end of the copy we will reenable
+	-- them and reindex the table. This bulk creating of indexes is
+	-- faster.
+	-- ----
+	update pg_class set relhasindex = ''f'' where oid = v_tab_oid;
+
+	return 1;
+	exception when others then
+		raise notice ''truncate of % failed - doing delete'', v_tab_fqname;
+		update pg_class set relhasindex = ''f'' where oid = v_tab_oid;
+		execute ''delete from only '' || @NAMESPACE at .slon_quote_input(v_tab_fqname);
+		return 0;
+end;
+' language plpgsql;
+
+comment on function @NAMESPACE at .prepareTableForCopy(int4) is
+'Delete all data and suppress index maintenance';
+
+-- ----------------------------------------------------------------------
+-- FUNCTION finishTableAfterCopy(tab_id)
+--
+--	Reenable index maintenance and reindex the table after COPY.
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .finishTableAfterCopy(int4)
+returns int4
+as '
+declare
+	p_tab_id		alias for $1;
+	v_tab_oid		oid;
+	v_tab_fqname	text;
+begin
+	-- ----
+	-- Get the tables OID and fully qualified name
+	-- ---
+	select	PGC.oid,
+			@NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
+			@NAMESPACE at .slon_quote_brute(PGC.relname) as tab_fqname
+		into v_tab_oid, v_tab_fqname
+			from @NAMESPACE at .sl_table T,
+				"pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN
+				where T.tab_id = p_tab_id
+				and T.tab_reloid = PGC.oid
+				and PGC.relnamespace = PGN.oid;
+	if not found then
+		raise exception ''Table with ID % not found in sl_table'', p_tab_id;
+	end if;
+
+	-- ----
+	-- Reenable indexes and reindex the table.
+	-- ----
+	update pg_class set relhasindex = ''t'' where oid = v_tab_oid;
+	execute ''reindex table '' || @NAMESPACE at .slon_quote_input(v_tab_fqname);
+
+	return 1;
+end;
+' language plpgsql;
+
+comment on function @NAMESPACE at .finishTableAfterCopy(int4) is
+'Reenable index maintenance and reindex the table';
+
+create or replace function @NAMESPACE at .pre74()
+returns integer
+as 'select 0' language sql;
+
+comment on function @NAMESPACE at .pre74() is
+'Returns 1/0 based on whether or not the DB is running a
+version earlier than 7.4';
+
+create or replace function @NAMESPACE at .make_function_strict (text, text) returns void as
+'
+declare
+   fun alias for $1;
+   parms alias for $2;
+   stmt text;
+begin
+   stmt := ''ALTER FUNCTION "_ at CLUSTERNAME@".'' || fun || '' '' || parms || '' STRICT;'';
+   execute stmt;
+   return;
+end
+' language plpgsql;
+
+comment on function @NAMESPACE at .make_function_strict (text, text) is
+'Equivalent to 8.1+ ALTER FUNCTION ... STRICT';
+
+
+
+
+create or replace function @NAMESPACE at .TruncateOnlyTable ( name) returns void as
+$$
+begin
+	execute 'truncate only '|| @NAMESPACE at .slon_quote_input($1);
+end;
+$$
+LANGUAGE plpgsql;
+
+
+comment on function @NAMESPACE at .TruncateOnlyTable(name) is
+'Calls TRUNCATE with out specifying ONLY, syntax supported in versions 8.3 and below';
\ No newline at end of file
diff --git a/src/slonik/slonik.c b/src/slonik/slonik.c
index 8b4bd2d..a1e67b2 100644
--- a/src/slonik/slonik.c
+++ b/src/slonik/slonik.c
@@ -1905,15 +1905,20 @@ load_slony_base(SlonikStmt * stmt, int no_id)
 		use_major = 8;
 		use_minor = 0;
 	}
-	else if ((adminfo->pg_version >= 80100) && adminfo->pg_version < 80500)	/* 8.1, 8.2, 8.3, 8.4 */
+	else if ((adminfo->pg_version >= 80100) && adminfo->pg_version < 80400)	/* 8.1, 8.2, 8.3 */
 	{
 		use_major = 8;
 		use_minor = 1;
 	}
-	else	/* 8.5+ */
+	else if((adminfo->pg_version >= 80400) && adminfo->pg_version < 90100)	/* 8.4+ */
 	{
 		use_major = 8;
-		use_minor = 1;
+		use_minor = 4;
+	}
+	else
+	{
+		use_major=8;
+		use_minor=4;
 		printf("%s:%d: Possible unsupported PostgreSQL "
 			"version (%d) %d.%d, defaulting to 8.1 support\n",
                         stmt->stmt_filename, stmt->stmt_lno, adminfo->pg_version,
@@ -2005,20 +2010,25 @@ load_slony_functions(SlonikStmt * stmt, int no_id)
                 use_major = 8;
                 use_minor = 0;
         }
-       else if ((adminfo->pg_version >= 80100) && adminfo->pg_version < 80300)	/* 8.1 and 8.2 */
+       else if ((adminfo->pg_version >= 80100) && adminfo->pg_version < 80400)	/* 8.1 and 8.2 and 8.3*/
        {
 	       use_major = 8;
 	       use_minor = 1;
        }
-        else    /* 8.3 and above */
-        {
-                use_major = 8;
-                use_minor = 1;
-                printf("%s:%d: Possible unsupported PostgreSQL "
-                        "version %d.%d, defaulting to 8.1 support\n",
-                        stmt->stmt_filename, stmt->stmt_lno,
-                        (adminfo->pg_version/10000), ((adminfo->pg_version%10000)/100));
-        }
+	   else if  ((adminfo->pg_version >= 80400) && adminfo->pg_version < 90100)    /* 8.4 and above */
+	   {
+		   use_major = 8;
+		   use_minor = 4;
+	   }
+	   else
+	   {
+		   use_major=8;
+		   use_minor=4;
+		   printf("%s:%d: Possible unsupported PostgreSQL "
+				  "version %d.%d, defaulting to 8.1 support\n",
+				  stmt->stmt_filename, stmt->stmt_lno,
+				  (adminfo->pg_version/10000), ((adminfo->pg_version%10000)/100));
+	   }
 
 	/* Load schema, DB version specific */
 	db_notice_silent = true;
-- 
1.6.3.3


--------------090901080308090608060503--


More information about the Slony1-patches mailing list