mirror of https://github.com/postgres/postgres
Add TEMP tables/indexes. Add COPY pfree(). Other cleanups.
This commit is contained in:
parent
7fc75517df
commit
4390b0bfbe
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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> [, ...] ]
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
@ -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; }
|
||||
|
|
|
@ -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},
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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\
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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....}]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
---+-------+---
|
||||
|
|
|
@ -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
|
||||
---+-------+---
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
--
|
||||
|
|
|
@ -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;
|
||||
|
||||
--
|
||||
|
|
|
@ -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 <;
|
||||
|
||||
--
|
||||
|
|
|
@ -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 <;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
|
@ -64,3 +64,4 @@ portals_p2
|
|||
rules
|
||||
install_plpgsql
|
||||
plpgsql
|
||||
temp
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue