Christopher Browne cbbrowne at ca.afilias.info
Thu Apr 5 12:13:50 PDT 2007
Here's a preliminary patch for removal of TABLE ADD KEY functionality, against CVS HEAD.

Index: src/backend/slony1_funcs.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.c,v
retrieving revision 1.57
diff -c -u -r1.57 slony1_funcs.c
--- src/backend/slony1_funcs.c	16 Jan 2007 21:40:19 -0000	1.57
+++ src/backend/slony1_funcs.c	5 Apr 2007 19:10:19 -0000
@@ -40,6 +40,11 @@
 PG_MODULE_MAGIC;
 #endif
 
+/* -- Change from PostgreSQL Ver 8.3 -- */
+#ifndef VARATT_SIZEP
+#define VARATT_SIZEP VARATT_SIZEP_DEPRECATED
+#endif
+
 PG_FUNCTION_INFO_V1(_Slony_I_createEvent);
 PG_FUNCTION_INFO_V1(_Slony_I_getLocalNodeId);
 PG_FUNCTION_INFO_V1(_Slony_I_getModuleVersion);
Index: src/backend/slony1_funcs.sql
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.106
diff -c -u -r1.106 slony1_funcs.sql
--- src/backend/slony1_funcs.sql	16 Mar 2007 14:43:29 -0000	1.106
+++ src/backend/slony1_funcs.sql	5 Apr 2007 19:10:20 -0000
@@ -4648,144 +4648,6 @@
 that are confirmed by all nodes in the whole cluster up to the last
 SYNC.  ';
 
--- ----------------------------------------------------------------------
--- FUNCTION tableAddKey (tab_fqname)
---
---	If the specified table does not have a column 
---	"_Slony-I_<clustername>_rowID", then add it as a bigint
---	with default nextval('"_<clustername>".sl_rowid_seq').
--- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .tableAddKey(text) returns text
-as '
-declare
-	p_tab_fqname	alias for $1;
-	v_tab_fqname_quoted	text default '''';
-	v_attkind		text default '''';
-	v_attrow		record;
-	v_have_serial	bool default ''f'';
-begin
-	v_tab_fqname_quoted := @NAMESPACE at .slon_quote_input(p_tab_fqname);
-	--
-	-- Loop over the attributes of this relation
-	-- and add a "v" for every user column, and a "k"
-	-- if we find the Slony-I special serial column.
-	--
-	for v_attrow in select PGA.attnum, PGA.attname
-			from "pg_catalog".pg_class PGC,
-			    "pg_catalog".pg_namespace PGN,
-				"pg_catalog".pg_attribute PGA
-			where @NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
-			    @NAMESPACE at .slon_quote_brute(PGC.relname) = v_tab_fqname_quoted
-				and PGN.oid = PGC.relnamespace
-				and PGA.attrelid = PGC.oid
-				and not PGA.attisdropped
-				and PGA.attnum > 0
-			order by attnum
-	loop
-		if v_attrow.attname = ''_Slony-I_ at CLUSTERNAME@_rowID'' then
-		    v_attkind := v_attkind || ''k'';
-			v_have_serial := ''t'';
-		else
-			v_attkind := v_attkind || ''v'';
-		end if;
-	end loop;
-	
-	--
-	-- A table must have at least one attribute, so not finding
-	-- anything means the table does not exist.
-	--
-	if not found then
-		raise exception ''Slony-I: tableAddKey(): table % not found'', v_tab_fqname_quoted;
-	end if;
-
-	--
-	-- If it does not have the special serial column, we
-	-- have to add it. This will be only half way done.
-	-- The function to add the table to the set must finish
-	-- these definitions with NOT NULL and UNIQUE after
-	-- updating all existing rows.
-	--
-	if not v_have_serial then
-		execute ''lock table '' || v_tab_fqname_quoted ||
-			'' in access exclusive mode'';
-		execute ''alter table only '' || v_tab_fqname_quoted ||
-			'' add column "_Slony-I_ at CLUSTERNAME@_rowID" bigint;'';
-		execute ''alter table only '' || v_tab_fqname_quoted ||
-			'' alter column "_Slony-I_ at CLUSTERNAME@_rowID" '' ||
-			'' set default "pg_catalog".nextval(''''@NAMESPACE at .sl_rowid_seq'''');'';
-
-		v_attkind := v_attkind || ''k'';
-	end if;
-
-	--
-	-- Return the resulting Slony-I attkind
-	--
-	return v_attkind;
-end;
-' language plpgsql;
-
-comment on function @NAMESPACE at .tableAddKey(text) is
-
-'tableAddKey (tab_fqname) - if the table has not got a column of the
-form _Slony-I_<clustername>_rowID, then add it as a bigint, defaulted
-to nextval() for a sequence created for the cluster.';
-
--- ----------------------------------------------------------------------
--- FUNCTION tableDropKey (tab_id)
---
---	If the specified table has a column 
---	"_Slony-I_<clustername>_rowID", then drop it.
--- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .tableDropKey(int4) returns int4
-as '
-declare
-	p_tab_id		alias for $1;
-	v_tab_fqname	text;
-	v_tab_oid		oid;
-begin
-	-- ----
-	-- Grab the central configuration lock
-	-- ----
-	lock table @NAMESPACE at .sl_config_lock;
-
-	-- ----
-	-- Construct the tables fully qualified name and get its oid
-	-- ----
-	select @NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
-				@NAMESPACE at .slon_quote_brute(PGC.relname),
-				PGC.oid into v_tab_fqname, v_tab_oid
-			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 ''Slony-I: tableDropKey(): table with ID % not found'', p_tab_id;
-	end if;
-
-	-- ----
-	-- Drop the special serial ID column if the table has it
-	-- ----
-	if exists (select true from "pg_catalog".pg_attribute
-			where attrelid = v_tab_oid
-				and attname = ''_Slony-I_ at CLUSTERNAME@_rowID'')
-	then
-		execute ''lock table '' || v_tab_fqname ||
-				'' in access exclusive mode'';
-		execute ''alter table '' || v_tab_fqname ||
-				'' drop column "_Slony-I_ at CLUSTERNAME@_rowID"'';
-	end if;
-
-	return p_tab_id;
-end;
-' language plpgsql;
-
-comment on function @NAMESPACE at .tableDropKey(int4) is
-'tableDropKey (tab_id)
-
-If the specified table has a column "_Slony-I_<clustername>_rowID",
-then drop it.';
 
 -- ----------------------------------------------------------------------
 -- FUNCTION determineIdxnameUnique (tab_fqname, indexname)
@@ -5021,90 +4883,6 @@
 log trigger) of the table. Use the specified unique index or the
 primary key (if indexname is NULL).';
 
