Add TEMP tables/indexes. Add COPY pfree(). Other cleanups.

This commit is contained in:
Bruce Momjian 1999-02-02 03:45:56 +00:00
parent 7fc75517df
commit 4390b0bfbe
69 changed files with 7195 additions and 6851 deletions

View File

@ -248,7 +248,7 @@ Specifies that output goes to a pipe or terminal.
</para>
<para>
The backslash character has other special meanings. NULL attributes are
output as "\N". A literal backslash character is output as two
represented as "\N". A literal backslash character is represented as two
consecutive backslashes ("\\"). A literal tab character is represented
as a backslash and a tab. A literal newline character is
represented as a backslash and a newline. When loading text data

View File

@ -18,7 +18,7 @@
<DATE>1998-09-11</DATE>
</REFSYNOPSISDIVINFO>
<SYNOPSIS>
CREATE TABLE <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> (
CREATE [TEMP] TABLE <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> (
<REPLACEABLE CLASS="PARAMETER">column</REPLACEABLE> <REPLACEABLE CLASS="PARAMETER">type</REPLACEABLE>
[ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT <REPLACEABLE CLASS="PARAMETER">value</REPLACEABLE> ]
[<REPLACEABLE>column_constraint_clause</REPLACEABLE> | PRIMARY KEY } [ ... ] ]
@ -38,6 +38,18 @@ CREATE TABLE <REPLACEABLE CLASS="PARAMETER">table</REPLACEABLE> (
</TITLE>
<PARA>
<VARLISTENTRY>
<TERM>
TEMP
</TERM>
<LISTITEM>
<PARA>
The table is created unique to this session, and is
automatically dropped on session exit.
</PARA>
</LISTITEM>
</VARLISTENTRY>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>

View File

@ -19,7 +19,7 @@ SELECT
<synopsis>
SELECT [ALL|DISTINCT [ON <replaceable class="PARAMETER">column</replaceable>] ]
<replaceable class="PARAMETER">expression</replaceable> [ AS <replaceable class="PARAMETER">name</replaceable> ] [, ...]
[ INTO [TABLE] <replaceable class="PARAMETER">new_table</replaceable> ]
[ INTO [TEMP] [TABLE] <replaceable class="PARAMETER">new_table</replaceable> ]
[ FROM <replaceable class="PARAMETER">table</replaceable> [<replaceable class="PARAMETER">alias</replaceable> ] [, ...] ]
[ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
[ GROUP BY <replaceable class="PARAMETER">column</replaceable> [, ...] ]
@ -64,6 +64,18 @@ SELECT [ALL|DISTINCT [ON <replaceable class="PARAMETER">column</replaceable>] ]
</listitem>
</varlistentry>
<VARLISTENTRY>
<TERM>
TEMP
</TERM>
<LISTITEM>
<PARA>
The table is created unique to this session, and is
automatically dropped on session exit.
</PARA>
</LISTITEM>
</VARLISTENTRY>
<varlistentry>
<term>
<replaceable class="PARAMETER">new_table</replaceable>
@ -599,7 +611,7 @@ Create a new table from an existing table or view
</refsynopsisdivinfo>
<synopsis>
SELECT [ ALL | DISTINCT ] <replaceable class="PARAMETER">expression</replaceable> [ AS <replaceable class="PARAMETER">name</replaceable> ] [, ...]
INTO [ TABLE ] <replaceable class="PARAMETER">new_table</replaceable> ]
INTO [TEMP] [ TABLE ] <replaceable class="PARAMETER">new_table</replaceable> ]
[ FROM <replaceable class="PARAMETER">table</replaceable> [<replaceable class="PARAMETER">alias</replaceable>] [, ...] ]
[ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
[ GROUP BY <replaceable class="PARAMETER">column</replaceable> [, ...] ]

View File

@ -363,7 +363,7 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
<listitem>
<para>
enables the genetic optimizer algorithm
for statements with 8 or more tables.
for statements with 6 or more tables.
</para>
</listitem>
</varlistentry>
@ -406,7 +406,7 @@ SET TIME ZONE { '<REPLACEABLE CLASS="PARAMETER">timezone</REPLACEABLE>' | LOCAL
</para>
<para>
This algorithm is on by default, which used GEQO for
statements of eight or more tables.
statements of six or more tables.
(See the chapter on GEQO in the Programmer's Guide
for more information).
</para>

View File

@ -7,31 +7,31 @@
#
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/Makefile.global.in,v 1.54 1998/11/29 05:30:14 tgl Exp $
# $Header: /cvsroot/pgsql/src/Makefile.global.in,v 1.55 1999/02/02 03:43:56 momjian Exp $
#
# NOTES
# Essentially all Postgres make files include this file and use the
# variables it sets.
# Essentially all Postgres make files include this file and use the
# variables it sets.
#
# To override the default setting, create a Makefile.custom in this
# directory and put your defines there. (Makefile.custom is included
# near the end of this file). Sometimes, a variable gets set in
# Makefile.global after Makefile.custom has been included, so you can't
# simply set that variable in Makefile.custom. In those cases, there is
# often another variable (like CUSTOM_COPT) that you can set in
# often another variable (like CUSTOM_COPT) that you can set in
# Makefile.custom that influences the later setting of the true variable
# of interest (like CFLAGS) by Makefile.global.
#
#
# If you change any of these defines you probably have to
# If you change any of these defines you probably have to
# make clean; make
# since no dependencies are created for these. (of course you can
# since no dependencies are created for these. (of course you can
# be crafty and check what files really depend on them and just remake
# those).
#
# Before including this file, you must set the SRCDIR variable to the
# path of the top of the Postgres source tree (the directory that
# contains this file).
#
# Before including this file, you must set the SRCDIR variable to the
# path of the top of the Postgres source tree (the directory that
# contains this file).
#
#-------------------------------------------------------------------------
@ -40,8 +40,8 @@
#
# CONFIGURATION SECTION
#
# Following are settings pertaining to the postgres build and
# installation.
# Following are settings pertaining to the postgres build and
# installation.
# of the port.
#
# Ignore BSD_SHLIB if you're not using one of the BSD ports. But if you
@ -55,8 +55,8 @@ ELF_SYSTEM= @ELF_SYS@
LIBPQDIR:= $(SRCDIR)/interfaces/libpq
# For convenience, POSTGRESDIR is where BINDIR, and LIBDIR
# and other target destinations are rooted. Of course, each of these is
# For convenience, POSTGRESDIR is where BINDIR, and LIBDIR
# and other target destinations are rooted. Of course, each of these is
# changable separately.
POSTGRESDIR= @prefix@
@ -73,7 +73,7 @@ LIBDIR= $(POSTGRESDIR)/lib
# This is the directory where IPC utilities ipcs and ipcrm are located
#
IPCS=@ipcs@
IPCRM=@ipcrm@
IPCRM=@ipcrm@
# Where the man pages (suitable for use with "man") get installed.
POSTMANDIR= $(POSTGRESDIR)/man
@ -91,7 +91,7 @@ ODBCINST= $(POSTGRESDIR)
##############################################################################
#
# FEATURES
# FEATURES
#
# To disable a feature, comment out the entire definition
# (that is, prepend '#', don't set it to "0" or "no").
@ -167,7 +167,7 @@ endif
##############################################################################
#
# Installation.
# Installation.
#
# For many ports, INSTALL is overridden below.
INSTALL= @INSTALL@
@ -181,7 +181,7 @@ INSTL_SHLIB_OPTS= @INSTL_SHLIB_OPTS@
##############################################################################
#
# For building shell scripts:
#
#
# For many ports, these are overridden below.
# DASH_N is what we put before the text on an echo command when we don't
@ -191,7 +191,7 @@ INSTL_SHLIB_OPTS= @INSTL_SHLIB_OPTS@
# you do echo "no newline after this\c".
DASH_N= @DASH_N@
BACKSLASH_C= @BACKSLASH_C@
BACKSLASH_C= @BACKSLASH_C@
@ -204,7 +204,7 @@ YFLAGS= @YFLAGS@
YACC= @YACC@
LEX= @LEX@
AROPT= @AROPT@
CFLAGS= -I$(SRCDIR)/include -I$(SRCDIR)/backend @CPPFLAGS@ @CFLAGS@
CFLAGS= -I$(SRCDIR)/include -I$(SRCDIR)/backend @CPPFLAGS@ @CFLAGS@
CFLAGS_SL= @SHARED_LIB@
LDFLAGS= @LDFLAGS@ @LIBS@
DLSUFFIX= @DLSUFFIX@
@ -245,25 +245,25 @@ INSTALL= $(CUSTOM_INSTALL)
endif
#
# Flags for CC and LD.
# Flags for CC and LD.
##############################################################################
# COPT
#
# COPT is for options that the sophisticated builder might want to vary
# COPT is for options that the sophisticated builder might want to vary
# from one build to the next, like options to build Postgres with debugging
# information included. COPT is meant to be set on the make command line,
# information included. COPT is meant to be set on the make command line,
# for example with the command "make COPT=-g". The value you see set here
# is the default that gets used if the builder does not give a value for
# COPT on his make command.
#
# There is a nonobvious relationship between -O (optimization) and
# There is a nonobvious relationship between -O (optimization) and
# -Werror (consider all warnings fatal). On some systems, if you don't
# optimize, you will always get some warnings because the system header
# files will include some unreferenced functions in the code. These are
# functions that are supposed to be inline, so there wouldn't ordinarily
# be an "unreferenced" problem, but if you don't enable optimization, no
# inlining can happen, and hence the problem. Therefore, we include
# inlining can happen, and hence the problem. Therefore, we include
# if you override -O, you override -Werror as well.
#
# CUSTOM_COPT is something the user may set in Makefile.custom

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Id: hio.c,v 1.15 1998/12/15 12:45:14 vadim Exp $
* $Id: hio.c,v 1.16 1999/02/02 03:43:57 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -110,7 +110,7 @@ RelationPutHeapTupleAtEnd(Relation relation, HeapTuple tuple)
ItemId itemId;
Item item;
if (!relation->rd_islocal)
if (!relation->rd_myxactonly)
LockRelation(relation, ExtendLock);
/*
@ -158,7 +158,7 @@ RelationPutHeapTupleAtEnd(Relation relation, HeapTuple tuple)
elog(ERROR, "Tuple is too big: size %d", len);
}
if (!relation->rd_islocal)
if (!relation->rd_myxactonly)
UnlockRelation(relation, ExtendLock);
offnum = PageAddItem((Page) pageHeader, (Item) tuple->t_data,

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.29 1999/01/29 09:22:53 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.30 1999/02/02 03:44:00 momjian Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
@ -850,7 +850,7 @@ StartTransaction()
are created in the course of the transactions
they need to be destroyed properly at the end of the transactions
*/
InitTempRelList();
InitNoNameRelList();
/* ----------------
* done with start processing, set current transaction
@ -917,7 +917,7 @@ CommitTransaction()
AtCommit_Notify();
CloseSequences();
DestroyTempRels();
DestroyNoNameRels();
AtEOXact_portals();
RecordTransactionCommit();
RelationPurgeLocalRelation(true);
@ -984,7 +984,7 @@ AbortTransaction()
AtEOXact_portals();
RecordTransactionAbort();
RelationPurgeLocalRelation(false);
DestroyTempRels();
DestroyNoNameRels();
AtAbort_Cache();
AtAbort_Locks();
AtAbort_Memory();

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.22 1999/01/21 22:48:04 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.23 1999/02/02 03:44:03 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -164,7 +164,8 @@ Boot_CreateStmt:
if (DebugMode)
puts("creating bootstrap relation");
tupdesc = CreateTupleDesc(numattr,attrtypes);
reldesc = heap_create(LexIDStr($3), tupdesc);
reldesc = heap_create(LexIDStr($3), tupdesc,
false, false);
if (DebugMode)
puts("bootstrap relation created ok");
}
@ -175,7 +176,7 @@ Boot_CreateStmt:
tupdesc = CreateTupleDesc(numattr,attrtypes);
id = heap_create_with_catalog(LexIDStr($3),
tupdesc, RELKIND_RELATION);
tupdesc, RELKIND_RELATION, false);
if (!Quiet)
printf("CREATED relation %s with OID %d\n",
LexIDStr($3), id);

View File

@ -7,7 +7,8 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.70 1998/12/15 12:45:40 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.71 1999/02/02 03:44:08 momjian Exp $
*
*
* INTERFACE ROUTINES
* heap_create() - Create an uncataloged heap relation
@ -26,6 +27,7 @@
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "miscadmin.h"
#include "access/heapam.h"
#include "catalog/catalog.h"
@ -41,7 +43,6 @@
#include "catalog/pg_type.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "miscadmin.h"
#include "nodes/plannodes.h"
#include "optimizer/tlist.h"
#include "parser/parse_expr.h"
@ -53,11 +54,13 @@
#include "storage/lmgr.h"
#include "storage/smgr.h"
#include "tcop/tcopprot.h"
#include "utils/catcache.h"
#include "utils/builtins.h"
#include "utils/mcxt.h"
#include "utils/relcache.h"
#include "utils/syscache.h"
#include "utils/tqual.h"
#include "utils/temprel.h"
#ifndef HAVE_MEMMOVE
#include <regex/utils.h>
@ -65,18 +68,17 @@
#include <string.h>
#endif
static void AddPgRelationTuple(Relation pg_class_desc,
static void AddNewRelationTuple(Relation pg_class_desc,
Relation new_rel_desc, Oid new_rel_oid, unsigned natts,
char relkind);
static void AddToTempRelList(Relation r);
static void DeletePgAttributeTuples(Relation rel);
static void DeletePgRelationTuple(Relation rel);
static void DeletePgTypeTuple(Relation rel);
static int RelationAlreadyExists(Relation pg_class_desc, char *relname);
char relkind, char *temp_relname);
static void AddToNoNameRelList(Relation r);
static void DeleteAttributeTuples(Relation rel);
static void DeleteRelationTuple(Relation rel);
static void DeleteTypeTuple(Relation rel);
static void RelationRemoveIndexes(Relation relation);
static void RelationRemoveInheritance(Relation relation);
static void RemoveFromTempRelList(Relation r);
static void addNewRelationType(char *typeName, Oid new_rel_oid);
static void RemoveFromNoNameRelList(Relation r);
static void AddNewRelationType(char *typeName, Oid new_rel_oid);
static void StoreConstraints(Relation rel);
static void RemoveConstraints(Relation rel);
@ -167,35 +169,34 @@ static TempRelList *tempRels = NULL;
*
*
* if heap_create is called with "" as the name, then heap_create will create
* a temporary name "temp_$RELOID" for the relation
* a temporary name "pg_noname.$PID.$SEQUENCE" for the relation
* ----------------------------------------------------------------
*/
Relation
heap_create(char *name,
TupleDesc tupDesc)
heap_create(char *relname,
TupleDesc tupDesc,
bool isnoname,
bool istemp)
{
unsigned i;
Oid relid;
Relation rel;
int len;
bool nailme = false;
char *relname = name;
char tempname[NAMEDATALEN];
int isTemp = 0;
int natts = tupDesc->natts;
/* Form_pg_attribute *att = tupDesc->attrs; */
static unsigned int uniqueId = 0;
extern GlobalMemory CacheCxt;
MemoryContext oldcxt;
/* ----------------
* sanity checks
* ----------------
*/
AssertArg(natts > 0);
if (IsSystemRelationName(relname) && IsNormalProcessingMode())
if (relname && IsSystemRelationName(relname) && IsNormalProcessingMode())
{
elog(ERROR,
"Illegal class name: %s -- pg_ is reserved for system catalogs",
@ -218,22 +219,22 @@ heap_create(char *name,
* descriptor follows.
* ----------------
*/
if (!strcmp(RelationRelationName, relname))
if (relname && !strcmp(RelationRelationName, relname))
{
relid = RelOid_pg_class;
nailme = true;
}
else if (!strcmp(AttributeRelationName, relname))
else if (relname && !strcmp(AttributeRelationName, relname))
{
relid = RelOid_pg_attribute;
nailme = true;
}
else if (!strcmp(ProcedureRelationName, relname))
else if (relname && !strcmp(ProcedureRelationName, relname))
{
relid = RelOid_pg_proc;
nailme = true;
}
else if (!strcmp(TypeRelationName, relname))
else if (relname && !strcmp(TypeRelationName, relname))
{
relid = RelOid_pg_type;
nailme = true;
@ -241,14 +242,21 @@ heap_create(char *name,
else
{
relid = newoid();
}
if (name[0] == '\0')
{
snprintf(tempname, NAMEDATALEN, "temp_%d", relid);
Assert(strlen(tempname) < NAMEDATALEN);
relname = tempname;
isTemp = 1;
}
if (isnoname)
{
Assert(!relname);
relname = palloc(NAMEDATALEN);
snprintf(relname, NAMEDATALEN, "pg_noname.%d.%u",
(int) MyProcPid, uniqueId++);
}
if (istemp)
{
/* replace relname of caller */
snprintf(relname, NAMEDATALEN, "pg_temp.%d.%u",
(int) MyProcPid, uniqueId++);
}
/* ----------------
@ -262,16 +270,11 @@ heap_create(char *name,
rel = (Relation) palloc(len);
MemSet((char *) rel, 0, len);
/* ----------
create a new tuple descriptor from the one passed in
/*
* create a new tuple descriptor from the one passed in
*/
rel->rd_att = CreateTupleDescCopyConstr(tupDesc);
/* ----------------
* initialize the fields of our new relation descriptor
* ----------------
*/
/* ----------------
* nail the reldesc if this is a bootstrap create reln and
* we may need it in the cache later on in the bootstrap
@ -285,8 +288,11 @@ heap_create(char *name,
rel->rd_rel = (Form_pg_class) palloc(sizeof *rel->rd_rel);
MemSet((char *) rel->rd_rel, 0,
sizeof *rel->rd_rel);
/* ----------------
* initialize the fields of our new relation descriptor
* ----------------
*/
MemSet((char *) rel->rd_rel, 0, sizeof *rel->rd_rel);
namestrcpy(&(rel->rd_rel->relname), relname);
rel->rd_rel->relkind = RELKIND_UNCATALOGED;
rel->rd_rel->relnatts = natts;
@ -305,31 +311,30 @@ heap_create(char *name,
}
/* ----------------
* remember if this is a temp relation
* remember if this is a noname relation
* ----------------
*/
rel->rd_istemp = isTemp;
rel->rd_isnoname = isnoname;
/* ----------------
* have the storage manager create the relation.
* ----------------
*/
rel->rd_tmpunlinked = TRUE; /* change once table is created */
rel->rd_nonameunlinked = TRUE; /* change once table is created */
rel->rd_fd = (File) smgrcreate(DEFAULT_SMGR, rel);
rel->rd_tmpunlinked = FALSE;
rel->rd_nonameunlinked = FALSE;
RelationRegisterRelation(rel);
MemoryContextSwitchTo(oldcxt);
/*
* add all temporary relations to the tempRels list so they can be
* add all noname relations to the tempRels list so they can be
* properly disposed of at the end of transaction
*/
if (isTemp)
AddToTempRelList(rel);
if (isnoname)
AddToNoNameRelList(rel);
return rel;
}
@ -343,7 +348,7 @@ heap_create(char *name,
* 1) CheckAttributeNames() is used to make certain the tuple
* descriptor contains a valid set of attribute names
*
* 2) pg_class is opened and RelationAlreadyExists()
* 2) pg_class is opened and RelationFindRelid()
* preforms a scan to ensure that no relation with the
* same name already exists.
*
@ -356,7 +361,7 @@ heap_create(char *name,
* 5) AddNewAttributeTuples() is called to register the
* new relation's schema in pg_attribute.
*
* 6) AddPgRelationTuple() is called to register the
* 6) AddNewRelationTuple() is called to register the
* relation itself in the catalogs.
*
* 7) StoreConstraints is called () - vadim 08/22/97
@ -456,71 +461,78 @@ CheckAttributeNames(TupleDesc tupdesc)
}
/* --------------------------------
* RelationAlreadyExists
* RelnameFindRelid
*
* this preforms a scan of pg_class to ensure that
* no relation with the same name already exists. The caller
* has to open pg_class and pass an open descriptor.
* no relation with the same name already exists.
* --------------------------------
*/
static int
RelationAlreadyExists(Relation pg_class_desc, char *relname)
Oid
RelnameFindRelid(char *relname)
{
ScanKeyData key;
HeapScanDesc pg_class_scan;
HeapTuple tup;
HeapTuple tuple;
Oid relid;
/*
* If this is not bootstrap (initdb) time, use the catalog index on
* pg_class.
*/
if (!IsBootstrapProcessingMode())
{
tup = SearchSysCacheTuple(RELNAME,
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(relname),
0, 0, 0);
if (HeapTupleIsValid(tup))
return true;
if (HeapTupleIsValid(tuple))
relid = tuple->t_data->t_oid;
else
return false;
relid = InvalidOid;
}
else
{
Relation pg_class_desc;
ScanKeyData key;
HeapScanDesc pg_class_scan;
pg_class_desc = heap_openr(RelationRelationName);
/* ----------------
* At bootstrap time, we have to do this the hard way. Form the
* scan key.
* ----------------
*/
ScanKeyEntryInitialize(&key,
0,
(AttrNumber) Anum_pg_class_relname,
(RegProcedure) F_NAMEEQ,
(Datum) relname);
/* ----------------
* At bootstrap time, we have to do this the hard way. Form the
* scan key.
* ----------------
*/
ScanKeyEntryInitialize(&key,
0,
(AttrNumber) Anum_pg_class_relname,
(RegProcedure) F_NAMEEQ,
(Datum) relname);
/* ----------------
* begin the scan
* ----------------
*/
pg_class_scan = heap_beginscan(pg_class_desc,
0,
SnapshotNow,
1,
&key);
/* ----------------
* get a tuple. if the tuple is NULL then it means we
* didn't find an existing relation.
* ----------------
*/
tuple = heap_getnext(pg_class_scan, 0);
if (HeapTupleIsValid(tuple))
relid = tuple->t_data->t_oid;
else
relid = InvalidOid;
/* ----------------
* begin the scan
* ----------------
*/
pg_class_scan = heap_beginscan(pg_class_desc,
0,
SnapshotNow,
1,
&key);
heap_endscan(pg_class_scan);
/* ----------------
* get a tuple. if the tuple is NULL then it means we
* didn't find an existing relation.
* ----------------
*/
tup = heap_getnext(pg_class_scan, 0);
/* ----------------
* end the scan and return existance of relation.
* ----------------
*/
heap_endscan(pg_class_scan);
return HeapTupleIsValid(tup);
heap_close(pg_class_desc);
}
return relid;
}
/* --------------------------------
@ -583,6 +595,7 @@ AddNewAttributeTuples(Oid new_rel_oid,
(char *) *dpp);
heap_insert(rel, tup);
if (hasindex)
CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup);
@ -623,18 +636,19 @@ AddNewAttributeTuples(Oid new_rel_oid,
}
/* --------------------------------
* AddPgRelationTuple
* AddNewRelationTuple
*
* this registers the new relation in the catalogs by
* adding a tuple to pg_class.
* --------------------------------
*/
static void
AddPgRelationTuple(Relation pg_class_desc,
AddNewRelationTuple(Relation pg_class_desc,
Relation new_rel_desc,
Oid new_rel_oid,
unsigned natts,
char relkind)
char relkind,
char *temp_relname)
{
Form_pg_class new_rel_reltup;
HeapTuple tup;
@ -679,9 +693,11 @@ AddPgRelationTuple(Relation pg_class_desc,
heap_insert(pg_class_desc, tup);
if (temp_relname)
create_temp_relation(temp_relname, tup);
if (!isBootstrap)
{
/*
* First, open the catalog indices and insert index tuples for the
* new relation.
@ -690,23 +706,22 @@ AddPgRelationTuple(Relation pg_class_desc,
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class_desc, tup);
CatalogCloseIndices(Num_pg_class_indices, idescs);
/* now restore processing mode */
SetProcessingMode(NormalProcessing);
}
pfree(tup);
}
/* --------------------------------
* addNewRelationType -
* AddNewRelationType -
*
* define a complex type corresponding to the new relation
* --------------------------------
*/
static void
addNewRelationType(char *typeName, Oid new_rel_oid)
AddNewRelationType(char *typeName, Oid new_rel_oid)
{
Oid new_type_oid;
@ -745,38 +760,55 @@ addNewRelationType(char *typeName, Oid new_rel_oid)
Oid
heap_create_with_catalog(char *relname,
TupleDesc tupdesc,
char relkind)
char relkind,
bool istemp)
{
Relation pg_class_desc;
Relation new_rel_desc;
Oid new_rel_oid;
int natts = tupdesc->natts;
char *temp_relname = NULL;
/* ----------------
* sanity checks
* ----------------
*/
AssertState(IsNormalProcessingMode() || IsBootstrapProcessingMode());
Assert(IsNormalProcessingMode() || IsBootstrapProcessingMode());
if (natts == 0 || natts > MaxHeapAttributeNumber)
elog(ERROR, "amcreate: from 1 to %d attributes must be specified",
MaxHeapAttributeNumber);
MaxHeapAttributeNumber);
CheckAttributeNames(tupdesc);
/* ----------------
* open pg_class and see that the relation doesn't
* already exist.
* ----------------
*/
pg_class_desc = heap_openr(RelationRelationName);
if (RelationAlreadyExists(pg_class_desc, relname))
{
heap_close(pg_class_desc);
/* temp tables can mask non-temp tables */
if ((!istemp && RelnameFindRelid(relname)) ||
(istemp && get_temp_rel_by_name(relname) != NULL))
elog(ERROR, "%s relation already exists", relname);
}
/* invalidate cache so non-temp table is masked by temp */
if (istemp)
{
Oid relid = RelnameFindRelid(relname);
if (relid != InvalidOid)
{
/*
* This is heavy-handed, but appears necessary bjm 1999/02/01
* SystemCacheRelationFlushed(relid) is not enough either.
*/
RelationForgetRelation(relid);
ResetSystemCache();
}
}
/* save user relation name because heap_create changes it */
if (istemp)
{
temp_relname = pstrdup(relname); /* save original value */
relname = palloc(NAMEDATALEN);
strcpy(relname, temp_relname); /* heap_create will change this */
}
/* ----------------
* ok, relation does not already exist so now we
* create an uncataloged relation and pull its relation oid
@ -784,9 +816,11 @@ heap_create_with_catalog(char *relname,
*
* Note: The call to heap_create() does all the "real" work
* of creating the disk file for the relation.
* This changes relname for noname and temp tables.
* ----------------
*/
new_rel_desc = heap_create(relname, tupdesc);
new_rel_desc = heap_create(relname, tupdesc, false, istemp);
new_rel_oid = new_rel_desc->rd_att->attrs[0]->attrelid;
/* ----------------
@ -794,7 +828,7 @@ heap_create_with_catalog(char *relname,
* we add a new system type corresponding to the new relation.
* ----------------
*/
addNewRelationType(relname, new_rel_oid);
AddNewRelationType(relname, new_rel_oid);
/* ----------------
* now add tuples to pg_attribute for the attributes in
@ -807,14 +841,23 @@ heap_create_with_catalog(char *relname,
* now update the information in pg_class.
* ----------------
*/
AddPgRelationTuple(pg_class_desc,
pg_class_desc = heap_openr(RelationRelationName);
AddNewRelationTuple(pg_class_desc,
new_rel_desc,
new_rel_oid,
natts,
relkind);
relkind,
temp_relname);
StoreConstraints(new_rel_desc);
if (istemp)
{
pfree(relname);
pfree(temp_relname);
}
/* ----------------
* ok, the relation has been cataloged, so close our relations
* and return the oid of the newly created relation.
@ -990,12 +1033,12 @@ RelationRemoveIndexes(Relation relation)
}
/* --------------------------------
* DeletePgRelationTuple
* DeleteRelationTuple
*
* --------------------------------
*/
static void
DeletePgRelationTuple(Relation rel)
DeleteRelationTuple(Relation rel)
{
Relation pg_class_desc;
HeapTuple tup;
@ -1012,7 +1055,7 @@ DeletePgRelationTuple(Relation rel)
if (!HeapTupleIsValid(tup))
{
heap_close(pg_class_desc);
elog(ERROR, "DeletePgRelationTuple: %s relation nonexistent",
elog(ERROR, "DeleteRelationTuple: %s relation nonexistent",
&rel->rd_rel->relname);
}
@ -1027,12 +1070,12 @@ DeletePgRelationTuple(Relation rel)
}
/* --------------------------------
* DeletePgAttributeTuples
* DeleteAttributeTuples
*
* --------------------------------
*/
static void
DeletePgAttributeTuples(Relation rel)
DeleteAttributeTuples(Relation rel)
{
Relation pg_attribute_desc;
HeapTuple tup;
@ -1073,7 +1116,7 @@ DeletePgAttributeTuples(Relation rel)
}
/* --------------------------------
* DeletePgTypeTuple
* DeleteTypeTuple
*
* If the user attempts to destroy a relation and there
* exists attributes in other relations of type
@ -1082,7 +1125,7 @@ DeletePgAttributeTuples(Relation rel)
* --------------------------------
*/
static void
DeletePgTypeTuple(Relation rel)
DeleteTypeTuple(Relation rel)
{
Relation pg_type_desc;
HeapScanDesc pg_type_scan;
@ -1127,7 +1170,7 @@ DeletePgTypeTuple(Relation rel)
{
heap_endscan(pg_type_scan);
heap_close(pg_type_desc);
elog(ERROR, "DeletePgTypeTuple: %s type nonexistent",
elog(ERROR, "DeleteTypeTuple: %s type nonexistent",
&rel->rd_rel->relname);
}
@ -1171,7 +1214,7 @@ DeletePgTypeTuple(Relation rel)
heap_endscan(pg_attribute_scan);
heap_close(pg_attribute_desc);
elog(ERROR, "DeletePgTypeTuple: att of type %s exists in relation %d",
elog(ERROR, "DeleteTypeTuple: att of type %s exists in relation %d",
&rel->rd_rel->relname, relid);
}
heap_endscan(pg_attribute_scan);
@ -1199,6 +1242,7 @@ heap_destroy_with_catalog(char *relname)
{
Relation rel;
Oid rid;
bool istemp = (get_temp_rel_by_name(relname) != NULL);
/* ----------------
* first open the relation. if the relation does exist,
@ -1216,7 +1260,8 @@ heap_destroy_with_catalog(char *relname)
* prevent deletion of system relations
* ----------------
*/
if (IsSystemRelationName(RelationGetRelationName(rel)->data))
/* allow temp of pg_class? Guess so. */
if (!istemp && IsSystemRelationName(RelationGetRelationName(rel)->data))
elog(ERROR, "amdestroy: cannot destroy %s relation",
&rel->rd_rel->relname);
@ -1248,22 +1293,26 @@ heap_destroy_with_catalog(char *relname)
* delete attribute tuples
* ----------------
*/
DeletePgAttributeTuples(rel);
DeleteAttributeTuples(rel);
if (istemp)
remove_temp_relation(rid);
/* ----------------
* delete type tuple. here we want to see the effects
* of the deletions we just did, so we use setheapoverride().
* ----------------
*/
setheapoverride(true);
DeletePgTypeTuple(rel);
DeleteTypeTuple(rel);
setheapoverride(false);
/* ----------------
* delete relation tuple
* ----------------
*/
DeletePgRelationTuple(rel);
/* must delete fake tuple in cache */
DeleteRelationTuple(rel);
/*
* release dirty buffers of this relation
@ -1283,16 +1332,15 @@ heap_destroy_with_catalog(char *relname)
* unlink the relation and finish up.
* ----------------
*/
if (!(rel->rd_istemp) || !(rel->rd_tmpunlinked))
if (!(rel->rd_isnoname) || !(rel->rd_nonameunlinked))
smgrunlink(DEFAULT_SMGR, rel);
rel->rd_tmpunlinked = TRUE;
rel->rd_nonameunlinked = TRUE;
UnlockRelation(rel, AccessExclusiveLock);
heap_close(rel);
/* ok - flush the relation from the relcache */
RelationForgetRelation(rid);
}
@ -1306,11 +1354,11 @@ void
heap_destroy(Relation rel)
{
ReleaseRelationBuffers(rel);
if (!(rel->rd_istemp) || !(rel->rd_tmpunlinked))
if (!(rel->rd_isnoname) || !(rel->rd_nonameunlinked))
smgrunlink(DEFAULT_SMGR, rel);
rel->rd_tmpunlinked = TRUE;
rel->rd_nonameunlinked = TRUE;
heap_close(rel);
RemoveFromTempRelList(rel);
RemoveFromNoNameRelList(rel);
}
@ -1336,7 +1384,7 @@ heap_destroy(Relation rel)
*/
void
InitTempRelList(void)
InitNoNameRelList(void)
{
if (tempRels)
{
@ -1356,10 +1404,10 @@ InitTempRelList(void)
MODIFIES the global variable tempRels
we don't really remove it, just mark it as NULL
and DestroyTempRels will look for NULLs
and DestroyNoNameRels will look for NULLs
*/
static void
RemoveFromTempRelList(Relation r)
RemoveFromNoNameRelList(Relation r)
{
int i;
@ -1382,7 +1430,7 @@ RemoveFromTempRelList(Relation r)
MODIFIES the global variable tempRels
*/
static void
AddToTempRelList(Relation r)
AddToNoNameRelList(Relation r)
{
if (!tempRels)
return;
@ -1401,7 +1449,7 @@ AddToTempRelList(Relation r)
go through the tempRels list and destroy each of the relations
*/
void
DestroyTempRels(void)
DestroyNoNameRels(void)
{
int i;
Relation rel;

View File

@ -7,19 +7,13 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.67 1999/01/21 22:48:05 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.68 1999/02/02 03:44:13 momjian Exp $
*
*
* INTERFACE ROUTINES
* index_create() - Create a cataloged index relation
* index_destroy() - Removes index relation from catalogs
*
* NOTES
* Much of this code uses hardcoded sequential heap relation scans
* to fetch information from the catalogs. These should all be
* rewritten to use the system caches lookup routines like
* SearchSysCacheTuple, which can do efficient lookup and
* caching.
*
*-------------------------------------------------------------------------
*/
@ -46,10 +40,12 @@
#include "storage/lmgr.h"
#include "storage/smgr.h"
#include "utils/builtins.h"
#include "utils/catcache.h"
#include "utils/mcxt.h"
#include "utils/relcache.h"
#include "utils/syscache.h"
#include "utils/tqual.h"
#include "utils/temprel.h"
#ifndef HAVE_MEMMOVE
#include <regex/utils.h>
@ -64,16 +60,15 @@
#define NTUPLES_PER_PAGE(natts) (BLCKSZ/((natts)*AVG_TUPLE_SIZE))
/* non-export function prototypes */
static Oid
RelationNameGetObjectId(char *relationName, Relation pg_class);
static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName);
static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName,
bool istemp);
static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
List *attributeList,
int numatts, AttrNumber *attNums);
static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
static Oid UpdateRelationRelation(Relation indexRelation);
static Oid UpdateRelationRelation(Relation indexRelation, char *temp_relname);
static void InitializeAttributeOids(Relation indexRelation,
int numatts,
Oid indexoid);
@ -121,105 +116,30 @@ static FormData_pg_attribute sysatts[] = {
{0, {"cmax"}, CIDOID, 0, 4, -6, 0, -1, -1, '\001', '\0', 'i', '\0', '\0'},
};
/* ----------------------------------------------------------------
* RelationNameGetObjectId --
* Returns the object identifier for a relation given its name.
*
* ----------------------------------------------------------------
*/
static Oid
RelationNameGetObjectId(char *relationName,
Relation pg_class)
{
HeapScanDesc pg_class_scan;
HeapTuple pg_class_tuple;
Oid relationObjectId;
ScanKeyData key;
/*
* If this isn't bootstrap time, we can use the system catalogs to
* speed this up.
*/
if (!IsBootstrapProcessingMode())
{
HeapTuple tuple;
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(relationName),
0, 0, 0);
if (HeapTupleIsValid(tuple))
return tuple->t_data->t_oid;
else
return InvalidOid;
}
/* ----------------
* BOOTSTRAP TIME, do this the hard way.
* begin a scan of pg_class for the named relation
* ----------------
*/
ScanKeyEntryInitialize(&key, 0, Anum_pg_class_relname,
F_NAMEEQ,
PointerGetDatum(relationName));
pg_class_scan = heap_beginscan(pg_class, 0, SnapshotNow, 1, &key);
/* ----------------
* if we find the named relation, fetch its relation id
* (the oid of the tuple we found).
* ----------------
*/
pg_class_tuple = heap_getnext(pg_class_scan, 0);
if (!HeapTupleIsValid(pg_class_tuple))
relationObjectId = InvalidOid;
else
relationObjectId = pg_class_tuple->t_data->t_oid;
/* ----------------
* cleanup and return results
* ----------------
*/
heap_endscan(pg_class_scan);
return relationObjectId;
}
/* ----------------------------------------------------------------
* GetHeapRelationOid
* ----------------------------------------------------------------
*/
static Oid
GetHeapRelationOid(char *heapRelationName, char *indexRelationName)
GetHeapRelationOid(char *heapRelationName, char *indexRelationName, bool istemp)
{
Relation pg_class;
Oid indoid;
Oid heapoid;
/* ----------------
* open pg_class and get the oid of the relation
* corresponding to the name of the index relation.
* ----------------
*/
pg_class = heap_openr(RelationRelationName);
indoid = RelnameFindRelid(indexRelationName);
indoid = RelationNameGetObjectId(indexRelationName, pg_class);
if (OidIsValid(indoid))
if ((!istemp && OidIsValid(indoid)) ||
(istemp && get_temp_rel_by_name(indexRelationName) != NULL))
elog(ERROR, "Cannot create index: '%s' already exists",
indexRelationName);
heapoid = RelationNameGetObjectId(heapRelationName, pg_class);
heapoid = RelnameFindRelid(heapRelationName);
if (!OidIsValid(heapoid))
elog(ERROR, "Cannot create index on '%s': relation does not exist",
heapRelationName);
heap_close(pg_class);
return heapoid;
}
@ -538,7 +458,7 @@ ConstructIndexReldesc(Relation indexRelation, Oid amoid)
* ----------------------------------------------------------------
*/
static Oid
UpdateRelationRelation(Relation indexRelation)
UpdateRelationRelation(Relation indexRelation, char *temp_relname)
{
Relation pg_class;
HeapTuple tuple;
@ -561,6 +481,9 @@ UpdateRelationRelation(Relation indexRelation)
tuple->t_data->t_oid = RelationGetRelid(indexRelation);
heap_insert(pg_class, tuple);
if (temp_relname)
create_temp_relation(temp_relname, tuple);
/*
* During normal processing, we need to make sure that the system
* catalog indices are correct. Bootstrap (initdb) time doesn't
@ -760,6 +683,7 @@ UpdateIndexRelation(Oid indexoid,
}
else
predText = (text *) fmgr(F_TEXTIN, "");
predLen = VARSIZE(predText);
itupLen = predLen + sizeof(FormData_pg_index);
indexForm = (Form_pg_index) palloc(itupLen);
@ -1025,27 +949,28 @@ index_create(char *heapRelationName,
Oid heapoid;
Oid indexoid;
PredInfo *predInfo;
bool istemp = (get_temp_rel_by_name(heapRelationName) != NULL);
char *temp_relname = NULL;
/* ----------------
* check parameters
* ----------------
*/
if (numatts < 1)
elog(ERROR, "must index at least one attribute");
/* ----------------
* get heap relation oid and open the heap relation
* XXX ADD INDEXING
* ----------------
*/
heapoid = GetHeapRelationOid(heapRelationName, indexRelationName);
heapoid = GetHeapRelationOid(heapRelationName, indexRelationName, istemp);
heapRelation = heap_open(heapoid);
/*
* Only SELECT ... FOR UPDATE are allowed
*/
LockRelation(heapRelation, ShareLock);
/* ----------------
@ -1061,12 +986,36 @@ index_create(char *heapRelationName,
numatts,
attNums);
/* invalidate cache so possible non-temp index is masked by temp */
if (istemp)
{
Oid relid = RelnameFindRelid(indexRelationName);
if (relid != InvalidOid)
{
/*
* This is heavy-handed, but appears necessary bjm 1999/02/01
* SystemCacheRelationFlushed(relid) is not enough either.
*/
RelationForgetRelation(relid);
ResetSystemCache();
}
}
/* save user relation name because heap_create changes it */
if (istemp)
{
temp_relname = pstrdup(indexRelationName); /* save original value */
indexRelationName = palloc(NAMEDATALEN);
strcpy(indexRelationName, temp_relname); /* heap_create will change this */
}
/* ----------------
* create the index relation
* ----------------
*/
indexRelation = heap_create(indexRelationName,
indexTupDesc);
indexTupDesc, false, istemp);
/* ----------------
* construct the index relation descriptor
@ -1081,7 +1030,7 @@ index_create(char *heapRelationName,
* (append RELATION tuple)
* ----------------
*/
indexoid = UpdateRelationRelation(indexRelation);
indexoid = UpdateRelationRelation(indexRelation, temp_relname);
/* ----------------
* Now get the index procedure (only relevant for functional indices).
@ -1162,9 +1111,9 @@ index_create(char *heapRelationName,
}
/* ----------------------------------------------------------------
*
* index_destroy
*
* XXX break into modules like index_create
* ----------------------------------------------------------------
*/
void
@ -1175,11 +1124,11 @@ index_destroy(Oid indexId)
Relation relationRelation;
Relation attributeRelation;
HeapTuple tuple;
int16 attnum;
int16 attnum;
Assert(OidIsValid(indexId));
/* why open it here? bjm 1998/08/20 */
/* Open now to obtain lock by referencing table? bjm */
userindexRelation = index_open(indexId);
/* ----------------
@ -1192,7 +1141,7 @@ index_destroy(Oid indexId)
ObjectIdGetDatum(indexId),
0, 0, 0);
AssertState(HeapTupleIsValid(tuple));
Assert(HeapTupleIsValid(tuple));
heap_delete(relationRelation, &tuple->t_self, NULL);
pfree(tuple);
@ -1217,6 +1166,9 @@ index_destroy(Oid indexId)
}
heap_close(attributeRelation);
/* does something only if it is a temp index */
remove_temp_relation(indexId);
/* ----------------
* fix INDEX relation
* ----------------
@ -1224,10 +1176,7 @@ index_destroy(Oid indexId)
tuple = SearchSysCacheTupleCopy(INDEXRELID,
ObjectIdGetDatum(indexId),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
elog(NOTICE, "IndexRelationDestroy: %s's INDEX tuple missing",
RelationGetRelationName(userindexRelation));
Assert(HeapTupleIsValid(tuple));
indexRelation = heap_openr(IndexRelationName);

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.34 1998/11/27 19:51:50 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.35 1999/02/02 03:44:13 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -30,6 +30,7 @@
#include "storage/bufmgr.h"
#include "utils/builtins.h"
#include "utils/syscache.h"
#include "utils/temprel.h"
/*
* Names of indices on the following system catalogs:
@ -455,6 +456,13 @@ ClassNameIndexScan(Relation heapRelation, char *relName)
ScanKeyData skey[1];
HeapTuple tuple;
/*
* we have to do this before looking in system tables because temp
* table namespace takes precedence
*/
if ((tuple = get_temp_rel_by_name(relName)) != NULL)
return heap_copytuple(tuple);
ScanKeyEntryInitialize(&skey[0],
(bits16) 0x0,
(AttrNumber) 1,

View File

@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.35 1999/01/21 22:48:06 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.36 1999/02/02 03:44:17 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -219,7 +219,8 @@ copy_heap(Oid OIDOldHeap)
tupdesc = CreateTupleDescCopy(OldHeapDesc);
OIDNewHeap = heap_create_with_catalog(NewName, tupdesc, RELKIND_RELATION);
OIDNewHeap = heap_create_with_catalog(NewName, tupdesc,
RELKIND_RELATION, false);
if (!OidIsValid(OIDNewHeap))
elog(ERROR, "clusterheap: cannot create temporary heap relation\n");

View File

@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.69 1999/02/01 20:25:54 wieck Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.70 1999/02/02 03:44:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -646,7 +646,6 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
index_nulls[i] = ' ';
byval[i] = (bool) IsTypeByVal(attr[i]->atttypid);
}
values = (Datum *) palloc(sizeof(Datum) * attr_count);
lineno = 0;
while (!done)
@ -873,13 +872,16 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
}
pfree(values);
pfree(nulls);
pfree(index_nulls);
pfree(idatum);
pfree(byval);
if (!binary)
{
pfree(in_functions);
pfree(elements);
pfree(typmod);
}
pfree(byval);
/* comments in execUtils.c */
if (has_index)

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.37 1998/12/14 05:18:43 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.38 1999/02/02 03:44:19 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -138,8 +138,8 @@ DefineRelation(CreateStmt *stmt, char relkind)
}
}
relationId = heap_create_with_catalog(relname,
descriptor, relkind);
relationId = heap_create_with_catalog(relname, descriptor,
relkind, stmt->istemp);
StoreCatalogInheritance(relationId, inheritList);
}
@ -279,7 +279,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
SearchSysCacheTuple(TYPOID,
ObjectIdGetDatum(attribute->atttypid),
0, 0, 0);
AssertState(HeapTupleIsValid(tuple));
Assert(HeapTupleIsValid(tuple));
attributeType =
(((Form_pg_type) GETSTRUCT(tuple))->typname).data;

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.30 1999/01/21 22:48:06 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.31 1999/02/02 03:44:19 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -98,15 +98,11 @@ DefineIndex(char *heapRelationName,
/*
* compute heap relation id
*/
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(heapRelationName),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
if ((relationId = RelnameFindRelid(heapRelationName)) == InvalidOid)
{
elog(ERROR, "DefineIndex: %s relation not found",
heapRelationName);
}
relationId = tuple->t_data->t_oid;
if (unique && strcmp(accessMethodName, "btree") != 0)
elog(ERROR, "DefineIndex: unique indices are only available with the btree access method");

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/recipe.c,v 1.26 1998/12/14 05:18:44 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/recipe.c,v 1.27 1999/02/02 03:44:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -1025,7 +1025,7 @@ tg_parseSubQuery(TgRecipe * r, TgNode * n, TeeInfo * teeInfo)
relid = heap_create_with_catalog(
child->nodeElem->outTypes->val[0],
tupdesc, RELKIND_RELATION);
tupdesc, RELKIND_RELATION, false);
}
else
{
@ -1049,7 +1049,7 @@ tg_parseSubQuery(TgRecipe * r, TgNode * n, TeeInfo * teeInfo)
{
relid = heap_create_with_catalog(
child->nodeElem->outTypes->val[0],
tupdesc, RELKIND_RELATION);
tupdesc, RELKIND_RELATION, false);
}
}
}

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.19 1998/12/15 12:45:58 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.20 1999/02/02 03:44:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -18,6 +18,7 @@
#include <utils/builtins.h>
#include <catalog/catname.h>
#include <utils/syscache.h>
#include <catalog/heap.h>
#include <catalog/indexing.h>
#include <catalog/catalog.h>
#include <commands/copy.h>
@ -106,15 +107,9 @@ renameatt(char *relname,
List *child,
*children;
reltup = SearchSysCacheTuple(RELNAME,
PointerGetDatum(relname),
0, 0, 0);
if (!HeapTupleIsValid(reltup))
if ((myrelid = RelnameFindRelid(relname)) == InvalidOid)
elog(ERROR, "renameatt: unknown relation: \"%s\"", relname);
myrelid = reltup->t_data->t_oid;
/* this routine is actually in the planner */
children = find_all_inheritors(lconsi(myrelid, NIL), NIL);
@ -147,14 +142,10 @@ renameatt(char *relname,
}
}
reltup = SearchSysCacheTuple(RELNAME,
PointerGetDatum(relname),
0, 0, 0);
if (!HeapTupleIsValid(reltup))
if ((relid = RelnameFindRelid(relname)) == InvalidOid)
elog(ERROR, "renameatt: relation \"%s\" nonexistent", relname);
relid = reltup->t_data->t_oid;
oldatttup = SearchSysCacheTupleCopy(ATTNAME,
ObjectIdGetDatum(relid),
PointerGetDatum(oldattname),
@ -211,8 +202,7 @@ void
renamerel(char *oldrelname, char *newrelname)
{
Relation relrelation; /* for RELATION relation */
HeapTuple oldreltup,
newreltup;
HeapTuple oldreltup;
char oldpath[MAXPGPATH],
newpath[MAXPGPATH];
Relation irelations[Num_pg_class_indices];
@ -231,10 +221,7 @@ renamerel(char *oldrelname, char *newrelname)
if (!HeapTupleIsValid(oldreltup))
elog(ERROR, "renamerel: relation \"%s\" does not exist", oldrelname);
newreltup = SearchSysCacheTuple(RELNAME,
PointerGetDatum(newrelname),
0, 0, 0);
if (HeapTupleIsValid(newreltup))
if (RelnameFindRelid(newrelname) != InvalidOid)
elog(ERROR, "renamerel: relation \"%s\" exists", newrelname);
/* rename the path first, so if this fails the rename's not done */

View File

@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: view.c,v 1.29 1998/12/14 08:11:01 scrappy Exp $
* $Id: view.c,v 1.30 1999/02/02 03:44:20 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -95,6 +95,7 @@ DefineVirtualRelation(char *relname, List *tlist)
* nil...
*/
createStmt.relname = relname;
createStmt.istemp = false;
createStmt.tableElts = attrList;
/* createStmt.tableType = NULL;*/
createStmt.inhRelnames = NIL;

View File

@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: execAmi.c,v 1.29 1999/01/18 00:09:45 momjian Exp $
* $Id: execAmi.c,v 1.30 1999/02/02 03:44:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -524,7 +524,7 @@ ExecCreatR(TupleDesc tupType,
* heap_create creates a name if the argument to heap_create is
* '\0 '
*/
relDesc = heap_create("", tupType);
relDesc = heap_create(NULL, tupType, true, false);
}
else
{

View File

@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.69 1999/01/29 13:24:36 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.70 1999/02/02 03:44:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -654,7 +654,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
tupdesc = CreateTupleDescCopy(tupType);
intoRelationId = heap_create_with_catalog(intoName,
tupdesc, RELKIND_RELATION);
tupdesc, RELKIND_RELATION,parseTree->isTemp);
FreeTupleDesc(tupdesc);

View File

@ -14,7 +14,7 @@
* ExecInitTee
* ExecEndTee
*
* $Id: nodeTee.c,v 1.28 1999/02/01 13:33:27 vadim Exp $
* $Id: nodeTee.c,v 1.29 1999/02/02 03:44:24 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -167,7 +167,7 @@ ExecInitTee(Tee *node, EState *currentEstate, Plan *parent)
else
bufferRel = heap_open(
heap_create_with_catalog(teeState->tee_bufferRelname,
tupType, RELKIND_RELATION));
tupType, RELKIND_RELATION, false));
}
else
{
@ -176,7 +176,7 @@ ExecInitTee(Tee *node, EState *currentEstate, Plan *parent)
newoid());
bufferRel = heap_open(
heap_create_with_catalog(teeState->tee_bufferRelname,
tupType, RELKIND_RELATION));
tupType, RELKIND_RELATION, false));
}
teeState->tee_bufferRel = bufferRel;

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.56 1999/01/29 09:22:59 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.57 1999/02/02 03:44:26 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -29,6 +29,7 @@
#include "utils/palloc.h"
#include "catalog/pg_type.h"
#include "storage/lmgr.h"
#include "optimizer/planmain.h"
/*
* listCopy--
@ -1572,6 +1573,7 @@ _copyQuery(Query *from)
newnode->into = pstrdup(from->into);
newnode->isPortal = from->isPortal;
newnode->isBinary = from->isBinary;
newnode->isTemp = from->isTemp;
newnode->unionall = from->unionall;
if (from->uniqueFlag)
newnode->uniqueFlag = pstrdup(from->uniqueFlag);

View File

@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: outfuncs.c,v 1.61 1999/01/24 00:28:20 momjian Exp $
* $Id: outfuncs.c,v 1.62 1999/02/02 03:44:26 momjian Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@ -69,8 +69,13 @@ _outIntList(StringInfo str, List *list)
static void
_outCreateStmt(StringInfo str, CreateStmt *node)
{
appendStringInfo(str, " CREATE :relname %s :columns ",
appendStringInfo(str, " CREATE :relname %s ",
stringStringInfo(node->relname));
appendStringInfo(str, " :istemp %s ",
node->istemp ? "true" : "false");
appendStringInfo(str, " :columns ");
_outNode(str, node->tableElts);
appendStringInfo(str, " :inhRelnames ");
@ -197,11 +202,12 @@ _outQuery(StringInfo str, Query *node)
}
appendStringInfo(str,
" :resultRelation %d :into %s :isPortal %s :isBinary %s :unionall %s ",
" :resultRelation %d :into %s :isPortal %s :isBinary %s :isTemp %s :unionall %s ",
node->resultRelation,
stringStringInfo(node->into),
node->isPortal ? "true" : "false",
node->isBinary ? "true" : "false",
node->isTemp ? "true" : "false",
node->unionall ? "true" : "false");
appendStringInfo(str, " :unique %s :sortClause ",

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.43 1999/01/24 00:28:20 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.44 1999/02/02 03:44:27 momjian Exp $
*
* NOTES
* Most of the read functions for plan nodes are tested. (In fact, they
@ -120,6 +120,10 @@ _readQuery()
token = lsptok(NULL, &length); /* get isBinary */
local_node->isBinary = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* skip :isTemp */
token = lsptok(NULL, &length); /* get isTemp */
local_node->isTemp = (token[0] == 't') ? true : false;
token = lsptok(NULL, &length); /* skip :unionall */
token = lsptok(NULL, &length); /* get unionall */
local_node->unionall = (token[0] == 't') ? true : false;

