in regression tests.
Jan
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.58 1999/12/20 10:40:38 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.59 1999/12/21 00:06:39 wieck Exp $
*
* NOTES
* some of the executor utility code such as "ExecTypeFromTL" should be
* relations for automatic move off into "secondary" relation.
* Jan
*/
-#ifdef LONG_ATTRIBUTES_NOW_IMPLEMENTED_FOR_ALL_VARLENA_DATA_TYPES
- att->attcanlong = (att->attlen == -1) ? 'e' : 'p';
+#ifdef TUPLE_TOASTER_ACTIVE
+#ifdef TUPLE_TOASTER_ALL_TYPES
+ att->attstorage = (att->attlen == -1) ? 'e' : 'p';
+#else
+ att->attstorage = 'p';
+#endif
#else
att->attstorage = 'p';
#endif
# Makefile for access/heap
#
# IDENTIFICATION
-# $Header: /cvsroot/pgsql/src/backend/access/heap/Makefile,v 1.8 1999/12/13 22:32:24 momjian Exp $
+# $Header: /cvsroot/pgsql/src/backend/access/heap/Makefile,v 1.9 1999/12/21 00:06:40 wieck Exp $
#
#-------------------------------------------------------------------------
CFLAGS += -I../..
-OBJS = heapam.o hio.o stats.o
+OBJS = heapam.o hio.o stats.o tuptoaster.o
all: SUBSYS.o
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.61 1999/12/16 22:19:36 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.62 1999/12/21 00:06:40 wieck Exp $
*
*
* INTERFACE ROUTINES
#include "access/heapam.h"
#include "access/hio.h"
#include "access/valid.h"
+#include "access/tuptoaster.h"
#include "catalog/catalog.h"
#include "miscadmin.h"
#include "storage/smgr.h"
--- /dev/null
+/*-------------------------------------------------------------------------
+ *
+ * tuptoaster.c
+ * Support routines for external and compressed storage of
+ * variable size attributes.
+ *
+ * Copyright (c) 2000, PostgreSQL Development Team
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.1 1999/12/21 00:06:40 wieck Exp $
+ *
+ *
+ * INTERFACE ROUTINES
+ * heap_tuple_toast_attrs -
+ * Try to make a given tuple fit into one page by compressing
+ * or moving off attributes
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/heapam.h"
+#include "access/tuptoaster.h"
+#include "catalog/catalog.h"
+#include "utils/rel.h"
+
+
+#ifdef TUPLE_TOASTER_ACTIVE
+
+void
+heap_tuple_toast_attrs (Relation rel, HeapTuple newtup, HeapTuple oldtup)
+{
+ return;
+}
+
+
+varattrib *
+heap_tuple_untoast_attr (varattrib *attr)
+{
+ elog(ERROR, "heap_tuple_untoast_attr() called");
+}
+
+
+#endif /* TUPLE_TOASTER_ACTIVE */
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: htup.h,v 1.26 1999/12/16 22:19:58 wieck Exp $
+ * $Id: htup.h,v 1.27 1999/12/21 00:06:42 wieck Exp $
*
*-------------------------------------------------------------------------
*/
#define HEAP_HASNULL 0x0001 /* has null attribute(s) */
#define HEAP_HASVARLENA 0x0002 /* has variable length
* attribute(s) */
+#define HEAP_HASEXTERNAL 0x0004 /* has external stored */
+ /* attribute(s) */
+#define HEAP_HASCOMPRESSED 0x0008 /* has compressed stored */
+ /* attribute(s) */
+#define HEAP_HASEXTENDED 0x000C /* the two above combined */
#define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */
#define HEAP_XMIN_INVALID 0x0200 /* t_xmin invalid/aborted */
#define HEAP_XMAX_COMMITTED 0x0400 /* t_xmax committed */
#define HeapTupleAllFixed(tuple) \
(!(((HeapTuple) (tuple))->t_data->t_infomask & HEAP_HASVARLENA))
+#define HeapTupleHasExternal(tuple) \
+ ((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASEXTERNAL) != 0)
+
+#define HeapTupleHasCompressed(tuple) \
+ ((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASCOMPRESSED) != 0)
+
+#define HeapTupleHasExtended(tuple) \
+ ((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASEXTENDED) != 0)
+
#endif /* HTUP_H */
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: tupmacs.h,v 1.11 1999/07/15 15:20:56 momjian Exp $
+ * $Id: tupmacs.h,v 1.12 1999/12/21 00:06:42 wieck Exp $
*
*-------------------------------------------------------------------------
*/
) \
: \
( \
- (cur_offset) + VARSIZE(DatumGetPointer(attval)) \
+ (cur_offset) + VARATT_SIZE(DatumGetPointer(attval)) \
) \
)
--- /dev/null
+/*-------------------------------------------------------------------------
+ *
+ * tuptoaster.h
+ * POSTGRES definitions for external and compressed storage
+ * of variable size attributes.
+ *
+ * Copyright (c) 2000, PostgreSQL Development Team
+ *
+ * $Id: tuptoaster.h,v 1.1 1999/12/21 00:06:42 wieck Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef TUPTOASTER_H
+#define TUPTOASTER_H
+
+#ifdef TUPLE_TOASTER_ACTIVE
+
+#include "postgres.h"
+#include "access/heapam.h"
+#include "access/htup.h"
+#include "access/tupmacs.h"
+#include "utils/rel.h"
+
+
+extern void heap_tuple_toast_attrs(Relation rel,
+ HeapTuple newtup, HeapTuple oldtup);
+
+extern varattrib *heap_tuple_untoast_attr(varattrib *attr);
+
+#endif /* TUPLE_TOASTER_ACTIVE */
+
+
+#endif /* TUPTOASTER_H */
*
* Copyright (c) 1995, Regents of the University of California
*
- * $Id: postgres.h,v 1.30 1999/11/07 23:08:32 momjian Exp $
+ * $Id: postgres.h,v 1.31 1999/12/21 00:06:41 wieck Exp $
*
*-------------------------------------------------------------------------
*/
typedef int2 int28[8];
typedef Oid oid8[8];
+
+/*
+ * Proposed new layout for variable length attributes
+ * DO NOT USE YET - Jan
+ */
+#undef TUPLE_TOASTER_ACTIVE
+#undef TUPLE_TOASTER_ALL_TYPES
+
+#ifdef TUPLE_TOASTER_ACTIVE
+typedef struct varattrib
+{
+ int32 va_header; /* External/compressed storage */
+ /* flags and item size */
+ union
+ {
+ struct
+ {
+ int32 va_rawsize; /* Plain data size */
+ } va_compressed; /* Compressed stored attribute */
+
+ struct
+ {
+ int32 va_rawsize; /* Plain data size */
+ Oid va_valueid; /* Unique identifier of value */
+ Oid va_longrelid; /* RelID where to find chunks */
+ Oid va_rowid; /* Main tables row Oid */
+ int16 va_attno; /* Main tables attno */
+ } va_external; /* External stored attribute */
+
+ char va_data[1]; /* Plain stored attribute */
+ } va_content;
+} varattrib;
+
+#define VARATT_FLAG_EXTERNAL 0x8000
+#define VARATT_FLAG_COMPRESSED 0x4000
+#define VARATT_MASK_FLAGS 0xc000
+#define VARATT_MASK_SIZE 0x3fff
+
+#define VARATT_SIZEP(_PTR) (((varattrib *)(_PTR))->va_header)
+#define VARATT_SIZE(PTR) (VARATT_SIZEP(PTR) & VARATT_MASK_SIZE)
+#define VARATT_DATA(PTR) (((varattrib *)(PTR))->va_content.va_data)
+
+#define VARATT_IS_EXTENDED(PTR) \
+ ((VARATT_SIZEP(PTR) & VARATT_MASK_FLAGS) != 0)
+#define VARATT_IS_EXTERNAL(PTR) \
+ ((VARATT_SIZEP(PTR) & VARATT_FLAG_EXTERNAL) != 0)
+#define VARATT_IS_COMPRESSED(PTR) \
+ ((VARATT_SIZEP(PTR) & VARATT_FLAG_COMPRESSED) != 0)
+
+/* ----------
+ * This is regularly declared in access/tuptoaster.h,
+ * but we don't want to include that into every source,
+ * so we (evil evil evil) declare it here once more.
+ * ----------
+ */
+extern varattrib *heap_tuple_untoast_attr(varattrib *attr);
+
+#define VARATT_GETPLAIN(_ARG,_VAR) { \
+ if (VARATTR_IS_EXTENDED(_ARG)) \
+ (_VAR) = (void *)heap_tuple_untoast_attr(_ARG); \
+ else \
+ (_VAR) = (_ARG); \
+ }
+#define VARATT_FREE(_ARG,VAR) { \
+ if ((void *)(_VAR) != (void *)(_ARG)) \
+ pfree((void *)(_VAR)); \
+ }
+#else /* TUPLE_TOASTER_ACTIVE */
+#define VARATT_SIZE(__PTR) VARSIZE(__PTR)
+#define VARATT_SIZEP(__PTR) VARSIZE(__PTR)
+#endif /* TUPLE_TOASTER_ACTIVE */
+
+
/* We want NameData to have length NAMEDATALEN and int alignment,
* because that's how the data type 'name' is defined in pg_type.
* Use a union to make sure the compiler agrees.
WHERE (p1.prolang = 0 OR p1.prorettype = 0 OR
p1.pronargs < 0 OR p1.pronargs > 9)
AND p1.proname !~ '^pl[^_]+_call_handler$'
- AND p1.proname !~ '^RI_FKey_';
+ AND p1.proname !~ '^RI_FKey_'
+ AND p1.proname != 'update_pg_pwd';
oid|proname
---+-------
(0 rows)
2|13
(3 rows)
-QUERY: delete from rtest_v1 where b = 12;
-QUERY: select * from rtest_v1;
** Remember the delete rule on rtest_v1: It says
** DO INSTEAD DELETE FROM rtest_t1 WHERE a = old.a
** So this time both rows with a = 2 must get deleted
+QUERY: delete from rtest_v1 where b = 12;
+QUERY: select * from rtest_v1;
a| b
-+--
1|11
WHERE (p1.prolang = 0 OR p1.prorettype = 0 OR
p1.pronargs < 0 OR p1.pronargs > 9)
AND p1.proname !~ '^pl[^_]+_call_handler$'
- AND p1.proname !~ '^RI_FKey_';
+ AND p1.proname !~ '^RI_FKey_'
+ AND p1.proname != 'update_pg_pwd';
-- Look for conflicting proc definitions (same names and input datatypes).