Created
September 12, 2014 22:30
-
-
Save schmiddy/fba1ac1d600f174181f5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c | |
index 5b5d31b..418665a 100644 | |
--- a/src/backend/access/transam/xact.c | |
+++ b/src/backend/access/transam/xact.c | |
@@ -46,6 +46,7 @@ | |
#include "storage/procarray.h" | |
#include "storage/sinvaladt.h" | |
#include "storage/smgr.h" | |
+#include "utils/builtins.h" | |
#include "utils/catcache.h" | |
#include "utils/combocid.h" | |
#include "utils/guc.h" | |
@@ -4994,3 +4995,57 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record) | |
else | |
elog(PANIC, "xact_redo: unknown op code %u", info); | |
} | |
+ | |
+Datum | |
+get_savepoints(PG_FUNCTION_ARGS) | |
+{ | |
+ | |
+ TransactionState s = CurrentTransactionState; | |
+ TransactionState target; | |
+ | |
+ RequireTransactionChain(true, "get_savepoints"); | |
+ | |
+ switch (s->blockState) | |
+ { | |
+ case TBLOCK_INPROGRESS: | |
+ case TBLOCK_ABORT: | |
+ /* | |
+ * Bail out early if no savepoints are defined. | |
+ */ | |
+ PG_RETURN_VOID(); | |
+ break; | |
+ /* | |
+ * There is at least one savepoint, so proceed. | |
+ */ | |
+ case TBLOCK_SUBINPROGRESS: | |
+ case TBLOCK_SUBABORT: | |
+ break; | |
+ | |
+ /* These cases are invalid. */ | |
+ case TBLOCK_DEFAULT: | |
+ case TBLOCK_STARTED: | |
+ case TBLOCK_BEGIN: | |
+ case TBLOCK_SUBBEGIN: | |
+ case TBLOCK_END: | |
+ case TBLOCK_SUBRELEASE: | |
+ case TBLOCK_SUBCOMMIT: | |
+ case TBLOCK_ABORT_END: | |
+ case TBLOCK_SUBABORT_END: | |
+ case TBLOCK_ABORT_PENDING: | |
+ case TBLOCK_SUBABORT_PENDING: | |
+ case TBLOCK_SUBRESTART: | |
+ case TBLOCK_SUBABORT_RESTART: | |
+ case TBLOCK_PREPARE: | |
+ elog(FATAL, "get_savepoints: unexpected state %s", | |
+ BlockStateAsString(s->blockState)); | |
+ break; | |
+ } | |
+ | |
+ for (target = s; PointerIsValid(target); target = target->parent) | |
+ { | |
+ if (PointerIsValid(target->name)) | |
+ elog(INFO, "Have savepoint name: %s", target->name); | |
+ } | |
+ | |
+ PG_RETURN_VOID(); | |
+} | |
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h | |
index a56a635..46f0a9c 100644 | |
--- a/src/include/catalog/pg_proc.h | |
+++ b/src/include/catalog/pg_proc.h | |
@@ -3055,7 +3055,7 @@ DESCR("difference in bytes, given two xlog locations"); | |
DATA(insert OID = 3809 ( pg_export_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_export_snapshot _null_ _null_ _null_ )); | |
DESCR("export a snapshot"); | |
-DATA(insert OID = 3810 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ )); | |
+DATA(insert OID = 3999 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ )); | |
DESCR("true if server is in recovery"); | |
DATA(insert OID = 3820 ( pg_last_xlog_receive_location PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ pg_last_xlog_receive_location _null_ _null_ _null_ )); | |
@@ -3099,6 +3099,8 @@ DESCR("sleep until the specified time"); | |
DATA(insert OID = 2971 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "16" _null_ _null_ _null_ _null_ booltext _null_ _null_ _null_ )); | |
DESCR("convert boolean to text"); | |
+DATA(insert OID = 3810 ( get_savepoints PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 2278 "" _null_ _null_ _null_ _null_ get_savepoints _null_ _null_ _null_ )); | |
+DESCR("show current savepoints"); | |
/* Aggregates (moved here from pg_aggregate for 7.3) */ | |
DATA(insert OID = 2100 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ )); | |
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h | |
index d88e7a3..e0a3bbe 100644 | |
--- a/src/include/utils/builtins.h | |
+++ b/src/include/utils/builtins.h | |
@@ -1191,6 +1191,9 @@ extern Datum pg_prepared_xact(PG_FUNCTION_ARGS); | |
/* access/transam/multixact.c */ | |
extern Datum pg_get_multixact_members(PG_FUNCTION_ARGS); | |
+/* access/transam/xact.c */ | |
+extern Datum get_savepoints(PG_FUNCTION_ARGS); | |
+ | |
/* catalogs/dependency.c */ | |
extern Datum pg_describe_object(PG_FUNCTION_ARGS); | |
extern Datum pg_identify_object(PG_FUNCTION_ARGS); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment