Included all yacc and lex files into the distribution.
This commit is contained in:
parent
a4e1304ed1
commit
759fba4873
@ -176,67 +176,6 @@ Ftp file
|
||||
</Para>
|
||||
</Step>
|
||||
|
||||
<Step Performance="required">
|
||||
<Para>
|
||||
Some platforms use <application>flex</application>.
|
||||
If your system uses <application>flex</application> then make sure
|
||||
you have a good version. To check, type
|
||||
<programlisting>
|
||||
$ flex --version
|
||||
</programlisting>
|
||||
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
If the <application>flex</application> command is not found then you probably do not need it.
|
||||
If the version is 2.5.2 or 2.5.4 or greater then you are okay. If it
|
||||
is 2.5.3 or before 2.5.2 then you will have to upgrade <application>flex</application>. You may
|
||||
get it at
|
||||
<ulink url="ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz">ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz</ulink>.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
If you need <application>flex</application> and don't have it or have the wrong version, then
|
||||
you will be told so when you attempt to compile the program. Feel
|
||||
free to skip this step if you aren't sure you need it. If you do
|
||||
need it then you will be told to install/upgrade <application>flex</application> when you try to
|
||||
compile <productname>Postgres</productname>.
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
You may want to do the entire <application>flex</application> installation from
|
||||
the root account, though that is not absolutely necessary.
|
||||
Assuming that you want the installation to place files in the usual default
|
||||
areas, type the following:
|
||||
<ProgramListing>
|
||||
$ su -
|
||||
$ cd /usr/local/src
|
||||
ftp prep.ai.mit.edu
|
||||
ftp> cd /pub/gnu/
|
||||
ftp> binary
|
||||
ftp> get flex-2.5.4.tar.gz
|
||||
ftp> quit
|
||||
$ gunzip -c flex-2.5.4.tar.gz | tar xvf -
|
||||
$ cd flex-2.5.4
|
||||
$ configure --prefix=/usr
|
||||
$ gmake
|
||||
$ gmake check
|
||||
# You must be root when typing the next line:
|
||||
$ gmake install
|
||||
$ cd /usr/local/src
|
||||
$ rm -rf flex-2.5.4
|
||||
</ProgramListing>
|
||||
</Para>
|
||||
|
||||
<Para>
|
||||
This will update files <filename>/usr/man/man1/flex.1</filename>,
|
||||
<filename>/usr/bin/flex</filename>,
|
||||
<filename>/usr/lib/libfl.a</filename>,
|
||||
<filename>/usr/include/FlexLexer.h</filename> and will add a link
|
||||
<filename>/usr/bin/flex++</filename> which points to flex.
|
||||
</Para>
|
||||
</Step>
|
||||
|
||||
<Step Performance="required">
|
||||
<Para>
|
||||
If you are not upgrading an existing system then skip to
|
||||
|
@ -7,7 +7,7 @@
|
||||
#
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/Attic/GNUmakefile.in,v 1.47 2000/01/09 07:53:52 tgl Exp $
|
||||
# $Header: /cvsroot/pgsql/src/Attic/GNUmakefile.in,v 1.48 2000/01/16 20:04:51 petere Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@ -24,7 +24,6 @@ ETAGS = @etags@
|
||||
XARGS = @xargs@
|
||||
|
||||
all:
|
||||
$(MAKE) lexverify
|
||||
$(MAKE) -C utils all
|
||||
$(MAKE) -C backend all
|
||||
$(MAKE) -C interfaces all
|
||||
@ -35,7 +34,6 @@ all:
|
||||
fi
|
||||
|
||||
install:
|
||||
$(MAKE) lexverify
|
||||
$(MAKE) -C utils install
|
||||
$(MAKE) -C backend install
|
||||
$(MAKE) -C interfaces install
|
||||
@ -43,19 +41,7 @@ install:
|
||||
$(MAKE) -C pl install
|
||||
cat ../register.txt
|
||||
|
||||
lexverify:
|
||||
$(MAKE) -C lextest all
|
||||
@if test ! -f lextest/lextest; then \
|
||||
echo "";\
|
||||
echo "You have a buggy version of flex. Read INSTALL and search for flex for a fix.";\
|
||||
echo "";\
|
||||
false;\
|
||||
else \
|
||||
true;\
|
||||
fi
|
||||
|
||||
clean:
|
||||
$(MAKE) -C lextest clean
|
||||
$(MAKE) -C utils clean
|
||||
$(MAKE) -C backend clean
|
||||
$(MAKE) -C interfaces clean
|
||||
@ -108,7 +94,6 @@ distclean: clean
|
||||
test/regress/GNUmakefile
|
||||
|
||||
.DEFAULT:
|
||||
$(MAKE) -C lextest $@
|
||||
$(MAKE) -C utils $@
|
||||
$(MAKE) -C backend $@
|
||||
$(MAKE) -C interfaces $@
|
||||
|
@ -4,7 +4,7 @@
|
||||
# Makefile for the bootstrap module
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/backend/bootstrap/Makefile,v 1.19 1999/12/16 16:52:46 momjian Exp $
|
||||
# $Header: /cvsroot/pgsql/src/backend/bootstrap/Makefile,v 1.20 2000/01/16 20:04:53 petere Exp $
|
||||
#
|
||||
#
|
||||
# We must build bootparse.c and bootscanner.c with yacc and lex and sed,
|
||||
@ -68,7 +68,7 @@ bootscanner.c: bootscanner.l
|
||||
rm -f lex.yy.c sedfile
|
||||
|
||||
clean:
|
||||
rm -f SUBSYS.o $(OBJS) bootparse.c bootstrap_tokens.h bootscanner.c
|
||||
rm -f SUBSYS.o $(OBJS)
|
||||
# And the garbage that might have been left behind by partial build:
|
||||
rm -f y.tab.h y.tab.c y.output lex.yy.c
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.34 2000/01/15 02:59:28 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.35 2000/01/16 20:04:54 petere Exp $
|
||||
*
|
||||
* NOTES
|
||||
* See acl.h.
|
||||
@ -444,8 +444,8 @@ pg_aclcheck(char *relname, char *usename, AclMode mode)
|
||||
}
|
||||
|
||||
int32
|
||||
pg_ownercheck(char *usename,
|
||||
char *value,
|
||||
pg_ownercheck(const char *usename,
|
||||
const char *value,
|
||||
int cacheid)
|
||||
{
|
||||
HeapTuple tuple;
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.27 2000/01/15 02:59:28 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.28 2000/01/16 20:04:54 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -26,7 +26,7 @@
|
||||
* Perhaps this should be in-line code in relopen().
|
||||
*/
|
||||
char *
|
||||
relpath(char *relname)
|
||||
relpath(const char *relname)
|
||||
{
|
||||
char *path;
|
||||
size_t bufsize = 0;
|
||||
@ -52,7 +52,7 @@ relpath(char *relname)
|
||||
* XXX this is way bogus. -- pma
|
||||
*/
|
||||
bool
|
||||
IsSystemRelationName(char *relname)
|
||||
IsSystemRelationName(const char *relname)
|
||||
{
|
||||
if (relname[0] && relname[1] && relname[2])
|
||||
return (relname[0] == 'p' &&
|
||||
@ -67,7 +67,7 @@ IsSystemRelationName(char *relname)
|
||||
* True iff name is the name of a shared system catalog relation.
|
||||
*/
|
||||
bool
|
||||
IsSharedSystemRelationName(char *relname)
|
||||
IsSharedSystemRelationName(const char *relname)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.62 1999/12/20 10:40:41 wieck Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.63 2000/01/16 20:04:55 petere Exp $
|
||||
*
|
||||
* NOTES
|
||||
* The PortalExecutorHeapMemory crap needs to be eliminated
|
||||
@ -23,13 +23,16 @@
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/heapam.h"
|
||||
#include "access/skey.h"
|
||||
#include "catalog/catalog.h"
|
||||
#include "catalog/catname.h"
|
||||
#include "catalog/indexing.h"
|
||||
#include "catalog/pg_attrdef.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "commands/command.h"
|
||||
#include "executor/execdefs.h"
|
||||
#include "executor/executor.h"
|
||||
#include "catalog/heap.h"
|
||||
#include "miscadmin.h"
|
||||
#include "optimizer/prep.h"
|
||||
#include "utils/acl.h"
|
||||
@ -37,6 +40,7 @@
|
||||
#include "utils/syscache.h"
|
||||
#include "utils/temprel.h"
|
||||
|
||||
|
||||
/* ----------------
|
||||
* PortalExecutorHeapMemory stuff
|
||||
*
|
||||
@ -246,7 +250,8 @@ PerformPortalClose(char *name, CommandDest dest)
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* PerformAddAttribute
|
||||
* AlterTableAddColumn
|
||||
* (formerly known as PerformAddAttribute)
|
||||
*
|
||||
* adds an additional attribute to a relation
|
||||
*
|
||||
@ -276,8 +281,7 @@ PerformPortalClose(char *name, CommandDest dest)
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
PerformAddAttribute(char *relationName,
|
||||
char *userName,
|
||||
AlterTableAddColumn(const char *relationName,
|
||||
bool inherits,
|
||||
ColumnDef *colDef)
|
||||
{
|
||||
@ -295,6 +299,7 @@ PerformAddAttribute(char *relationName,
|
||||
Relation idescs[Num_pg_attr_indices];
|
||||
Relation ridescs[Num_pg_class_indices];
|
||||
bool hasindex;
|
||||
List *rawDefaults = NIL;
|
||||
|
||||
/*
|
||||
* permissions checking. this would normally be done in utility.c,
|
||||
@ -303,19 +308,18 @@ PerformAddAttribute(char *relationName,
|
||||
* normally, only the owner of a class can change its schema.
|
||||
*/
|
||||
if (!allowSystemTableMods && IsSystemRelationName(relationName))
|
||||
elog(ERROR, "PerformAddAttribute: class \"%s\" is a system catalog",
|
||||
elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
|
||||
relationName);
|
||||
#ifndef NO_SECURITY
|
||||
if (!pg_ownercheck(userName, relationName, RELNAME))
|
||||
elog(ERROR, "PerformAddAttribute: you do not own class \"%s\"",
|
||||
relationName);
|
||||
if (!pg_ownercheck(UserName, relationName, RELNAME))
|
||||
elog(ERROR, "ALTER TABLE: permission denied");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Grab an exclusive lock on the target table, which we will NOT release
|
||||
* until end of transaction.
|
||||
*/
|
||||
rel = heap_openr(relationName, AccessExclusiveLock);
|
||||
rel = heap_openr((char *)relationName, AccessExclusiveLock);
|
||||
myrelid = RelationGetRelid(rel);
|
||||
heap_close(rel, NoLock); /* close rel but keep lock! */
|
||||
|
||||
@ -324,8 +328,10 @@ PerformAddAttribute(char *relationName,
|
||||
*/
|
||||
if (colDef->is_not_null)
|
||||
elog(ERROR, "Can't add a NOT NULL attribute to an existing relation");
|
||||
|
||||
if (colDef->raw_default || colDef->cooked_default)
|
||||
elog(ERROR, "ADD ATTRIBUTE: DEFAULT not yet implemented");
|
||||
elog(ERROR, "Adding columns with defaults is not implemented.");
|
||||
|
||||
|
||||
/*
|
||||
* if the first element in the 'schema' list is a "*" then we are
|
||||
@ -358,8 +364,8 @@ PerformAddAttribute(char *relationName,
|
||||
if (childrelid == myrelid)
|
||||
continue;
|
||||
rel = heap_open(childrelid, AccessExclusiveLock);
|
||||
PerformAddAttribute(RelationGetRelationName(rel),
|
||||
userName, false, colDef);
|
||||
AlterTableAddColumn(RelationGetRelationName(rel),
|
||||
false, colDef);
|
||||
heap_close(rel, AccessExclusiveLock);
|
||||
}
|
||||
}
|
||||
@ -372,7 +378,7 @@ PerformAddAttribute(char *relationName,
|
||||
0, 0, 0);
|
||||
|
||||
if (!HeapTupleIsValid(reltup))
|
||||
elog(ERROR, "PerformAddAttribute: relation \"%s\" not found",
|
||||
elog(ERROR, "ALTER TABLE: relation \"%s\" not found",
|
||||
relationName);
|
||||
|
||||
/*
|
||||
@ -380,14 +386,14 @@ PerformAddAttribute(char *relationName,
|
||||
*/
|
||||
if (((Form_pg_class) GETSTRUCT(reltup))->relkind == RELKIND_INDEX)
|
||||
{
|
||||
elog(ERROR, "PerformAddAttribute: index relation \"%s\" not changed",
|
||||
elog(ERROR, "ALTER TABLE: index relation \"%s\" not changed",
|
||||
relationName);
|
||||
}
|
||||
|
||||
minattnum = ((Form_pg_class) GETSTRUCT(reltup))->relnatts;
|
||||
maxatts = minattnum + 1;
|
||||
if (maxatts > MaxHeapAttributeNumber)
|
||||
elog(ERROR, "PerformAddAttribute: relations limited to %d attributes",
|
||||
elog(ERROR, "ALTER TABLE: relations limited to %d columns",
|
||||
MaxHeapAttributeNumber);
|
||||
|
||||
attrdesc = heap_openr(AttributeRelationName, RowExclusiveLock);
|
||||
@ -421,7 +427,7 @@ PerformAddAttribute(char *relationName,
|
||||
0, 0);
|
||||
|
||||
if (HeapTupleIsValid(tup))
|
||||
elog(ERROR, "PerformAddAttribute: attribute \"%s\" already exists in class \"%s\"",
|
||||
elog(ERROR, "ALTER TABLE: column name \"%s\" already exists in relation \"%s\"",
|
||||
colDef->colname, relationName);
|
||||
|
||||
/*
|
||||
@ -444,7 +450,7 @@ PerformAddAttribute(char *relationName,
|
||||
tform = (Form_pg_type) GETSTRUCT(typeTuple);
|
||||
|
||||
if (!HeapTupleIsValid(typeTuple))
|
||||
elog(ERROR, "Add: type \"%s\" nonexistent", typename);
|
||||
elog(ERROR, "ALTER TABLE: type \"%s\" does not exist", typename);
|
||||
namestrcpy(&(attribute->attname), colDef->colname);
|
||||
attribute->atttypid = typeTuple->t_data->t_oid;
|
||||
attribute->attlen = tform->typlen;
|
||||
@ -483,9 +489,223 @@ PerformAddAttribute(char *relationName,
|
||||
CatalogCloseIndices(Num_pg_class_indices, ridescs);
|
||||
|
||||
heap_freetuple(reltup);
|
||||
heap_close(rel, RowExclusiveLock);
|
||||
|
||||
heap_close(rel, NoLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void drop_default(Oid relid, int16 attnum);
|
||||
|
||||
|
||||
/*
|
||||
* ALTER TABLE ALTER COLUMN SET/DROP DEFAULT
|
||||
*/
|
||||
void
|
||||
AlterTableAlterColumn(const char *relationName,
|
||||
bool inh, const char *colName,
|
||||
Node *newDefault)
|
||||
{
|
||||
Relation rel;
|
||||
HeapTuple tuple;
|
||||
int16 attnum;
|
||||
Oid myrelid;
|
||||
|
||||
if (!allowSystemTableMods && IsSystemRelationName(relationName))
|
||||
elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
|
||||
relationName);
|
||||
#ifndef NO_SECURITY
|
||||
if (!pg_ownercheck(UserName, relationName, RELNAME))
|
||||
elog(ERROR, "ALTER TABLE: permission denied");
|
||||
#endif
|
||||
|
||||
/* XXX should heap_openr take const char * ? */
|
||||
rel = heap_openr((char *)relationName, AccessExclusiveLock);
|
||||
myrelid = RelationGetRelid(rel);
|
||||
heap_close(rel, NoLock);
|
||||
|
||||
/*
|
||||
* Propagate to children if desired
|
||||
*/
|
||||
if (inh)
|
||||
{
|
||||
List *child,
|
||||
*children;
|
||||
|
||||
/* this routine is actually in the planner */
|
||||
children = find_all_inheritors(myrelid);
|
||||
|
||||
/*
|
||||
* find_all_inheritors does the recursive search of the
|
||||
* inheritance hierarchy, so all we have to do is process all
|
||||
* of the relids in the list that it returns.
|
||||
*/
|
||||
foreach(child, children)
|
||||
{
|
||||
Oid childrelid = lfirsti(child);
|
||||
|
||||
if (childrelid == myrelid)
|
||||
continue;
|
||||
rel = heap_open(childrelid, AccessExclusiveLock);
|
||||
AlterTableAlterColumn(RelationGetRelationName(rel),
|
||||
false, colName, newDefault);
|
||||
heap_close(rel, AccessExclusiveLock);
|
||||
}
|
||||
}
|
||||
|
||||
/* -= now do the thing on this relation =- */
|
||||
|
||||
/* reopen the business */
|
||||
rel = heap_openr((char *)relationName, AccessExclusiveLock);
|
||||
|
||||
/*
|
||||
* get the number of the attribute
|
||||
*/
|
||||
tuple = SearchSysCacheTuple(ATTNAME,
|
||||
ObjectIdGetDatum(myrelid),
|
||||
NameGetDatum(namein((char *)colName)),
|
||||
0, 0);
|
||||
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
{
|
||||
heap_close(rel, AccessExclusiveLock);
|
||||
elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"",
|
||||
relationName, colName);
|
||||
}
|
||||
|
||||
attnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum;
|
||||
|
||||
if (newDefault) /* SET DEFAULT */
|
||||
{
|
||||
List* rawDefaults = NIL;
|
||||
RawColumnDefault *rawEnt;
|
||||
|
||||
/* Get rid of the old one first */
|
||||
drop_default(myrelid, attnum);
|
||||
|
||||
rawEnt = (RawColumnDefault *) palloc(sizeof(RawColumnDefault));
|
||||
rawEnt->attnum = attnum;
|
||||
rawEnt->raw_default = newDefault;
|
||||
rawDefaults = lappend(rawDefaults, rawEnt);
|
||||
|
||||
/*
|
||||
* This function is intended for CREATE TABLE,
|
||||
* so it processes a _list_ of defaults, but we just do one.
|
||||
*/
|
||||
AddRelationRawConstraints(rel, rawDefaults, NIL);
|
||||
}
|
||||
|
||||
else /* DROP DEFAULT */
|
||||
{
|
||||
Relation attr_rel;
|
||||
ScanKeyData scankeys[3];
|
||||
HeapScanDesc scan;
|
||||
HeapTuple tuple;
|
||||
|
||||
attr_rel = heap_openr(AttributeRelationName, AccessExclusiveLock);
|
||||
ScanKeyEntryInitialize(&scankeys[0], 0x0, Anum_pg_attribute_attrelid, F_OIDEQ,
|
||||
ObjectIdGetDatum(myrelid));
|
||||
ScanKeyEntryInitialize(&scankeys[1], 0x0, Anum_pg_attribute_attnum, F_INT2EQ,
|
||||
Int16GetDatum(attnum));
|
||||
ScanKeyEntryInitialize(&scankeys[2], 0x0, Anum_pg_attribute_atthasdef, F_BOOLEQ,
|
||||
TRUE);
|
||||
|
||||
scan = heap_beginscan(attr_rel, false, SnapshotNow, 3, scankeys);
|
||||
AssertState(scan!=NULL);
|
||||
|
||||
if (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||
{
|
||||
HeapTuple newtuple;
|
||||
Relation irelations[Num_pg_attr_indices];
|
||||
|
||||
/* update to false */
|
||||
newtuple = heap_copytuple(tuple);
|
||||
((Form_pg_attribute) GETSTRUCT(newtuple))->atthasdef = FALSE;
|
||||
heap_update(attr_rel, &tuple->t_self, newtuple, NULL);
|
||||
|
||||
/* keep the system catalog indices current */
|
||||
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
|
||||
CatalogIndexInsert(irelations, Num_pg_attr_indices, attr_rel, newtuple);
|
||||
CatalogCloseIndices(Num_pg_class_indices, irelations);
|
||||
|
||||
/* get rid of actual default definition */
|
||||
drop_default(myrelid, attnum);
|
||||
}
|
||||
else
|
||||
elog(NOTICE, "ALTER TABLE: there was no default on column \"%s\" of relation \"%s\"",
|
||||
colName, relationName);
|
||||
heap_endscan(scan);
|
||||
heap_close(attr_rel, NoLock);
|
||||
}
|
||||
|
||||
heap_close(rel, NoLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
drop_default(Oid relid, int16 attnum)
|
||||
{
|
||||
ScanKeyData scankeys[2];
|
||||
HeapScanDesc scan;
|
||||
Relation attrdef_rel;
|
||||
HeapTuple tuple;
|
||||
|
||||
attrdef_rel = heap_openr(AttrDefaultRelationName, AccessExclusiveLock);
|
||||
ScanKeyEntryInitialize(&scankeys[0], 0x0, Anum_pg_attrdef_adrelid, F_OIDEQ,
|
||||
ObjectIdGetDatum(relid));
|
||||
ScanKeyEntryInitialize(&scankeys[1], 0x0, Anum_pg_attrdef_adnum, F_INT2EQ,
|
||||
Int16GetDatum(attnum));
|
||||
|
||||
scan = heap_beginscan(attrdef_rel, false, SnapshotNow, 2, scankeys);
|
||||
AssertState(scan!=NULL);
|
||||
|
||||
if (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||
heap_delete(attrdef_rel, &tuple->t_self, NULL);
|
||||
|
||||
heap_endscan(scan);
|
||||
|
||||
heap_close(attrdef_rel, NoLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ALTER TABLE DROP COLUMN
|
||||
*/
|
||||
void
|
||||
AlterTableDropColumn(const char *relationName,
|
||||
bool inh, const char *colName,
|
||||
int behavior)
|
||||
{
|
||||
elog(NOTICE, "ALTER TABLE / DROP COLUMN is not implemented");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
AlterTableAddConstraint(const char *relationName,
|
||||
bool inh, Node *newConstraint)
|
||||
{
|
||||
elog(NOTICE, "ALTER TABLE / ADD CONSTRAINT is not implemented");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AlterTableDropConstraint(const char *relationName,
|
||||
bool inh, const char *constrName,
|
||||
int behavior)
|
||||
{
|
||||
elog(NOTICE, "ALTER TABLE / DROP CONSTRAINT is not implemented");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* LOCK TABLE
|
||||
*
|
||||
*/
|
||||
void
|
||||
LockTableCommand(LockStmt *lockstmt)
|
||||
{
|
||||
|
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.126 2000/01/15 02:59:32 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.127 2000/01/16 20:04:55 petere Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -114,7 +114,7 @@ static Node *doNegate(Node *n);
|
||||
}
|
||||
|
||||
%type <node> stmt,
|
||||
AddAttrStmt, ClosePortalStmt,
|
||||
AlterTableStmt, ClosePortalStmt,
|
||||
CopyStmt, CreateStmt, CreateAsStmt, CreateSeqStmt, DefineStmt, DropStmt,
|
||||
TruncateStmt, CommentStmt,
|
||||
ExtendStmt, FetchStmt, GrantStmt, CreateTrigStmt, DropTrigStmt,
|
||||
@ -130,6 +130,9 @@ static Node *doNegate(Node *n);
|
||||
RuleActionStmtOrEmpty, ConstraintsSetStmt,
|
||||
CreateGroupStmt, AlterGroupStmt, DropGroupStmt
|
||||
|
||||
%type <node> alter_column_action
|
||||
%type <ival> drop_behavior
|
||||
|
||||
%type <str> createdb_opt_location
|
||||
%type <ival> createdb_opt_encoding
|
||||
|
||||
@ -210,7 +213,7 @@ static Node *doNegate(Node *n);
|
||||
%type <astmt> insert_rest
|
||||
|
||||
%type <node> OptTableElement, ConstraintElem
|
||||
%type <node> columnDef, alter_clause
|
||||
%type <node> columnDef
|
||||
%type <defelt> def_elem
|
||||
%type <node> def_arg, columnElem, where_clause,
|
||||
a_expr, a_expr_or_null, b_expr, com_expr, AexprConst,
|
||||
@ -391,7 +394,7 @@ stmtmulti: stmtmulti ';' stmt
|
||||
}
|
||||
;
|
||||
|
||||
stmt : AddAttrStmt
|
||||
stmt : AlterTableStmt
|
||||
| AlterGroupStmt
|
||||
| AlterUserStmt
|
||||
| ClosePortalStmt
|
||||
@ -797,40 +800,74 @@ constraints_set_mode: DEFERRED
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERY :
|
||||
* addattr ( attr1 = type1 .. attrn = typen ) to <relname> [*]
|
||||
* ALTER TABLE variations
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause
|
||||
{
|
||||
AddAttrStmt *n = makeNode(AddAttrStmt);
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->colDef = $5;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
AlterTableStmt:
|
||||
/* ALTER TABLE <name> ADD [COLUMN] <coldef> */
|
||||
ALTER TABLE relation_name opt_inh_star ADD opt_column columnDef
|
||||
{
|
||||
AlterTableStmt *n = makeNode(AlterTableStmt);
|
||||
n->subtype = 'A';
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->def = $7;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
/* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
|
||||
| ALTER TABLE relation_name opt_inh_star ALTER opt_column ColId alter_column_action
|
||||
{
|
||||
AlterTableStmt *n = makeNode(AlterTableStmt);
|
||||
n->subtype = 'T';
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->name = $7;
|
||||
n->def = $8;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
/* ALTER TABLE <name> DROP [COLUMN] <name> {RESTRICT|CASCADE} */
|
||||
| ALTER TABLE relation_name opt_inh_star DROP opt_column ColId drop_behavior
|
||||
{
|
||||
AlterTableStmt *n = makeNode(AlterTableStmt);
|
||||
n->subtype = 'D';
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->name = $7;
|
||||
n->behavior = $8;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
/* ALTER TABLE <name> ADD CONSTRAINT ... */
|
||||
| ALTER TABLE relation_name opt_inh_star ADD TableConstraint
|
||||
{
|
||||
AlterTableStmt *n = makeNode(AlterTableStmt);
|
||||
n->subtype = 'A';
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->def = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
/* ALTER TABLE <name> DROP CONSTRAINT <name> {RESTRICT|CASCADE} */
|
||||
| ALTER TABLE relation_name opt_inh_star DROP CONSTRAINT name drop_behavior
|
||||
{
|
||||
AlterTableStmt *n = makeNode(AlterTableStmt);
|
||||
n->relname = $3;
|
||||
n->inh = $4;
|
||||
n->name = $7;
|
||||
n->behavior = $8;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
alter_column_action:
|
||||
SET DEFAULT a_expr_or_null { $$ = $3; }
|
||||
| DROP DEFAULT { $$ = NULL; }
|
||||
;
|
||||
|
||||
drop_behavior: CASCADE { $$ = CASCADE; }
|
||||
| RESTRICT { $$ = RESTRICT; }
|
||||
;
|
||||
|
||||
alter_clause: ADD opt_column columnDef
|
||||
{
|
||||
$$ = $3;
|
||||
}
|
||||
| ADD '(' OptTableElementList ')'
|
||||
{
|
||||
if (length($3) != 1)
|
||||
elog(ERROR,"ALTER TABLE/ADD() allows one column only");
|
||||
$$ = (Node *) lfirst($3);
|
||||
}
|
||||
| DROP opt_column ColId
|
||||
{ elog(ERROR,"ALTER TABLE/DROP COLUMN not yet implemented"); }
|
||||
| ALTER opt_column ColId SET DEFAULT a_expr
|
||||
{ elog(ERROR,"ALTER TABLE/ALTER COLUMN/SET DEFAULT not yet implemented"); }
|
||||
| ALTER opt_column ColId DROP DEFAULT
|
||||
{ elog(ERROR,"ALTER TABLE/ALTER COLUMN/DROP DEFAULT not yet implemented"); }
|
||||
| ADD ConstraintElem
|
||||
{ elog(ERROR,"ALTER TABLE/ADD CONSTRAINT not yet implemented"); }
|
||||
;
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.79 2000/01/15 18:30:30 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.80 2000/01/16 20:04:56 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -270,24 +270,6 @@ ProcessUtility(Node *parsetree,
|
||||
}
|
||||
break;
|
||||
|
||||
case T_AddAttrStmt:
|
||||
{
|
||||
AddAttrStmt *stmt = (AddAttrStmt *) parsetree;
|
||||
|
||||
PS_SET_STATUS(commandTag = "ADD");
|
||||
CHECK_IF_ABORTED();
|
||||
|
||||
/*
|
||||
* owner checking done in PerformAddAttribute (now
|
||||
* recursive)
|
||||
*/
|
||||
PerformAddAttribute(stmt->relname,
|
||||
userName,
|
||||
stmt->inh,
|
||||
(ColumnDef *) stmt->colDef);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
* schema
|
||||
*/
|
||||
@ -346,6 +328,44 @@ ProcessUtility(Node *parsetree,
|
||||
}
|
||||
break;
|
||||
|
||||
/* various Alter Table forms */
|
||||
|
||||
case T_AlterTableStmt:
|
||||
{
|
||||
AlterTableStmt *stmt = (AlterTableStmt *) parsetree;
|
||||
|
||||
PS_SET_STATUS(commandTag = "ALTER TABLE");
|
||||
CHECK_IF_ABORTED();
|
||||
|
||||
/*
|
||||
* Some or all of these functions are recursive to cover inherited things,
|
||||
* so permission checks are done there.
|
||||
*/
|
||||
switch(stmt->subtype)
|
||||
{
|
||||
case 'A': /* ADD COLUMN */
|
||||
AlterTableAddColumn(stmt->relname, stmt->inh, (ColumnDef *) stmt->def);
|
||||
break;
|
||||
case 'T': /* ALTER COLUMN */
|
||||
AlterTableAlterColumn(stmt->relname, stmt->inh, stmt->name, stmt->def);
|
||||
break;
|
||||
case 'D': /* ALTER DROP */
|
||||
AlterTableDropColumn(stmt->relname, stmt->inh, stmt->name, stmt->behavior);
|
||||
break;
|
||||
case 'C': /* ADD CONSTRAINT */
|
||||
AlterTableAddConstraint(stmt->relname, stmt->inh, stmt->def);
|
||||
break;
|
||||
case 'X': /* DROP CONSTRAINT */
|
||||
AlterTableDropConstraint(stmt->relname, stmt->inh, stmt->name, stmt->behavior);
|
||||
break;
|
||||
default: /* oops */
|
||||
elog(ERROR, "T_AlterTableStmt: unknown subtype");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case T_ChangeACLStmt:
|
||||
{
|
||||
ChangeACLStmt *stmt = (ChangeACLStmt *) parsetree;
|
||||
|
@ -268,8 +268,9 @@ MainLoop(FILE *source, int encoding)
|
||||
|
||||
/* colon -> substitute variable */
|
||||
/* we need to be on the watch for the '::' operator */
|
||||
else if (line[i] == ':' && !was_bslash &&
|
||||
strspn(line+i+thislen, VALID_VARIABLE_CHARS)>0
|
||||
else if (line[i] == ':' && !was_bslash
|
||||
&& strspn(line+i+thislen, VALID_VARIABLE_CHARS)>0
|
||||
&& !(prevlen>0 && line[i-prevlen] == ':')
|
||||
)
|
||||
{
|
||||
size_t in_length,
|
||||
|
740
src/configure
vendored
740
src/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -545,6 +545,20 @@ AC_SUBST(DASH_N)
|
||||
AC_SUBST(BACKSLASH_C)
|
||||
|
||||
AC_PROG_LEX
|
||||
if test "$LEX" = "flex"; then
|
||||
$LEX --version 2> /dev/null | grep -s '2\.5\.3' >& /dev/null
|
||||
if test $? -eq 0 ; then
|
||||
AC_MSG_WARN([
|
||||
***
|
||||
You have flex version 2.5.3, which is broken. Get version 2.5.4 or
|
||||
a different lex.
|
||||
(If you are using the official distribution of PostgreSQL then you
|
||||
do not need to worry about this because the lexer files are
|
||||
pre-generated. However, other software using flex is likely to be
|
||||
broken as well.)
|
||||
***])
|
||||
fi
|
||||
fi
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_RANLIB
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: catalog.h,v 1.8 1999/07/15 23:03:41 momjian Exp $
|
||||
* $Id: catalog.h,v 1.9 2000/01/16 20:04:57 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -15,9 +15,9 @@
|
||||
|
||||
#include "access/tupdesc.h"
|
||||
|
||||
extern char *relpath(char *relname);
|
||||
extern bool IsSystemRelationName(char *relname);
|
||||
extern bool IsSharedSystemRelationName(char *relname);
|
||||
extern char *relpath(const char *relname);
|
||||
extern bool IsSystemRelationName(const char *relname);
|
||||
extern bool IsSharedSystemRelationName(const char *relname);
|
||||
extern Oid newoid(void);
|
||||
extern void fillatt(TupleDesc att);
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: command.h,v 1.15 1999/07/15 23:03:44 momjian Exp $
|
||||
* $Id: command.h,v 1.16 2000/01/16 20:04:58 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -38,12 +38,29 @@ extern void PerformPortalClose(char *name, CommandDest dest);
|
||||
extern void PortalCleanup(Portal portal);
|
||||
|
||||
/*
|
||||
* PerformAddAttribute
|
||||
* Performs the POSTQUEL function ADD.
|
||||
* ALTER TABLE variants
|
||||
*/
|
||||
extern void PerformAddAttribute(char *relationName, char *userName,
|
||||
bool inh, ColumnDef *colDef);
|
||||
extern void AlterTableAddColumn(const char *relationName,
|
||||
bool inh, ColumnDef *colDef);
|
||||
|
||||
extern void AlterTableAlterColumn(const char *relationName,
|
||||
bool inh, const char *colName,
|
||||
Node *newDefault);
|
||||
|
||||
extern void AlterTableDropColumn(const char *relationName,
|
||||
bool inh, const char *colName,
|
||||
int behavior);
|
||||
|
||||
extern void AlterTableAddConstraint(const char *relationName,
|
||||
bool inh, Node *newConstraint);
|
||||
|
||||
extern void AlterTableDropConstraint(const char *relationName,
|
||||
bool inh, const char *constrName,
|
||||
int behavior);
|
||||
|
||||
/*
|
||||
* LOCK
|
||||
*/
|
||||
extern void LockTableCommand(LockStmt *lockstmt);
|
||||
|
||||
#endif /* COMMAND_H */
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: nodes.h,v 1.60 2000/01/09 00:26:42 tgl Exp $
|
||||
* $Id: nodes.h,v 1.61 2000/01/16 20:04:58 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -145,7 +145,7 @@ typedef enum NodeTag
|
||||
T_DeleteStmt,
|
||||
T_UpdateStmt,
|
||||
T_SelectStmt,
|
||||
T_AddAttrStmt,
|
||||
T_AlterTableStmt,
|
||||
T_AggregateStmt,
|
||||
T_ChangeACLStmt,
|
||||
T_ClosePortalStmt,
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: parsenodes.h,v 1.93 2000/01/14 22:11:38 petere Exp $
|
||||
* $Id: parsenodes.h,v 1.94 2000/01/16 20:04:58 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -84,16 +84,20 @@ typedef struct Query
|
||||
*****************************************************************************/
|
||||
|
||||
/* ----------------------
|
||||
* Add Column Statement
|
||||
* Alter Table
|
||||
* ----------------------
|
||||
*/
|
||||
typedef struct AddAttrStmt
|
||||
/* The fields are used in different ways by the different variants of this command */
|
||||
typedef struct AlterTableStmt
|
||||
{
|
||||
NodeTag type;
|
||||
char *relname; /* the relation to add attr */
|
||||
bool inh; /* add recursively to children? */
|
||||
Node *colDef; /* the attribute definition */
|
||||
} AddAttrStmt;
|
||||
char subtype; /* A = add, T = alter, D = drop, C = add constr, X = drop constr */
|
||||
char *relname; /* table to work on */
|
||||
bool inh; /* recursively on children? */
|
||||
char *name; /* column or constraint name to act on */
|
||||
Node *def; /* definition of new column or constraint */
|
||||
int behavior; /* CASCADE or RESTRICT drop behavior */
|
||||
} AlterTableStmt;
|
||||
|
||||
/* ----------------------
|
||||
* Change ACL Statement
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: acl.h,v 1.22 1999/07/15 23:04:19 momjian Exp $
|
||||
* $Id: acl.h,v 1.23 2000/01/16 20:04:59 petere Exp $
|
||||
*
|
||||
* NOTES
|
||||
* For backward-compatability purposes we have to allow there
|
||||
@ -168,7 +168,7 @@ extern AclId get_grosysid(char *groname);
|
||||
extern char *get_groname(AclId grosysid);
|
||||
|
||||
extern int32 pg_aclcheck(char *relname, char *usename, AclMode mode);
|
||||
extern int32 pg_ownercheck(char *usename, char *value, int cacheid);
|
||||
extern int32 pg_ownercheck(const char *usename, const char *value, int cacheid);
|
||||
extern int32 pg_func_ownercheck(char *usename, char *funcname,
|
||||
int nargs, Oid *arglist);
|
||||
extern int32 pg_aggr_ownercheck(char *usename, char *aggname,
|
||||
|
@ -4,7 +4,7 @@
|
||||
# Makefile for the plpgsql shared object
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/Makefile.in,v 1.18 1999/10/13 11:38:40 momjian Exp $
|
||||
# $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/Makefile.in,v 1.19 2000/01/16 20:04:59 petere Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@ -79,6 +79,6 @@ pl_scan.c: scan.l
|
||||
|
||||
clean: clean-shlib
|
||||
rm -f lib$(NAME).a
|
||||
rm -f *.o pl.tab.h pl_gram.c pl_scan.c
|
||||
rm -f *.o
|
||||
# And the garbage that might have been left behind by partial build:
|
||||
rm -f y.tab.c y.tab.h lex.yy.c
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Header: /cvsroot/pgsql/src/test/regress/Attic/run_check.sh,v 1.6 2000/01/09 20:54:36 tgl Exp $
|
||||
# $Header: /cvsroot/pgsql/src/test/regress/Attic/run_check.sh,v 1.7 2000/01/16 20:05:00 petere Exp $
|
||||
|
||||
# ----------
|
||||
# Check call syntax
|
||||
@ -37,6 +37,16 @@ export LOGDIR
|
||||
export TIMDIR
|
||||
export PGPORT
|
||||
|
||||
# Needed by psql and pg_encoding (if you run multibyte).
|
||||
# I hope this covers all platforms with shared libraries,
|
||||
# otherwise feel free to cover your platform here as well.
|
||||
if [ "$LD_LIBRARY_PATH" ]; then
|
||||
old_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
|
||||
LD_LIBRARY_PATH="$LIBDIR:$LD_LIBARY_PATH"
|
||||
else
|
||||
LD_LIBRARY_PATH="$LIBDIR"
|
||||
fi
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
# ----------
|
||||
# Get the commandline parameters
|
||||
@ -111,6 +121,7 @@ trap ' echo ""
|
||||
echo ""
|
||||
fi
|
||||
echo ""
|
||||
LD_LIBRARY_PATH="$old_LD_LIBRARY_PATH"
|
||||
exit 1
|
||||
' 2 15
|
||||
|
||||
@ -434,5 +445,6 @@ done | tee run_check.out 2>&1
|
||||
echo "=============== Terminating regression postmaster ================"
|
||||
kill -15 $PMPID
|
||||
|
||||
LD_LIBRARY_PATH="$old_LD_LIBRARY_PATH"
|
||||
|
||||
exit 0
|
||||
|
@ -31,34 +31,39 @@ cd src
|
||||
|
||||
./configure
|
||||
|
||||
# Generate parser's gram and lex files.
|
||||
# Generate parser's yacc and lex files
|
||||
|
||||
cd backend/parser
|
||||
|
||||
rm -f gram.c parse.h scan.c
|
||||
|
||||
$MAKE gram.c parse.h scan.c
|
||||
|
||||
cd ../..
|
||||
|
||||
# Generate ecpg preprocessor's gram and lex files.
|
||||
# Generate bootstrap parser's yacc and lex files
|
||||
|
||||
cd backend/bootstrap
|
||||
rm -f bootstrap_tokens.h bootparse.c bootscanner.c
|
||||
$MAKE bootstrap_tokens.h bootparse.c bootscanner.c
|
||||
cd ../..
|
||||
|
||||
# Generate ecpg preprocessor's yacc and lex files
|
||||
|
||||
cd interfaces/ecpg/preproc
|
||||
|
||||
rm -f preproc.c preproc.h pgc.c
|
||||
|
||||
$MAKE preproc.c preproc.h pgc.c
|
||||
|
||||
cd ../../..
|
||||
|
||||
# Generate plpgsql's yacc and lex files
|
||||
|
||||
cd pl/plpgsql
|
||||
rm -rf pl_scan.c pl.tab.h pl_gram.c
|
||||
$MAKE pl_scan.c pl.tab.h pl_gram.c
|
||||
cd ../..
|
||||
|
||||
# Generate psql's help on SQL command from the SGML docs
|
||||
|
||||
cd bin/psql
|
||||
|
||||
rm -f sql_help.h
|
||||
|
||||
$MAKE sql_help.h
|
||||
|
||||
cd ../..
|
||||
|
||||
# Clean up
|
||||
|
Loading…
Reference in New Issue
Block a user