summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/tid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/tid.c')
-rw-r--r--src/backend/utils/adt/tid.c246
1 files changed, 0 insertions, 246 deletions
diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c
deleted file mode 100644
index 598e0d8a3b1..00000000000
--- a/src/backend/utils/adt/tid.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * tid.c
- * Functions for the built-in type tuple id
- *
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.31 2002/06/20 20:29:38 momjian Exp $
- *
- * NOTES
- * input routine largely stolen from boxin().
- *
- *-------------------------------------------------------------------------
- */
-
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "catalog/namespace.h"
-#include "utils/builtins.h"
-#include "catalog/pg_type.h"
-
-#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X))
-#define ItemPointerGetDatum(X) PointerGetDatum(X)
-#define PG_GETARG_ITEMPOINTER(n) DatumGetItemPointer(PG_GETARG_DATUM(n))
-#define PG_RETURN_ITEMPOINTER(x) return ItemPointerGetDatum(x)
-
-#define LDELIM '('
-#define RDELIM ')'
-#define DELIM ','
-#define NTIDARGS 2
-
-/* ----------------------------------------------------------------
- * tidin
- * ----------------------------------------------------------------
- */
-Datum
-tidin(PG_FUNCTION_ARGS)
-{
- char *str = PG_GETARG_CSTRING(0);
- char *p,
- *coord[NTIDARGS];
- int i;
- ItemPointer result;
- BlockNumber blockNumber;
- OffsetNumber offsetNumber;
-
- for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++)
- if (*p == DELIM || (*p == LDELIM && !i))
- coord[i++] = p + 1;
-
- if (i < NTIDARGS)
- elog(ERROR, "invalid tid format: '%s'", str);
-
- blockNumber = (BlockNumber) atoi(coord[0]);
- offsetNumber = (OffsetNumber) atoi(coord[1]);
-
- result = (ItemPointer) palloc(sizeof(ItemPointerData));
-
- ItemPointerSet(result, blockNumber, offsetNumber);
-
- PG_RETURN_ITEMPOINTER(result);
-}
-
-/* ----------------------------------------------------------------
- * tidout
- * ----------------------------------------------------------------
- */
-Datum
-tidout(PG_FUNCTION_ARGS)
-{
- ItemPointer itemPtr = PG_GETARG_ITEMPOINTER(0);
- BlockId blockId;
- BlockNumber blockNumber;
- OffsetNumber offsetNumber;
- char buf[32];
- static char *invalidTid = "()";
-
- if (!ItemPointerIsValid(itemPtr))
- PG_RETURN_CSTRING(pstrdup(invalidTid));
-
- blockId = &(itemPtr->ip_blkid);
-
- blockNumber = BlockIdGetBlockNumber(blockId);
- offsetNumber = itemPtr->ip_posid;
-
- sprintf(buf, "(%d,%d)", (int) blockNumber, (int) offsetNumber);
-
- PG_RETURN_CSTRING(pstrdup(buf));
-}
-
-/*****************************************************************************
- * PUBLIC ROUTINES *
- *****************************************************************************/
-
-Datum
-tideq(PG_FUNCTION_ARGS)
-{
- ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
- ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
-
- PG_RETURN_BOOL(BlockIdGetBlockNumber(&(arg1->ip_blkid)) ==
- BlockIdGetBlockNumber(&(arg2->ip_blkid)) &&
- arg1->ip_posid == arg2->ip_posid);
-}
-
-#ifdef NOT_USED
-Datum
-tidne(PG_FUNCTION_ARGS)
-{
- ItemPointer arg1 = PG_GETARG_ITEMPOINTER(0);
- ItemPointer arg2 = PG_GETARG_ITEMPOINTER(1);
-
- PG_RETURN_BOOL(BlockIdGetBlockNumber(&(arg1->ip_blkid)) !=
- BlockIdGetBlockNumber(&(arg2->ip_blkid)) ||
- arg1->ip_posid != arg2->ip_posid);
-}
-#endif
-
-/*
- * Functions to get latest tid of a specified tuple.
- *
- * Maybe these implementations should be moved to another place
- */
-
-static ItemPointerData Current_last_tid = {{0, 0}, 0};
-
-void
-setLastTid(const ItemPointer tid)
-{
- Current_last_tid = *tid;
-}
-
-/*
- * Handle CTIDs of views.
- * CTID should be defined in the view and it must
- * correspond to the CTID of a base relation.
- */
-static Datum
-currtid_for_view(Relation viewrel, ItemPointer tid)
-{
- TupleDesc att = RelationGetDescr(viewrel);
- RuleLock *rulelock;
- RewriteRule *rewrite;
- int i, natts = att->natts, tididx = -1;
-
- for (i = 0; i < natts ; i++)
- {
- if (strcasecmp(NameStr(att->attrs[i]->attname), "ctid") == 0)
- {
- if (att->attrs[i]->atttypid != TIDOID)
- elog(ERROR, "ctid isn't of type TID");
- tididx = i;
- }
- }
- if (tididx < 0)
- elog(ERROR, "currtid can't handle views with no CTID");
- if (rulelock = viewrel->rd_rules, !rulelock)
- elog(ERROR, "the view has no rules");
- for (i = 0; i < rulelock->numLocks; i++)
- {
- rewrite = rulelock->rules[i];
- if (rewrite->event == CMD_SELECT)
- {
- Query *query;
- TargetEntry *tle;
-
- if (length(rewrite->actions) != 1)
- elog(ERROR, "only one select rule is allowed in views");
- query = (Query *) lfirst(rewrite->actions);
- tle = (TargetEntry *) nth(tididx, query->targetList);
- if (tle && tle->expr && nodeTag(tle->expr) == T_Var)
- {
- Var *var = (Var *) tle->expr;
- RangeTblEntry *rte;
- if (var->varno > 0 && var->varno < INNER && var->varattno == SelfItemPointerAttributeNumber)
- {
- rte = (RangeTblEntry *) nth(var->varno - 1, query->rtable);
- if (rte)
- {
- heap_close(viewrel, AccessShareLock);
- return DirectFunctionCall2(currtid_byreloid, ObjectIdGetDatum(rte->relid), PointerGetDatum(tid));
- }
- }
- }
- break;
- }
- }
- elog(ERROR, "currtid can't handle this view");
- return (Datum) 0;
-}
-
-Datum
-currtid_byreloid(PG_FUNCTION_ARGS)
-{
- Oid reloid = PG_GETARG_OID(0);
- ItemPointer tid = PG_GETARG_ITEMPOINTER(1);
- ItemPointer result;
- Relation rel;
-
- result = (ItemPointer) palloc(sizeof(ItemPointerData));
- if (!reloid)
- {
- *result = Current_last_tid;
- PG_RETURN_ITEMPOINTER(result);
- }
-
- rel = heap_open(reloid, AccessShareLock);
- if (rel->rd_rel->relkind == RELKIND_VIEW)
- return currtid_for_view(rel, tid);
-
- ItemPointerCopy(tid, result);
- heap_get_latest_tid(rel, SnapshotNow, result);
-
- heap_close(rel, AccessShareLock);
-
- PG_RETURN_ITEMPOINTER(result);
-}
-
-Datum
-currtid_byrelname(PG_FUNCTION_ARGS)
-{
- text *relname = PG_GETARG_TEXT_P(0);
- ItemPointer tid = PG_GETARG_ITEMPOINTER(1);
- ItemPointer result;
- RangeVar *relrv;
- Relation rel;
-
- relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname,
- "currtid_byrelname"));
- rel = heap_openrv(relrv, AccessShareLock);
- if (rel->rd_rel->relkind == RELKIND_VIEW)
- return currtid_for_view(rel, tid);
-
- result = (ItemPointer) palloc(sizeof(ItemPointerData));
- ItemPointerCopy(tid, result);
-
- heap_get_latest_tid(rel, SnapshotNow, result);
-
- heap_close(rel, AccessShareLock);
-
- PG_RETURN_ITEMPOINTER(result);
-}