From 09241332aece31c8128e7edf3d70a51d83fa6254 Mon Sep 17 00:00:00 2001 From: Steve Singer Date: Mon, 7 Nov 2011 12:46:27 -0500 Subject: [PATCH] Fix for bug 247. slony_logshipper can now handle the TRUNCATE commands passed to it in response to TRUNCATE triggers. Also remove the extra ';' from the command stream for the truncate command. --- src/backend/slony1_funcs.sql | 2 +- src/slony_logshipper/parser.y | 14 ++++++++++++++ src/slony_logshipper/scan.l | 2 ++ src/slony_logshipper/slony_logshipper.c | 23 +++++++++++++++++++++++ src/slony_logshipper/slony_logshipper.h | 6 ++++++ 5 files changed, 46 insertions(+), 1 deletions(-) diff --git a/src/backend/slony1_funcs.sql b/src/backend/slony1_funcs.sql index fc9d8a7..78b4b36 100644 --- a/src/backend/slony1_funcs.sql +++ b/src/backend/slony1_funcs.sql @@ -5528,7 +5528,7 @@ $$ c_tabid := tg_argv[0]; c_node := @NAMESPACE@.getLocalNodeId('_@CLUSTERNAME@'); c_command := 'TRUNCATE TABLE ONLY "' || tab_nspname || '"."' || - tab_relname || '" CASCADE;' + tab_relname || '" CASCADE' from @NAMESPACE@.sl_table where tab_id = c_tabid; select last_value into c_log from @NAMESPACE@.sl_log_status; if c_log in (0, 2) then diff --git a/src/slony_logshipper/parser.y b/src/slony_logshipper/parser.y index 37ff20a..f324fef 100644 --- a/src/slony_logshipper/parser.y +++ b/src/slony_logshipper/parser.y @@ -74,6 +74,7 @@ int yydebug=1; %token K_AND %token K_ARCHIVE %token K_ARCHIVE_COMMENT +%token K_CASCADE %token K_CLUSTER %token K_COMMAND %token K_COMMIT @@ -107,6 +108,7 @@ int yydebug=1; %token K_TABLE %token K_TO %token K_TRANSACTION +%token K_TRUNCATE %token K_UPDATE %token K_VACUUM %token K_VALUES @@ -398,6 +400,7 @@ arch_stmt : arch_comment | arch_exec_ddl | arch_vacuum | arch_analyze + | arch_truncate ; arch_commit : K_COMMIT ';' @@ -590,6 +593,16 @@ arch_delete_qual : arch_qualification } ; +arch_truncate : K_TRUNCATE K_TABLE K_ONLY ident '.' ident K_CASCADE ';' + { + + TruncateStmt stmt; + stmt.namespace=$4; + stmt.tablename=$6; + process_truncate(&stmt); + + }; + arch_copy : K_COPY ident '.' ident '(' arch_attr_list ')' K_FROM ident ';' { CopyStmt stmt; @@ -1016,6 +1029,7 @@ ident_keywords : K_START_CONFIG | K_START_ARCHIVE | K_SET | K_START | K_TRANSACTION + | K_TRUNCATE | K_UPDATE | K_VACUUM | K_VALUES diff --git a/src/slony_logshipper/scan.l b/src/slony_logshipper/scan.l index 48cb69f..b968bf1 100644 --- a/src/slony_logshipper/scan.l +++ b/src/slony_logshipper/scan.l @@ -106,6 +106,7 @@ analyze { return K_ANALYZE; } and { return K_AND; } archive { return K_ARCHIVE; } archives { return K_ARCHIVES; } +cascade { return K_CASCADE; } cluster { return K_CLUSTER; } command { return K_COMMAND; } commit { return K_COMMIT; } @@ -137,6 +138,7 @@ start { return K_START; } table { return K_TABLE; } to { return K_TO; } transaction { return K_TRANSACTION; } +truncate { return K_TRUNCATE; } update { return K_UPDATE; } vacuum { return K_VACUUM; } values { return K_VALUES; } diff --git a/src/slony_logshipper/slony_logshipper.c b/src/slony_logshipper/slony_logshipper.c index c400d76..8df9f61 100644 --- a/src/slony_logshipper/slony_logshipper.c +++ b/src/slony_logshipper/slony_logshipper.c @@ -798,6 +798,29 @@ process_delete(DeleteStmt *stmt) int +process_truncate(TruncateStmt *stmt) +{ + SlonDString ds; + int rc; + char *namespace; + char *tablename; + + if (lookup_rename(stmt->namespace, stmt->tablename, + &namespace, &tablename) == 0) + return 0; + + dstring_init(&ds); + slon_mkquery(&ds, "truncate only %s.%s cascade;", + namespace, tablename); + dstring_terminate(&ds); + + rc = process_exec_sql(dstring_data(&ds)); + dstring_free(&ds); + + return rc; +} + +int process_copy(CopyStmt *stmt) { SlonDString ds; diff --git a/src/slony_logshipper/slony_logshipper.h b/src/slony_logshipper/slony_logshipper.h index 1f6881e..dbdd9cf 100644 --- a/src/slony_logshipper/slony_logshipper.h +++ b/src/slony_logshipper/slony_logshipper.h @@ -122,6 +122,11 @@ typedef struct DeleteStmt_s { AttElemList *qualification; } DeleteStmt; +typedef struct TruncateStmt_s { + char *namespace; + char *tablename; +} TruncateStmt; + typedef struct CopyStmt_s { char *namespace; char *tablename; @@ -191,6 +196,7 @@ extern int process_end_transaction(char *sql); extern int process_insert(InsertStmt *stmt); extern int process_update(UpdateStmt *stmt); extern int process_delete(DeleteStmt *stmt); +extern int process_truncate(TruncateStmt *stmt); extern int process_copy(CopyStmt *stmt); extern int process_copydata(char *line); extern int process_copyend(void); -- 1.7.0.4