]> granicus.if.org Git - postgresql/blobdiff - src/backend/utils/adt/tid.c
Add support for EUI-64 MAC addresses as macaddr8
[postgresql] / src / backend / utils / adt / tid.c
index 0ad831e02513ad1db16b816ad8b71a7f21f2b49c..49a5a157b94e24b5781c0f9bb6cb09c56c03891a 100644 (file)
@@ -3,12 +3,12 @@
  * tid.c
  *       Functions for the built-in type tuple id
  *
- * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/tid.c,v 1.60 2008/03/26 21:10:39 alvherre Exp $
+ *       src/backend/utils/adt/tid.c
  *
  * NOTES
  *       input routine largely stolen from boxin().
@@ -21,6 +21,7 @@
 #include <limits.h>
 
 #include "access/heapam.h"
+#include "access/sysattr.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_type.h"
 #include "libpq/pqformat.h"
 #include "parser/parsetree.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
+#include "utils/rel.h"
+#include "utils/snapmgr.h"
 #include "utils/tqual.h"
+#include "utils/varlena.h"
 
 
 #define DatumGetItemPointer(X)  ((ItemPointer) DatumGetPointer(X))
@@ -65,24 +69,24 @@ tidin(PG_FUNCTION_ARGS)
        if (i < NTIDARGS)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                                errmsg("invalid input syntax for type tid: \"%s\"",
-                                               str)));
+                                errmsg("invalid input syntax for type %s: \"%s\"",
+                                               "tid", str)));
 
        errno = 0;
        blockNumber = strtoul(coord[0], &badp, 10);
        if (errno || *badp != DELIM)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                                errmsg("invalid input syntax for type tid: \"%s\"",
-                                               str)));
+                                errmsg("invalid input syntax for type %s: \"%s\"",
+                                               "tid", str)));
 
        hold_offset = strtol(coord[1], &badp, 10);
        if (errno || *badp != RDELIM ||
                hold_offset > USHRT_MAX || hold_offset < 0)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-                                errmsg("invalid input syntax for type tid: \"%s\"",
-                                               str)));
+                                errmsg("invalid input syntax for type %s: \"%s\"",
+                                               "tid", str)));
 
        offsetNumber = hold_offset;
 
@@ -304,7 +308,7 @@ currtid_for_view(Relation viewrel, ItemPointer tid)
                                Var                *var = (Var *) tle->expr;
                                RangeTblEntry *rte;
 
-                               if (var->varno > 0 && var->varno < INNER &&
+                               if (!IS_SPECIAL_VARNO(var->varno) &&
                                        var->varattno == SelfItemPointerAttributeNumber)
                                {
                                        rte = rt_fetch(var->varno, query->rtable);
@@ -330,6 +334,7 @@ currtid_byreloid(PG_FUNCTION_ARGS)
        ItemPointer result;
        Relation        rel;
        AclResult       aclresult;
+       Snapshot        snapshot;
 
        result = (ItemPointer) palloc(sizeof(ItemPointerData));
        if (!reloid)
@@ -350,7 +355,10 @@ currtid_byreloid(PG_FUNCTION_ARGS)
                return currtid_for_view(rel, tid);
 
        ItemPointerCopy(tid, result);
-       heap_get_latest_tid(rel, SnapshotNow, result);
+
+       snapshot = RegisterSnapshot(GetLatestSnapshot());
+       heap_get_latest_tid(rel, snapshot, result);
+       UnregisterSnapshot(snapshot);
 
        heap_close(rel, AccessShareLock);
 
@@ -360,12 +368,13 @@ currtid_byreloid(PG_FUNCTION_ARGS)
 Datum
 currtid_byrelname(PG_FUNCTION_ARGS)
 {
-       text       *relname = PG_GETARG_TEXT_P(0);
+       text       *relname = PG_GETARG_TEXT_PP(0);
        ItemPointer tid = PG_GETARG_ITEMPOINTER(1);
        ItemPointer result;
        RangeVar   *relrv;
        Relation        rel;
        AclResult       aclresult;
+       Snapshot        snapshot;
 
        relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
        rel = heap_openrv(relrv, AccessShareLock);
@@ -382,7 +391,9 @@ currtid_byrelname(PG_FUNCTION_ARGS)
        result = (ItemPointer) palloc(sizeof(ItemPointerData));
        ItemPointerCopy(tid, result);
 
-       heap_get_latest_tid(rel, SnapshotNow, result);
+       snapshot = RegisterSnapshot(GetLatestSnapshot());
+       heap_get_latest_tid(rel, snapshot, result);
+       UnregisterSnapshot(snapshot);
 
        heap_close(rel, AccessShareLock);