--- ----------------------------------------------------------------------
--- FUNCTION determineAttKindSerial (tab_fqname)
---
---	A table was that was specified without a primary key is added
---	to the replication. Assume that tableAddKey() was called before
---	and finish the creation of the serial column. The return an
---	attkind according to that.
--- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .determineAttkindSerial(text)
-returns text
-as '
-declare
-	p_tab_fqname	alias for $1;
-	v_tab_fqname_quoted	text default '''';
-	v_attkind		text default '''';
-	v_attrow		record;
-	v_have_serial	bool default ''f'';
-begin
-	v_tab_fqname_quoted := @NAMESPACE at .slon_quote_input(p_tab_fqname);
-	--
-	-- Loop over the attributes of this relation
-	-- and add a "v" for every user column, and a "k"
-	-- if we find the Slony-I special serial column.
-	--
-	for v_attrow in select PGA.attnum, PGA.attname
-			from "pg_catalog".pg_class PGC,
-			    "pg_catalog".pg_namespace PGN,
-				"pg_catalog".pg_attribute PGA
-			where @NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
-			    @NAMESPACE at .slon_quote_brute(PGC.relname) = v_tab_fqname_quoted
-				and PGN.oid = PGC.relnamespace
-				and PGA.attrelid = PGC.oid
-				and not PGA.attisdropped
-				and PGA.attnum > 0
-			order by attnum
-	loop
-		if v_attrow.attname = ''_Slony-I_ at CLUSTERNAME@_rowID'' then
-		    v_attkind := v_attkind || ''k'';
-			v_have_serial := ''t'';
-		else
-			v_attkind := v_attkind || ''v'';
-		end if;
-	end loop;
-	
-	--
-	-- A table must have at least one attribute, so not finding
-	-- anything means the table does not exist.
-	--
-	if not found then
-		raise exception ''Slony-I: table % not found'', v_tab_fqname_quoted;
-	end if;
-
-	--
-	-- If it does not have the special serial column, we
-	-- should not have been called in the first place.
-	--
-	if not v_have_serial then
-		raise exception ''Slony-I: table % does not have the serial key'',
-				v_tab_fqname_quoted;
-	end if;
-
-	execute ''update '' || v_tab_fqname_quoted ||
-		'' set "_Slony-I_ at CLUSTERNAME@_rowID" ='' ||
-		'' "pg_catalog".nextval(''''@NAMESPACE at .sl_rowid_seq'''');'';
-	execute ''alter table only '' || v_tab_fqname_quoted ||
-		'' add unique ("_Slony-I_ at CLUSTERNAME@_rowID");'';
-	execute ''alter table only '' || v_tab_fqname_quoted ||
-		'' alter column "_Slony-I_ at CLUSTERNAME@_rowID" '' ||
-		'' set not null;'';
-
-	--
-	-- Return the resulting Slony-I attkind
-	--
-	return v_attkind;
-end;
-' language plpgsql;
-
-comment on function @NAMESPACE at .determineAttkindSerial(text) is
-'determineAttKindSerial (tab_fqname)
-
-A table was that was specified without a primary key is added to the
-replication. Assume that tableAddKey() was called before and finish
-the creation of the serial column. The return an attkind according to
-that.';
 
 -- ----------------------------------------------------------------------
 -- FUNCTION RebuildListenEntries ()
@@ -5236,41 +5014,6 @@
   'Generate a sync event if there has not been one in the requested interval, and this is a provider node.';
 
 -- ----------------------------------------------------------------------
--- FUNCTION tableHasSerialKey (tab_fqname)
---
---	Checks if a table has our special serial key column that is
---	used if the table has no natural unique constraint.
--- ----------------------------------------------------------------------
-create or replace function @NAMESPACE at .tableHasSerialKey(text) 
-returns bool
-as '
-declare
-	p_tab_fqname	alias for $1;
-	v_tab_fqname_quoted	text default '''';
-	v_attnum		int2;
-begin
-	v_tab_fqname_quoted := @NAMESPACE at .slon_quote_input(p_tab_fqname);
-	select PGA.attnum into v_attnum
-			from "pg_catalog".pg_class PGC,
-				"pg_catalog".pg_namespace PGN,
-				"pg_catalog".pg_attribute PGA
-			where @NAMESPACE at .slon_quote_brute(PGN.nspname) || ''.'' ||
-				@NAMESPACE at .slon_quote_brute(PGC.relname) = v_tab_fqname_quoted
-				and PGC.relnamespace = PGN.oid
-				and PGA.attrelid = PGC.oid
-				and PGA.attname = ''_Slony-I_ at CLUSTERNAME@_rowID''
-				and not PGA.attisdropped;
-	return found;
-end;
-' language plpgsql;
-
-comment on function @NAMESPACE at .tableHasSerialKey(text) is
-'tableHasSerialKey (tab_fqname)
-
-Checks if a table has our special serial key column that is used if
-the table has no natural unique constraint.';
-
--- ----------------------------------------------------------------------
 -- FUNCTION updateRelname (set_id, only_on_node)
 --
 --      Reset the relnames          
@@ -5808,7 +5551,7 @@
 	-- ----
 	-- Changes for 1.2
 	-- ----
-	if p_old IN (''1.0.2'', ''1.0.5'', ''1.0.6'', ''1.1.0'', ''1.1.1'', ''1.1.2'', ''1.1.3'', ''1.1.5'', ''1.1.6'', "1.1.7", "1.1.8") then
+	if p_old IN (''1.0.2'', ''1.0.5'', ''1.0.6'', ''1.1.0'', ''1.1.1'', ''1.1.2'', ''1.1.3'', ''1.1.5'', ''1.1.6'', ''1.1.7'', ''1.1.8'', ''1.1.9'') then
 		-- Add new table sl_registry
 		execute ''create table @NAMESPACE at .sl_registry (
 						reg_key			text primary key,
Index: src/slon/confoptions.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slon/confoptions.c,v
retrieving revision 1.21
diff -c -u -r1.21 confoptions.c
--- src/slon/confoptions.c	2 Feb 2007 20:24:16 -0000	1.21
+++ src/slon/confoptions.c	5 Apr 2007 19:10:20 -0000
@@ -21,7 +21,316 @@
 double		real_placeholder;
 char	   *string_placeholder;
 
+static struct config_int ConfigureNamesInt[] =
+{
+	{
+		{
+			(const char *)"vac_frequency",		/* conf name */
+			gettext_noop("Sets how many cleanup cycles to run before a vacuum is done"),		/* short desc */
+			gettext_noop("Sets how many cleanup cycles to run before a vacuum is done"),		/* long desc */
+			SLON_C_INT			/* config type */
+		},
+		&vac_frequency,			/* var name */
+		3,						/* default val */
+		0,						/* min val */
+		100						/* max val */
+	},
+	{
+		{
+			(const char *)"log_level",
+			gettext_noop("debug log level"),
+			gettext_noop("debug log level"),
+			SLON_C_INT
+		},
+		&slon_log_level,
+		2,
+		0,
+		4
+	},
+	{
+		{
+			(const char *)"sync_interval",
+			gettext_noop("sync event interval"),
+			gettext_noop("sync event interval in ms"),
+			SLON_C_INT
+		},
+		&sync_interval,
+		2000,
+		10,
+		60000
+	},
+	{
+		{
+			(const char *)"sync_interval_timeout",
+			gettext_noop("sync interval time out"),
+			gettext_noop("sync interval time out"),
+			SLON_C_INT
+		},
+		&sync_interval_timeout,
+		10000,
+		0,
+		1200000
+	},
+	{
+		{
+			(const char *)"sync_group_maxsize",
+			gettext_noop("sync group"),
+			gettext_noop("sync group"),
+			SLON_C_INT
+		},
+		&sync_group_maxsize,
+		20,
+		0,
+		10000
+	},
+	{
+		{
+			(const char *)"desired_sync_time",
+			gettext_noop("maximum time planned for grouped SYNCs"),
+			gettext_noop("If replication is behind, slon will try to increase numbers of "
+			  "syncs done targetting that they should take this quantity of "
+						 "time to process"),
+			SLON_C_INT
+		},
+		&desired_sync_time,
+		60000,
+		0,
+		6000000
+	},
+#ifdef HAVE_SYSLOG
+	{
+		{
+			(const char *)"syslog",
+			gettext_noop("Uses syslog for logging."),
+			gettext_noop("If this parameter is 1, messages go both to syslog "
+						 "and the standard output. A value of 2 sends output only to syslog. "
+			"(Some messages will still go to the standard output/error.) The "
+						 "default is 0, which means syslog is off."),
+			SLON_C_INT
+		},
+		&Use_syslog,
+		0,
+		0,
+		2
+	},
+#endif
+	{
+		{
+			(const char *)"quit_sync_provider",
+			gettext_noop("Node to watch for a final SYNC"),
+			gettext_noop("We want to terminate slon when the worker thread reaches a certain SYNC number "
+					"against a certain provider.  This is the provider... "),
+			SLON_C_INT
+		},
+		&quit_sync_provider,
+		0,
+		0,
+		2147483647
+	},
+	{
+		{
+			(const char *)"quit_sync_finalsync",
+			gettext_noop("SYNC number at which slon should abort"),
+			gettext_noop("We want to terminate slon when the worker thread reaches a certain SYNC number "
+				 "against a certain provider.  This is the SYNC number... "),
+			SLON_C_INT
+		},
+		&quit_sync_finalsync,
+		0,
+		0,
+		2147483647
+	},
+	{
+		{
+			(const char *)"sync_max_rowsize",		/* conf name */
+			gettext_noop("sl_log_? rows larger than that are read separately"),		/* short desc */
+			gettext_noop("sl_log_? rows larger than that are read separately"),		/* long desc */
+			SLON_C_INT			/* config type */
+		},
+		&sync_max_rowsize,			/* var name */
+		8192,						/* default val */
+		1024,						/* min val */
+		32768						/* max val */
+	},
+	{
+		{
+			(const char *)"sync_max_largemem",		/* conf name */
+			gettext_noop("How much memory to allow for sl_log_? rows exceeding sync_max_rowsize"),		/* short desc */
+			gettext_noop("How much memory to allow for sl_log_? rows exceeding sync_max_rowsize"),		/* long desc */
+			SLON_C_INT			/* config type */
+		},
+		&sync_max_largemem,			/* var name */
+		5242880,					/* default val */
+		1048576,					/* min val */
+		1073741824					/* max val */
+	},
+	{{0}}
+};
 
+static struct config_bool ConfigureNamesBool[] =
+{
+	{
+		{
+			(const char *)"log_pid",	/* conf name */
+			gettext_noop("place holder"),		/* short desc */
+			gettext_noop("place holder"),		/* long desc */
+			SLON_C_BOOL			/* config type */
+		},
+		&logpid,				/* var_name */
+		false					/* default_value */
+	},
+	{
+		{
+			(const char *)"log_timestamp",
+			gettext_noop("place holder"),
+			gettext_noop("place holder"),
+			SLON_C_BOOL
+		},
+		&logtimestamp,
+		true
+	},
+
+	{{0}}
+};
+
+static struct config_real ConfigureNamesReal[] =
+{
+	{
+		{
+			(const char *)"real_placeholder",	/* conf name */
+			gettext_noop("place holder"),		/* short desc */
+			gettext_noop("place holder"),		/* long desc */
+			SLON_C_REAL			/* config type */
+		},
+		&real_placeholder,		/* var_name */
+		0.0,					/* default val */
+		0.0,					/* min_value */
+		1.0						/* max value */
+	},
+	{{0}}
+};
+
+static struct config_string ConfigureNamesString[] =
+{
+	{
+		{
+			(const char *)"cluster_name",		/* conf name */
+			gettext_noop("Name of the replication cluster"),	/* short desc */
+			NULL,				/* long desc */
+			SLON_C_STRING		/* config type */
+		},
+		&rtcfg_cluster_name,	/* var_name */
+		NULL					/* default value */
+	},
+	{
+		{
+			(const char *)"conn_info",
+			gettext_noop("connection info string"),
+			NULL,
+			SLON_C_STRING
+		},
+		&rtcfg_conninfo,
+		NULL
+	},
+	{
+		{
+			(const char *)"pid_file",
+			gettext_noop("Where to write the pid file"),
+			NULL,
+			SLON_C_STRING
+		},
+		&pid_file,
+		NULL
+	},
+	{
+		{
+			(const char *)"log_timestamp_format",
+			gettext_noop("A strftime()-style log timestamp format string."),
+			NULL,
+			SLON_C_STRING
+		},
+		&log_timestamp_format,
+		"%Y-%m-%d %H:%M:%S %Z"
+	},
+	{
+		{
+			(const char *)"archive_dir",
+			gettext_noop("Where to drop the sync archive files"),
+			NULL,
+			SLON_C_STRING
+		},
+		&archive_dir,
+		NULL
+	},
+	{
+		{
+			(const char *)"sql_on_connection",
+			gettext_noop("SQL to send to each connected node upon "
+						 "connection establishment, useful to enable "
+						 "duration logging, or to adjust any other "
+						 "connection settable GUC"),
+			NULL,
+			SLON_C_STRING
+		},
+		&sql_on_connection,
+		NULL
+	},
+
+
+	{
+		{
+			(const char *)"lag_interval",
+			gettext_noop("A PostgreSQL value compatible with ::interval "
+						 "which indicates how far behind this node should "
+						 "lag its providers."),
+			NULL,
+			SLON_C_STRING
+		},
+		&lag_interval,
+		NULL
+	},
+
+	{
+		{
+			(const char *)"command_on_logarchive",
+			gettext_noop("Command to run (probably a shell script) "
+				     "every time a log archive is committed. "
+				     "This command will be passed one parameter: "
+				     "The full pathname of the archive file"
+				),
+			NULL,
+			SLON_C_STRING
+		},
+		&command_on_logarchive,
+		NULL
+	},
+
+
+#ifdef HAVE_SYSLOG
+	{
+		{
+			(const char *)"syslog_facility",
+			gettext_noop("Sets the syslog \"facility\" to be used when syslog enabled."),
+			gettext_noop("Valid values are LOCAL0, LOCAL1, LOCAL2, LOCAL3, "
+						 "LOCAL4, LOCAL5, LOCAL6, LOCAL7."),
+			SLON_C_STRING
+		},
+		&Syslog_facility,
+		"LOCAL0"
+	},
+	{
+		{
+			(const char *)"syslog_ident",
+			gettext_noop("Sets the program name used to identify slon messages in syslog."),
+			NULL,
+			SLON_C_STRING
+		},
+		&Syslog_ident,
+		"slon"
+	},
+#endif
+	{{0}}
+};
 
 void
 build_conf_variables(void)
Index: src/slon/confoptions.h
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slon/confoptions.h,v
retrieving revision 1.33
diff -c -u -r1.33 confoptions.h
--- src/slon/confoptions.h	6 Feb 2007 21:04:27 -0000	1.33
+++ src/slon/confoptions.h	5 Apr 2007 19:10:20 -0000
@@ -98,13 +98,6 @@
 				const char *default_val;
 };
 
-
-
-static struct config_int ConfigureNamesInt[];
-static struct config_bool ConfigureNamesBool[];
-static struct config_real ConfigureNamesReal[];
-static struct config_string ConfigureNamesString[];
-
 #endif
 /*
  * Local Variables:
Index: src/slon/misc.h
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slon/misc.h,v
retrieving revision 1.8
diff -c -u -r1.8 misc.h
--- src/slon/misc.h	27 Oct 2006 20:10:57 -0000	1.8
+++ src/slon/misc.h	5 Apr 2007 19:10:20 -0000
@@ -34,6 +34,13 @@
 #undef send
 #endif
 
+/* Adjustment windows */
+#ifdef WIN32
+#define sleep(x) Sleep(x*1000)
+#define strtoll(x,y,z) (__int64) strtol(x,y,z)
+#define strncasecmp(x,y,z)	strnicmp(x,y,z)
+#endif
+
 /*
  * Local Variables:
  *	tab-width: 4
Index: src/slon/remote_worker.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slon/remote_worker.c,v
retrieving revision 1.135
diff -c -u -r1.135 remote_worker.c
--- src/slon/remote_worker.c	14 Mar 2007 15:55:06 -0000	1.135
+++ src/slon/remote_worker.c	5 Apr 2007 19:10:20 -0000
@@ -2659,90 +2659,22 @@
 				 "prepare to copy table %s\n",
 				 node->no_id, tab_fqname);
 
-		/*
-		 * Find out if the table we're copying has the special slony serial
-		 * number key on the provider DB
-		 */
-		slon_mkquery(&query1,
-					 "select %s.tableHasSerialKey('%q');",
-					 rtcfg_namespace, tab_fqname);
-		res2 = PQexec(pro_dbconn, dstring_data(&query1));
+		slon_mkquery(&query3, "select * from %s limit 0;",
+			     tab_fqname);
+		res2 = PQexec(loc_dbconn, dstring_data(&query3));
 		if (PQresultStatus(res2) != PGRES_TUPLES_OK)
 		{
-			slon_log(SLON_ERROR, "remoteWorkerThread_%d: \"%s\" %s",
-					 node->no_id, dstring_data(&query1),
-					 PQresultErrorMessage(res2));
+			slon_log(SLON_ERROR, "remoteWorkerThread_%d: Could not find table %s "
+				 "on subscriber\n", node->no_id, tab_fqname);
 			PQclear(res2);
 			PQclear(res1);
 			slon_disconnectdb(pro_conn);
 			dstring_free(&query1);
-			dstring_free(&query2);
 			dstring_free(&query3);
-			dstring_free(&lsquery);
-			dstring_free(&indexregenquery);
 			archive_terminate(node);
 			return -1;
 		}
-		rc = *PQgetvalue(res2, 0, 0) == 't';
 		PQclear(res2);
-
-		if (rc)
-		{
-			/*
-			 * It has, check if the table has this on the local DB too.
-			 */
-			slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-					 "table %s will require Slony-I serial key\n",
-					 node->no_id, tab_fqname);
-			res2 = PQexec(loc_dbconn, dstring_data(&query1));
-			if (PQresultStatus(res2) != PGRES_TUPLES_OK)
-			{
-				slon_log(SLON_ERROR, "remoteWorkerThread_%d: \"%s\" %s",
-						 node->no_id, dstring_data(&query1),
-						 PQresultErrorMessage(res2));
-				PQclear(res2);
-				PQclear(res1);
-				slon_disconnectdb(pro_conn);
-				dstring_free(&query1);
-				dstring_free(&query2);
-				dstring_free(&query3);
-				dstring_free(&lsquery);
-				dstring_free(&indexregenquery);
-				archive_terminate(node);
-				return -1;
-			}
-			rc = *PQgetvalue(res2, 0, 0) == 't';
-			PQclear(res2);
-
-			if (!rc)
-			{
-				slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-						 "table %s Slony-I serial key to be added local\n",
-						 node->no_id, tab_fqname);
-			}
-		}
-		else
-		{
-			slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-					 "table %s does not require Slony-I serial key\n",
-					 node->no_id, tab_fqname);
-			slon_mkquery(&query3, "select * from %s limit 0;",
-						 tab_fqname);
-			res2 = PQexec(loc_dbconn, dstring_data(&query3));
-			if (PQresultStatus(res2) != PGRES_TUPLES_OK)
-			{
-				slon_log(SLON_ERROR, "remoteWorkerThread_%d: Could not find table %s "
-						 "on subscriber\n", node->no_id, tab_fqname);
-				PQclear(res2);
-				PQclear(res1);
-				slon_disconnectdb(pro_conn);
-				dstring_free(&query1);
-				dstring_free(&query3);
-				archive_terminate(node);
-				return -1;
-			}
-			PQclear(res2);
-		}
 		/* Request an exclusive lock on each table
 
 		   We do this immediately so that we don't get stuck
@@ -2890,102 +2822,6 @@
 				 node->no_id, tab_fqname);
 
 		/*
-		 * Find out if the table we're copying has the special slony serial
-		 * number key on the provider DB
-		 */
-		slon_mkquery(&query1,
-					 "select %s.tableHasSerialKey('%q');",
-					 rtcfg_namespace, tab_fqname);
-		res2 = PQexec(pro_dbconn, dstring_data(&query1));
-		if (PQresultStatus(res2) != PGRES_TUPLES_OK)
-		{
-			slon_log(SLON_ERROR, "remoteWorkerThread_%d: \"%s\" %s",
-					 node->no_id, dstring_data(&query1),
-					 PQresultErrorMessage(res2));
-			PQclear(res2);
-			PQclear(res1);
-			slon_disconnectdb(pro_conn);
-			dstring_free(&query1);
-			dstring_free(&query2);
-			dstring_free(&query3);
-			dstring_free(&lsquery);
-			dstring_free(&indexregenquery);
-			archive_terminate(node);
-			return -1;
-		}
-		rc = *PQgetvalue(res2, 0, 0) == 't';
-		PQclear(res2);
-
-		if (rc)
-		{
-			/*
-			 * It has, check if the table has this on the local DB too.
-			 */
-			slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-					 "table %s requires Slony-I serial key\n",
-					 node->no_id, tab_fqname);
-			res2 = PQexec(loc_dbconn, dstring_data(&query1));
-			if (PQresultStatus(res2) != PGRES_TUPLES_OK)
-			{
-				slon_log(SLON_ERROR, "remoteWorkerThread_%d: \"%s\" %s",
-						 node->no_id, dstring_data(&query1),
-						 PQresultErrorMessage(res2));
-				PQclear(res2);
-				PQclear(res1);
-				slon_disconnectdb(pro_conn);
-				dstring_free(&query1);
-				dstring_free(&query2);
-				dstring_free(&query3);
-				dstring_free(&lsquery);
-				dstring_free(&indexregenquery);
-				archive_terminate(node);
-				return -1;
-			}
-			rc = *PQgetvalue(res2, 0, 0) == 't';
-			PQclear(res2);
-
-			if (!rc)
-			{
-				/*
-				 * Nope, so we gotta add the key here.
-				 */
-				slon_mkquery(&query1,
-							 "select %s.tableAddKey('%q'); "
-							 "select %s.determineAttkindSerial('%q'); ",
-							 rtcfg_namespace, tab_fqname,
-							 rtcfg_namespace, tab_fqname);
-				if (query_execute(node, loc_dbconn, &query1) < 0)
-				{
-					PQclear(res1);
-					slon_disconnectdb(pro_conn);
-					dstring_free(&query1);
-					dstring_free(&query2);
-					dstring_free(&query3);
-					dstring_free(&lsquery);
-					dstring_free(&indexregenquery);
-					archive_terminate(node);
-					return -1;
-				}
-				slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-						 "table %s Slony-I serial key added local\n",
-						 node->no_id, tab_fqname);
-			}
-			else
-			{
-				slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-						 "local table %s already has Slony-I serial key\n",
-						 node->no_id, tab_fqname);
-			}
-		}
-		else
-		{
-			slon_log(SLON_DEBUG3, "remoteWorkerThread_%d: "
-					 "table %s does not require Slony-I serial key\n",
-					 node->no_id, tab_fqname);
-		}
-
-
-		/*
 		 * Call the setAddTable_int() stored procedure. Up to now, while we
 		 * have not been subscribed to the set, this should have been
 		 * suppressed.
Index: src/slonik/dbutil.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/dbutil.c,v
retrieving revision 1.12
diff -c -u -r1.12 dbutil.c
--- src/slonik/dbutil.c	28 Jun 2006 04:47:14 -0000	1.12
+++ src/slonik/dbutil.c	5 Apr 2007 19:10:20 -0000
@@ -11,10 +11,10 @@
  */
 
 
+#ifndef WIN32
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
-#ifndef WIN32
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
Index: src/slonik/parser.y
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/parser.y,v
retrieving revision 1.27
diff -c -u -r1.27 parser.y
--- src/slonik/parser.y	31 Oct 2006 22:09:40 -0000	1.27
+++ src/slonik/parser.y	5 Apr 2007 19:10:20 -0000
@@ -41,7 +41,6 @@
 	O_RECEIVER,
 	O_SECONDS,
 	O_SERVER,
-	O_SER_KEY,
 	O_SET_ID,
 	O_SPOOLNODE,
 	O_TAB_ID,
@@ -148,7 +147,6 @@
 %type <statement>	stmt_set_drop_sequence
 %type <statement>	stmt_set_move_table
 %type <statement>	stmt_set_move_sequence
-%type <statement>	stmt_table_add_key
 %type <statement>	stmt_store_trigger
 %type <statement>	stmt_drop_trigger
 %type <statement>	stmt_subscribe_set
@@ -226,7 +224,6 @@
 %token	K_SCRIPT
 %token  K_SECONDS
 %token	K_SEQUENCE
-%token	K_SERIAL
 %token	K_SERVER
 %token	K_SET
 %token	K_SPOOLNODE
@@ -448,8 +445,6 @@
 						{ $$ = $1; }
 					| stmt_merge_set
 						{ $$ = $1; }
-					| stmt_table_add_key
-						{ $$ = $1; }
 					| stmt_set_add_table
 						{ $$ = $1; }
 					| stmt_set_add_sequence
@@ -919,33 +914,6 @@
 					}
 					;
 
-stmt_table_add_key	: lno K_TABLE K_ADD K_KEY option_list
-					{
-						SlonikStmt_table_add_key *new;
-						statement_option opt[] = {
-							STMT_OPTION_INT( O_NODE_ID, -1 ),
-							STMT_OPTION_STR( O_FQNAME, NULL ),
-							STMT_OPTION_END
-						};
-
-						new = (SlonikStmt_table_add_key *)
-								malloc(sizeof(SlonikStmt_table_add_key));
-						memset(new, 0, sizeof(SlonikStmt_table_add_key));
-						new->hdr.stmt_type		= STMT_TABLE_ADD_KEY;
-						new->hdr.stmt_filename	= current_file;
-						new->hdr.stmt_lno		= $1;
-
-						if (assign_options(opt, $5) == 0)
-						{
-							new->no_id			= opt[0].ival;
-							new->tab_fqname		= opt[1].str;
-						}
-						else
-							parser_errors++;
-
-						$$ = (SlonikStmt *)new;
-					}
-					;
 
 stmt_set_add_table	: lno K_SET K_ADD K_TABLE option_list
 					{
@@ -956,7 +924,6 @@
 							STMT_OPTION_INT( O_ID, -1 ),
 							STMT_OPTION_STR( O_FQNAME, NULL ),
 							STMT_OPTION_STR( O_USE_KEY, NULL ),
-							STMT_OPTION_INT( O_SER_KEY, 0 ),
 							STMT_OPTION_STR( O_COMMENT, NULL ),
 							STMT_OPTION_END
 						};
@@ -975,8 +942,7 @@
 							new->tab_id			= opt[2].ival;
 							new->tab_fqname		= opt[3].str;
 							new->use_key		= opt[4].str;
-							new->use_serial		= opt[5].ival;
-							new->tab_comment	= opt[6].str;
+							new->tab_comment	= opt[5].str;
 						}
 						else
 							parser_errors++;
@@ -1653,19 +1619,6 @@
 						$3->opt_code	= O_USE_KEY;
 						$$ = $3;
 					}
-					| K_KEY '=' K_SERIAL
-					{
-						option_list *new;
-						new = (option_list *)malloc(sizeof(option_list));
-
-						new->opt_code	= O_SER_KEY;
-						new->ival	= 1;
-						new->str	= NULL;
-						new->lineno	= yylineno;
-						new->next	= NULL;
-
-						$$ = new;
-					}
 					| K_FORWARD '=' option_item_yn
 					{
 						$3->opt_code	= O_FORWARD;
@@ -1867,7 +1820,6 @@
 		case O_RECEIVER:		return "receiver";
     	case O_SECONDS:         return "seconds";
 		case O_SERVER:			return "server";
-		case O_SER_KEY:			return "key";
 		case O_SET_ID:			return "set id";
 		case O_SPOOLNODE:		return "spoolnode";
 		case O_TAB_ID:			return "table id";
Index: src/slonik/slonik.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.74
diff -c -u -r1.74 slonik.c
--- src/slonik/slonik.c	16 Mar 2007 22:38:01 -0000	1.74
+++ src/slonik/slonik.c	5 Apr 2007 19:10:21 -0000
@@ -11,22 +11,21 @@
  */
 
 
+#ifndef WIN32
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
-#ifndef WIN32
 #include <unistd.h>
 #include <fcntl.h>
 #include <ctype.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <errno.h>
+#include <time.h>
 #else
 #define sleep(x) Sleep(x*1000)
 #define vsnprintf _vsnprintf
-#define INT64_FORMAT "%I64d"
 #endif
-#include <errno.h>
-#include <time.h>
 
 #include "postgres.h"
 #include "libpq-fe.h"
@@ -554,15 +553,6 @@
 							   hdr->stmt_filename, hdr->stmt_lno);
 						errors++;
 					}
-					if (stmt->use_serial && stmt->use_key != NULL)
-					{
-						printf("%s:%d: Error: "
-							   "unique key name or SERIAL are "
-							   "mutually exclusive\n",
-							   hdr->stmt_filename, hdr->stmt_lno);
-						errors++;
-					}
-
 					if (stmt->tab_comment == NULL)
 						stmt->tab_comment = strdup(stmt->tab_fqname);
 				}
@@ -777,40 +767,6 @@
 				}
 				break;
 
-			case STMT_TABLE_ADD_KEY:
-				{
-					SlonikStmt_table_add_key *stmt =
-					(SlonikStmt_table_add_key *) hdr;
-
-					/*
-					 * Check that we have the node id and that we can reach
-					 * it.
-					 */
-					if (stmt->no_id < 0)
-					{
-						printf("%s:%d: Error: "
-							   "node id must be specified\n",
-							   hdr->stmt_filename, hdr->stmt_lno);
-						errors++;
-					}
-					else
-					{
-						if (script_check_adminfo(hdr, stmt->no_id) < 0)
-							errors++;
-					}
-
-					/*
-					 * Check that we have the table name
-					 */
-					if (stmt->tab_fqname == NULL)
-					{
-						printf("%s:%d: Error: "
-							   "table FQ-name must be specified\n",
-							   hdr->stmt_filename, hdr->stmt_lno);
-						errors++;
-					}
-				}
-				break;
 
 			case STMT_STORE_TRIGGER:
 				{
@@ -1446,16 +1402,6 @@
 				}
 				break;
 
-			case STMT_TABLE_ADD_KEY:
-				{
-					SlonikStmt_table_add_key *stmt =
-					(SlonikStmt_table_add_key *) hdr;
-
-					if (slonik_table_add_key(stmt) < 0)
-						errors++;
-				}
-				break;
-
 			case STMT_STORE_TRIGGER:
 				{
 					SlonikStmt_store_trigger *stmt =
@@ -3315,35 +3261,19 @@
 
 	dstring_init(&query);
 
-	/*
-	 * Determine the attkind of the table. The stored procedure for KEY =
-	 * SERIAL might actually add a bigserial column to the table.
-	 */
-	if (stmt->use_serial)
+	if (stmt->use_key == NULL)
 	{
 		slon_mkquery(&query,
-					 "select \"_%s\".determineIdxnameSerial('%q'), "
-					 "       \"_%s\".determineAttKindSerial('%q'); ",
-					 stmt->hdr.script->clustername, stmt->tab_fqname,
-					 stmt->hdr.script->clustername, stmt->tab_fqname);
+			     "select \"_%s\".determineIdxnameUnique('%q', NULL); ",
+			     stmt->hdr.script->clustername, stmt->tab_fqname);
 
 	}
 	else
 	{
-		if (stmt->use_key == NULL)
-		{
-			slon_mkquery(&query,
-					   "select \"_%s\".determineIdxnameUnique('%q', NULL); ",
-						 stmt->hdr.script->clustername, stmt->tab_fqname);
-
-		}
-		else
-		{
-			slon_mkquery(&query,
-					   "select \"_%s\".determineIdxnameUnique('%q', '%q'); ",
-						 stmt->hdr.script->clustername,
-						 stmt->tab_fqname, stmt->use_key);
-		}
+		slon_mkquery(&query,
+			     "select \"_%s\".determineIdxnameUnique('%q', '%q'); ",
+			     stmt->hdr.script->clustername,
+			     stmt->tab_fqname, stmt->use_key);
 	}
 
 	db_notice_silent = true;
@@ -3531,43 +3461,6 @@
 	return 0;
 }
 
-
-int
-slonik_table_add_key(SlonikStmt_table_add_key * stmt)
-{
-	SlonikAdmInfo *adminfo1;
-	SlonDString query;
-
-	adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_id);
-	if (adminfo1 == NULL)
-		return -1;
-
-	if (db_begin_xact((SlonikStmt *) stmt, adminfo1) < 0)
-		return -1;
-
-	dstring_init(&query);
-
-	/*
-	 * call tableAddKey()
-	 */
-	db_notice_silent = true;
-	slon_mkquery(&query,
-				 "select \"_%s\".tableAddKey('%q'); ",
-				 stmt->hdr.script->clustername,
-				 stmt->tab_fqname);
-	if (db_exec_command((SlonikStmt *) stmt, adminfo1, &query) < 0)
-	{
-		db_notice_silent = false;
-		dstring_free(&query);
-		return -1;
-	}
-	db_notice_silent = false;
-
-	dstring_free(&query);
-	return 0;
-}
-
-
 int
 slonik_store_trigger(SlonikStmt_store_trigger * stmt)
 {
Index: src/slonik/slonik.h
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.h,v
retrieving revision 1.29
diff -c -u -r1.29 slonik.h
--- src/slonik/slonik.h	31 Oct 2006 22:09:40 -0000	1.29
+++ src/slonik/slonik.h	5 Apr 2007 19:10:21 -0000
@@ -37,7 +37,6 @@
 typedef struct SlonikStmt_set_drop_sequence_s SlonikStmt_set_drop_sequence;
 typedef struct SlonikStmt_set_move_table_s SlonikStmt_set_move_table;
 typedef struct SlonikStmt_set_move_sequence_s SlonikStmt_set_move_sequence;
-typedef struct SlonikStmt_table_add_key_s SlonikStmt_table_add_key;
 typedef struct SlonikStmt_store_trigger_s SlonikStmt_store_trigger;
 typedef struct SlonikStmt_drop_trigger_s SlonikStmt_drop_trigger;
 typedef struct SlonikStmt_subscribe_set_s SlonikStmt_subscribe_set;
@@ -82,7 +81,6 @@
 	STMT_STORE_PATH,
 	STMT_STORE_TRIGGER,
 	STMT_SUBSCRIBE_SET,
-	STMT_TABLE_ADD_KEY,
 	STMT_UNINSTALL_NODE,
 	STMT_UNLOCK_SET,
 	STMT_UNSUBSCRIBE_SET,
@@ -279,7 +277,6 @@
 	int			set_id;
 	int			set_origin;
 	int			tab_id;
-	int			use_serial;
 	char	   *use_key;
 	char	   *tab_fqname;
 	char	   *tab_comment;
@@ -331,14 +328,6 @@
 };
 
 
-struct SlonikStmt_table_add_key_s
-{
-	SlonikStmt	hdr;
-	int			no_id;
-	char	   *tab_fqname;
-};
-
-
 struct SlonikStmt_store_trigger_s
 {
 	SlonikStmt	hdr;
@@ -558,7 +547,6 @@
 extern int	slonik_set_drop_sequence(SlonikStmt_set_drop_sequence * stmt);
 extern int	slonik_set_move_table(SlonikStmt_set_move_table * stmt);
 extern int	slonik_set_move_sequence(SlonikStmt_set_move_sequence * stmt);
-extern int	slonik_table_add_key(SlonikStmt_table_add_key * stmt);
 extern int	slonik_store_trigger(SlonikStmt_store_trigger * stmt);
 extern int	slonik_drop_trigger(SlonikStmt_drop_trigger * stmt);
 extern int	slonik_subscribe_set(SlonikStmt_subscribe_set * stmt);
Index: tests/test1/init_add_tables.ik
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/tests/test1/init_add_tables.ik,v
retrieving revision 1.8
diff -c -u -r1.8 init_add_tables.ik
--- tests/test1/init_add_tables.ik	4 Aug 2006 20:06:24 -0000	1.8
+++ tests/test1/init_add_tables.ik	5 Apr 2007 19:10:21 -0000
@@ -1,16 +1,13 @@
 set add table (id=1, set id=1, origin=1, fully qualified name = 'public.table1', comment='accounts table');
 set add table (id=2, set id=1, origin=1, fully qualified name = 'public.table2', key='table2_id_key');
 
-table add key (node id = 1, fully qualified name = 'public.table3');
-set add table (id=3, set id=1, origin=1, fully qualified name = 'public.table3', key = SERIAL);
-
 try {
-   set add table (id=4, set id=1, origin=1, fully qualified name = 'public.table4', key = 'no_good_candidate_pk', comment='bad table - table 4');
+   set add table (id=3, set id=1, origin=1, fully qualified name = 'public.table3', key = 'no_good_candidate_pk', comment='bad table - table 3');
 } on error {
-   echo 'Tried to replicate table4 with no good candidate PK - rejected';
+   echo 'Tried to replicate table3 with no good candidate PK - rejected';
 } on success {
-   echo 'Tried to replicate table4 with no good candidate PK - accepted';
+   echo 'Tried to replicate table3 with no good candidate PK - accepted';
    exit 1;
 }
 
-set add table (id=4, set id=1, origin=1, fully qualified name = 'public.table5', comment='a table of many types');
\ No newline at end of file
+set add table (id=4, set id=1, origin=1, fully qualified name = 'public.table4', comment='a table of many types');
\ No newline at end of file
Index: tests/test1/init_data.sql
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/tests/test1/init_data.sql,v
retrieving revision 1.2
diff -c -u -r1.2 init_data.sql
--- tests/test1/init_data.sql	4 Aug 2006 20:06:24 -0000	1.2
+++ tests/test1/init_data.sql	5 Apr 2007 19:10:21 -0000
@@ -2,9 +2,7 @@
 INSERT INTO table1(data) VALUES ('placeholder 2');
 INSERT INTO table2(table1_id,data) VALUES (1,'placeholder 1');
 INSERT INTO table2(table1_id,data) VALUES (2,'placeholder 2');
-INSERT INTO table3(table2_id) VALUES (1);
-INSERT INTO table3(table2_id) VALUES (2);
 
-INSERT INTO table5(numcol,realcol,ptcol,pathcol,polycol,circcol,ipcol,maccol,bitcol) values ('74.0','7.40','(7,4)','((7,7),(4,4),(0,0),(7,0))','((7,4),(0,7),(4,0),(0,4))','<(7,4),0>','192.168.7.40','08:00:2d:07:04:00',X'740');
+INSERT INTO table4(numcol,realcol,ptcol,pathcol,polycol,circcol,ipcol,maccol,bitcol) values ('74.0','7.40','(7,4)','((7,7),(4,4),(0,0),(7,0))','((7,4),(0,7),(4,0),(0,4))','<(7,4),0>','192.168.7.40','08:00:2d:07:04:00',X'740');
 
-INSERT INTO table5(numcol,realcol,ptcol,pathcol,polycol,circcol,ipcol,maccol,bitcol) values ('93.1','9.31','(9,3)','((9,9),(3,3),(1,1),(9,1))','((9,3),(1,9),(3,1),(1,3))','<(9,3),1>','192.168.9.31','08:00:2d:09:03:01',X'931');
\ No newline at end of file
+INSERT INTO table4(numcol,realcol,ptcol,pathcol,polycol,circcol,ipcol,maccol,bitcol) values ('93.1','9.31','(9,3)','((9,9),(3,3),(1,1),(9,1))','((9,3),(1,9),(3,1),(1,3))','<(9,3),1>','192.168.9.31','08:00:2d:09:03:01',X'931');
\ No newline at end of file
Index: tests/test1/init_schema.sql
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/tests/test1/init_schema.sql,v
retrieving revision 1.5
diff -c -u -r1.5 init_schema.sql
--- tests/test1/init_schema.sql	4 Aug 2006 20:06:24 -0000	1.5
+++ tests/test1/init_schema.sql	5 Apr 2007 19:10:21 -0000
@@ -10,23 +10,14 @@
   data		TEXT
 );
 
-CREATE TABLE table3(
-  id		SERIAL,
-  table2_id	INT4		REFERENCES table2(id)
-					ON UPDATE SET NULL ON DELETE SET NULL,
-  mod_date	TIMESTAMPTZ	NOT NULL DEFAULT now(),
-  data		FLOAT		NOT NULL DEFAULT random()
-  CONSTRAINT table3_date_check	CHECK (mod_date <= now())
-); 
-
-create table table4 (
+create table table3 (
   id serial NOT NULL,
   id2 integer
 );
 
-create unique index no_good_candidate_pk on table4 (id, id2);
+create unique index no_good_candidate_pk on table3 (id, id2);
 
-create table table5 (
+create table table4 (
   id serial primary key,
   numcol numeric(12,4), -- 1.23
   realcol real,     -- (1.23)

-- 
select 'cbbrowne' || '@' || 'ca.afilias.info';
<http://dba2.int.libertyrms.com/>
Christopher Browne
(416) 673-4124 (land)


More information about the Slony1-patches mailing list