View File

@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: analyze.c,v 1.96 1999/01/27 01:18:20 scrappy Exp $
* $Id: analyze.c,v 1.97 1999/02/02 03:44:32 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -924,6 +924,7 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt)
qry->uniqueFlag = stmt->unique;
qry->into = stmt->into;
qry->isTemp = stmt->istemp;
qry->isPortal = FALSE;
qry->targetList = transformTargetList(pstate, stmt->targetList);
@ -1032,6 +1033,7 @@ transformCursorStmt(ParseState *pstate, SelectStmt *stmt)
qry = transformSelectStmt(pstate, stmt);
qry->into = stmt->portalname;
qry->isTemp = stmt->istemp;
qry->isPortal = TRUE;
qry->isBinary = stmt->binary; /* internal portal */
@ -1074,7 +1076,7 @@ create_select_list(Node *ptr, List **select_list, bool *unionall_present)
* hands back 'true' */
Node *A_Expr_to_Expr(Node *ptr, bool *intersect_present)
{
Node *result;
Node *result = NULL;
switch(nodeTag(ptr))
{

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.49 1999/01/25 12:01:13 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.50 1999/02/02 03:44:42 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@ -154,13 +154,13 @@ Oid param_type(int t); /* used in parse_expr.c */
%type <str> opt_id, opt_portal_name,
all_Op, MathOp, opt_name, opt_unique,
result, OptUseOp, opt_class, SpecialRuleRelation
OptUseOp, opt_class, SpecialRuleRelation
%type <str> privileges, operation_commalist, grantee
%type <chr> operation, TriggerOneEvent
%type <list> stmtblock, stmtmulti,
relation_name_list, OptTableElementList,
result, relation_name_list, OptTableElementList,
OptInherit, definition,
opt_with, func_args, func_args_list,
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
@ -173,7 +173,7 @@ Oid param_type(int t); /* used in parse_expr.c */
%type <node> func_return
%type <boolean> set_opt
%type <boolean> TriggerForOpt, TriggerForType
%type <boolean> TriggerForOpt, TriggerForType, OptTemp
%type <list> for_update_clause
%type <list> join_list
@ -283,7 +283,7 @@ Oid param_type(int t); /* used in parse_expr.c */
PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
TABLE, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
TABLE, TEMP, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
UNION, UNIQUE, UPDATE, USER, USING,
VALUES, VARCHAR, VARYING, VIEW,
@ -747,18 +747,23 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = $3; }
*
*****************************************************************************/
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
OptInherit
{
CreateStmt *n = makeNode(CreateStmt);
n->relname = $3;
n->tableElts = $5;
n->inhRelnames = $7;
n->istemp = $2;
n->relname = $4;
n->tableElts = $6;
n->inhRelnames = $8;
n->constraints = NIL;
$$ = (Node *)n;
}
;
OptTemp: TEMP { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
OptTableElementList: OptTableElementList ',' OptTableElement
{
if ($3 != NULL)
@ -1236,12 +1241,13 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
| /*EMPTY*/ { $$ = NIL; }
;
CreateAsStmt: CREATE TABLE relation_name OptCreateAs AS SubSelect
CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SubSelect
{
SelectStmt *n = (SelectStmt *)$6;
if ($4 != NIL)
mapTargetColumns($4, n->targetList);
n->into = $3;
SelectStmt *n = (SelectStmt *)$7;
if ($5 != NIL)
mapTargetColumns($5, n->targetList);
n->istemp = $2;
n->into = $4;
$$ = (Node *)n;
}
;
@ -2862,8 +2868,9 @@ SubSelect: SELECT opt_unique res_target_list2
* want to create a new rule 'SubSelect1' including the
* feature. If it makes troubles we will have to add
* a new rule and change this to prevent INTOs in
* Subselects again */
n->into = $4;
* Subselects again */
n->istemp = (bool)((A_Const *)lfirst($4))->val.val.ival;
n->into = (char *)lnext($4);
n->fromClause = $5;
n->whereClause = $6;
@ -2873,8 +2880,9 @@ SubSelect: SELECT opt_unique res_target_list2
}
;
result: INTO opt_table relation_name { $$= $3; }
| /*EMPTY*/ { $$ = NULL; }
/* easy way to return two values. Can someone improve this? bjm */
result: INTO OptTemp opt_table relation_name { $$ = lcons(makeInteger($2), (List *)$4); }
| /*EMPTY*/ { $$ = lcons(makeInteger(false), NIL); }
;
opt_table: TABLE { $$ = TRUE; }

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.51 1999/01/18 00:09:53 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.52 1999/02/02 03:44:42 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -213,6 +213,7 @@ static ScanKeyword ScanKeywords[] = {
{"stdout", STDOUT},
{"substring", SUBSTRING},
{"table", TABLE},
{"temp", TEMP},
{"then", THEN},
{"time", TIME},
{"timestamp", TIMESTAMP},

View File

@ -145,110 +145,111 @@ typedef union
#define SET 371
#define SUBSTRING 372
#define TABLE 373
#define THEN 374
#define TIME 375
#define TIMESTAMP 376
#define TIMEZONE_HOUR 377
#define TIMEZONE_MINUTE 378
#define TO 379
#define TRAILING 380
#define TRANSACTION 381
#define TRIM 382
#define TRUE_P 383
#define UNION 384
#define UNIQUE 385
#define UPDATE 386
#define USER 387
#define USING 388
#define VALUES 389
#define VARCHAR 390
#define VARYING 391
#define VIEW 392
#define WHEN 393
#define WHERE 394
#define WITH 395
#define WORK 396
#define YEAR_P 397
#define ZONE 398
#define TRIGGER 399
#define TYPE_P 400
#define ABORT_TRANS 401
#define AFTER 402
#define AGGREGATE 403
#define ANALYZE 404
#define BACKWARD 405
#define BEFORE 406
#define BINARY 407
#define CACHE 408
#define CLUSTER 409
#define COPY 410
#define CREATEDB 411
#define CREATEUSER 412
#define CYCLE 413
#define DATABASE 414
#define DELIMITERS 415
#define DO 416
#define EACH 417
#define ENCODING 418
#define EXPLAIN 419
#define EXTEND 420
#define FORWARD 421
#define FUNCTION 422
#define HANDLER 423
#define INCREMENT 424
#define INDEX 425
#define INHERITS 426
#define INSTEAD 427
#define ISNULL 428
#define LANCOMPILER 429
#define LISTEN 430
#define LOAD 431
#define LOCATION 432
#define LOCK_P 433
#define MAXVALUE 434
#define MINVALUE 435
#define MOVE 436
#define NEW 437
#define NOCREATEDB 438
#define NOCREATEUSER 439
#define NONE 440
#define NOTHING 441
#define NOTIFY 442
#define NOTNULL 443
#define OIDS 444
#define OPERATOR 445
#define PASSWORD 446
#define PROCEDURAL 447
#define RECIPE 448
#define RENAME 449
#define RESET 450
#define RETURNS 451
#define ROW 452
#define RULE 453
#define SEQUENCE 454
#define SERIAL 455
#define SETOF 456
#define SHOW 457
#define START 458
#define STATEMENT 459
#define STDIN 460
#define STDOUT 461
#define TRUSTED 462
#define UNLISTEN 463
#define UNTIL 464
#define VACUUM 465
#define VALID 466
#define VERBOSE 467
#define VERSION 468
#define IDENT 469
#define SCONST 470
#define Op 471
#define ICONST 472
#define PARAM 473
#define FCONST 474
#define OP 475
#define UMINUS 476
#define TYPECAST 477
#define TEMP 374
#define THEN 375
#define TIME 376
#define TIMESTAMP 377
#define TIMEZONE_HOUR 378
#define TIMEZONE_MINUTE 379
#define TO 380
#define TRAILING 381
#define TRANSACTION 382
#define TRIM 383
#define TRUE_P 384
#define UNION 385
#define UNIQUE 386
#define UPDATE 387
#define USER 388
#define USING 389
#define VALUES 390
#define VARCHAR 391
#define VARYING 392
#define VIEW 393
#define WHEN 394
#define WHERE 395
#define WITH 396
#define WORK 397
#define YEAR_P 398
#define ZONE 399
#define TRIGGER 400
#define TYPE_P 401
#define ABORT_TRANS 402
#define AFTER 403
#define AGGREGATE 404
#define ANALYZE 405
#define BACKWARD 406
#define BEFORE 407
#define BINARY 408
#define CACHE 409
#define CLUSTER 410
#define COPY 411
#define CREATEDB 412
#define CREATEUSER 413
#define CYCLE 414
#define DATABASE 415
#define DELIMITERS 416
#define DO 417
#define EACH 418
#define ENCODING 419
#define EXPLAIN 420
#define EXTEND 421
#define FORWARD 422
#define FUNCTION 423
#define HANDLER 424
#define INCREMENT 425
#define INDEX 426
#define INHERITS 427
#define INSTEAD 428
#define ISNULL 429
#define LANCOMPILER 430
#define LISTEN 431
#define LOAD 432
#define LOCATION 433
#define LOCK_P 434
#define MAXVALUE 435
#define MINVALUE 436
#define MOVE 437
#define NEW 438
#define NOCREATEDB 439
#define NOCREATEUSER 440
#define NONE 441
#define NOTHING 442
#define NOTIFY 443
#define NOTNULL 444
#define OIDS 445
#define OPERATOR 446
#define PASSWORD 447
#define PROCEDURAL 448
#define RECIPE 449
#define RENAME 450
#define RESET 451
#define RETURNS 452
#define ROW 453
#define RULE 454
#define SEQUENCE 455
#define SERIAL 456
#define SETOF 457
#define SHOW 458
#define START 459
#define STATEMENT 460
#define STDIN 461
#define STDOUT 462
#define TRUSTED 463
#define UNLISTEN 464
#define UNTIL 465
#define VACUUM 466
#define VALID 467
#define VERBOSE 468
#define VERSION 469
#define IDENT 470
#define SCONST 471
#define Op 472
#define ICONST 473
#define PARAM 474
#define FCONST 475
#define OP 476
#define UMINUS 477
#define TYPECAST 478
extern YYSTYPE yylval;

View File

@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.32 1999/01/25 18:02:20 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.33 1999/02/02 03:44:45 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -1135,6 +1135,7 @@ modifyAggrefMakeSublink(Expr *origexp, Query *parsetree)
subquery->into = NULL;
subquery->isPortal = FALSE;
subquery->isBinary = FALSE;
subquery->isTemp = FALSE;
subquery->unionall = FALSE;
subquery->uniqueFlag = NULL;
subquery->sortClause = NULL;
@ -2767,7 +2768,7 @@ Except_Intersect_Rewrite (Query *parsetree)
List *union_list = NIL, *sortClause;
List *left_expr, *right_expr, *resnames = NIL;
char *op, *uniqueFlag, *into;
bool isBinary, isPortal;
bool isBinary, isPortal, isTemp;
CmdType commandType = CMD_SELECT;
List *rtable_insert = NIL;
@ -2811,7 +2812,8 @@ Except_Intersect_Rewrite (Query *parsetree)
into = parsetree->into;
isBinary = parsetree->isBinary;
isPortal = parsetree->isPortal;
isTemp = parsetree->isTemp;
/* The operator tree attached to parsetree->intersectClause is still 'raw'
* ( = the leaf nodes are still SelectStmt nodes instead of Query nodes)
* So step through the tree and transform the nodes using parse_analyze().
@ -2959,6 +2961,8 @@ Except_Intersect_Rewrite (Query *parsetree)
result->into = into;
result->isPortal = isPortal;
result->isBinary = isBinary;
result->isTemp = isTemp;
/* The relation to insert into is attached to the range table
* of the new top node */
if (commandType == CMD_INSERT)

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.45 1998/12/15 12:46:19 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.46 1999/02/02 03:44:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -231,7 +231,7 @@ ReadBufferWithBufferLock(Relation reln,
bool isLocalBuf;
extend = (blockNum == P_NEW);
isLocalBuf = reln->rd_islocal;
isLocalBuf = reln->rd_myxactonly;
if (isLocalBuf)
{
@ -1374,7 +1374,7 @@ BlockNumber
RelationGetNumberOfBlocks(Relation relation)
{
return
((relation->rd_islocal) ? relation->rd_nblocks :
((relation->rd_myxactonly) ? relation->rd_nblocks :
smgrnblocks(DEFAULT_SMGR, relation));
}
@ -1395,7 +1395,7 @@ ReleaseRelationBuffers(Relation rel)
int holding = 0;
BufferDesc *buf;
if (rel->rd_islocal)
if (rel->rd_myxactonly)
{
for (i = 0; i < NLocBuffer; i++)
{
@ -1564,7 +1564,7 @@ BlowawayRelationBuffers(Relation rel, BlockNumber block)
int i;
BufferDesc *buf;
if (rel->rd_islocal)
if (rel->rd_myxactonly)
{
for (i = 0; i < NLocBuffer; i++)
{

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.45 1999/01/21 22:48:09 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.46 1999/02/02 03:44:50 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -47,7 +47,6 @@
#include "utils/builtins.h" /* for namestrcpy() */
#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/syscache.h"
/*
* Warning, Will Robinson... In order to pack data into an inversion
@ -120,20 +119,16 @@ inv_create(int flags)
sprintf(objname, "xinv%d", file_oid);
sprintf(indname, "xinx%d", file_oid);
if (SearchSysCacheTuple(RELNAME,
PointerGetDatum(objname),
0, 0, 0) != NULL)
if (RelnameFindRelid(objname) != InvalidOid)
{
elog(ERROR,
"internal error: %s already exists -- cannot create large obj",
objname);
}
if (SearchSysCacheTuple(RELNAME,
PointerGetDatum(indname),
0, 0, 0) != NULL)
if (RelnameFindRelid(indname) != InvalidOid)
{
elog(ERROR,
"internal error: %s already exists -- cannot create large obj",
"internal error: %s already exists -- cannot create large obj",
indname);
}
@ -153,7 +148,7 @@ inv_create(int flags)
* be located on whatever storage manager the user requested.
*/
heap_create_with_catalog(objname, tupdesc, RELKIND_LOBJECT);
heap_create_with_catalog(objname, tupdesc, RELKIND_LOBJECT, false);
/* make the relation visible in this transaction */
CommandCounterIncrement();

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.97 1999/01/18 00:09:56 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.98 1999/02/02 03:44:51 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@ -72,6 +72,7 @@
#include "utils/mcxt.h"
#include "utils/rel.h"
#include "utils/ps_status.h"
#include "utils/temprel.h"
#if FALSE
#include "nodes/relation.h"
@ -1502,6 +1503,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!TransactionFlushEnabled())
on_shmem_exit(FlushBufferPool, NULL);
on_shmem_exit(remove_all_temp_relations, NULL);
/* ----------------
* Set up handler for cancel-request signal, and
* send this backend's cancellation info to the frontend.
@ -1535,7 +1538,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
puts("$Revision: 1.97 $ $Date: 1999/01/18 00:09:56 $\n");
puts("$Revision: 1.98 $ $Date: 1999/02/02 03:44:51 $\n");
}
/* ----------------

View File

@ -4,7 +4,7 @@
# Makefile for utils/cache
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/utils/cache/Makefile,v 1.9 1998/08/24 01:13:52 momjian Exp $
# $Header: /cvsroot/pgsql/src/backend/utils/cache/Makefile,v 1.10 1999/02/02 03:44:54 momjian Exp $
#
#-------------------------------------------------------------------------
@ -13,7 +13,8 @@ include ../../../Makefile.global
CFLAGS += -I../..
OBJS = catcache.o inval.o rel.o relcache.o syscache.o lsyscache.o fcache.o
OBJS = catcache.o inval.o rel.o relcache.o syscache.o lsyscache.o \
fcache.o temprel.o
all: SUBSYS.o

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.36 1998/11/27 19:52:26 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.37 1999/02/02 03:44:58 momjian Exp $
*
* Notes:
* XXX This needs to use exception.h to handle recovery when
@ -196,7 +196,6 @@ CatalogCacheInitializeCache(struct catcache * cache,
if (cache->cc_key[i] > 0)
{
/*
* Yoiks. The implementation of the hashing code and the
* implementation of int28's are at loggerheads. The right

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.18 1998/11/27 19:52:28 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.19 1999/02/02 03:45:01 momjian Exp $
*
* Note - this code is real crufty...
*
@ -20,6 +20,7 @@
#include "access/heapam.h" /* XXX to support hacks below */
#include "access/htup.h"
#include "catalog/catalog.h"
#include "catalog/heap.h"
#include "storage/bufpage.h"
#include "storage/buf.h" /* XXX for InvalidBuffer */
#include "storage/ipc.h"
@ -244,31 +245,17 @@ RelationIdRegisterLocalInvalid(Oid relationId, Oid objectId)
static void
getmyrelids()
{
HeapTuple tuple;
MyRelationRelationId = RelnameFindRelid(RelationRelationName);
Assert(RelationRelationName != InvalidOid);
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(RelationRelationName),
0, 0, 0);
Assert(HeapTupleIsValid(tuple));
MyRelationRelationId = tuple->t_data->t_oid;
MyAttributeRelationId = RelnameFindRelid(AttributeRelationName);
Assert(AttributeRelationName != InvalidOid);
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(AttributeRelationName),
0, 0, 0);
Assert(HeapTupleIsValid(tuple));
MyAttributeRelationId = tuple->t_data->t_oid;
MyAMRelationId = RelnameFindRelid(AccessMethodRelationName);
Assert(MyAMRelationId != InvalidOid);
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(AccessMethodRelationName),
0, 0, 0);
Assert(HeapTupleIsValid(tuple));
MyAMRelationId = tuple->t_data->t_oid;
tuple = SearchSysCacheTuple(RELNAME,
PointerGetDatum(AccessMethodOperatorRelationName),
0, 0, 0);
Assert(HeapTupleIsValid(tuple));
MyAMOPRelationId = tuple->t_data->t_oid;
MyAMOPRelationId = RelnameFindRelid(AccessMethodOperatorRelationName);
Assert(MyAMOPRelationId != InvalidOid);
}
/* --------------------------------
@ -614,10 +601,6 @@ RelationInvalidateHeapTuple(Relation relation, HeapTuple tuple)
*/
RelationInvalidateHeapTuple_DEBUG1;
/* ----------------
*
* ----------------
*/
RelationInvalidateCatalogCacheTuple(relation,
tuple,
CacheIdRegisterLocalInvalid);
@ -625,12 +608,4 @@ RelationInvalidateHeapTuple(Relation relation, HeapTuple tuple)
RelationInvalidateRelationCache(relation,
tuple,
RelationIdRegisterLocalInvalid);
#ifdef NOT_USED
if (RefreshWhenInvalidate)
/* what does this do? bjm 1998/08/20 */
RelationInvalidateCatalogCacheTuple(relation,
tuple,
(void (*) ()) NULL);
#endif
}

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.55 1999/01/22 18:47:37 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.56 1999/02/02 03:45:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -404,7 +404,7 @@ scan_pg_rel_ind(RelationBuildDescInfo buildinfo)
switch (buildinfo.infotype)
{
case INFO_RELID:
return_tuple = ClassOidIndexScan(pg_class_desc, buildinfo.i.info_id);
return_tuple = ClassOidIndexScan(pg_class_desc,buildinfo.i.info_id);
break;
case INFO_RELNAME:
@ -821,7 +821,6 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
*/
if (!HeapTupleIsValid(pg_class_tuple))
{
MemoryContextSwitchTo(oldcxt);
return NULL;
@ -867,8 +866,7 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
*/
if (OidIsValid(relam))
{
relation->rd_am = (Form_pg_am)
AccessMethodObjectIdGetForm(relam);
relation->rd_am = (Form_pg_am) AccessMethodObjectIdGetForm(relam);
}
/* ----------------
@ -927,7 +925,6 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
* restore memory context and return the new reldesc.
* ----------------
*/
RelationCacheInsert(relation);
/* -------------------
@ -1197,8 +1194,7 @@ RelationIdGetRelation(Oid relationId)
buildinfo.i.info_id = relationId;
rd = RelationBuildDesc(buildinfo);
return
rd;
return rd;
}
/* --------------------------------
@ -1332,8 +1328,9 @@ RelationFlushRelation(Relation *relationPtr,
/* --------------------------------
* RelationForgetRelation -
* RelationFlushRelation + if the relation is local then get rid of
* the relation descriptor from the newly created relation list.
* RelationFlushRelation + if the relation is myxactonly then
* get rid of the relation descriptor from the newly created
* relation list.
* --------------------------------
*/
void
@ -1342,37 +1339,39 @@ RelationForgetRelation(Oid rid)
Relation relation;
RelationIdCacheLookup(rid, relation);
Assert(PointerIsValid(relation));
if (relation->rd_islocal)
if (PointerIsValid(relation))
{
MemoryContext oldcxt;
List *curr;
List *prev = NIL;
oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
foreach(curr, newlyCreatedRelns)
if (relation->rd_myxactonly)
{
Relation reln = lfirst(curr);
Assert(reln != NULL && reln->rd_islocal);
if (RelationGetRelid(reln) == rid)
break;
prev = curr;
MemoryContext oldcxt;
List *curr;
List *prev = NIL;
oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
foreach(curr, newlyCreatedRelns)
{
Relation reln = lfirst(curr);
Assert(reln != NULL && reln->rd_myxactonly);
if (RelationGetRelid(reln) == rid)
break;
prev = curr;
}
if (curr == NIL)
elog(FATAL, "Local relation %s not found in list",
(RelationGetRelationName(relation))->data);
if (prev == NIL)
newlyCreatedRelns = lnext(newlyCreatedRelns);
else
lnext(prev) = lnext(curr);
pfree(curr);
MemoryContextSwitchTo(oldcxt);
}
if (curr == NIL)
elog(FATAL, "Local relation %s not found in list",
(RelationGetRelationName(relation))->data);
if (prev == NIL)
newlyCreatedRelns = lnext(newlyCreatedRelns);
else
lnext(prev) = lnext(curr);
pfree(curr);
MemoryContextSwitchTo(oldcxt);
RelationFlushRelation(&relation, false);
}
RelationFlushRelation(&relation, false);
}
/* --------------------------------
@ -1393,9 +1392,8 @@ RelationIdInvalidateRelationCacheByRelationId(Oid relationId)
* BufferSync also? But I'll leave it for now since I don't want to
* break anything.) - ay 3/95
*/
if (PointerIsValid(relation) && !relation->rd_islocal)
if (PointerIsValid(relation) && !relation->rd_myxactonly)
{
/*
* The boolean onlyFlushReferenceCountZero in RelationFlushReln()
* should be set to true when we are incrementing the command
@ -1502,13 +1500,13 @@ RelationRegisterRelation(Relation relation)
/*
* we've just created the relation. It is invisible to anyone else
* before the transaction is committed. Setting rd_islocal allows us
* before the transaction is committed. Setting rd_myxactonly allows us
* to use the local buffer manager for select/insert/etc before the
* end of transaction. (We also need to keep track of relations
* created during a transaction and does the necessary clean up at the
* end of the transaction.) - ay 3/95
*/
relation->rd_islocal = TRUE;
relation->rd_myxactonly = TRUE;
newlyCreatedRelns = lcons(relation, newlyCreatedRelns);
MemoryContextSwitchTo(oldcxt);
@ -1516,7 +1514,7 @@ RelationRegisterRelation(Relation relation)
/*
* RelationPurgeLocalRelation -
* find all the Relation descriptors marked rd_islocal and reset them.
* find all the Relation descriptors marked rd_myxactonly and reset them.
* This should be called at the end of a transaction (commit/abort) when
* the "local" relations will become visible to others and the multi-user
* buffer pool should be used.
@ -1536,7 +1534,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
List *l = newlyCreatedRelns;
Relation reln = lfirst(l);
Assert(reln != NULL && reln->rd_islocal);
Assert(reln != NULL && reln->rd_myxactonly);
if (!xactCommitted)
{
@ -1545,18 +1543,18 @@ RelationPurgeLocalRelation(bool xactCommitted)
* remove the file if we abort. This is so that files for
* tables created inside a transaction block get removed.
*/
if (reln->rd_istemp)
if (reln->rd_isnoname)
{
if (!(reln->rd_tmpunlinked))
if (!(reln->rd_nonameunlinked))
{
smgrunlink(DEFAULT_SMGR, reln);
reln->rd_tmpunlinked = TRUE;
reln->rd_nonameunlinked = TRUE;
}
}
else
smgrunlink(DEFAULT_SMGR, reln);
}
else if (!IsBootstrapProcessingMode() && !(reln->rd_istemp))
else if (!IsBootstrapProcessingMode() && !(reln->rd_isnoname))
/*
* RelationFlushRelation () below will flush relation
@ -1568,7 +1566,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
*/
smgrclose(DEFAULT_SMGR, reln);
reln->rd_islocal = FALSE;
reln->rd_myxactonly = FALSE;
if (!IsBootstrapProcessingMode())
RelationFlushRelation(&reln, FALSE);

165
src/backend/utils/cache/temprel.c vendored Normal file
View File

@ -0,0 +1,165 @@
/*-------------------------------------------------------------------------
*
* temprel.c--
* POSTGRES temporary relation handling
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.1 1999/02/02 03:45:03 momjian Exp $
*
*-------------------------------------------------------------------------
*/
/*
* This implements temp tables by modifying the relname cache lookups
* of pg_class.
* When a temp table is created, a linked list of temp table tuples is
* stored here. When a relname cache lookup is done, references to user-named
* temp tables are converted to the internal temp table names.
*
*/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include "postgres.h"
#include "miscadmin.h"
#include "nodes/pg_list.h"
#include "utils/mcxt.h"
#include "utils/temprel.h"
#include "access/htup.h"
#include "access/heapam.h"
#include "catalog/heap.h"
#include "catalog/index.h"
#include "catalog/pg_class.h"
GlobalMemory CacheCxt;
/* ----------------
* global variables
* ----------------
*/
static List *temp_rels = NIL;
typedef struct TempTable
{
char *user_relname;
HeapTuple pg_class_tuple;
} TempTable;
void
create_temp_relation(char *relname, HeapTuple pg_class_tuple)
{
MemoryContext oldcxt;
TempTable *temp_rel;
oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
temp_rel = palloc(sizeof(TempTable));
temp_rel->user_relname = palloc(NAMEDATALEN);
/* save user-supplied name */
strcpy(temp_rel->user_relname, relname);
temp_rel->pg_class_tuple = heap_copytuple(pg_class_tuple);
temp_rels = lcons(temp_rel, temp_rels);
MemoryContextSwitchTo(oldcxt);
}
void
remove_all_temp_relations(void)
{
List *l, *next;
l = temp_rels;
while (l != NIL)
{
TempTable *temp_rel = lfirst(l);
Form_pg_class classtuple;
classtuple = (Form_pg_class)GETSTRUCT(temp_rel->pg_class_tuple);
next = lnext(l); /* do this first, l is deallocated */
if (classtuple->relkind != RELKIND_INDEX)
{
char relname[NAMEDATALEN];
/* safe from deallocation */
strcpy(relname, temp_rel->user_relname);
heap_destroy_with_catalog(relname);
}
else
index_destroy(temp_rel->pg_class_tuple->t_data->t_oid);
l = next;
}
}
/* we don't have the relname for indexes, so we just pass the oid */
void
remove_temp_relation(Oid relid)
{
MemoryContext oldcxt;
List *l, *prev;
oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
prev = NIL;
l = temp_rels;
while (l != NIL)
{
TempTable *temp_rel = lfirst(l);
if (temp_rel->pg_class_tuple->t_data->t_oid == relid)
{
pfree(temp_rel->user_relname);
pfree(temp_rel->pg_class_tuple);
pfree(temp_rel);
/* remove from linked list */
if (prev != NIL)
{
lnext(prev) = lnext(l);
pfree(l);
l = lnext(prev);
}
else
{
temp_rels = lnext(l);
pfree(l);
l = temp_rels;
}
}
else
{
prev = l;
l = lnext(l);
}
}
MemoryContextSwitchTo(oldcxt);
}
HeapTuple
get_temp_rel_by_name(char *user_relname)
{
List *l;
foreach(l, temp_rels)
{
TempTable *temp_rel = lfirst(l);
if (strcmp(temp_rel->user_relname, user_relname) == 0)
return temp_rel->pg_class_tuple;
}
return NULL;
}

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.4 1998/09/01 03:26:49 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.5 1999/02/02 03:45:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -38,7 +38,7 @@ BypassEnable(int *enableCountInOutP, bool on)
return (bool) (*enableCountInOutP >= 2);
}
AssertState(*enableCountInOutP >= 1);
Assert(*enableCountInOutP >= 1);
*enableCountInOutP -= 1;

View File

@ -4,7 +4,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: psort.c,v 1.47 1999/01/17 06:19:02 momjian Exp $
* $Id: psort.c,v 1.48 1999/02/02 03:45:12 momjian Exp $
*
* NOTES
* Sorts the first relation into the second relation.
@ -1019,9 +1019,8 @@ gettape()
tp = (struct tapelst *) palloc((unsigned) sizeof(struct tapelst));
snprintf(uniqueName, MAXPGPATH - 1, "%spg_psort.%d.%d",
TEMPDIR, (int) MyProcPid, uniqueFileId);
uniqueFileId++;
snprintf(uniqueName, MAXPGPATH - 1, "%spg_psort.%d.%u",
TEMPDIR, (int) MyProcPid, uniqueFileId++);
tapeinit = 1;

View File

@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: psqlHelp.h,v 1.54 1998/10/14 05:10:02 momjian Exp $
* $Id: psqlHelp.h,v 1.55 1999/02/02 03:45:15 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -124,7 +124,7 @@ static struct _helpStruct QL_HELP[] = {
{"create table",
"create a new table",
"\
\tCREATE TABLE class_name\n\
\tCREATE [TEMP] TABLE class_name\n\
\t(attr1 type1 [DEFAULT expression] [NOT NULL], ...attrN)\n\
\t[INHERITS (class_name1, ...class_nameN)\n\
\t[[CONSTRAINT name] CHECK condition1, ...conditionN] ]\n\
@ -315,7 +315,7 @@ static struct _helpStruct QL_HELP[] = {
"retrieve tuples",
"\
\tSELECT [DISTINCT [ON attrN]] expr1 [AS attr1], ...exprN\n\
\t[INTO [TABLE] class_name]\n\
\t[INTO [TEMP] [TABLE] class_name]\n\
\t[FROM from_list]\n\
\t[WHERE qual]\n\
\t[GROUP BY group_list]\n\

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: heap.h,v 1.16 1998/09/01 04:34:41 momjian Exp $
* $Id: heap.h,v 1.17 1999/02/02 03:45:16 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -15,15 +15,17 @@
#include <utils/rel.h>
extern Relation heap_create(char *relname, TupleDesc att);
extern Oid RelnameFindRelid(char *relname);
extern Relation heap_create(char *relname, TupleDesc att,
bool isnoname, bool istemp);
extern Oid heap_create_with_catalog(char *relname,
TupleDesc tupdesc, char relkind);
TupleDesc tupdesc, char relkind, bool istemp);
extern void heap_destroy_with_catalog(char *relname);
extern void heap_destroy(Relation rel);
extern void InitTempRelList(void);
extern void DestroyTempRels(void);
extern void InitNoNameRelList(void);
extern void DestroyNoNameRels(void);
#endif /* HEAP_H */

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: parsenodes.h,v 1.68 1999/01/21 22:48:20 momjian Exp $
* $Id: parsenodes.h,v 1.69 1999/02/02 03:45:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -43,6 +43,7 @@ typedef struct Query
char *into; /* portal (cursor) name */
bool isPortal; /* is this a retrieve into portal? */
bool isBinary; /* binary portal? */
bool isTemp; /* is 'into' a temp table? */
bool unionall; /* union without unique sort */
bool hasAggs; /* has aggregates in target list */
bool hasSubLinks; /* has subquery SubLink */
@ -138,6 +139,7 @@ typedef struct CopyStmt
typedef struct CreateStmt
{
NodeTag type;
bool istemp; /* is this a temp table? */
char *relname; /* the relation to create */
List *tableElts; /* column definitions list of Column */
List *inhRelnames; /* relations to inherit from list of Value
@ -662,6 +664,7 @@ typedef struct SelectStmt
List *sortClause; /* sort clause (a list of SortGroupBy's) */
char *portalname; /* the portal (cursor) to create */
bool binary; /* a binary (internal) portal? */
bool istemp; /* into is a temp table */
bool unionall; /* union without unique sort */
Node *limitOffset; /* # of result tuples to skip */
Node *limitCount; /* # of result tuples to return */

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: internal.h,v 1.11 1998/09/01 04:37:08 momjian Exp $
* $Id: internal.h,v 1.12 1999/02/02 03:45:24 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -86,6 +86,6 @@ extern int BushyPlanFlag;
/*#define joininfo_inactive(joininfo) joininfo->inactive */
/* GEQO switch according to number of relations in a query */
#define GEQO_RELS 8
#define GEQO_RELS 6
#endif /* INTERNAL_H */

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: rel.h,v 1.20 1998/09/01 04:39:29 momjian Exp $
* $Id: rel.h,v 1.21 1999/02/02 03:45:28 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -49,10 +49,10 @@ typedef struct RelationData
File rd_fd; /* open file descriptor */
int rd_nblocks; /* number of blocks in rel */
uint16 rd_refcnt; /* reference count */
bool rd_islocal; /* uses the local buffer mgr */
bool rd_myxactonly; /* uses the local buffer mgr */
bool rd_isnailed; /* rel is nailed in cache */
bool rd_istemp; /* rel is a temp rel */
bool rd_tmpunlinked; /* temp rel already unlinked */
bool rd_isnoname; /* rel has no name */
bool rd_nonameunlinked; /* noname rel already unlinked */
Form_pg_am rd_am; /* AM tuple */
Form_pg_class rd_rel; /* RELATION tuple */
Oid rd_id; /* relations's object id */

View File

@ -0,0 +1,25 @@
/*-------------------------------------------------------------------------
*
* temprel.h--
* Temporary relation functions
*
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: temprel.h,v 1.1 1999/02/02 03:45:28 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef TEMPREL_H
#define TEMPREL_H
#include "access/htup.h"
#include "access/attnum.h"
void create_temp_relation(char *relname, HeapTuple pg_class_tuple);
void remove_all_temp_relations(void);
void remove_temp_relation(Oid relid);
HeapTuple get_temp_rel_by_name(char *user_relname);
#endif /* TEMPREL_H */

View File

@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
.\" $Header: /cvsroot/pgsql/src/man/Attic/copy.l,v 1.6 1998/06/24 13:21:24 momjian Exp $
.\" $Header: /cvsroot/pgsql/src/man/Attic/copy.l,v 1.7 1999/02/02 03:45:31 momjian Exp $
.TH COPY SQL 11/05/95 PostgreSQL PostgreSQL
.SH NAME
copy - copy data to or from a class from or to a Unix file.
@ -93,8 +93,8 @@ encountered.
.PP
The backslash character has special meaning.
.BR NULL
attributes are output as \\N.
A literal backslash character is output as two consecutive backslashes.
attributes are represented as \\N.
A literal backslash character is represented as two consecutive backslashes.
A literal tab character is represented as a backslash and a tab.
A literal newline character is represented as a backslash and a newline.
When loading ASCII data not generated by PostgreSQL, you will need to

View File

@ -1,12 +1,12 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
.\" $Header: /cvsroot/pgsql/src/man/Attic/create_table.l,v 1.22 1998/10/14 02:54:29 momjian Exp $
.\" $Header: /cvsroot/pgsql/src/man/Attic/create_table.l,v 1.23 1999/02/02 03:45:32 momjian Exp $
.TH "CREATE TABLE" SQL 09/25/97 PostgreSQL
.SH NAME
create table - create a new class
.SH SYNOPSIS
.nf
\fBcreate table\fR classname
\fBcreate\fR [\fBtemp\fR] \fBtable\fR classname
\fB(\fP
attname type
[\fBdefault\fP value]

View File

@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
.\" $Header: /cvsroot/pgsql/src/man/Attic/select.l,v 1.10 1998/07/12 04:49:47 momjian Exp $
.\" $Header: /cvsroot/pgsql/src/man/Attic/select.l,v 1.11 1999/02/02 03:45:32 momjian Exp $
.TH SELECT SQL 11/05/95 PostgreSQL PostgreSQL
.SH NAME
select - retrieve instances from a class
@ -9,7 +9,7 @@ select - retrieve instances from a class
\fBselect\fR [distinct [on attr_name]]
expression1 [\fBas\fR attr_name-1]
{, expression-1 [\fBas\fR attr_name-i]}
[\fBinto\fR [\fBtable\fR] classname]
[\fBinto\fR [\fBtemp\fR] [\fBtable\fR] classname]
[\fBfrom\fR from-list]
[\fBwhere\fR where-clause]
[\fBgroup by\fR attr_name1 {, attr_name-i....}]

View File

@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.11 1998/10/14 05:10:12 momjian Exp $
.\" $Header: /cvsroot/pgsql/src/man/Attic/set.l,v 1.12 1999/02/02 03:45:33 momjian Exp $
.TH SET SQL 05/14/97 PostgreSQL PostgreSQL
.SH NAME
set - set run-time parameters for session
@ -44,8 +44,10 @@ determines the output format for the date and time data types.
.IR GEQO
enables or disables the genetic optimizer algorithm. This algorithm is
.IR on
by default, which used GEQO for statements of eight or more tables.
See the GEQO README for more information.
by default, which used GEQO for statements of six or more tables.
Set the
.IR Programmer's Guide
for more information.
.ce 1
\fBGEQO Values\fR

View File

@ -1,7 +1,7 @@
/* A lexical scanner generated by flex */
/* Scanner skeleton version:
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.c,v 1.3 1999/01/28 11:50:42 wieck Exp $
* /master/usr.bin/lex/skel.c,v 1.3 1997/09/25 00:10:23 jch Exp
*/
#define FLEX_SCANNER
@ -126,6 +126,7 @@ extern FILE *yyin, *yyout;
{ \
/* Undo effects of setting up yytext. */ \
*yy_cp = yy_hold_char; \
YY_RESTORE_YY_MORE_OFFSET \
yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
YY_DO_BEFORE_ACTION; /* set up yytext again */ \
} \
@ -235,7 +236,7 @@ void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str ));
YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
@ -281,13 +282,15 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
*/
#define YY_DO_BEFORE_ACTION \
yytext_ptr = yy_bp; \
yytext_ptr -= yy_more_len; \
yyleng = (int) (yy_cp - yytext_ptr); \
yyleng = (int) (yy_cp - yy_bp); \
yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \
if ( yyleng >= YYLMAX ) \
if ( yyleng + yy_more_offset >= YYLMAX ) \
YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \
yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \
yy_flex_strncpy( &yytext[yy_more_offset], yytext_ptr, yyleng + 1 ); \
yyleng += yy_more_offset; \
yy_prev_more_offset = yy_more_offset; \
yy_more_offset = 0; \
yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 60
@ -606,10 +609,16 @@ yy_cp = yy_full_match; /* restore poss. backed-over text */ \
++yy_lp; \
goto find_rule; \
}
static int yy_more_flag = 0;
static int yy_more_len = 0;
#define yymore() (yy_more_flag = 1)
#define YY_MORE_ADJ yy_more_len
static int yy_more_offset = 0;
static int yy_prev_more_offset = 0;
#define yymore() (yy_more_offset = yy_flex_strlen( yytext ))
#define YY_NEED_STRLEN
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET \
{ \
yy_more_offset = yy_prev_more_offset; \
yyleng -= yy_more_offset; \
}
#ifndef YYLMAX
#define YYLMAX 8192
#endif
@ -624,7 +633,7 @@ char *yytext_ptr;
* procedural language
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.c,v 1.3 1999/01/28 11:50:42 wieck Exp $
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.c,v 1.4 1999/02/02 03:45:33 momjian Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@ -688,6 +697,10 @@ static void yyunput YY_PROTO(( int c, char *buf_ptr ));
static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
#endif
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen YY_PROTO(( yyconst char * ));
#endif
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput YY_PROTO(( void ));
@ -873,12 +886,6 @@ YY_DECL
while ( 1 ) /* loops until end-of-file is reached */
{
yy_more_len = 0;
if ( yy_more_flag )
{
yy_more_len = yyleng;
yy_more_flag = 0;
}
yy_cp = yy_c_buf_p;
/* Support of yytext. */
@ -1291,6 +1298,7 @@ ECHO;
/* Undo the effects of YY_DO_BEFORE_ACTION. */
*yy_cp = yy_hold_char;
YY_RESTORE_YY_MORE_OFFSET
if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
{
@ -1436,7 +1444,7 @@ static int yy_get_next_buffer()
{ /* Don't try to fill the buffer, so this is an EOF. */
if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
{
/* We matched a singled characater, the EOB, so
/* We matched a single character, the EOB, so
* treat this as a final EOF.
*/
return EOB_ACT_END_OF_FILE;
@ -1463,7 +1471,7 @@ static int yy_get_next_buffer()
/* don't do the read, it's not guaranteed to return an EOF,
* just force an EOF
*/
yy_n_chars = 0;
yy_current_buffer->yy_n_chars = yy_n_chars = 0;
else
{
@ -1518,6 +1526,8 @@ static int yy_get_next_buffer()
/* Read in more data. */
YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
yy_n_chars, num_to_read );
yy_current_buffer->yy_n_chars = yy_n_chars;
}
if ( yy_n_chars == 0 )
@ -1601,8 +1611,9 @@ yy_state_type yy_current_state;
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
*yy_state_ptr++ = yy_current_state;
yy_is_jam = (yy_current_state == 211);
if ( ! yy_is_jam )
*yy_state_ptr++ = yy_current_state;
return yy_is_jam ? 0 : yy_current_state;
}
@ -1636,7 +1647,8 @@ register char *yy_bp;
yy_cp += (int) (dest - source);
yy_bp += (int) (dest - source);
yy_n_chars = yy_current_buffer->yy_buf_size;
yy_current_buffer->yy_n_chars =
yy_n_chars = yy_current_buffer->yy_buf_size;
if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
YY_FATAL_ERROR( "flex scanner push-back overflow" );
@ -1676,19 +1688,31 @@ static int input()
else
{ /* need more input */
yytext_ptr = yy_c_buf_p;
int offset = yy_c_buf_p - yytext_ptr;
++yy_c_buf_p;
switch ( yy_get_next_buffer() )
{
case EOB_ACT_LAST_MATCH:
/* This happens because yy_g_n_b()
* sees that we've accumulated a
* token and flags that we need to
* try matching the token before
* proceeding. But for input(),
* there's no matching to consider.
* So convert the EOB_ACT_LAST_MATCH
* to EOB_ACT_END_OF_FILE.
*/
/* Reset buffer status. */
yyrestart( yyin );
/* fall through */
case EOB_ACT_END_OF_FILE:
{
if ( yywrap() )
{
yy_c_buf_p =
yytext_ptr + YY_MORE_ADJ;
return EOF;
}
if ( ! yy_did_buffer_switch_on_eof )
YY_NEW_FILE;
@ -1700,17 +1724,8 @@ static int input()
}
case EOB_ACT_CONTINUE_SCAN:
yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
yy_c_buf_p = yytext_ptr + offset;
break;
case EOB_ACT_LAST_MATCH:
#ifdef __cplusplus
YY_FATAL_ERROR(
"unexpected last match in yyinput()" );
#else
YY_FATAL_ERROR(
"unexpected last match in input()" );
#endif
}
}
}
@ -1877,6 +1892,9 @@ YY_BUFFER_STATE b;
#endif
{
if ( ! b )
return;
b->yy_n_chars = 0;
/* We always need two end-of-buffer characters. The first causes
@ -1936,17 +1954,17 @@ yy_size_t size;
#ifndef YY_NO_SCAN_STRING
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_string( yyconst char *str )
YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
#else
YY_BUFFER_STATE yy_scan_string( str )
yyconst char *str;
YY_BUFFER_STATE yy_scan_string( yy_str )
yyconst char *yy_str;
#endif
{
int len;
for ( len = 0; str[len]; ++len )
for ( len = 0; yy_str[len]; ++len )
;
return yy_scan_bytes( str, len );
return yy_scan_bytes( yy_str, len );
}
#endif
@ -2067,7 +2085,7 @@ char msg[];
{ \
/* Undo effects of setting up yytext. */ \
yytext[yyleng] = yy_hold_char; \
yy_c_buf_p = yytext + n - YY_MORE_ADJ; \
yy_c_buf_p = yytext + n; \
yy_hold_char = *yy_c_buf_p; \
*yy_c_buf_p = '\0'; \
yyleng = n; \
@ -2093,6 +2111,22 @@ int n;
}
#endif
#ifdef YY_NEED_STRLEN
#ifdef YY_USE_PROTOS
static int yy_flex_strlen( yyconst char *s )
#else
static int yy_flex_strlen( s )
yyconst char *s;
#endif
{
register int n;
for ( n = 0; s[n]; ++n )
;
return n;
}
#endif
#ifdef YY_USE_PROTOS
static void *yy_flex_alloc( yy_size_t size )

View File

@ -1,31 +1,31 @@
QUERY: CREATE TABLE temp (initial int4);
QUERY: ALTER TABLE temp ADD COLUMN a int4;
QUERY: ALTER TABLE temp ADD COLUMN b name;
QUERY: ALTER TABLE temp ADD COLUMN c text;
QUERY: ALTER TABLE temp ADD COLUMN d float8;
QUERY: ALTER TABLE temp ADD COLUMN e float4;
QUERY: ALTER TABLE temp ADD COLUMN f int2;
QUERY: ALTER TABLE temp ADD COLUMN g polygon;
QUERY: ALTER TABLE temp ADD COLUMN h abstime;
QUERY: ALTER TABLE temp ADD COLUMN i char;
QUERY: ALTER TABLE temp ADD COLUMN j abstime[];
QUERY: ALTER TABLE temp ADD COLUMN k dt;
QUERY: CREATE TABLE tmp (initial int4);
QUERY: ALTER TABLE tmp ADD COLUMN a int4;
QUERY: ALTER TABLE tmp ADD COLUMN b name;
QUERY: ALTER TABLE tmp ADD COLUMN c text;
QUERY: ALTER TABLE tmp ADD COLUMN d float8;
QUERY: ALTER TABLE tmp ADD COLUMN e float4;
QUERY: ALTER TABLE tmp ADD COLUMN f int2;
QUERY: ALTER TABLE tmp ADD COLUMN g polygon;
QUERY: ALTER TABLE tmp ADD COLUMN h abstime;
QUERY: ALTER TABLE tmp ADD COLUMN i char;
QUERY: ALTER TABLE tmp ADD COLUMN j abstime[];
QUERY: ALTER TABLE tmp ADD COLUMN k dt;
ERROR: type name lookup of dt failed
QUERY: ALTER TABLE temp ADD COLUMN l tid;
QUERY: ALTER TABLE temp ADD COLUMN m xid;
QUERY: ALTER TABLE temp ADD COLUMN n oid8;
QUERY: ALTER TABLE temp ADD COLUMN p smgr;
QUERY: ALTER TABLE temp ADD COLUMN q point;
QUERY: ALTER TABLE temp ADD COLUMN r lseg;
QUERY: ALTER TABLE temp ADD COLUMN s path;
QUERY: ALTER TABLE temp ADD COLUMN t box;
QUERY: ALTER TABLE temp ADD COLUMN u tinterval;
QUERY: ALTER TABLE temp ADD COLUMN v datetime;
QUERY: ALTER TABLE temp ADD COLUMN w timespan;
QUERY: ALTER TABLE temp ADD COLUMN x float8[];
QUERY: ALTER TABLE temp ADD COLUMN y float4[];
QUERY: ALTER TABLE temp ADD COLUMN z int2[];
QUERY: INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
QUERY: ALTER TABLE tmp ADD COLUMN l tid;
QUERY: ALTER TABLE tmp ADD COLUMN m xid;
QUERY: ALTER TABLE tmp ADD COLUMN n oid8;
QUERY: ALTER TABLE tmp ADD COLUMN p smgr;
QUERY: ALTER TABLE tmp ADD COLUMN q point;
QUERY: ALTER TABLE tmp ADD COLUMN r lseg;
QUERY: ALTER TABLE tmp ADD COLUMN s path;
QUERY: ALTER TABLE tmp ADD COLUMN t box;
QUERY: ALTER TABLE tmp ADD COLUMN u tinterval;
QUERY: ALTER TABLE tmp ADD COLUMN v datetime;
QUERY: ALTER TABLE tmp ADD COLUMN w timespan;
QUERY: ALTER TABLE tmp ADD COLUMN x float8[];
QUERY: ALTER TABLE tmp ADD COLUMN y float4[];
QUERY: ALTER TABLE tmp ADD COLUMN z int2[];
QUERY: INSERT INTO tmp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
v, w, x, y, z)
VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)',
'Mon May 1 00:30:30 1995', 'c', '{Mon May 1 00:30:30 1995, Monday Aug 24 14:43:07 1992, epoch}',
@ -33,43 +33,43 @@ QUERY: INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t
'1 2 3 4 5 6 7 8', 'magnetic disk', '(1.1,1.1)', '(4.1,4.1,3.1,3.1)',
'(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', '["current" "infinity"]',
'1/3', '1,name', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}');
ERROR: Relation temp does not have attribute k
QUERY: SELECT * FROM temp;
ERROR: Relation tmp does not have attribute k
QUERY: SELECT * FROM tmp;
initial|a|b|c|d|e|f|g|h|i|j|l|m|n|p|q|r|s|t|u|v|w|x|y|z
-------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(0 rows)
QUERY: DROP TABLE temp;
QUERY: CREATE TABLE temp (
QUERY: DROP TABLE tmp;
QUERY: CREATE TABLE tmp (
initial int4
);
QUERY: ALTER TABLE temp ADD COLUMN a int4;
QUERY: ALTER TABLE temp ADD COLUMN b name;
QUERY: ALTER TABLE temp ADD COLUMN c text;
QUERY: ALTER TABLE temp ADD COLUMN d float8;
QUERY: ALTER TABLE temp ADD COLUMN e float4;
QUERY: ALTER TABLE temp ADD COLUMN f int2;
QUERY: ALTER TABLE temp ADD COLUMN g polygon;
QUERY: ALTER TABLE temp ADD COLUMN h abstime;
QUERY: ALTER TABLE temp ADD COLUMN i char;
QUERY: ALTER TABLE temp ADD COLUMN j abstime[];
QUERY: ALTER TABLE temp ADD COLUMN k dt;
QUERY: ALTER TABLE tmp ADD COLUMN a int4;
QUERY: ALTER TABLE tmp ADD COLUMN b name;
QUERY: ALTER TABLE tmp ADD COLUMN c text;
QUERY: ALTER TABLE tmp ADD COLUMN d float8;
QUERY: ALTER TABLE tmp ADD COLUMN e float4;
QUERY: ALTER TABLE tmp ADD COLUMN f int2;
QUERY: ALTER TABLE tmp ADD COLUMN g polygon;
QUERY: ALTER TABLE tmp ADD COLUMN h abstime;
QUERY: ALTER TABLE tmp ADD COLUMN i char;
QUERY: ALTER TABLE tmp ADD COLUMN j abstime[];
QUERY: ALTER TABLE tmp ADD COLUMN k dt;
ERROR: type name lookup of dt failed
QUERY: ALTER TABLE temp ADD COLUMN l tid;
QUERY: ALTER TABLE temp ADD COLUMN m xid;
QUERY: ALTER TABLE temp ADD COLUMN n oid8;
QUERY: ALTER TABLE temp ADD COLUMN p smgr;
QUERY: ALTER TABLE temp ADD COLUMN q point;
QUERY: ALTER TABLE temp ADD COLUMN r lseg;
QUERY: ALTER TABLE temp ADD COLUMN s path;
QUERY: ALTER TABLE temp ADD COLUMN t box;
QUERY: ALTER TABLE temp ADD COLUMN u tinterval;
QUERY: ALTER TABLE temp ADD COLUMN v datetime;
QUERY: ALTER TABLE temp ADD COLUMN w timespan;
QUERY: ALTER TABLE temp ADD COLUMN x float8[];
QUERY: ALTER TABLE temp ADD COLUMN y float4[];
QUERY: ALTER TABLE temp ADD COLUMN z int2[];
QUERY: INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
QUERY: ALTER TABLE tmp ADD COLUMN l tid;
QUERY: ALTER TABLE tmp ADD COLUMN m xid;
QUERY: ALTER TABLE tmp ADD COLUMN n oid8;
QUERY: ALTER TABLE tmp ADD COLUMN p smgr;
QUERY: ALTER TABLE tmp ADD COLUMN q point;
QUERY: ALTER TABLE tmp ADD COLUMN r lseg;
QUERY: ALTER TABLE tmp ADD COLUMN s path;
QUERY: ALTER TABLE tmp ADD COLUMN t box;
QUERY: ALTER TABLE tmp ADD COLUMN u tinterval;
QUERY: ALTER TABLE tmp ADD COLUMN v datetime;
QUERY: ALTER TABLE tmp ADD COLUMN w timespan;
QUERY: ALTER TABLE tmp ADD COLUMN x float8[];
QUERY: ALTER TABLE tmp ADD COLUMN y float4[];
QUERY: ALTER TABLE tmp ADD COLUMN z int2[];
QUERY: INSERT INTO tmp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
v, w, x, y, z)
VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)',
'Mon May 1 00:30:30 1995', 'c', '{Mon May 1 00:30:30 1995, Monday Aug 24 14:43:07 1992, epoch}',
@ -77,13 +77,13 @@ QUERY: INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t
'1 2 3 4 5 6 7 8', 'magnetic disk', '(1.1,1.1)', '(4.1,4.1,3.1,3.1)',
'(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', '["current" "infinity"]',
'1/3', '1,name', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}');
ERROR: Relation temp does not have attribute k
QUERY: SELECT * FROM temp;
ERROR: Relation tmp does not have attribute k
QUERY: SELECT * FROM tmp;
initial|a|b|c|d|e|f|g|h|i|j|l|m|n|p|q|r|s|t|u|v|w|x|y|z
-------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
(0 rows)
QUERY: DROP TABLE temp;
QUERY: DROP TABLE tmp;
QUERY: ALTER TABLE tenk1 RENAME TO ten_k;
QUERY: SELECT unique1 FROM ten_k WHERE unique1 < 20;
unique1

View File

@ -173,7 +173,7 @@ unique1|string4
(20 rows)
QUERY: SELECT two, stringu1, ten, string4
INTO TABLE temp
INTO TABLE tmp
FROM onek;
QUERY: SELECT p.name, p.age FROM person* p;
name |age

View File

@ -1,11 +1,11 @@
QUERY: SELECT DISTINCT two FROM temp;
QUERY: SELECT DISTINCT two FROM tmp;
two
---
0
1
(2 rows)
QUERY: SELECT DISTINCT ten FROM temp;
QUERY: SELECT DISTINCT ten FROM tmp;
ten
---
0
@ -20,7 +20,7 @@ ten
9
(10 rows)
QUERY: SELECT DISTINCT string4 FROM temp;
QUERY: SELECT DISTINCT string4 FROM tmp;
string4
-------
AAAAxx
@ -30,7 +30,7 @@ VVVVxx
(4 rows)
QUERY: SELECT DISTINCT two, string4, ten
FROM temp
FROM tmp
ORDER BY two using <, string4 using <, ten using <;
two|string4|ten
---+-------+---

View File

@ -1,5 +1,5 @@
QUERY: SELECT DISTINCT ON string4 two, string4, ten
FROM temp
FROM tmp
ORDER BY two using <, string4 using <, ten using <;
two|string4|ten
---+-------+---

View File

@ -1,10 +1,10 @@
QUERY: SELECT *
INTO TABLE temp1
FROM temp
INTO TABLE tmp1
FROM tmp
WHERE onek.unique1 < 2;
QUERY: DROP TABLE temp1;
QUERY: DROP TABLE tmp1;
QUERY: SELECT *
INTO TABLE temp1
FROM temp
INTO TABLE tmp1
FROM tmp
WHERE onek2.unique1 < 2;
QUERY: DROP TABLE temp1;
QUERY: DROP TABLE tmp1;

View File

@ -0,0 +1,29 @@
QUERY: CREATE TABLE temptest(col int);
QUERY: CREATE INDEX i_temptest ON temptest(col);
QUERY: CREATE TEMP TABLE temptest(col int);
QUERY: CREATE INDEX i_temptest ON temptest(col);
QUERY: DROP INDEX i_temptest;
QUERY: DROP TABLE temptest;
QUERY: DROP INDEX i_temptest;
QUERY: DROP TABLE temptest;
QUERY: CREATE TABLE temptest(col int);
QUERY: INSERT INTO temptest VALUES (1);
QUERY: CREATE TEMP TABLE temptest(col int);
QUERY: INSERT INTO temptest VALUES (2);
QUERY: SELECT * FROM temptest;
col
---
2
(1 row)
QUERY: DROP TABLE temptest;
QUERY: SELECT * FROM temptest;
col
---
1
(1 row)
QUERY: DROP TABLE temptest;
QUERY: CREATE TEMP TABLE temptest(col int);
QUERY: SELECT * FROM temptest;
ERROR: temptest: Table does not exist.

View File

@ -122,22 +122,22 @@ DROP SEQUENCE INSERT_SEQ;
CREATE SEQUENCE INSERT_SEQ START 4;
CREATE TABLE TEMP (xd INT, yd TEXT, zd INT);
CREATE TABLE tmp (xd INT, yd TEXT, zd INT);
INSERT INTO TEMP VALUES (null, 'Y', null);
INSERT INTO TEMP VALUES (5, '!check failed', null);
INSERT INTO TEMP VALUES (null, 'try again', null);
INSERT INTO INSERT_TBL(y) select yd from TEMP;
INSERT INTO tmp VALUES (null, 'Y', null);
INSERT INTO tmp VALUES (5, '!check failed', null);
INSERT INTO tmp VALUES (null, 'try again', null);
INSERT INTO INSERT_TBL(y) select yd from tmp;
SELECT '' AS three, * FROM INSERT_TBL;
INSERT INTO INSERT_TBL SELECT * FROM TEMP WHERE yd = 'try again';
INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM TEMP WHERE yd = 'try again';
INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM TEMP WHERE yd = 'try again';
INSERT INTO INSERT_TBL SELECT * FROM tmp WHERE yd = 'try again';
INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM tmp WHERE yd = 'try again';
INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM tmp WHERE yd = 'try again';
SELECT '' AS four, * FROM INSERT_TBL;
DROP TABLE TEMP;
DROP TABLE tmp;
--
-- Check constraints on UPDATE

View File

@ -26,17 +26,17 @@ UPDATE onek
-- systems. This non-func update stuff needs to be examined
-- more closely. - jolly (2/22/96)
--
UPDATE temp
UPDATE tmp
SET stringu1 = reverse_name(onek.stringu1)
WHERE onek.stringu1 = 'JBAAAA' and
onek.stringu1 = temp.stringu1;
onek.stringu1 = tmp.stringu1;
UPDATE temp
UPDATE tmp
SET stringu1 = reverse_name(onek2.stringu1)
WHERE onek2.stringu1 = 'JCAAAA' and
onek2.stringu1 = temp.stringu1;
onek2.stringu1 = tmp.stringu1;
DROP TABLE temp;
DROP TABLE tmp;
--UPDATE person*
-- SET age = age + 1;

View File

@ -148,11 +148,11 @@ eight| 8
QUERY: DELETE FROM INSERT_TBL;
QUERY: DROP SEQUENCE INSERT_SEQ;
QUERY: CREATE SEQUENCE INSERT_SEQ START 4;
QUERY: CREATE TABLE TEMP (xd INT, yd TEXT, zd INT);
QUERY: INSERT INTO TEMP VALUES (null, 'Y', null);
QUERY: INSERT INTO TEMP VALUES (5, '!check failed', null);
QUERY: INSERT INTO TEMP VALUES (null, 'try again', null);
QUERY: INSERT INTO INSERT_TBL(y) select yd from TEMP;
QUERY: CREATE TABLE tmp (xd INT, yd TEXT, zd INT);
QUERY: INSERT INTO tmp VALUES (null, 'Y', null);
QUERY: INSERT INTO tmp VALUES (5, '!check failed', null);
QUERY: INSERT INTO tmp VALUES (null, 'try again', null);
QUERY: INSERT INTO INSERT_TBL(y) select yd from tmp;
NOTICE: insert_seq.nextval: sequence was re-created
QUERY: SELECT '' AS three, * FROM INSERT_TBL;
three|x|y | z
@ -162,10 +162,10 @@ three|x|y | z
|6|try again |-6
(3 rows)
QUERY: INSERT INTO INSERT_TBL SELECT * FROM TEMP WHERE yd = 'try again';
QUERY: INSERT INTO INSERT_TBL SELECT * FROM tmp WHERE yd = 'try again';
ERROR: ExecAppend: rejected due to CHECK constraint $2
QUERY: INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM TEMP WHERE yd = 'try again';
QUERY: INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM TEMP WHERE yd = 'try again';
QUERY: INSERT INTO INSERT_TBL(y,z) SELECT yd, -7 FROM tmp WHERE yd = 'try again';
QUERY: INSERT INTO INSERT_TBL(y,z) SELECT yd, -8 FROM tmp WHERE yd = 'try again';
ERROR: ExecAppend: rejected due to CHECK constraint insert_con
QUERY: SELECT '' AS four, * FROM INSERT_TBL;
four|x|y | z
@ -176,7 +176,7 @@ four|x|y | z
|7|try again |-7
(4 rows)
QUERY: DROP TABLE TEMP;
QUERY: DROP TABLE tmp;
QUERY: UPDATE INSERT_TBL SET x = NULL WHERE x = 6;
ERROR: ExecReplace: rejected due to CHECK constraint $2
QUERY: UPDATE INSERT_TBL SET x = 6 WHERE x = 6;

View File

@ -2,19 +2,19 @@ QUERY: UPDATE onek
SET unique1 = onek.unique1 + 1;
QUERY: UPDATE onek
SET unique1 = onek.unique1 - 1;
QUERY: UPDATE temp
QUERY: UPDATE tmp
SET stringu1 = reverse_name(onek.stringu1)
WHERE onek.stringu1 = 'JBAAAA' and
onek.stringu1 = temp.stringu1;
onek.stringu1 = tmp.stringu1;
NOTICE: Non-functional update, only first update is performed
NOTICE: Non-functional update, only first update is performed
QUERY: UPDATE temp
QUERY: UPDATE tmp
SET stringu1 = reverse_name(onek2.stringu1)
WHERE onek2.stringu1 = 'JCAAAA' and
onek2.stringu1 = temp.stringu1;
onek2.stringu1 = tmp.stringu1;
NOTICE: Non-functional update, only first update is performed
NOTICE: Non-functional update, only first update is performed
QUERY: DROP TABLE temp;
QUERY: DROP TABLE tmp;
QUERY: COPY onek TO '_OBJWD_/results/onek.data';
QUERY: DELETE FROM onek;
QUERY: COPY onek FROM '_OBJWD_/results/onek.data';

View File

@ -1,60 +1,60 @@
--
-- add attribute
--
CREATE TABLE temp (initial int4);
CREATE TABLE tmp (initial int4);
ALTER TABLE temp ADD COLUMN a int4;
ALTER TABLE tmp ADD COLUMN a int4;
ALTER TABLE temp ADD COLUMN b name;
ALTER TABLE tmp ADD COLUMN b name;
ALTER TABLE temp ADD COLUMN c text;
ALTER TABLE tmp ADD COLUMN c text;
ALTER TABLE temp ADD COLUMN d float8;
ALTER TABLE tmp ADD COLUMN d float8;
ALTER TABLE temp ADD COLUMN e float4;
ALTER TABLE tmp ADD COLUMN e float4;
ALTER TABLE temp ADD COLUMN f int2;
ALTER TABLE tmp ADD COLUMN f int2;
ALTER TABLE temp ADD COLUMN g polygon;
ALTER TABLE tmp ADD COLUMN g polygon;
ALTER TABLE temp ADD COLUMN h abstime;
ALTER TABLE tmp ADD COLUMN h abstime;
ALTER TABLE temp ADD COLUMN i char;
ALTER TABLE tmp ADD COLUMN i char;
ALTER TABLE temp ADD COLUMN j abstime[];
ALTER TABLE tmp ADD COLUMN j abstime[];
ALTER TABLE temp ADD COLUMN k dt;
ALTER TABLE tmp ADD COLUMN k dt;
ALTER TABLE temp ADD COLUMN l tid;
ALTER TABLE tmp ADD COLUMN l tid;
ALTER TABLE temp ADD COLUMN m xid;
ALTER TABLE tmp ADD COLUMN m xid;
ALTER TABLE temp ADD COLUMN n oid8;
ALTER TABLE tmp ADD COLUMN n oid8;
--ALTER TABLE temp ADD COLUMN o lock;
ALTER TABLE temp ADD COLUMN p smgr;
--ALTER TABLE tmp ADD COLUMN o lock;
ALTER TABLE tmp ADD COLUMN p smgr;
ALTER TABLE temp ADD COLUMN q point;
ALTER TABLE tmp ADD COLUMN q point;
ALTER TABLE temp ADD COLUMN r lseg;
ALTER TABLE tmp ADD COLUMN r lseg;
ALTER TABLE temp ADD COLUMN s path;
ALTER TABLE tmp ADD COLUMN s path;
ALTER TABLE temp ADD COLUMN t box;
ALTER TABLE tmp ADD COLUMN t box;
ALTER TABLE temp ADD COLUMN u tinterval;
ALTER TABLE tmp ADD COLUMN u tinterval;
ALTER TABLE temp ADD COLUMN v datetime;
ALTER TABLE tmp ADD COLUMN v datetime;
ALTER TABLE temp ADD COLUMN w timespan;
ALTER TABLE tmp ADD COLUMN w timespan;
ALTER TABLE temp ADD COLUMN x float8[];
ALTER TABLE tmp ADD COLUMN x float8[];
ALTER TABLE temp ADD COLUMN y float4[];
ALTER TABLE tmp ADD COLUMN y float4[];
ALTER TABLE temp ADD COLUMN z int2[];
ALTER TABLE tmp ADD COLUMN z int2[];
INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
INSERT INTO tmp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
v, w, x, y, z)
VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)',
'Mon May 1 00:30:30 1995', 'c', '{Mon May 1 00:30:30 1995, Monday Aug 24 14:43:07 1992, epoch}',
@ -63,67 +63,67 @@ INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
'(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', '["current" "infinity"]',
'1/3', '1,name', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}');
SELECT * FROM temp;
SELECT * FROM tmp;
DROP TABLE temp;
DROP TABLE tmp;
-- the wolf bug - schema mods caused inconsistent row descriptors
CREATE TABLE temp (
CREATE TABLE tmp (
initial int4
);
ALTER TABLE temp ADD COLUMN a int4;
ALTER TABLE tmp ADD COLUMN a int4;
ALTER TABLE temp ADD COLUMN b name;
ALTER TABLE tmp ADD COLUMN b name;
ALTER TABLE temp ADD COLUMN c text;
ALTER TABLE tmp ADD COLUMN c text;
ALTER TABLE temp ADD COLUMN d float8;
ALTER TABLE tmp ADD COLUMN d float8;
ALTER TABLE temp ADD COLUMN e float4;
ALTER TABLE tmp ADD COLUMN e float4;
ALTER TABLE temp ADD COLUMN f int2;
ALTER TABLE tmp ADD COLUMN f int2;
ALTER TABLE temp ADD COLUMN g polygon;
ALTER TABLE tmp ADD COLUMN g polygon;
ALTER TABLE temp ADD COLUMN h abstime;
ALTER TABLE tmp ADD COLUMN h abstime;
ALTER TABLE temp ADD COLUMN i char;
ALTER TABLE tmp ADD COLUMN i char;
ALTER TABLE temp ADD COLUMN j abstime[];
ALTER TABLE tmp ADD COLUMN j abstime[];
ALTER TABLE temp ADD COLUMN k dt;
ALTER TABLE tmp ADD COLUMN k dt;
ALTER TABLE temp ADD COLUMN l tid;
ALTER TABLE tmp ADD COLUMN l tid;
ALTER TABLE temp ADD COLUMN m xid;
ALTER TABLE tmp ADD COLUMN m xid;
ALTER TABLE temp ADD COLUMN n oid8;
ALTER TABLE tmp ADD COLUMN n oid8;
--ALTER TABLE temp ADD COLUMN o lock;
ALTER TABLE temp ADD COLUMN p smgr;
--ALTER TABLE tmp ADD COLUMN o lock;
ALTER TABLE tmp ADD COLUMN p smgr;
ALTER TABLE temp ADD COLUMN q point;
ALTER TABLE tmp ADD COLUMN q point;
ALTER TABLE temp ADD COLUMN r lseg;
ALTER TABLE tmp ADD COLUMN r lseg;
ALTER TABLE temp ADD COLUMN s path;
ALTER TABLE tmp ADD COLUMN s path;
ALTER TABLE temp ADD COLUMN t box;
ALTER TABLE tmp ADD COLUMN t box;
ALTER TABLE temp ADD COLUMN u tinterval;
ALTER TABLE tmp ADD COLUMN u tinterval;
ALTER TABLE temp ADD COLUMN v datetime;
ALTER TABLE tmp ADD COLUMN v datetime;
ALTER TABLE temp ADD COLUMN w timespan;
ALTER TABLE tmp ADD COLUMN w timespan;
ALTER TABLE temp ADD COLUMN x float8[];
ALTER TABLE tmp ADD COLUMN x float8[];
ALTER TABLE temp ADD COLUMN y float4[];
ALTER TABLE tmp ADD COLUMN y float4[];
ALTER TABLE temp ADD COLUMN z int2[];
ALTER TABLE tmp ADD COLUMN z int2[];
INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
INSERT INTO tmp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
v, w, x, y, z)
VALUES (4, 'name', 'text', 4.1, 4.1, 2, '(4.1,4.1,3.1,3.1)',
'Mon May 1 00:30:30 1995', 'c', '{Mon May 1 00:30:30 1995, Monday Aug 24 14:43:07 1992, epoch}',
@ -132,9 +132,9 @@ INSERT INTO temp (a, b, c, d, e, f, g, h, i, j, k, l, m, n, p, q, r, s, t, u,
'(0,2,4.1,4.1,3.1,3.1)', '(4.1,4.1,3.1,3.1)', '["current" "infinity"]',
'1/3', '1,name', '{1.0,2.0,3.0,4.0}', '{1.0,2.0,3.0,4.0}', '{1,2,3,4}');
SELECT * FROM temp;
SELECT * FROM tmp;
DROP TABLE temp;
DROP TABLE tmp;
--

View File

@ -72,7 +72,7 @@ SELECT onek.unique1, onek.string4
-- ORDER BY stringu1 using <;
SELECT two, stringu1, ten, string4
INTO TABLE temp
INTO TABLE tmp
FROM onek;
--

View File

@ -1,24 +1,24 @@
--
-- awk '{print $3;}' onek.data | sort -n | uniq
--
SELECT DISTINCT two FROM temp;
SELECT DISTINCT two FROM tmp;
--
-- awk '{print $5;}' onek.data | sort -n | uniq
--
SELECT DISTINCT ten FROM temp;
SELECT DISTINCT ten FROM tmp;
--
-- awk '{print $16;}' onek.data | sort -d | uniq
--
SELECT DISTINCT string4 FROM temp;
SELECT DISTINCT string4 FROM tmp;
--
-- awk '{print $3,$16,$5;}' onek.data | sort -d | uniq |
-- sort +0n -1 +1d -2 +2n -3
--
SELECT DISTINCT two, string4, ten
FROM temp
FROM tmp
ORDER BY two using <, string4 using <, ten using <;
--

View File

@ -3,6 +3,6 @@
-- test select distinct on
--
SELECT DISTINCT ON string4 two, string4, ten
FROM temp
FROM tmp
ORDER BY two using <, string4 using <, ten using <;

View File

@ -1,14 +1,14 @@
SELECT *
INTO TABLE temp1
FROM temp
INTO TABLE tmp1
FROM tmp
WHERE onek.unique1 < 2;
DROP TABLE temp1;
DROP TABLE tmp1;
SELECT *
INTO TABLE temp1
FROM temp
INTO TABLE tmp1
FROM tmp
WHERE onek2.unique1 < 2;
DROP TABLE temp1;
DROP TABLE tmp1;

View File

@ -0,0 +1,47 @@
--
-- Test temp relations and indexes
--
-- test temp table/index masking
CREATE TABLE temptest(col int);
CREATE INDEX i_temptest ON temptest(col);
CREATE TEMP TABLE temptest(col int);
CREATE INDEX i_temptest ON temptest(col);
DROP INDEX i_temptest;
DROP TABLE temptest;
DROP INDEX i_temptest;
DROP TABLE temptest;
-- test temp table selects
CREATE TABLE temptest(col int);
INSERT INTO temptest VALUES (1);
CREATE TEMP TABLE temptest(col int);
INSERT INTO temptest VALUES (2);
SELECT * FROM temptest;
DROP TABLE temptest;
SELECT * FROM temptest;
DROP TABLE temptest;
CREATE TEMP TABLE temptest(col int);
-- test temp table deletion
\c regression
SELECT * FROM temptest;

View File

@ -64,3 +64,4 @@ portals_p2
rules
install_plpgsql
plpgsql
temp

View File

@ -1,7 +1,7 @@
#!/bin/sh
trap "rm -f /tmp/$$" 0 1 2 3 15
rm -f ./tags
find `pwd`/ -type f -name '*.[chyl]' -print|xargs ctags -t -a -f tags
find `pwd`/ -type f -name '*.[chyl]' -print|xargs ctags -d -t -a -f tags
sort tags >/tmp/$$ && mv /tmp/$$ tags
find . -type d -print |while read DIR