mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 00:08:23 -05:00 
			
		
		
		
	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");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ----------------
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								src/backend/utils/cache/Makefile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								src/backend/utils/cache/Makefile
									
									
									
									
										vendored
									
									
								
							@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								src/backend/utils/cache/catcache.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/backend/utils/cache/catcache.c
									
									
									
									
										vendored
									
									
								
							@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								src/backend/utils/cache/inval.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								src/backend/utils/cache/inval.c
									
									
									
									
										vendored
									
									
								
							@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										92
									
								
								src/backend/utils/cache/relcache.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								src/backend/utils/cache/relcache.c
									
									
									
									
										vendored
									
									
								
							@ -7,7 +7,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.55 1999/01/22 18:47:37 momjian Exp $
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.56 1999/02/02 03:45:02 momjian Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@ -404,7 +404,7 @@ scan_pg_rel_ind(RelationBuildDescInfo buildinfo)
 | 
			
		||||
	switch (buildinfo.infotype)
 | 
			
		||||
	{
 | 
			
		||||
		case INFO_RELID:
 | 
			
		||||
			return_tuple = ClassOidIndexScan(pg_class_desc, buildinfo.i.info_id);
 | 
			
		||||
			return_tuple = ClassOidIndexScan(pg_class_desc,buildinfo.i.info_id);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case INFO_RELNAME:
 | 
			
		||||
@ -821,7 +821,6 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
 | 
			
		||||
	 */
 | 
			
		||||
	if (!HeapTupleIsValid(pg_class_tuple))
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
 | 
			
		||||
		return NULL;
 | 
			
		||||
@ -867,8 +866,7 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
 | 
			
		||||
	 */
 | 
			
		||||
	if (OidIsValid(relam))
 | 
			
		||||
	{
 | 
			
		||||
		relation->rd_am = (Form_pg_am)
 | 
			
		||||
			AccessMethodObjectIdGetForm(relam);
 | 
			
		||||
		relation->rd_am = (Form_pg_am) AccessMethodObjectIdGetForm(relam);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ----------------
 | 
			
		||||
@ -927,7 +925,6 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
 | 
			
		||||
	 *	restore memory context and return the new reldesc.
 | 
			
		||||
	 * ----------------
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	RelationCacheInsert(relation);
 | 
			
		||||
 | 
			
		||||
	/* -------------------
 | 
			
		||||
@ -1197,8 +1194,7 @@ RelationIdGetRelation(Oid relationId)
 | 
			
		||||
	buildinfo.i.info_id = relationId;
 | 
			
		||||
 | 
			
		||||
	rd = RelationBuildDesc(buildinfo);
 | 
			
		||||
	return
 | 
			
		||||
		rd;
 | 
			
		||||
	return rd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* --------------------------------
 | 
			
		||||
@ -1332,8 +1328,9 @@ RelationFlushRelation(Relation *relationPtr,
 | 
			
		||||
 | 
			
		||||
/* --------------------------------
 | 
			
		||||
 *		RelationForgetRelation -
 | 
			
		||||
 *		   RelationFlushRelation + if the relation is local then get rid of
 | 
			
		||||
 *		   the relation descriptor from the newly created relation list.
 | 
			
		||||
 *		   RelationFlushRelation + if the relation is myxactonly then
 | 
			
		||||
 *		   get rid of the relation descriptor from the newly created
 | 
			
		||||
 *		   relation list.
 | 
			
		||||
 * --------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
@ -1342,37 +1339,39 @@ RelationForgetRelation(Oid rid)
 | 
			
		||||
	Relation	relation;
 | 
			
		||||
 | 
			
		||||
	RelationIdCacheLookup(rid, relation);
 | 
			
		||||
	Assert(PointerIsValid(relation));
 | 
			
		||||
 | 
			
		||||
	if (relation->rd_islocal)
 | 
			
		||||
	if (PointerIsValid(relation))
 | 
			
		||||
	{
 | 
			
		||||
		MemoryContext oldcxt;
 | 
			
		||||
		List	   *curr;
 | 
			
		||||
		List	   *prev = NIL;
 | 
			
		||||
 | 
			
		||||
		oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
 | 
			
		||||
 | 
			
		||||
		foreach(curr, newlyCreatedRelns)
 | 
			
		||||
		if (relation->rd_myxactonly)
 | 
			
		||||
		{
 | 
			
		||||
			Relation	reln = lfirst(curr);
 | 
			
		||||
 | 
			
		||||
			Assert(reln != NULL && reln->rd_islocal);
 | 
			
		||||
			if (RelationGetRelid(reln) == rid)
 | 
			
		||||
				break;
 | 
			
		||||
			prev = curr;
 | 
			
		||||
			MemoryContext oldcxt;
 | 
			
		||||
			List	   *curr;
 | 
			
		||||
			List	   *prev = NIL;
 | 
			
		||||
	
 | 
			
		||||
			oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
 | 
			
		||||
	
 | 
			
		||||
			foreach(curr, newlyCreatedRelns)
 | 
			
		||||
			{
 | 
			
		||||
				Relation	reln = lfirst(curr);
 | 
			
		||||
	
 | 
			
		||||
				Assert(reln != NULL && reln->rd_myxactonly);
 | 
			
		||||
				if (RelationGetRelid(reln) == rid)
 | 
			
		||||
					break;
 | 
			
		||||
				prev = curr;
 | 
			
		||||
			}
 | 
			
		||||
			if (curr == NIL)
 | 
			
		||||
				elog(FATAL, "Local relation %s not found in list",
 | 
			
		||||
					 (RelationGetRelationName(relation))->data);
 | 
			
		||||
			if (prev == NIL)
 | 
			
		||||
				newlyCreatedRelns = lnext(newlyCreatedRelns);
 | 
			
		||||
			else
 | 
			
		||||
				lnext(prev) = lnext(curr);
 | 
			
		||||
			pfree(curr);
 | 
			
		||||
			MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
		}
 | 
			
		||||
		if (curr == NIL)
 | 
			
		||||
			elog(FATAL, "Local relation %s not found in list",
 | 
			
		||||
				 (RelationGetRelationName(relation))->data);
 | 
			
		||||
		if (prev == NIL)
 | 
			
		||||
			newlyCreatedRelns = lnext(newlyCreatedRelns);
 | 
			
		||||
		else
 | 
			
		||||
			lnext(prev) = lnext(curr);
 | 
			
		||||
		pfree(curr);
 | 
			
		||||
		MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
	
 | 
			
		||||
		RelationFlushRelation(&relation, false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	RelationFlushRelation(&relation, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* --------------------------------
 | 
			
		||||
@ -1393,9 +1392,8 @@ RelationIdInvalidateRelationCacheByRelationId(Oid relationId)
 | 
			
		||||
	 * BufferSync also? But I'll leave it for now since I don't want to
 | 
			
		||||
	 * break anything.) - ay 3/95
 | 
			
		||||
	 */
 | 
			
		||||
	if (PointerIsValid(relation) && !relation->rd_islocal)
 | 
			
		||||
	if (PointerIsValid(relation) && !relation->rd_myxactonly)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * The boolean onlyFlushReferenceCountZero in RelationFlushReln()
 | 
			
		||||
		 * should be set to true when we are incrementing the command
 | 
			
		||||
@ -1502,13 +1500,13 @@ RelationRegisterRelation(Relation relation)
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * we've just created the relation. It is invisible to anyone else
 | 
			
		||||
	 * before the transaction is committed. Setting rd_islocal allows us
 | 
			
		||||
	 * before the transaction is committed. Setting rd_myxactonly allows us
 | 
			
		||||
	 * to use the local buffer manager for select/insert/etc before the
 | 
			
		||||
	 * end of transaction. (We also need to keep track of relations
 | 
			
		||||
	 * created during a transaction and does the necessary clean up at the
 | 
			
		||||
	 * end of the transaction.)				- ay 3/95
 | 
			
		||||
	 */
 | 
			
		||||
	relation->rd_islocal = TRUE;
 | 
			
		||||
	relation->rd_myxactonly = TRUE;
 | 
			
		||||
	newlyCreatedRelns = lcons(relation, newlyCreatedRelns);
 | 
			
		||||
 | 
			
		||||
	MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
@ -1516,7 +1514,7 @@ RelationRegisterRelation(Relation relation)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * RelationPurgeLocalRelation -
 | 
			
		||||
 *	  find all the Relation descriptors marked rd_islocal and reset them.
 | 
			
		||||
 *	  find all the Relation descriptors marked rd_myxactonly and reset them.
 | 
			
		||||
 *	  This should be called at the end of a transaction (commit/abort) when
 | 
			
		||||
 *	  the "local" relations will become visible to others and the multi-user
 | 
			
		||||
 *	  buffer pool should be used.
 | 
			
		||||
@ -1536,7 +1534,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
 | 
			
		||||
		List	   *l = newlyCreatedRelns;
 | 
			
		||||
		Relation	reln = lfirst(l);
 | 
			
		||||
 | 
			
		||||
		Assert(reln != NULL && reln->rd_islocal);
 | 
			
		||||
		Assert(reln != NULL && reln->rd_myxactonly);
 | 
			
		||||
 | 
			
		||||
		if (!xactCommitted)
 | 
			
		||||
		{
 | 
			
		||||
@ -1545,18 +1543,18 @@ RelationPurgeLocalRelation(bool xactCommitted)
 | 
			
		||||
			 * remove the file if we abort. This is so that files for
 | 
			
		||||
			 * tables created inside a transaction block get removed.
 | 
			
		||||
			 */
 | 
			
		||||
			if (reln->rd_istemp)
 | 
			
		||||
			if (reln->rd_isnoname)
 | 
			
		||||
			{
 | 
			
		||||
				if (!(reln->rd_tmpunlinked))
 | 
			
		||||
				if (!(reln->rd_nonameunlinked))
 | 
			
		||||
				{
 | 
			
		||||
					smgrunlink(DEFAULT_SMGR, reln);
 | 
			
		||||
					reln->rd_tmpunlinked = TRUE;
 | 
			
		||||
					reln->rd_nonameunlinked = TRUE;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
				smgrunlink(DEFAULT_SMGR, reln);
 | 
			
		||||
		}
 | 
			
		||||
		else if (!IsBootstrapProcessingMode() && !(reln->rd_istemp))
 | 
			
		||||
		else if (!IsBootstrapProcessingMode() && !(reln->rd_isnoname))
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * RelationFlushRelation () below will flush relation
 | 
			
		||||
@ -1568,7 +1566,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
 | 
			
		||||
			 */
 | 
			
		||||
			smgrclose(DEFAULT_SMGR, reln);
 | 
			
		||||
 | 
			
		||||
		reln->rd_islocal = FALSE;
 | 
			
		||||
		reln->rd_myxactonly = FALSE;
 | 
			
		||||
 | 
			
		||||
		if (!IsBootstrapProcessingMode())
 | 
			
		||||
			RelationFlushRelation(&reln, FALSE);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										165
									
								
								src/backend/utils/cache/temprel.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								src/backend/utils/cache/temprel.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,165 @@
 | 
			
		||||
/*-------------------------------------------------------------------------
 | 
			
		||||
 *
 | 
			
		||||
 * temprel.c--
 | 
			
		||||
 *	  POSTGRES temporary relation handling
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 1994, Regents of the University of California
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.1 1999/02/02 03:45:03 momjian Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This implements temp tables by modifying the relname cache lookups
 | 
			
		||||
 * of pg_class.
 | 
			
		||||
 * When a temp table is created, a linked list of temp table tuples is
 | 
			
		||||
 * stored here.  When a relname cache lookup is done, references to user-named
 | 
			
		||||
 * temp tables are converted to the internal temp table names.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "postgres.h"
 | 
			
		||||
#include "miscadmin.h"
 | 
			
		||||
#include "nodes/pg_list.h"
 | 
			
		||||
#include "utils/mcxt.h"
 | 
			
		||||
#include "utils/temprel.h"
 | 
			
		||||
#include "access/htup.h"
 | 
			
		||||
#include "access/heapam.h"
 | 
			
		||||
#include "catalog/heap.h"
 | 
			
		||||
#include "catalog/index.h"
 | 
			
		||||
#include "catalog/pg_class.h"
 | 
			
		||||
 | 
			
		||||
GlobalMemory CacheCxt;
 | 
			
		||||
 | 
			
		||||
/* ----------------
 | 
			
		||||
 *		global variables
 | 
			
		||||
 * ----------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static List *temp_rels = NIL;
 | 
			
		||||
 | 
			
		||||
typedef struct TempTable
 | 
			
		||||
{
 | 
			
		||||
	char 		*user_relname;
 | 
			
		||||
	HeapTuple	pg_class_tuple;
 | 
			
		||||
} TempTable;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
create_temp_relation(char *relname, HeapTuple pg_class_tuple)
 | 
			
		||||
{
 | 
			
		||||
	MemoryContext oldcxt;
 | 
			
		||||
	TempTable	*temp_rel;
 | 
			
		||||
 | 
			
		||||
	oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
 | 
			
		||||
 | 
			
		||||
	temp_rel = palloc(sizeof(TempTable));
 | 
			
		||||
	temp_rel->user_relname = palloc(NAMEDATALEN);
 | 
			
		||||
 | 
			
		||||
	/* save user-supplied name */
 | 
			
		||||
	strcpy(temp_rel->user_relname, relname);
 | 
			
		||||
            
 | 
			
		||||
	temp_rel->pg_class_tuple = heap_copytuple(pg_class_tuple);
 | 
			
		||||
 | 
			
		||||
	temp_rels = lcons(temp_rel, temp_rels);
 | 
			
		||||
 | 
			
		||||
	MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
remove_all_temp_relations(void)
 | 
			
		||||
{
 | 
			
		||||
	List *l, *next;
 | 
			
		||||
 | 
			
		||||
	l = temp_rels;
 | 
			
		||||
	while (l != NIL)
 | 
			
		||||
	{
 | 
			
		||||
		TempTable	*temp_rel = lfirst(l);
 | 
			
		||||
		Form_pg_class classtuple;
 | 
			
		||||
 | 
			
		||||
		classtuple = (Form_pg_class)GETSTRUCT(temp_rel->pg_class_tuple);
 | 
			
		||||
 | 
			
		||||
		next = lnext(l); /* do this first, l is deallocated */
 | 
			
		||||
 | 
			
		||||
		if (classtuple->relkind != RELKIND_INDEX)
 | 
			
		||||
		{
 | 
			
		||||
			char relname[NAMEDATALEN];
 | 
			
		||||
 | 
			
		||||
			/* safe from deallocation */
 | 
			
		||||
			strcpy(relname, temp_rel->user_relname); 
 | 
			
		||||
			heap_destroy_with_catalog(relname);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			index_destroy(temp_rel->pg_class_tuple->t_data->t_oid);
 | 
			
		||||
 | 
			
		||||
		l = next;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* we don't have the relname for indexes, so we just pass the oid */
 | 
			
		||||
void
 | 
			
		||||
remove_temp_relation(Oid relid)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	MemoryContext oldcxt;
 | 
			
		||||
	List		*l, *prev;
 | 
			
		||||
	
 | 
			
		||||
	oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
 | 
			
		||||
 | 
			
		||||
	prev = NIL;
 | 
			
		||||
	l = temp_rels;
 | 
			
		||||
	while (l != NIL)
 | 
			
		||||
	{
 | 
			
		||||
		TempTable	*temp_rel = lfirst(l);
 | 
			
		||||
 | 
			
		||||
		if (temp_rel->pg_class_tuple->t_data->t_oid == relid)
 | 
			
		||||
		{
 | 
			
		||||
			pfree(temp_rel->user_relname);
 | 
			
		||||
			pfree(temp_rel->pg_class_tuple);
 | 
			
		||||
			pfree(temp_rel);
 | 
			
		||||
			/* remove from linked list */
 | 
			
		||||
			if (prev != NIL)
 | 
			
		||||
			{
 | 
			
		||||
				lnext(prev) = lnext(l);
 | 
			
		||||
				pfree(l);
 | 
			
		||||
				l = lnext(prev);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				temp_rels = lnext(l);
 | 
			
		||||
				pfree(l);
 | 
			
		||||
				l = temp_rels;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			prev = l;
 | 
			
		||||
			l = lnext(l);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	MemoryContextSwitchTo(oldcxt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HeapTuple
 | 
			
		||||
get_temp_rel_by_name(char *user_relname)
 | 
			
		||||
{
 | 
			
		||||
	List *l;
 | 
			
		||||
 | 
			
		||||
	foreach(l, temp_rels)
 | 
			
		||||
	{
 | 
			
		||||
		TempTable	*temp_rel = lfirst(l);
 | 
			
		||||
 | 
			
		||||
		if (strcmp(temp_rel->user_relname, user_relname) == 0)
 | 
			
		||||
			return temp_rel->pg_class_tuple;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
@ -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 */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								src/include/utils/temprel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/include/utils/temprel.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
/*-------------------------------------------------------------------------
 | 
			
		||||
 *
 | 
			
		||||
 * temprel.h--
 | 
			
		||||
 *	  Temporary relation functions
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 1994, Regents of the University of California
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: temprel.h,v 1.1 1999/02/02 03:45:28 momjian Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
#ifndef TEMPREL_H
 | 
			
		||||
#define TEMPREL_H
 | 
			
		||||
 | 
			
		||||
#include "access/htup.h"
 | 
			
		||||
#include "access/attnum.h"
 | 
			
		||||
 | 
			
		||||
void create_temp_relation(char *relname, HeapTuple pg_class_tuple);
 | 
			
		||||
void remove_all_temp_relations(void);
 | 
			
		||||
void remove_temp_relation(Oid relid);
 | 
			
		||||
HeapTuple get_temp_rel_by_name(char *user_relname);
 | 
			
		||||
 | 
			
		||||
#endif	 /* TEMPREL_H */
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								src/test/regress/expected/temp.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/test/regress/expected/temp.out
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
QUERY: CREATE TABLE temptest(col int);
 | 
			
		||||
QUERY: CREATE INDEX i_temptest ON temptest(col);
 | 
			
		||||
QUERY: CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
QUERY: CREATE INDEX i_temptest ON temptest(col);
 | 
			
		||||
QUERY: DROP INDEX i_temptest;
 | 
			
		||||
QUERY: DROP TABLE temptest;
 | 
			
		||||
QUERY: DROP INDEX i_temptest;
 | 
			
		||||
QUERY: DROP TABLE temptest;
 | 
			
		||||
QUERY: CREATE TABLE temptest(col int);
 | 
			
		||||
QUERY: INSERT INTO temptest VALUES (1);
 | 
			
		||||
QUERY: CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
QUERY: INSERT INTO temptest VALUES (2);
 | 
			
		||||
QUERY: SELECT * FROM temptest;
 | 
			
		||||
col
 | 
			
		||||
---
 | 
			
		||||
  2
 | 
			
		||||
(1 row)
 | 
			
		||||
 | 
			
		||||
QUERY: DROP TABLE temptest;
 | 
			
		||||
QUERY: SELECT * FROM temptest;
 | 
			
		||||
col
 | 
			
		||||
---
 | 
			
		||||
  1
 | 
			
		||||
(1 row)
 | 
			
		||||
 | 
			
		||||
QUERY: DROP TABLE temptest;
 | 
			
		||||
QUERY: CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
QUERY: SELECT * FROM temptest;
 | 
			
		||||
ERROR:  temptest: Table does not exist.
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								src/test/regress/sql/temp.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/test/regress/sql/temp.sql
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
			
		||||
--
 | 
			
		||||
-- Test temp relations and indexes
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
-- test temp table/index masking
 | 
			
		||||
 | 
			
		||||
CREATE TABLE temptest(col int);
 | 
			
		||||
 | 
			
		||||
CREATE INDEX i_temptest ON temptest(col);
 | 
			
		||||
 | 
			
		||||
CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
 | 
			
		||||
CREATE INDEX i_temptest ON temptest(col);
 | 
			
		||||
 | 
			
		||||
DROP INDEX i_temptest;
 | 
			
		||||
 | 
			
		||||
DROP TABLE temptest;
 | 
			
		||||
 | 
			
		||||
DROP INDEX i_temptest;
 | 
			
		||||
 | 
			
		||||
DROP TABLE temptest;
 | 
			
		||||
 | 
			
		||||
-- test temp table selects
 | 
			
		||||
 | 
			
		||||
CREATE TABLE temptest(col int);
 | 
			
		||||
 | 
			
		||||
INSERT INTO temptest VALUES (1);
 | 
			
		||||
 | 
			
		||||
CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
 | 
			
		||||
INSERT INTO temptest VALUES (2);
 | 
			
		||||
 | 
			
		||||
SELECT * FROM temptest;
 | 
			
		||||
 | 
			
		||||
DROP TABLE temptest;
 | 
			
		||||
 | 
			
		||||
SELECT * FROM temptest;
 | 
			
		||||
 | 
			
		||||
DROP TABLE temptest;
 | 
			
		||||
 | 
			
		||||
CREATE TEMP TABLE temptest(col int);
 | 
			
		||||
 | 
			
		||||
-- test temp table deletion
 | 
			
		||||
 | 
			
		||||
\c regression
 | 
			
		||||
 | 
			
		||||
SELECT * FROM temptest;
 | 
			
		||||
@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user