diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-02-09 03:35:35 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-02-09 03:35:35 +0000 |
commit | c398300330cb3060d50652800dbd12729ab9f5ef (patch) | |
tree | 53d16880d6a38ffe3f6ddd125d644e1e984d14d1 /src/pl/plperl/plperl.c | |
parent | acb3416686d44885b6f7d40daacb8e4c1a28e366 (diff) | |
download | postgresql-c398300330cb3060d50652800dbd12729ab9f5ef.tar.gz postgresql-c398300330cb3060d50652800dbd12729ab9f5ef.zip |
Combine cmin and cmax fields of HeapTupleHeaders into a single field, by
keeping private state in each backend that has inserted and deleted the same
tuple during its current top-level transaction. This is sufficient since
there is no need to be able to determine the cmin/cmax from any other
transaction. This gets us back down to 23-byte headers, removing a penalty
paid in 8.0 to support subtransactions. Patch by Heikki Linnakangas, with
minor revisions by moi, following a design hashed out awhile back on the
pghackers list.
Diffstat (limited to 'src/pl/plperl/plperl.c')
-rw-r--r-- | src/pl/plperl/plperl.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 0cf8c57a137..33027c53bde 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1,7 +1,7 @@ /********************************************************************** * plperl.c - perl as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.126 2007/02/01 19:10:29 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.127 2007/02/09 03:35:34 tgl Exp $ * **********************************************************************/ @@ -41,7 +41,7 @@ typedef struct plperl_proc_desc { char *proname; TransactionId fn_xmin; - CommandId fn_cmin; + ItemPointerData fn_tid; bool fn_readonly; bool lanpltrusted; bool fn_retistuple; /* true, if function returns tuple */ @@ -296,7 +296,7 @@ _PG_init(void) * * We start out by creating a "held" interpreter that we can use in * trusted or untrusted mode (but not both) as the need arises. Later, we - * assign that interpreter if it is available to either the trusted or + * assign that interpreter if it is available to either the trusted or * untrusted interpreter. If it has already been assigned, and we need to * create the other interpreter, we do that if we can, or error out. * We detect if it is safe to run two interpreters during the setup of the @@ -304,7 +304,7 @@ _PG_init(void) */ -static void +static void check_interp(bool trusted) { if (interp_state == INTERP_HELD) @@ -322,7 +322,7 @@ check_interp(bool trusted) plperl_held_interp = NULL; trusted_context = trusted; } - else if (interp_state == INTERP_BOTH || + else if (interp_state == INTERP_BOTH || (trusted && interp_state == INTERP_TRUSTED) || (!trusted && interp_state == INTERP_UNTRUSTED)) { @@ -349,11 +349,9 @@ check_interp(bool trusted) } else { - elog(ERROR, + elog(ERROR, "cannot allocate second Perl interpreter on this platform"); - } - } @@ -425,7 +423,7 @@ plperl_init_interp(void) elog(ERROR, "could not allocate Perl interpreter"); perl_construct(plperl_held_interp); - perl_parse(plperl_held_interp, plperl_init_shared_libs, + perl_parse(plperl_held_interp, plperl_init_shared_libs, 3, embedding, NULL); perl_run(plperl_held_interp); @@ -434,7 +432,7 @@ plperl_init_interp(void) SV *res; res = eval_pv(TEST_FOR_MULTI,TRUE); - can_run_two = SvIV(res); + can_run_two = SvIV(res); interp_state = INTERP_HELD; } @@ -1430,7 +1428,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) /************************************************************ * Lookup the internal proc name in the hashtable ************************************************************/ - hash_entry = hash_search(plperl_proc_hash, internal_proname, + hash_entry = hash_search(plperl_proc_hash, internal_proname, HASH_FIND, NULL); if (hash_entry) @@ -1445,7 +1443,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) * function's pg_proc entry without changing its OID. ************************************************************/ uptodate = (prodesc->fn_xmin == HeapTupleHeaderGetXmin(procTup->t_data) && - prodesc->fn_cmin == HeapTupleHeaderGetCmin(procTup->t_data)); + ItemPointerEquals(&prodesc->fn_tid, &procTup->t_self)); if (!uptodate) { @@ -1485,7 +1483,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger) MemSet(prodesc, 0, sizeof(plperl_proc_desc)); prodesc->proname = strdup(internal_proname); prodesc->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data); - prodesc->fn_cmin = HeapTupleHeaderGetCmin(procTup->t_data); + prodesc->fn_tid = procTup->t_self; /* Remember if function is STABLE/IMMUTABLE */ prodesc->fn_readonly = @@ -2128,9 +2126,9 @@ plperl_spi_prepare(char *query, int argc, SV **argv) PG_TRY(); { /************************************************************ - * Resolve argument type names and then look them up by oid - * in the system cache, and remember the required information - * for input conversion. + * Resolve argument type names and then look them up by oid + * in the system cache, and remember the required information + * for input conversion. ************************************************************/ for (i = 0; i < argc; i++) { @@ -2523,8 +2521,8 @@ plperl_spi_freeplan(char *query) * free all memory before SPI_freeplan, so if it dies, nothing will be * left over */ - hash_search(plperl_query_hash, query, - HASH_REMOVE,NULL); + hash_search(plperl_query_hash, query, + HASH_REMOVE, NULL); plan = qdesc->plan; free(qdesc->argtypes); |