Commit 2b84cbb6 authored by Peter Eisentraut's avatar Peter Eisentraut

A few minor psql enhancements

Initdb help correction
Changed end/abort to commit/rollback and changed related notices
Commented out way old printing functions in libpq
Fixed a typo in alter table / alter column
parent 7e7416bd
......@@ -274,8 +274,8 @@ PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
</para>
<para>
To begin, call conn=PQconnectStart("&lt;connection_info_string&gt;"). If
conn is NULL, then libpq has been unable to allocate a new PGconn
To begin, call <literal>conn=PQconnectStart("&lt;connection_info_string&gt;")</literal>.
If conn is NULL, then libpq has been unable to allocate a new PGconn
structure. Otherwise, a valid PGconn pointer is returned (though not yet
representing a valid connection to the database). On return from
PQconnectStart, call status=PQstatus(conn). If status equals
......@@ -1019,6 +1019,9 @@ const char * PQcmdTuples(const PGresult *res);
<synopsis>
Oid PQoidValue(const PGresult *res);
</synopsis>
The type <type>Oid</type> and the constant <literal>Invalid</literal>
will be defined if you include the <application>libpq</application>
header file. They will both be some integer type.
</para>
</listitem>
......@@ -1031,7 +1034,8 @@ Oid PQoidValue(const PGresult *res);
<synopsis>
const char * PQoidStatus(const PGresult *res);
</synopsis>
The function is deprecated in favor of <function>PQoidValue</function>.
The function is deprecated in favor of <function>PQoidValue</function>
and is not thread-safe.
</para>
</listitem>
......@@ -1045,57 +1049,25 @@ void PQprint(FILE* fout, /* output stream */
const PGresult *res,
const PQprintOpt *po);
struct _PQprintOpt {
pqbool header; /* print output field headings and row count */
pqbool align; /* fill align the fields */
pqbool standard; /* old brain dead format */
pqbool html3; /* output html tables */
pqbool expanded; /* expand tables */
pqbool pager; /* use pager for output if needed */
struct {
int header; /* print output field headings and row count */
int align; /* fill align the fields */
int standard; /* old brain dead format */
int html3; /* output html tables */
int expanded; /* expand tables */
int pager; /* use pager for output if needed */
char *fieldSep; /* field separator */
char *tableOpt; /* insert to HTML &lt;table ...&gt; */
char *caption; /* HTML &lt;caption&gt; */
char **fieldName; /* null terminated array of replacement field names */
}
} PQprintOpt;
</synopsis>
This function is intended to replace PQprintTuples(), which is
now obsolete. The <filename>psql</filename> program uses
<function>PQprint()</function> to display query results.
This function was formerly used by <application>psql</application>
to print query results, but this is no longer the case and this
function is no longer supported.
</para>
</listitem>
<listitem>
<para>
<function>PQprintTuples</function>
Prints out all the tuples and, optionally, the
attribute names to the specified output stream.
<synopsis>
void PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
int printAttName,/* print attribute names or not*/
int terseOutput, /* delimiter bars or not?*/
int width); /* width of column, variable width if 0*/
</synopsis>
</para>
</listitem>
<listitem>
<para>
<function>PQdisplayTuples</function>
Prints out all the tuples and, optionally, the
attribute names to the specified output stream.
<synopsis>
void PQdisplayTuples(const PGresult* res,
FILE *fout, /* output stream */
int fillAlign, /* space fill to align columns */
const char *fieldSep, /* field separator */
int printHeader, /* display headers? */
int quiet); /* suppress print of row count at end */
</synopsis>
<function>PQdisplayTuples()</function> was intended to supersede
<function>PQprintTuples()</function>, and
is in turn superseded by <function>PQprint()</function>.
</para>
</listitem>
<listitem>
<para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/abort.sgml,v 1.4 1999/07/22 15:09:05 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/abort.sgml,v 1.5 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -52,7 +52,7 @@ ABORT [ WORK | TRANSACTION ]
<variablelist>
<varlistentry>
<term><computeroutput>
ABORT
ROLLBACK
</computeroutput></term>
<listitem>
<para>
......@@ -62,8 +62,8 @@ ABORT
</varlistentry>
<varlistentry>
<term><computeroutput>
NOTICE: UserAbortTransactionBlock and not in in-progress state
ABORT
NOTICE: ROLLBACK: no transaction in progress
ROLLBACK
</computeroutput></term>
<listitem>
<para>
......@@ -130,7 +130,7 @@ ABORT WORK;
SQL92
</title>
<para>
This command is a <productname>Postgres</productname> extension present
This command is a <productname>PostgreSQL</productname> extension present
for historical reasons. <command>ROLLBACK</command> is the <acronym>SQL92</acronym>
equivalent command.
</para>
......
This diff is collapsed.
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.9 1999/07/22 15:09:06 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/begin.sgml,v 1.10 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -72,7 +72,7 @@ BEGIN
</varlistentry>
<varlistentry>
<term><computeroutput>
NOTICE: BeginTransactionBlock and not in default state
NOTICE: BEGIN: already a transaction in progress
</computeroutput></term>
<listitem>
<para>
......@@ -95,7 +95,7 @@ NOTICE: BeginTransactionBlock and not in default state
</title>
<para>
By default, <productname>Postgres</productname> executes transactions
By default, <productname>PostgreSQL</productname> executes transactions
in <firstterm>unchained mode</firstterm>
(also known as <quote>autocommit</quote> in other database
systems).
......@@ -116,7 +116,7 @@ NOTICE: BeginTransactionBlock and not in default state
<para>
The default transaction isolation level in
<productname>Postgres</productname>
<productname>PostgreSQL</productname>
is READ COMMITTED, where queries inside the transaction see only changes
committed before query execution. So, you have to use
<command>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE</command>
......@@ -128,7 +128,7 @@ NOTICE: BeginTransactionBlock and not in default state
</para>
<para>
If the transaction is committed, <productname>Postgres</productname>
If the transaction is committed, <productname>PostgreSQL</productname>
will ensure either that all updates are done or else that none of
them are done. Transactions have the standard <acronym>ACID</acronym>
(atomic, consistent, isolatable, and durable) property.
......@@ -141,11 +141,6 @@ NOTICE: BeginTransactionBlock and not in default state
<title>
Notes
</title>
<para>
The keyword TRANSACTION is just a cosmetic alternative to WORK.
Neither keyword need be specified.
</para>
<para>
Refer to <xref linkend="sql-lock-title" endterm="sql-lock-title">
for further information
......@@ -190,7 +185,7 @@ BEGIN WORK;
<para>
<command>BEGIN</command>
is a <productname>Postgres</productname> language extension.
is a <productname>PostgreSQL</productname> language extension.
There is no explicit <command>BEGIN</command>
command in <acronym>SQL92</acronym>;
transaction initiation is always implicit and it terminates either
......@@ -204,6 +199,12 @@ BEGIN WORK;
</note>
</para>
<para>
Incidentally, the <literal>BEGIN</literal> keyword is used for a different
purpose in embedded SQL. You are advised to be careful about the transaction
semantics when porting database applications.
</para>
<para>
<acronym>SQL92</acronym> also requires SERIALIZABLE to be the default
transaction isolation level.
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/commit.sgml,v 1.8 1999/07/22 15:09:06 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/commit.sgml,v 1.9 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -62,7 +62,7 @@ COMMIT [ WORK | TRANSACTION ]
<variablelist>
<varlistentry>
<term><computeroutput>
END
COMMIT
</computeroutput></term>
<listitem>
<para>
......@@ -72,7 +72,7 @@ END
</varlistentry>
<varlistentry>
<term><computeroutput>
NOTICE EndTransactionBlock and not inprogress/abort state
NOTICE: COMMIT: no transaction in progress
</computeroutput></term>
<listitem>
<para>
......@@ -141,7 +141,8 @@ COMMIT WORK;
SQL92
</title>
<para>
Full compatibility.
<acronym>SQL92</acronym> only specifies the two forms <literal>COMMIT</literal>
and <literal>COMMIT WORK</literal>. Otherwise full compatibility.
</para>
</refsect2>
</refsect1>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/end.sgml,v 1.1 1999/07/22 15:09:11 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/end.sgml,v 1.2 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -62,7 +62,7 @@ END [ WORK | TRANSACTION ]
<variablelist>
<varlistentry>
<term><computeroutput>
END
COMMIT
</computeroutput></term>
<listitem>
<para>
......@@ -72,7 +72,7 @@ END
</varlistentry>
<varlistentry>
<term><computeroutput>
NOTICE EndTransactionBlock and not inprogress/abort state
NOTICE: COMMIT: no transaction in progress
</computeroutput></term>
<listitem>
<para>
......@@ -94,7 +94,7 @@ NOTICE EndTransactionBlock and not inprogress/abort state
</title>
<para>
<command>END</command> is a <productname>Postgres</productname>
<command>END</command> is a <productname>PostgreSQL</productname>
synonym for
<xref linkend="sql-commit-title" endterm="sql-commit-title">.
</para>
......@@ -144,7 +144,7 @@ END WORK;
</title>
<para>
<command>END</command> is a <productname>Postgres</productname>
<command>END</command> is a <productname>PostgreSQL</productname>
extension which provides functionality equivalent to
<xref linkend="sql-commit-title" endterm="sql-commit-title">.
</para>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.21 2000/01/18 23:30:19 petere Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.22 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -1944,7 +1944,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<varlistentry>
<term><literal>%#</literal></term>
<listitem><para>If the username is <literal>postgres</literal>, a
<listitem><para>If the current user is a database superuser, then a
<quote>#</quote>, otherwise a <quote>&gt;</quote>.</para></listitem>
</varlistentry>
......@@ -2020,10 +2020,9 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<para>
Before starting up in interactive mode, <application>psql</application> attempts
to read and execute the files <filename>/etc/psqlrc</filename> and
<filename>$HOME/.psqlrc</filename>. They could be used to set up the client or
the server to taste (using the <command>\set</command> and <command>SET</command>
commands).
to read and execute commands from the file <filename>$HOME/.psqlrc</filename>. It
could be used to set up the client or the server to taste (using the <command>\set
</command> and <command>SET</command> commands).
</para>
</refsect2>
......@@ -2034,7 +2033,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<para>
<application>psql</application> supports the readline and history libraries for
convenienent line editing and retrieval. The command history is stored in a file
named <filename>.psqlrc</filename> in your home directory and is reloaded when
named <filename>.psql_history</filename> in your home directory and is reloaded when
<application>psql</application> starts up.
Tab-completion is also supported, although
the completion logic makes no claim to be an <acronym>SQL</acronym> parser.
......@@ -2088,7 +2087,7 @@ $ ./configure --with-includes=/opt/gnu/include --with-libraries=/opt/gnu/lib ..
Notice the changing prompt.
<programlisting>
testdb=> <userinput>CREATE TABLE my_table (</userinput>
testdb-> <userinput> first int4 not null default 0,</userinput>
testdb-> <userinput> first integer not null default 0,</userinput>
testdb-> <userinput> second text</userinput>
testdb-> <userinput>);</userinput>
CREATE
......@@ -2096,11 +2095,11 @@ CREATE
Now look at the table definition again:
<programlisting>
testdb=> <userinput>\d my_table</userinput>
Table "my_table"
Attribute | Type | Info
-----------+------+--------------------
first | int4 | not null default 0
second | text |
Table "my_table"
Attribute | Type | Modifier
-----------+---------+--------------------
first | integer | not null default 0
second | text |
</programlisting>
At this point you decide to change the prompt to something more
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/rollback.sgml,v 1.6 1999/07/22 15:09:14 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/rollback.sgml,v 1.7 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -61,8 +61,7 @@ ABORT
<varlistentry>
<term><computeroutput>
NOTICE: UserAbortTransactionBlock and not in in-progress state
ABORT
NOTICE: ROLLBACK: no transaction in progress
</computeroutput></term>
<listitem>
<para>
......@@ -95,10 +94,6 @@ ABORT
<title>
Notes
</title>
<para>
The keywords WORK and TRANSACTION are noise and can be omitted.
</para>
<para>
Use <xref linkend="SQL-COMMIT-TITLE" endterm="SQL-COMMIT-TITLE">
to successfully terminate a transaction.
......@@ -134,8 +129,8 @@ ROLLBACK WORK;
SQL92
</title>
<para>
Full compatibility. The TRANSACTION keyword is a
<productname>Postgres</productname> extension.
<acronym>SQL92</acronym> only specifies the two forms <literal>ROLLBACK</literal>
and <literal>ROLLBACK WORK</literal>. Otherwise full compatibility.
</para>
</refsect2>
</refsect1>
......
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/update.sgml,v 1.6 1999/07/22 15:09:15 thomas Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/ref/update.sgml,v 1.7 2000/01/29 16:58:27 petere Exp $
Postgres documentation
-->
......@@ -23,7 +23,7 @@ Postgres documentation
<date>1999-07-20</date>
</refsynopsisdivinfo>
<synopsis>
UPDATE <replaceable class="PARAMETER">table</replaceable> SET <replaceable class="PARAMETER">R">col</replaceable>le> = <replaceable class="PARAMETER">expression</replaceable> [, ...]
UPDATE <replaceable class="PARAMETER">table</replaceable> SET <replaceable class="PARAMETER">col</replaceable> = <replaceable class="PARAMETER">expression</replaceable> [, ...]
[ FROM <replaceable class="PARAMETER">fromlist</replaceable> ]
[ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
</synopsis>
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.59 2000/01/26 05:56:04 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.60 2000/01/29 16:58:29 petere Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
......@@ -1331,7 +1331,7 @@ BeginTransactionBlock(void)
return;
if (s->blockState != TBLOCK_DEFAULT)
elog(NOTICE, "BeginTransactionBlock and not in default state ");
elog(NOTICE, "BEGIN: already a transaction in progress");
/* ----------------
* set the current transaction block state information
......@@ -1404,7 +1404,7 @@ EndTransactionBlock(void)
* default state.
* ----------------
*/
elog(NOTICE, "EndTransactionBlock and not inprogress/abort state ");
elog(NOTICE, "COMMIT: no transaction in progress");
s->blockState = TBLOCK_ENDABORT;
}
......@@ -1516,13 +1516,13 @@ UserAbortTransactionBlock()
/* ----------------
* this case should not be possible, because it would mean
* the user entered an "abort" from outside a transaction block.
* the user entered a "rollback" from outside a transaction block.
* So we print an error message, abort the transaction and
* enter the "ENDABORT" state so we will end up in the default
* state after the upcoming CommitTransactionCommand().
* ----------------
*/
elog(NOTICE, "UserAbortTransactionBlock and not in in-progress state");
elog(NOTICE, "ROLLBACK: no transaction in progress");
AbortTransaction();
s->blockState = TBLOCK_ENDABORT;
}
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.66 2000/01/26 05:56:13 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.67 2000/01/29 16:58:34 petere Exp $
*
* NOTES
* The PortalExecutorHeapMemory crap needs to be eliminated
......@@ -301,7 +301,6 @@ AlterTableAddColumn(const 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,
......@@ -386,9 +385,9 @@ AlterTableAddColumn(const char *relationName,
/*
* XXX is the following check sufficient?
*/
if (((Form_pg_class) GETSTRUCT(reltup))->relkind == RELKIND_INDEX)
if (((Form_pg_class) GETSTRUCT(reltup))->relkind != RELKIND_RELATION)
{
elog(ERROR, "ALTER TABLE: index relation \"%s\" not changed",
elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
relationName);
}
......@@ -429,7 +428,7 @@ AlterTableAddColumn(const char *relationName,
0, 0);
if (HeapTupleIsValid(tup))
elog(ERROR, "ALTER TABLE: column name \"%s\" already exists in relation \"%s\"",
elog(ERROR, "ALTER TABLE: column name \"%s\" already exists in table \"%s\"",
colDef->colname, relationName);
/*
......@@ -627,14 +626,12 @@ AlterTableAlterColumn(const char *relationName,
/* 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_attrdef_indices, irelations);
CatalogCloseIndices(Num_pg_attr_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);
}
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.55 2000/01/26 05:56:13 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.56 2000/01/29 16:58:34 petere Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -31,8 +31,8 @@
* ----------------
*/
static int checkAttrExists(char *attributeName,
char *attributeType, List *schema);
static bool checkAttrExists(const char *attributeName,
const char *attributeType, List *schema);
static List *MergeAttributes(List *schema, List *supers, List **supconstr);
static void StoreCatalogInheritance(Oid relationId, List *supers);
......@@ -291,7 +291,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
if (!strcmp(coldef->colname, restdef->colname))
{
elog(ERROR, "attribute '%s' duplicated",
elog(ERROR, "CREATE TABLE: attribute \"%s\" duplicated",
coldef->colname);
}
}
......@@ -304,7 +304,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
{
if (!strcmp(strVal(lfirst(entry)), strVal(lfirst(rest))))
{
elog(ERROR, "relation '%s' duplicated",
elog(ERROR, "CREATE TABLE: inherited relation \"%s\" duplicated",
strVal(lfirst(entry)));
}
}
......@@ -326,9 +326,8 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
tupleDesc = RelationGetDescr(relation);
constr = tupleDesc->constr;
/* XXX shouldn't this test be stricter? No indexes, for example? */
if (relation->rd_rel->relkind == 'S')
elog(ERROR, "MergeAttr: Can't inherit from sequence superclass '%s'", name);
if (relation->rd_rel->relkind != RELKIND_RELATION)
elog(ERROR, "CREATE TABLE: inherited relation \"%s\" is not a table", name);
for (attrno = relation->rd_rel->relnatts - 1; attrno >= 0; attrno--)
{
......@@ -353,15 +352,15 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
* check validity
*
*/
if (checkAttrExists(attributeName, attributeType, inhSchema) ||
checkAttrExists(attributeName, attributeType, schema))
{
if (checkAttrExists(attributeName, attributeType, schema))
elog(ERROR, "CREATE TABLE: attribute \"%s\" already exists in inherited schema",
attributeName);
if (checkAttrExists(attributeName, attributeType, inhSchema))
/*
* this entry already exists
*/
continue;
}
/*
* add an entry to the schema
......@@ -629,11 +628,13 @@ again:
heap_close(relation, RowExclusiveLock);
}
/*
* returns 1 if attribute already exists in schema, 0 otherwise.
* returns true if attribute already exists in schema, false otherwise.
*/
static int
checkAttrExists(char *attributeName, char *attributeType, List *schema)
static bool
checkAttrExists(const char *attributeName, const char *attributeType, List *schema)
{
List *s;
......@@ -641,19 +642,16 @@ checkAttrExists(char *attributeName, char *attributeType, List *schema)
{
ColumnDef *def = lfirst(s);
if (!strcmp(attributeName, def->colname))
if (strcmp(attributeName, def->colname)==0)
{
/*
* attribute exists. Make sure the types are the same.
*/
if (strcmp(attributeType, def->typename->name) != 0)
{
elog(ERROR, "%s and %s conflict for %s",
attributeType, def->typename->name, attributeName);
}
return 1;
elog(ERROR, "CREATE TABLE: attribute \"%s\" type conflict (%s and %s)",
attributeName, attributeType, def->typename->name);
return true;
}
}
return 0;
return false;
}
......@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.136 2000/01/27 18:11:35 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.137 2000/01/29 16:58:37 petere Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
......@@ -832,14 +832,14 @@ AlterTableStmt:
$$ = (Node *)n;
}
/* ALTER TABLE <name> DROP [COLUMN] <name> {RESTRICT|CASCADE} */
| ALTER TABLE relation_name opt_inh_star DROP opt_column ColId /* drop_behavior */
| 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; */
n->behavior = $8;
$$ = (Node *)n;
}
/* ALTER TABLE <name> ADD CONSTRAINT ... */
......@@ -856,7 +856,7 @@ AlterTableStmt:
| ALTER TABLE relation_name opt_inh_star DROP CONSTRAINT name drop_behavior
{
AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'X';
n->subtype = 'X';
n->relname = $3;
n->inh = $4;
n->name = $7;
......@@ -866,7 +866,8 @@ AlterTableStmt:
;
alter_column_action:
SET DEFAULT a_expr_or_null { $$ = $3; }
SET DEFAULT a_expr { $$ = $3; }
| SET DEFAULT NULL_P { $$ = NULL; }
| DROP DEFAULT { $$ = NULL; }
;
......@@ -2531,19 +2532,15 @@ UnlistenStmt: UNLISTEN relation_name
*
* Transactions:
*
* abort transaction
* (ABORT)
* begin transaction
* (BEGIN)
* end transaction
* (END)
* BEGIN / COMMIT / ROLLBACK
* (also older versions END / ABORT)
*
*****************************************************************************/
TransactionStmt: ABORT_TRANS opt_trans
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = ABORT_TRANS;
n->command = ROLLBACK;
$$ = (Node *)n;
}
| BEGIN_TRANS opt_trans
......@@ -2555,19 +2552,19 @@ TransactionStmt: ABORT_TRANS opt_trans
| COMMIT opt_trans
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = END_TRANS;
n->command = COMMIT;
$$ = (Node *)n;
}
| END_TRANS opt_trans
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = END_TRANS;
n->command = COMMIT;
$$ = (Node *)n;
}
| ROLLBACK opt_trans
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = ABORT_TRANS;
n->command = ROLLBACK;
$$ = (Node *)n;
}
;
......
......@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.81 2000/01/26 05:57:07 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.82 2000/01/29 16:58:38 petere Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -57,8 +57,8 @@ if (1) \
{ \
if (IsAbortedTransactionBlockState()) \
{ \
elog(NOTICE, "(transaction aborted): %s", \
"all queries ignored until end of transaction block"); \
elog(NOTICE, "current transaction is aborted, " \
"queries ignored until end of transaction block"); \
commandTag = "*ABORT STATE*"; \
break; \
} \
......@@ -98,13 +98,13 @@ ProcessUtility(Node *parsetree,
BeginTransactionBlock();
break;
case END_TRANS:
PS_SET_STATUS(commandTag = "END");
case COMMIT:
PS_SET_STATUS(commandTag = "COMMIT");
EndTransactionBlock();
break;
case ABORT_TRANS:
PS_SET_STATUS(commandTag = "ABORT");
case ROLLBACK:
PS_SET_STATUS(commandTag = "ROLLBACK");
UserAbortTransactionBlock();
break;
}
......@@ -278,17 +278,16 @@ ProcessUtility(Node *parsetree,
{
RenameStmt *stmt = (RenameStmt *) parsetree;
PS_SET_STATUS(commandTag = "RENAME");
PS_SET_STATUS(commandTag = "ALTER");
CHECK_IF_ABORTED();
relname = stmt->relname;
if (!allowSystemTableMods && IsSystemRelationName(relname))
elog(ERROR, "class \"%s\" is a system catalog",
elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
relname);
#ifndef NO_SECURITY
if (!pg_ownercheck(userName, relname, RELNAME))
elog(ERROR, "you do not own class \"%s\"",
relname);
elog(ERROR, "permission denied");
#endif
/* ----------------
......@@ -335,7 +334,7 @@ ProcessUtility(Node *parsetree,
{
AlterTableStmt *stmt = (AlterTableStmt *) parsetree;
PS_SET_STATUS(commandTag = "ALTER TABLE");
PS_SET_STATUS(commandTag = "ALTER");
CHECK_IF_ABORTED();
/*
......
......@@ -26,7 +26,7 @@
#
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.82 2000/01/20 21:51:05 petere Exp $
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.83 2000/01/29 16:58:42 petere Exp $
#
#-------------------------------------------------------------------------
......@@ -204,6 +204,11 @@ do
-E*)
MULTIBYTE=`echo $1 | sed 's/^-E//'`
;;
-*)
echo "$CMDNAME: invalid option: $1"
echo "Try -? for help."
exit 1
;;
*)
PGDATA=$1
;;
......@@ -218,15 +223,15 @@ if [ "$usage" ]; then
echo " $CMDNAME [options] datadir"
echo
echo "Options:"
echo " [-D, --pgdata] <datadir> Location for this database"
echo " [-D, --pgdata] <datadir> Location for this database"
echo " -W, --pwprompt Prompt for a password for the new superuser's"
if [ -n "$MULTIBYTE" ]
then
echo " -e, --encoding <encoding> Set the default multibyte encoding for new databases"
echo " -E, --encoding <encoding> Set the default multibyte encoding for new databases"
fi
echo " -i, --sysid <sysid> Database sysid for the superuser"
echo "Less commonly used options: "
echo " -L, --pglib <libdir> Where to find the input files (should happend automatically"
echo " -L, --pglib <libdir> Where to find the input files"
echo " -t, --template Re-initialize template database only"
echo " -d, --debug Generate lots of debugging output"
echo " -n, --noclean Do not clean up after errors"
......
......@@ -22,7 +22,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.140 2000/01/27 05:33:49 momjian Exp $
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.141 2000/01/29 16:58:44 petere Exp $
*
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
*
......@@ -178,7 +178,7 @@ version(void)
puts("pg_dump (PostgreSQL) " PG_RELEASE "." PG_VERSION "." PG_SUBVERSION);
puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc");
puts("Portions Copyright (C) 1996 Regents of the University of California");
puts("Read the file COPYING to see the usage and distribution terms.");
puts("Read the file COPYRIGHT to see the usage and distribution terms.");
}
......@@ -685,7 +685,7 @@ main(int argc, char **argv)
case '?':
/* getopt returns '?' on unknown argument. That's not
quite what we want */
if (strcmp(argv[optind-1], "-?")==0)
if (strcmp(argv[optind-1], "-?")==0 || strcmp(argv[optind-1], "--help")==0)
{
help(progname);
exit(1);
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.15 2000/01/23 01:27:37 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.16 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "command.h"
......@@ -361,7 +361,7 @@ exec_command(const char *cmd,
switch (cmd[1])
{
case '\0':
case '?':
case '+':
if (options[0])
success = describeTableDetails(options[0], show_verbose);
else
......@@ -992,11 +992,41 @@ do_connect(const char *new_dbname, const char *new_user)
SetVariable(pset.vars, "HOST", PQhost(pset.db));
SetVariable(pset.vars, "PORT", PQport(pset.db));
pset.issuper = test_superuser(PQuser(pset.db));
return success;
}
/*
* Test if the given user is a database superuser.
* (Used to set up the prompt right.)
*/
bool
test_superuser(const char * username)
{
PGresult *res;
char buf[64 + NAMEDATALEN];
bool answer;
if (!username)
return false;
sprintf(buf, "SELECT usesuper FROM pg_user WHERE usename = '%.*s'", NAMEDATALEN, username);
res = PSQLexec(buf);
answer =
(PQntuples(res)>0 && PQnfields(res)>0
&& !PQgetisnull(res,0,0)
&& PQgetvalue(res,0,0)
&& strcmp(PQgetvalue(res,0,0), "t")==0);
PQclear(res);
return answer;
}
/*
* do_edit -- handler for \e
*
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/command.h,v 1.6 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/command.h,v 1.7 2000/01/29 16:58:48 petere Exp $
*/
#ifndef COMMAND_H
#define COMMAND_H
......@@ -36,6 +36,9 @@ HandleSlashCmds(const char *line,
bool
process_file(char *filename);
bool
test_superuser(const char * username);
bool
do_pset(const char *param,
const char *value,
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.10 2000/01/19 20:08:33 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.11 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "common.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.4 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.5 2000/01/29 16:58:48 petere Exp $
*/
#ifndef COMMON_H
#define COMMON_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.8 2000/01/21 04:21:12 tgl Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.9 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "copy.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.5 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.6 2000/01/29 16:58:48 petere Exp $
*/
#ifndef COPY_H
#define COPY_H
......
#!/usr/bin/perl
#! /usr/bin/perl
#################################################################
# create_help.pl -- converts SGML docs to internal psql help
#
# This script automatically generates the help on SQL in psql from the
# SGML docs. So far the format of the docs was consistent enough that
# this worked, but this here is my no means an SGML parser.
# Copyright 2000 by PostgreSQL Global Development Group
#
# It might be a good idea that this is just done once before distribution
# so people that don't have the docs or have slightly messed up docs or
# don't have perl, etc. won't have to bother.
# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.3 2000/01/29 16:58:48 petere Exp $
#################################################################
#
# This script automatically generates the help on SQL in psql from
# the SGML docs. So far the format of the docs was consistent
# enough that this worked, but this here is my no means an SGML
# parser.
#
# Call: perl create_help.pl sql_help.h
# (Do not rely on this script to be executable.)
# The name of the header file doesn't matter to this script, but it sure
# does matter to the rest of the source.
# The name of the header file doesn't matter to this script, but it
# sure does matter to the rest of the source.
#
# A rule for this is also in the psql makefile.
#
......@@ -29,9 +33,15 @@ open OUT, ">$outputfile" or die "Couldn't open output file '$outputfile': $!\n";
print OUT
"/*
* This file is automatically generated from the SGML documentation.
* Direct changes here will be overwritten.
* *** Do not change this file directly. Changes will be overwritten. ***
*
* This file was generated by
* $^X $0 $outputfile
* from the DocBook documentation in
* $docdir
*
*/
#ifndef $define
#define $define
......@@ -76,7 +86,7 @@ foreach $file (sort readdir DIR) {
print OUT " { \"$cmdname\",\n \"$cmddesc\",\n \"$cmdsynopsis\" },\n\n";
}
else {
print STDERR "Couldn't parse file '$file'. (N='$cmdname' D='$cmddesc')\n";
print STDERR "$0: parsing file '$file' failed at or near line $. (N='$cmdname' D='$cmddesc')\n";
}
}
......
This diff is collapsed.
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.6 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.7 2000/01/29 16:58:48 petere Exp $
*/
#ifndef DESCRIBE_H
#define DESCRIBE_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.14 2000/01/26 16:10:01 momjian Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.15 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "help.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.4 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.5 2000/01/29 16:58:48 petere Exp $
*/
#ifndef HELP_H
#define HELP_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.7 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.8 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "input.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/input.h,v 1.5 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/input.h,v 1.6 2000/01/29 16:58:48 petere Exp $
*/
#ifndef INPUT_H
#define INPUT_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.c,v 1.6 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.c,v 1.7 2000/01/29 16:58:48 petere Exp $
*/
#include <c.h>
#include "large_obj.h"
......@@ -60,8 +60,8 @@ handle_transaction(void)
if (notice[0])
{
if ((!commit && strcmp(notice, "NOTICE: UserAbortTransactionBlock and not in in-progress state\n") != 0) ||
(commit && strcmp(notice, "NOTICE: EndTransactionBlock and not inprogress/abort state\n") != 0))
if ((!commit && strcmp(notice, "NOTICE: ROLLBACK: no transaction in progress\n") != 0) ||
(commit && strcmp(notice, "NOTICE: COMMIT: no transaction in progress\n") != 0))
fputs(notice, stderr);
}
else if (!QUIET())
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.h,v 1.6 2000/01/18 23:30:23 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.h,v 1.7 2000/01/29 16:58:49 petere Exp $
*/
#ifndef LARGE_OBJ_H
#define LARGE_OBJ_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/mainloop.h,v 1.5 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/mainloop.h,v 1.6 2000/01/29 16:58:49 petere Exp $
*/
#ifndef MAINLOOP_H
#define MAINLOOP_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.8 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.9 2000/01/29 16:58:49 petere Exp $
*/
#include <c.h>
#include "print.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.5 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.6 2000/01/29 16:58:49 petere Exp $
*/
#ifndef PRINT_H
#define PRINT_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.6 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.7 2000/01/29 16:58:49 petere Exp $
*/
#include <c.h>
#include "prompt.h"
......@@ -39,7 +39,7 @@
* %n - database user name
* %/ - current database
* %~ - like %/ but "~" when database name equals user name
* %# - "#" if the username is postgres, ">" otherwise
* %# - "#" if superuser, ">" otherwise
* %R - in prompt1 normally =, or ^ if single line mode,
* or a ! if session is not connected to a database;
* in prompt2 -, *, ', or ";
......@@ -194,7 +194,7 @@ get_prompt(promptStatus_t status)
case '#':
{
if (pset.db && strcmp(PQuser(pset.db), "postgres") == 0)
if (pset.issuper)
buf[0] = '#';
else
buf[0] = '>';
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.h,v 1.4 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.h,v 1.5 2000/01/29 16:58:49 petere Exp $
*/
#ifndef PROMPT_H
#define PROMPT_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/settings.h,v 1.7 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/settings.h,v 1.8 2000/01/29 16:58:49 petere Exp $
*/
#ifndef SETTINGS_H
#define SETTINGS_H
......@@ -53,6 +53,9 @@ typedef struct _psqlSettings
char *progname; /* in case you renamed psql */
char *inputfile; /* for error reporting */
unsigned lineno; /* also for error reporting */
bool issuper; /* is the current user a superuser?
(used to form the prompt) */
} PsqlSettings;
extern PsqlSettings pset;
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.19 2000/01/27 05:33:51 momjian Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.20 2000/01/29 16:58:49 petere Exp $
*/
#include <c.h>
......@@ -162,8 +162,8 @@ main(int argc, char **argv)
if (PQstatus(pset.db) == CONNECTION_BAD)
{
fprintf(stderr, "%s: connection to database \"%s\" failed - %s",
pset.progname, PQdb(pset.db), PQerrorMessage(pset.db));
fprintf(stderr, "%s: %s",
pset.progname, PQerrorMessage(pset.db));
PQfinish(pset.db);
exit(EXIT_BADCONN);
}
......@@ -188,6 +188,8 @@ main(int argc, char **argv)
SetVariable(pset.vars, "HOST", PQhost(pset.db));
SetVariable(pset.vars, "PORT", PQport(pset.db));
pset.issuper = test_superuser(PQuser(pset.db));
if (!QUIET() && !pset.notty && !options.action)
{
printf("Welcome to %s, the PostgreSQL interactive terminal.\n\n"
......@@ -436,11 +438,13 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
pset.getPassword = true;
break;
case '?':
if (strcmp(argv[optind-1], "-?")==0)
/* Actual help option given */
if (strcmp(argv[optind-1], "-?")==0 || strcmp(argv[optind-1], "--help")==0)
{
usage();
exit(EXIT_SUCCESS);
}
/* unknown option reported by getopt */
else
{
fputs("Try -? for help.\n", stderr);
......@@ -486,7 +490,7 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
/*
* Load /etc/psqlrc or .psqlrc file, if found.
* Load .psqlrc file, if found.
*/
static void
process_psqlrc(void)
......@@ -498,12 +502,6 @@ process_psqlrc(void)
#define R_OK 0
#endif
/* System-wide startup file */
if (access("/etc/psqlrc-" PG_RELEASE "." PG_VERSION "." PG_SUBVERSION, R_OK) == 0)
process_file("/etc/psqlrc-" PG_RELEASE "." PG_VERSION "." PG_SUBVERSION);
else if (access("/etc/psqlrc", R_OK) == 0)
process_file("/etc/psqlrc");
/* Look for one in the home dir */
home = getenv("HOME");
......@@ -573,6 +571,6 @@ showVersion(void)
puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc");
puts("Portions Copyright (C) 1996 Regents of the University of California");
puts("Read the file COPYING or use the command \\copyright to see the");
puts("Read the file COPYRIGHT or use the command \\copyright to see the");
puts("usage and distribution terms.");
}
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.22 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.23 2000/01/29 16:58:49 petere Exp $
*/
#include <c.h>
#include "stringutils.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.h,v 1.12 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.h,v 1.13 2000/01/29 16:58:49 petere Exp $
*/
#ifndef STRINGUTILS_H
#define STRINGUTILS_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.8 2000/01/21 23:32:36 tgl Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.9 2000/01/29 16:58:49 petere Exp $
*/
/*-----------
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.h,v 1.2 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.h,v 1.3 2000/01/29 16:58:49 petere Exp $
*/
#ifndef TAB_COMPLETE_H
#define TAB_COMPLETE_H
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/variables.c,v 1.4 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/variables.c,v 1.5 2000/01/29 16:58:49 petere Exp $
*/
#include <c.h>
#include "variables.h"
......
/*
* psql - the PostgreSQL interactive terminal
*
* Copyright 2000 by PostgreSQL Global Development Team
* Copyright 2000 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/src/bin/psql/variables.h,v 1.4 2000/01/18 23:30:24 petere Exp $
* $Header: /cvsroot/pgsql/src/bin/psql/variables.h,v 1.5 2000/01/29 16:58:49 petere Exp $
*/
/*
......
......@@ -10,7 +10,7 @@
* Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgdatabase.cc,v 1.8 1999/10/13 16:46:28 momjian Exp $
* $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgdatabase.cc,v 1.9 2000/01/29 16:58:52 petere Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -26,9 +26,9 @@ void PgDatabase::DisplayTuples(FILE *out, int fillAlign,
memset(&po,0,sizeof(po));
po.align = (pqbool)fillAlign;
po.align = fillAlign;
po.fieldSep = (char *)fieldSep;
po.header = (pqbool)printHeader;
po.header = printHeader;
PQprint(out,pgResult,&po);
}
......@@ -43,12 +43,12 @@ void PgDatabase::PrintTuples(FILE *out, int printAttName, int terseOutput,
memset(&po,0,sizeof(po));
po.align = (pqbool)width;
po.align = width;
if(terseOutput) po.fieldSep = strdup("|");
else po.fieldSep = "";
po.header = (pqbool)printAttName;
po.header = printAttName;
PQprint(out,pgResult,&po);
}
......
......@@ -25,7 +25,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.37 2000/01/26 05:58:45 momjian Exp $
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.38 2000/01/29 16:58:51 petere Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -51,6 +51,11 @@
#include "libpq-int.h"
#include "pqsignal.h"
#ifdef MULTIBYTE
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#endif
#define DONOTICE(conn,message) \
((*(conn)->noticeHook) ((conn)->noticeArg, (message)))
......@@ -737,3 +742,52 @@ pqWait(int forRead, int forWrite, PGconn *conn)
return 0;
}
/*
* A couple of "miscellaneous" multibyte related functions. They used
* to be in fe-print.c but that file is doomed.
*/
#ifdef MULTIBYTE
/*
* returns the byte length of the word beginning s, using the
* specified encoding.
*/
int
PQmblen(const unsigned char *s, int encoding)
{
return (pg_encoding_mblen(encoding, s));
}
/*
* Get encoding id from environment variable PGCLIENTENCODING.
*/
int
PQenv2encoding(void)
{
char *str;
int encoding = SQL_ASCII;
str = getenv("PGCLIENTENCODING");
if (str && *str != '\0')
encoding = pg_char_to_encoding(str);
return(encoding);
}
#else
/* Provide a default definition in case someone calls it anyway */
int
PQmblen(const unsigned char *s, int encoding)
{
return 1;
}
int
PQenv2encoding(void)
{
return 0;
}
#endif /* MULTIBYTE */
......@@ -10,13 +10,13 @@
* didn't really belong there.
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.32 2000/01/26 05:58:46 momjian Exp $
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.33 2000/01/29 16:58:51 petere Exp $
*
*-------------------------------------------------------------------------
*/
#include <signal.h>
#include <postgres.h>
#include "postgres.h"
#include <signal.h>
#include "libpq-fe.h"
#include "libpq-int.h"
#include "pqsignal.h"
......@@ -36,21 +36,14 @@
#endif
#endif
#ifdef MULTIBYTE
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#endif
#ifdef TIOCGWINSZ
static struct winsize screen_size;
#else
static struct winsize
{
int ws_row;
int ws_col;
} screen_size;
#endif
......@@ -66,7 +59,6 @@ static char *do_header(FILE *fout, const PQprintOpt *po, const int nFields,
static void output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
unsigned char *fieldNotNum, int *fieldMax, char *border,
const int row_index);
static void fill(int length, int max, char filler, FILE *fp);
/*
......@@ -78,7 +70,9 @@ static void fill(int length, int max, char filler, FILE *fp);
* various flags and options. consult libpq-fe.h for
* details
*
* Obsoletes PQprintTuples.
* This function should probably be removed sometime since psql
* doesn't use it anymore. It is unclear to what extend this is used
* by external clients, however.
*/
void
......@@ -315,229 +309,6 @@ PQprint(FILE *fout,
}
/*
* PQdisplayTuples()
* kept for backward compatibility
*/
void
PQdisplayTuples(const PGresult *res,
FILE *fp, /* where to send the output */
int fillAlign, /* pad the fields with spaces */
const char *fieldSep, /* field separator */
int printHeader,/* display headers? */
int quiet
)
{
#define DEFAULT_FIELD_SEP " "
int i,
j;
int nFields;
int nTuples;
int *fLength = NULL;
if (fieldSep == NULL)
fieldSep = DEFAULT_FIELD_SEP;
/* Get some useful info about the results */
nFields = PQnfields(res);
nTuples = PQntuples(res);
if (fp == NULL)
fp = stdout;
/* Figure the field lengths to align to */
/* will be somewhat time consuming for very large results */
if (fillAlign)
{
fLength = (int *) malloc(nFields * sizeof(int));
for (j = 0; j < nFields; j++)
{
fLength[j] = strlen(PQfname(res, j));
for (i = 0; i < nTuples; i++)
{
int flen = PQgetlength(res, i, j);
if (flen > fLength[j])
fLength[j] = flen;
}
}
}
if (printHeader)
{
/* first, print out the attribute names */
for (i = 0; i < nFields; i++)
{
fputs(PQfname(res, i), fp);
if (fillAlign)
fill(strlen(PQfname(res, i)), fLength[i], ' ', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
/* Underline the attribute names */
for (i = 0; i < nFields; i++)
{
if (fillAlign)
fill(0, fLength[i], '-', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
}
/* next, print out the instances */
for (i = 0; i < nTuples; i++)
{
for (j = 0; j < nFields; j++)
{
fprintf(fp, "%s", PQgetvalue(res, i, j));
if (fillAlign)
fill(strlen(PQgetvalue(res, i, j)), fLength[j], ' ', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
}
if (!quiet)
fprintf(fp, "\nQuery returned %d row%s.\n", PQntuples(res),
(PQntuples(res) == 1) ? "" : "s");
fflush(fp);
if (fLength)
free(fLength);
}
/*
* PQprintTuples()
*
* kept for backward compatibility
*
*/
void
PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
int PrintAttNames,/* print attribute names or not */
int TerseOutput, /* delimiter bars or not? */
int colWidth /* width of column, if 0, use variable
* width */
)
{
int nFields;
int nTups;
int i,
j;
char formatString[80];
char *tborder = NULL;
nFields = PQnfields(res);
nTups = PQntuples(res);
if (colWidth > 0)
sprintf(formatString, "%%s %%-%ds", colWidth);
else
sprintf(formatString, "%%s %%s");
if (nFields > 0)
{ /* only print rows with at least 1 field. */
if (!TerseOutput)
{
int width;
width = nFields * 14;
tborder = malloc(width + 1);
for (i = 0; i <= width; i++)
tborder[i] = '-';
tborder[i] = '\0';
fprintf(fout, "%s\n", tborder);
}
for (i = 0; i < nFields; i++)
{
if (PrintAttNames)
{
fprintf(fout, formatString,
TerseOutput ? "" : "|",
PQfname(res, i));
}
}
if (PrintAttNames)
{
if (TerseOutput)
fprintf(fout, "\n");
else
fprintf(fout, "|\n%s\n", tborder);
}
for (i = 0; i < nTups; i++)
{
for (j = 0; j < nFields; j++)
{
const char *pval = PQgetvalue(res, i, j);
fprintf(fout, formatString,
TerseOutput ? "" : "|",
pval ? pval : "");
}
if (TerseOutput)
fprintf(fout, "\n");
else
fprintf(fout, "|\n%s\n", tborder);
}
}
}
#ifdef MULTIBYTE
/*
* returns the byte length of the word beginning s.
* Client side encoding is determined by the environment variable
* "PGCLIENTENCODING".
* if this variable is not defined, the same encoding as
* the backend is assumed.
*/
int
PQmblen(const unsigned char *s, int encoding)
{
return (pg_encoding_mblen(encoding, s));
}
/*
* Get encoding id from environment variable PGCLIENTENCODING.
*/
int
PQenv2encoding(void)
{
char *str;
int encoding = SQL_ASCII;
str = getenv("PGCLIENTENCODING");
if (str && *str != '\0')
encoding = pg_char_to_encoding(str);
return(encoding);
}
#else
/* Provide a default definition in case someone calls it anyway */
int
PQmblen(const unsigned char *s, int encoding)
{
return 1;
}
int
PQenv2encoding(void)
{
return 0;
}
#endif /* MULTIBYTE */
static void
do_field(const PQprintOpt *po, const PGresult *res,
const int i, const int j, const int fs_len,
......@@ -785,14 +556,176 @@ output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
}
/* simply send out max-length number of filler characters to fp */
static void
fill(int length, int max, char filler, FILE *fp)
#if 0
/*
* really old printing routines
*/
void
PQdisplayTuples(const PGresult *res,
FILE *fp, /* where to send the output */
int fillAlign, /* pad the fields with spaces */
const char *fieldSep, /* field separator */
int printHeader,/* display headers? */
int quiet
)
{
#define DEFAULT_FIELD_SEP " "
int i,
j;
int nFields;
int nTuples;
int *fLength = NULL;
if (fieldSep == NULL)
fieldSep = DEFAULT_FIELD_SEP;
/* Get some useful info about the results */
nFields = PQnfields(res);
nTuples = PQntuples(res);
if (fp == NULL)
fp = stdout;
/* Figure the field lengths to align to */
/* will be somewhat time consuming for very large results */
if (fillAlign)
{
fLength = (int *) malloc(nFields * sizeof(int));
for (j = 0; j < nFields; j++)
{
fLength[j] = strlen(PQfname(res, j));
for (i = 0; i < nTuples; i++)
{
int flen = PQgetlength(res, i, j);
if (flen > fLength[j])
fLength[j] = flen;
}
}
}
if (printHeader)
{
/* first, print out the attribute names */
for (i = 0; i < nFields; i++)
{
fputs(PQfname(res, i), fp);
if (fillAlign)
fill(strlen(PQfname(res, i)), fLength[i], ' ', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
/* Underline the attribute names */
for (i = 0; i < nFields; i++)
{
if (fillAlign)
fill(0, fLength[i], '-', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
}
/* next, print out the instances */
for (i = 0; i < nTuples; i++)
{
for (j = 0; j < nFields; j++)
{
fprintf(fp, "%s", PQgetvalue(res, i, j));
if (fillAlign)
fill(strlen(PQgetvalue(res, i, j)), fLength[j], ' ', fp);
fputs(fieldSep, fp);
}
fprintf(fp, "\n");
}
if (!quiet)
fprintf(fp, "\nQuery returned %d row%s.\n", PQntuples(res),
(PQntuples(res) == 1) ? "" : "s");
fflush(fp);
if (fLength)
free(fLength);
}
void
PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
int PrintAttNames,/* print attribute names or not */
int TerseOutput, /* delimiter bars or not? */
int colWidth /* width of column, if 0, use variable
* width */
)
{
int count;
int nFields;
int nTups;
int i,
j;
char formatString[80];
char *tborder = NULL;
nFields = PQnfields(res);
nTups = PQntuples(res);
if (colWidth > 0)
sprintf(formatString, "%%s %%-%ds", colWidth);
else
sprintf(formatString, "%%s %%s");
if (nFields > 0)
{ /* only print rows with at least 1 field. */
if (!TerseOutput)
{
int width;
width = nFields * 14;
tborder = malloc(width + 1);
for (i = 0; i <= width; i++)
tborder[i] = '-';
tborder[i] = '\0';
fprintf(fout, "%s\n", tborder);
}
for (i = 0; i < nFields; i++)
{
if (PrintAttNames)
{
fprintf(fout, formatString,
TerseOutput ? "" : "|",
PQfname(res, i));
}
}
if (PrintAttNames)
{
if (TerseOutput)
fprintf(fout, "\n");
else
fprintf(fout, "|\n%s\n", tborder);
}
for (i = 0; i < nTups; i++)
{
for (j = 0; j < nFields; j++)
{
const char *pval = PQgetvalue(res, i, j);
count = max - length;
while (count-- >= 0)
putc(filler, fp);
fprintf(fout, formatString,
TerseOutput ? "" : "|",
pval ? pval : "");
}
if (TerseOutput)
fprintf(fout, "\n");
else
fprintf(fout, "|\n%s\n", tborder);
}
}
}
#endif
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: libpq-fe.h,v 1.57 2000/01/26 05:58:46 momjian Exp $
* $Id: libpq-fe.h,v 1.58 2000/01/29 16:58:51 petere Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -116,22 +116,15 @@ extern "C"
/* Print options for PQprint() */
/*
* We can't use the conventional "bool", because we are designed to be
* included in a user's program, and user may already have that type
* defined. Pqbool, on the other hand, is unlikely to be used.
*/
typedef char pqbool;
typedef struct _PQprintOpt
{
pqbool header; /* print output field headings and row
int header; /* print output field headings and row
* count */
pqbool align; /* fill align the fields */
pqbool standard; /* old brain dead format */
pqbool html3; /* output html tables */
pqbool expanded; /* expand tables */
pqbool pager; /* use pager for output if needed */
int align; /* fill align the fields */
int standard; /* old brain dead format */
int html3; /* output html tables */
int expanded; /* expand tables */
int pager; /* use pager for output if needed */
char *fieldSep; /* field separator */
char *tableOpt; /* insert to HTML <table ...> */
char *caption; /* HTML <caption> */
......@@ -296,8 +289,8 @@ extern "C"
extern int PQfsize(const PGresult *res, int field_num);
extern int PQfmod(const PGresult *res, int field_num);
extern const char *PQcmdStatus(const PGresult *res);
extern const char *PQoidStatus(const PGresult *res); /* old and ugly */
extern Oid PQoidValue(const PGresult *res); /* new and improved */
extern const char *PQoidStatus(const PGresult *res); /* old and ugly */
extern Oid PQoidValue(const PGresult *res); /* new and improved */
extern const char *PQcmdTuples(const PGresult *res);
extern const char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
extern int PQgetlength(const PGresult *res, int tup_num, int field_num);
......@@ -319,33 +312,24 @@ extern "C"
const PGresult *res,
const PQprintOpt *ps); /* option structure */
/*
* PQdisplayTuples() is a better version of PQprintTuples(), but both
* are obsoleted by PQprint().
*/
extern void PQdisplayTuples(const PGresult *res,
FILE *fp, /* where to send the
* output */
int fillAlign, /* pad the fields with
* spaces */
const char *fieldSep, /* field separator */
int printHeader, /* display headers? */
int quiet);
extern void PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
int printAttName, /* print attribute names
* or not */
int terseOutput, /* delimiter bars or
* not? */
int width); /* width of column, if
* 0, use variable width */
/* Determine length of multibyte encoded char at *s */
extern int PQmblen(const unsigned char *s, int encoding);
/* Get encoding id from environment variable PGCLIENTENCODING */
int PQenv2encoding(void);
#if 0
/*
* really old printing routines
*/
extern void PQdisplayTuples(const PGresult *res,
FILE *fp, /* where to send the output */
int fillAlign, /* pad the fields with spaces */
const char *fieldSep, /* field separator */
int printHeader, /* display headers? */
int quiet);
extern void PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
int printAttName, /* print attribute names */
int terseOutput, /* delimiter bars */
int width); /* width of column, if
* 0, use variable width */
#endif
/* === in fe-lobj.c === */
......@@ -361,6 +345,14 @@ extern "C"
extern Oid lo_import(PGconn *conn, const char *filename);
extern int lo_export(PGconn *conn, Oid lobjId, const char *filename);
/* === in fe-misc.c === */
/* Determine length of multibyte encoded char at *s */
extern int PQmblen(const unsigned char *s, int encoding);
/* Get encoding id from environment variable PGCLIENTENCODING */
extern int PQenv2encoding(void);
#ifdef __cplusplus
};
......
......@@ -93,10 +93,10 @@ ERROR: renameatt: attribute "oid" exists
-- not in a xact
abort;
NOTICE: UserAbortTransactionBlock and not in in-progress state
NOTICE: ROLLBACK: no transaction in progress
-- not in a xact
end;
NOTICE: EndTransactionBlock and not inprogress/abort state
NOTICE: COMMIT: no transaction in progress
--
-- DEFINE AGGREGATE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment