CVS User Account cvsuser
Tue Apr 4 11:28:58 PDT 2006
Log Message:
-----------
Don't skip NULL columns on insert. If the table definition on a
subscriber has a default value, an explicit given NULL by the
application will be overwritten by the subscriber with the default.

Jan

Modified Files:
--------------
    slony1-engine/src/backend:
        slony1_funcs.c (r1.40 -> r1.41)

-------------- next part --------------
Index: slony1_funcs.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -Lsrc/backend/slony1_funcs.c -Lsrc/backend/slony1_funcs.c -u -w -r1.40 -r1.41
--- src/backend/slony1_funcs.c
+++ src/backend/slony1_funcs.c
@@ -491,7 +491,7 @@
 		HeapTuple	new_row = tg->tg_trigtuple;
 		TupleDesc	tupdesc = tg->tg_relation->rd_att;
 		char	   *col_ident;
-		char	  **col_value;
+		char	   *col_value;
 		int			len_ident;
 		int			len_value;
 		int			i;
@@ -501,38 +501,23 @@
 		/*
 		 * INSERT
 		 *
-		 * cmdtype = 'I' cmddata = ("non-NULL-col" [, ...]) values ('value' [,
-		 * ...])
+		 * cmdtype = 'I' cmddata = ("col" [, ...]) values ('value' [, ...])
 		 */
 		cmdtype = cs->cmdtype_I;
 
 		/*
-		 * Allocate an array of char pointers to hold the values. We need to
-		 * go over the tuple descriptor 2 times, first to add the column names
-		 * of non-null columns, second to add the values. But we can identify
-		 * what's NULL only by getting the value via SPI_getvalue() in the
-		 * first pass.
-		 */
-		col_value = (char **)palloc(sizeof(char *) *
-									tg->tg_relation->rd_att->natts);
-
-		/*
 		 * Specify all the columns
 		 */
 		*cp++ = '(';
 		for (i = 0; i < tg->tg_relation->rd_att->natts; i++)
 		{
 			/*
-			 * Skip dropped columns and NULL values
+			 * Skip dropped columns
 			 */
 			if (tupdesc->attrs[i]->attisdropped)
 				continue;
-			if ((col_value[i] = SPI_getvalue(new_row, tupdesc, i + 1)) == NULL)
-				continue;
 
 			col_ident = (char *)slon_quote_identifier(SPI_fname(tupdesc, i + 1));
-			col_value[i] = slon_quote_literal(col_value[i]);
-
 			cmddata_need = (cp - (char *)(cs->cmddata_buf)) + 16 +
 				(len_ident = strlen(col_ident));
 			if (cs->cmddata_size < cmddata_need)
@@ -575,15 +560,21 @@
 		for (i = 0; i < tg->tg_relation->rd_att->natts; i++)
 		{
 			/*
-			 * Skip dropped columns and NULL values
+			 * Skip dropped columns
 			 */
 			if (tupdesc->attrs[i]->attisdropped)
 				continue;
-			if (col_value[i] == NULL)
-				continue;
+			if ((col_value = SPI_getvalue(new_row, tupdesc, i + 1)) == NULL)
+			{
+				col_value = "NULL";
+			}
+			else
+			{
+				col_value = slon_quote_literal(col_value);
+			}
 
 			cmddata_need = (cp - (char *)(cs->cmddata_buf)) + 16 +
-				(len_value = strlen(col_value[i]));
+				(len_value = strlen(col_value));
 			if (cs->cmddata_size < cmddata_need)
 			{
 				int			have = (cp - (char *)(cs->cmddata_buf));
@@ -599,7 +590,7 @@
 			else
 				need_comma = true;
 
-			memcpy(cp, col_value[i], len_value);
+			memcpy(cp, col_value, len_value);
 			cp += len_value;
 		}
 



More information about the Slony1-commit mailing list