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
This commit is contained in:
Peter Eisentraut 2000-01-29 16:58:54 +00:00
parent 7e7416bd4e
commit 2b84cbb60f
49 changed files with 821 additions and 870 deletions

View File

@ -274,8 +274,8 @@ PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
</para> </para>
<para> <para>
To begin, call conn=PQconnectStart("&lt;connection_info_string&gt;"). If To begin, call <literal>conn=PQconnectStart("&lt;connection_info_string&gt;")</literal>.
conn is NULL, then libpq has been unable to allocate a new PGconn 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 structure. Otherwise, a valid PGconn pointer is returned (though not yet
representing a valid connection to the database). On return from representing a valid connection to the database). On return from
PQconnectStart, call status=PQstatus(conn). If status equals PQconnectStart, call status=PQstatus(conn). If status equals
@ -1019,6 +1019,9 @@ const char * PQcmdTuples(const PGresult *res);
<synopsis> <synopsis>
Oid PQoidValue(const PGresult *res); Oid PQoidValue(const PGresult *res);
</synopsis> </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> </para>
</listitem> </listitem>
@ -1031,7 +1034,8 @@ Oid PQoidValue(const PGresult *res);
<synopsis> <synopsis>
const char * PQoidStatus(const PGresult *res); const char * PQoidStatus(const PGresult *res);
</synopsis> </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> </para>
</listitem> </listitem>
@ -1045,57 +1049,25 @@ void PQprint(FILE* fout, /* output stream */
const PGresult *res, const PGresult *res,
const PQprintOpt *po); const PQprintOpt *po);
struct _PQprintOpt { struct {
pqbool header; /* print output field headings and row count */ int header; /* print output field headings and row count */
pqbool align; /* fill align the fields */ int align; /* fill align the fields */
pqbool standard; /* old brain dead format */ int standard; /* old brain dead format */
pqbool html3; /* output html tables */ int html3; /* output html tables */
pqbool expanded; /* expand tables */ int expanded; /* expand tables */
pqbool pager; /* use pager for output if needed */ int pager; /* use pager for output if needed */
char *fieldSep; /* field separator */ char *fieldSep; /* field separator */
char *tableOpt; /* insert to HTML &lt;table ...&gt; */ char *tableOpt; /* insert to HTML &lt;table ...&gt; */
char *caption; /* HTML &lt;caption&gt; */ char *caption; /* HTML &lt;caption&gt; */
char **fieldName; /* null terminated array of replacement field names */ char **fieldName; /* null terminated array of replacement field names */
} } PQprintOpt;
</synopsis> </synopsis>
This function is intended to replace PQprintTuples(), which is This function was formerly used by <application>psql</application>
now obsolete. The <filename>psql</filename> program uses to print query results, but this is no longer the case and this
<function>PQprint()</function> to display query results. function is no longer supported.
</para> </para>
</listitem> </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>
<listitem> <listitem>
<para> <para>

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -52,7 +52,7 @@ ABORT [ WORK | TRANSACTION ]
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
ABORT ROLLBACK
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -62,8 +62,8 @@ ABORT
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
NOTICE: UserAbortTransactionBlock and not in in-progress state NOTICE: ROLLBACK: no transaction in progress
ABORT ROLLBACK
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -130,7 +130,7 @@ ABORT WORK;
SQL92 SQL92
</title> </title>
<para> <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> for historical reasons. <command>ROLLBACK</command> is the <acronym>SQL92</acronym>
equivalent command. equivalent command.
</para> </para>

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.9 2000/01/09 17:35:27 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.10 2000/01/29 16:58:27 petere Exp $
Postgres documentation Postgres documentation
--> -->
@ -23,11 +23,14 @@ Postgres documentation
<date>1999-07-20</date> <date>1999-07-20</date>
</refsynopsisdivinfo> </refsynopsisdivinfo>
<synopsis> <synopsis>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER TABLE <replaceable class="PARAMETER">table</replaceable> [ * ]
[ * ] ADD [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> <replaceable ADD [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> <replaceable
class="PARAMETER">type</replaceable> class="PARAMETER">type</replaceable>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER TABLE <replaceable class="PARAMETER">table</replaceable> [ * ]
[ * ] RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> { SET DEFAULT <replaceable
class="PARAMETER">value</replaceable> | DROP DEFAULT }
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> [ * ]
RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable
class="PARAMETER">newcolumn</replaceable> class="PARAMETER">newcolumn</replaceable>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
RENAME TO <replaceable class="PARAMETER">newtable</replaceable> RENAME TO <replaceable class="PARAMETER">newtable</replaceable>
@ -82,7 +85,7 @@ ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
<term><replaceable class="PARAMETER"> newtable </replaceable></term> <term><replaceable class="PARAMETER"> newtable </replaceable></term>
<listitem> <listitem>
<para> <para>
New name for an existing column. New name for the table.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -101,9 +104,7 @@ ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>ALTER</computeroutput></term>
ALTER
</computeroutput></term>
<listitem> <listitem>
<para> <para>
Message returned from column or table renaming. Message returned from column or table renaming.
@ -112,20 +113,7 @@ ALTER
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>ERROR</computeroutput></term>
NEW
</computeroutput></term>
<listitem>
<para>
Message returned from column addition.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><computeroutput>
ERROR
</computeroutput></term>
<listitem> <listitem>
<para> <para>
Message returned if table or column is not available. Message returned if table or column is not available.
@ -146,9 +134,12 @@ ERROR
</title> </title>
<para> <para>
<command>ALTER TABLE</command> changes the definition of an existing table. <command>ALTER TABLE</command> changes the definition of an existing table.
The new columns and their types are specified in the same style The <literal>ADD COLUMN</literal> form adds a new column to the table
and with the the same restrictions as in <command>CREATE TABLE</command>. using the same syntax as <xref linkend="SQL-CREATETABLE"
The RENAME clause causes the name of a table or column endterm="SQL-CREATETABLE-title">. The <literal>ALTER COLUMN</literal> form
allows you to set or remove the default for the column. Note that defaults
only apply to newly inserted rows.
The <literal>RENAME</literal> clause causes the name of a table or column
to change without changing any of the data contained in to change without changing any of the data contained in
the affected table. Thus, the table or column will the affected table. Thus, the table or column will
remain of the same type and size after this command is remain of the same type and size after this command is
@ -189,13 +180,12 @@ SELECT <replaceable>NewColumn</replaceable> FROM <replaceable>SuperClass</replac
</para> </para>
<para> <para>
For efficiency reasons, default values for added attributes are In the current implementation, default and constraint clauses for the
not placed in existing instances of a class. new column will be ignored. You can use the <literal>SET DEFAULT</literal>
That is, existing instances will have NULL values in the new form of <command>ALTER TABLE</command> to set the default later.
attributes. If non-NULL values are desired, a subsequent (You will also have to update the already existing rows to the
<command>UPDATE</command> query new default value, using <xref linkend="sql-update-title"
(<xref linkend="sql-update-title" endterm="sql-update-title">) endterm="sql-update-title">.)
should be run.
</para> </para>
<para> <para>
@ -248,87 +238,38 @@ ALTER TABLE distributors RENAME TO suppliers;
<refsect2info> <refsect2info>
<date>1998-04-15</date> <date>1998-04-15</date>
</refsect2info> </refsect2info>
<title> <title>SQL92</title>
SQL92 <para>
</title> The <literal>ADD COLUMN</literal> form is compliant with the exception that
<para> it does not support defaults and constraints, as explained above.
<command>ALTER TABLE/RENAME</command> The <literal>ALTER COLUMN</literal> form is in full compliance.
is a <productname>Postgres</productname> language extension. </para>
</para>
<para> <para>
SQL92 specifies some additional capabilities for <command>ALTER TABLE</command> SQL92 specifies some additional capabilities for <command>ALTER TABLE</command>
statement which are not yet directly supported by statement which are not yet directly supported by <productname>PostgreSQL</productname>:
<productname>Postgres</productname>:
</para>
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term> <term>
<synopsis> <synopsis>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER [ ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ADD <replaceable class="PARAMETER">table constraint definition</replaceable>
COLUMN ] <replaceable class="PARAMETER">column</replaceable> ALTER TABLE <replaceable class="PARAMETER">table</replaceable> DROP CONSTRAINT <replaceable class="PARAMETER">constraint</replaceable> { RESTRICT | CASCADE }
SET DEFAULT <replaceable class="PARAMETER">default</replaceable>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER [
COLUMN ] <replaceable class="PARAMETER">column</replaceable>
ADD [ CONSTRAINT <replaceable class="PARAMETER">>constrain</replaceable>> ] <replaceable
class="PARAMETER">table-constraint</replaceable>
</synopsis> </synopsis>
</term> </term>
<listitem> <listitem>
<para> <para>
Puts the default value or constraint specified into the Adds or removes a table constraint (such as a check constraint,
definition of column in the table. unique constraint, or foreign key constraint). To create
See <command>CREATE TABLE</command> for the or remove a unique constraint, create or drop a unique index,
syntax of the default and table-constraint clauses. respectively (see <xref linkend="SQL-CREATEINDEX" endterm="SQL-CREATEINDEX-title">).
If a default clause already exists, it will be replaced by To change other kinds of constraints you need to recreate
the new definition. If any constraints on this column already and reload the table, using other parameters to the
exist, they will be retained using a boolean AND with the new <xref linkend="SQL-CREATETABLE" endterm="SQL-CREATETABLE-title">
constraint. command.
</para> </para>
<para> <para>
Currently, to set new default constraints on an existing column For example, to drop any constraints on a table <literal>distributors</literal>:
the table must be recreated and reloaded:
<programlisting>
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
did DECIMAL(3) DEFAULT 1,
name VARCHAR(40) NOT NULL,
city VARCHAR(30)
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
DROP DEFAULT <replaceable class="PARAMETER">default</replaceable>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
DROP CONSTRAINT <replaceable class="PARAMETER">constraint</replaceable> { RESTRICT | CASCADE }
</synopsis>
</term>
<listitem>
<para>
Removes the default value specified by default or the rule
specified by constraint from the definition of a table.
If RESTRICT is specified only a constraint with no dependent
constraints can be destroyed.
If CASCADE is specified, Any constraints that are dependent on
this constraint are also dropped.
</para>
<para>
Currently, to remove a default value or constraints on an
existing column the table must be recreated and reloaded:
<programlisting> <programlisting>
CREATE TABLE temp AS SELECT * FROM distributors; CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors; DROP TABLE distributors;
@ -342,23 +283,14 @@ DROP TABLE temp;
<varlistentry> <varlistentry>
<term> <term>
<synopsis> <synopsis>
ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ALTER TABLE <replaceable class="PARAMETER">table</replaceable> DROP [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> { RESTRICT | CASCADE }
DROP [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> { RESTRICT | CASCADE }
</synopsis> </synopsis>
</term> </term>
<listitem> <listitem>
<para> <para>
Removes a column from a table. Removes a column from a table.
If RESTRICT is specified only a column with no dependent
objects can be destroyed.
If CASCADE is specified, all objects that are dependent on
this column are also dropped.
</para>
<para>
Currently, to remove an existing column the table must be Currently, to remove an existing column the table must be
recreated and reloaded: recreated and reloaded:
<programlisting> <programlisting>
CREATE TABLE temp AS SELECT did, city FROM distributors; CREATE TABLE temp AS SELECT did, city FROM distributors;
DROP TABLE distributors; DROP TABLE distributors;
@ -373,6 +305,13 @@ DROP TABLE temp;
</listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
</para>
<para>
The clauses to rename columns and tables are <productname>PostgreSQL</productname>
extensions. SQL92 does not provide for them.
</para>
</refsect2> </refsect2>
</refsect1> </refsect1>
</refentry> </refentry>

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -72,7 +72,7 @@ BEGIN
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
NOTICE: BeginTransactionBlock and not in default state NOTICE: BEGIN: already a transaction in progress
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -95,7 +95,7 @@ NOTICE: BeginTransactionBlock and not in default state
</title> </title>
<para> <para>
By default, <productname>Postgres</productname> executes transactions By default, <productname>PostgreSQL</productname> executes transactions
in <firstterm>unchained mode</firstterm> in <firstterm>unchained mode</firstterm>
(also known as <quote>autocommit</quote> in other database (also known as <quote>autocommit</quote> in other database
systems). systems).
@ -116,7 +116,7 @@ NOTICE: BeginTransactionBlock and not in default state
<para> <para>
The default transaction isolation level in The default transaction isolation level in
<productname>Postgres</productname> <productname>PostgreSQL</productname>
is READ COMMITTED, where queries inside the transaction see only changes is READ COMMITTED, where queries inside the transaction see only changes
committed before query execution. So, you have to use committed before query execution. So, you have to use
<command>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE</command> <command>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE</command>
@ -128,7 +128,7 @@ NOTICE: BeginTransactionBlock and not in default state
</para> </para>
<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 will ensure either that all updates are done or else that none of
them are done. Transactions have the standard <acronym>ACID</acronym> them are done. Transactions have the standard <acronym>ACID</acronym>
(atomic, consistent, isolatable, and durable) property. (atomic, consistent, isolatable, and durable) property.
@ -141,11 +141,6 @@ NOTICE: BeginTransactionBlock and not in default state
<title> <title>
Notes Notes
</title> </title>
<para>
The keyword TRANSACTION is just a cosmetic alternative to WORK.
Neither keyword need be specified.
</para>
<para> <para>
Refer to <xref linkend="sql-lock-title" endterm="sql-lock-title"> Refer to <xref linkend="sql-lock-title" endterm="sql-lock-title">
for further information for further information
@ -190,7 +185,7 @@ BEGIN WORK;
<para> <para>
<command>BEGIN</command> <command>BEGIN</command>
is a <productname>Postgres</productname> language extension. is a <productname>PostgreSQL</productname> language extension.
There is no explicit <command>BEGIN</command> There is no explicit <command>BEGIN</command>
command in <acronym>SQL92</acronym>; command in <acronym>SQL92</acronym>;
transaction initiation is always implicit and it terminates either transaction initiation is always implicit and it terminates either
@ -204,6 +199,12 @@ BEGIN WORK;
</note> </note>
</para> </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> <para>
<acronym>SQL92</acronym> also requires SERIALIZABLE to be the default <acronym>SQL92</acronym> also requires SERIALIZABLE to be the default
transaction isolation level. transaction isolation level.

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -62,7 +62,7 @@ COMMIT [ WORK | TRANSACTION ]
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
END COMMIT
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -72,7 +72,7 @@ END
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
NOTICE EndTransactionBlock and not inprogress/abort state NOTICE: COMMIT: no transaction in progress
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -141,7 +141,8 @@ COMMIT WORK;
SQL92 SQL92
</title> </title>
<para> <para>
Full compatibility. <acronym>SQL92</acronym> only specifies the two forms <literal>COMMIT</literal>
and <literal>COMMIT WORK</literal>. Otherwise full compatibility.
</para> </para>
</refsect2> </refsect2>
</refsect1> </refsect1>

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -62,7 +62,7 @@ END [ WORK | TRANSACTION ]
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
END COMMIT
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -72,7 +72,7 @@ END
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
NOTICE EndTransactionBlock and not inprogress/abort state NOTICE: COMMIT: no transaction in progress
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -94,7 +94,7 @@ NOTICE EndTransactionBlock and not inprogress/abort state
</title> </title>
<para> <para>
<command>END</command> is a <productname>Postgres</productname> <command>END</command> is a <productname>PostgreSQL</productname>
synonym for synonym for
<xref linkend="sql-commit-title" endterm="sql-commit-title">. <xref linkend="sql-commit-title" endterm="sql-commit-title">.
</para> </para>
@ -144,7 +144,7 @@ END WORK;
</title> </title>
<para> <para>
<command>END</command> is a <productname>Postgres</productname> <command>END</command> is a <productname>PostgreSQL</productname>
extension which provides functionality equivalent to extension which provides functionality equivalent to
<xref linkend="sql-commit-title" endterm="sql-commit-title">. <xref linkend="sql-commit-title" endterm="sql-commit-title">.
</para> </para>

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -1944,7 +1944,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<varlistentry> <varlistentry>
<term><literal>%#</literal></term> <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> <quote>#</quote>, otherwise a <quote>&gt;</quote>.</para></listitem>
</varlistentry> </varlistentry>
@ -2020,10 +2020,9 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<para> <para>
Before starting up in interactive mode, <application>psql</application> attempts Before starting up in interactive mode, <application>psql</application> attempts
to read and execute the files <filename>/etc/psqlrc</filename> and to read and execute commands from the file <filename>$HOME/.psqlrc</filename>. It
<filename>$HOME/.psqlrc</filename>. They could be used to set up the client or could be used to set up the client or the server to taste (using the <command>\set
the server to taste (using the <command>\set</command> and <command>SET</command> </command> and <command>SET</command> commands).
commands).
</para> </para>
</refsect2> </refsect2>
@ -2034,7 +2033,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<para> <para>
<application>psql</application> supports the readline and history libraries for <application>psql</application> supports the readline and history libraries for
convenienent line editing and retrieval. The command history is stored in a file 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. <application>psql</application> starts up.
Tab-completion is also supported, although Tab-completion is also supported, although
the completion logic makes no claim to be an <acronym>SQL</acronym> parser. 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. Notice the changing prompt.
<programlisting> <programlisting>
testdb=> <userinput>CREATE TABLE my_table (</userinput> 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> second text</userinput>
testdb-> <userinput>);</userinput> testdb-> <userinput>);</userinput>
CREATE CREATE
@ -2096,11 +2095,11 @@ CREATE
Now look at the table definition again: Now look at the table definition again:
<programlisting> <programlisting>
testdb=> <userinput>\d my_table</userinput> testdb=> <userinput>\d my_table</userinput>
Table "my_table" Table "my_table"
Attribute | Type | Info Attribute | Type | Modifier
-----------+------+-------------------- -----------+---------+--------------------
first | int4 | not null default 0 first | integer | not null default 0
second | text | second | text |
</programlisting> </programlisting>
At this point you decide to change the prompt to something more At this point you decide to change the prompt to something more

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -61,8 +61,7 @@ ABORT
<varlistentry> <varlistentry>
<term><computeroutput> <term><computeroutput>
NOTICE: UserAbortTransactionBlock and not in in-progress state NOTICE: ROLLBACK: no transaction in progress
ABORT
</computeroutput></term> </computeroutput></term>
<listitem> <listitem>
<para> <para>
@ -95,10 +94,6 @@ ABORT
<title> <title>
Notes Notes
</title> </title>
<para>
The keywords WORK and TRANSACTION are noise and can be omitted.
</para>
<para> <para>
Use <xref linkend="SQL-COMMIT-TITLE" endterm="SQL-COMMIT-TITLE"> Use <xref linkend="SQL-COMMIT-TITLE" endterm="SQL-COMMIT-TITLE">
to successfully terminate a transaction. to successfully terminate a transaction.
@ -134,8 +129,8 @@ ROLLBACK WORK;
SQL92 SQL92
</title> </title>
<para> <para>
Full compatibility. The TRANSACTION keyword is a <acronym>SQL92</acronym> only specifies the two forms <literal>ROLLBACK</literal>
<productname>Postgres</productname> extension. and <literal>ROLLBACK WORK</literal>. Otherwise full compatibility.
</para> </para>
</refsect2> </refsect2>
</refsect1> </refsect1>

View File

@ -1,5 +1,5 @@
<!-- <!--
$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 Postgres documentation
--> -->
@ -23,7 +23,7 @@ Postgres documentation
<date>1999-07-20</date> <date>1999-07-20</date>
</refsynopsisdivinfo> </refsynopsisdivinfo>
<synopsis> <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> ] [ FROM <replaceable class="PARAMETER">fromlist</replaceable> ]
[ WHERE <replaceable class="PARAMETER">condition</replaceable> ] [ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
</synopsis> </synopsis>

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* Transaction aborts can now occur two ways: * Transaction aborts can now occur two ways:
@ -1331,7 +1331,7 @@ BeginTransactionBlock(void)
return; return;
if (s->blockState != TBLOCK_DEFAULT) 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 * set the current transaction block state information
@ -1404,7 +1404,7 @@ EndTransactionBlock(void)
* default state. * default state.
* ---------------- * ----------------
*/ */
elog(NOTICE, "EndTransactionBlock and not inprogress/abort state "); elog(NOTICE, "COMMIT: no transaction in progress");
s->blockState = TBLOCK_ENDABORT; s->blockState = TBLOCK_ENDABORT;
} }
@ -1516,13 +1516,13 @@ UserAbortTransactionBlock()
/* ---------------- /* ----------------
* this case should not be possible, because it would mean * 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 * So we print an error message, abort the transaction and
* enter the "ENDABORT" state so we will end up in the default * enter the "ENDABORT" state so we will end up in the default
* state after the upcoming CommitTransactionCommand(). * state after the upcoming CommitTransactionCommand().
* ---------------- * ----------------
*/ */
elog(NOTICE, "UserAbortTransactionBlock and not in in-progress state"); elog(NOTICE, "ROLLBACK: no transaction in progress");
AbortTransaction(); AbortTransaction();
s->blockState = TBLOCK_ENDABORT; s->blockState = TBLOCK_ENDABORT;
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* The PortalExecutorHeapMemory crap needs to be eliminated * The PortalExecutorHeapMemory crap needs to be eliminated
@ -301,7 +301,6 @@ AlterTableAddColumn(const char *relationName,
Relation idescs[Num_pg_attr_indices]; Relation idescs[Num_pg_attr_indices];
Relation ridescs[Num_pg_class_indices]; Relation ridescs[Num_pg_class_indices];
bool hasindex; bool hasindex;
// List *rawDefaults = NIL;
/* /*
* permissions checking. this would normally be done in utility.c, * permissions checking. this would normally be done in utility.c,
@ -386,9 +385,9 @@ AlterTableAddColumn(const char *relationName,
/* /*
* XXX is the following check sufficient? * 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); relationName);
} }
@ -429,7 +428,7 @@ AlterTableAddColumn(const char *relationName,
0, 0); 0, 0);
if (HeapTupleIsValid(tup)) 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); colDef->colname, relationName);
/* /*
@ -627,14 +626,12 @@ AlterTableAlterColumn(const char *relationName,
/* keep the system catalog indices current */ /* keep the system catalog indices current */
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations); CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
CatalogIndexInsert(irelations, Num_pg_attr_indices, attr_rel, newtuple); 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 */ /* get rid of actual default definition */
drop_default(myrelid, attnum); 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_endscan(scan);
heap_close(attr_rel, NoLock); heap_close(attr_rel, NoLock);
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, static bool checkAttrExists(const char *attributeName,
char *attributeType, List *schema); const char *attributeType, List *schema);
static List *MergeAttributes(List *schema, List *supers, List **supconstr); static List *MergeAttributes(List *schema, List *supers, List **supconstr);
static void StoreCatalogInheritance(Oid relationId, List *supers); static void StoreCatalogInheritance(Oid relationId, List *supers);
@ -291,7 +291,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
if (!strcmp(coldef->colname, restdef->colname)) if (!strcmp(coldef->colname, restdef->colname))
{ {
elog(ERROR, "attribute '%s' duplicated", elog(ERROR, "CREATE TABLE: attribute \"%s\" duplicated",
coldef->colname); coldef->colname);
} }
} }
@ -304,7 +304,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
{ {
if (!strcmp(strVal(lfirst(entry)), strVal(lfirst(rest)))) if (!strcmp(strVal(lfirst(entry)), strVal(lfirst(rest))))
{ {
elog(ERROR, "relation '%s' duplicated", elog(ERROR, "CREATE TABLE: inherited relation \"%s\" duplicated",
strVal(lfirst(entry))); strVal(lfirst(entry)));
} }
} }
@ -326,9 +326,8 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
tupleDesc = RelationGetDescr(relation); tupleDesc = RelationGetDescr(relation);
constr = tupleDesc->constr; constr = tupleDesc->constr;
/* XXX shouldn't this test be stricter? No indexes, for example? */ if (relation->rd_rel->relkind != RELKIND_RELATION)
if (relation->rd_rel->relkind == 'S') elog(ERROR, "CREATE TABLE: inherited relation \"%s\" is not a table", name);
elog(ERROR, "MergeAttr: Can't inherit from sequence superclass '%s'", name);
for (attrno = relation->rd_rel->relnatts - 1; attrno >= 0; attrno--) for (attrno = relation->rd_rel->relnatts - 1; attrno >= 0; attrno--)
{ {
@ -353,15 +352,15 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
* check validity * check validity
* *
*/ */
if (checkAttrExists(attributeName, attributeType, inhSchema) || if (checkAttrExists(attributeName, attributeType, schema))
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 * this entry already exists
*/ */
continue; continue;
}
/* /*
* add an entry to the schema * add an entry to the schema
@ -629,11 +628,13 @@ again:
heap_close(relation, RowExclusiveLock); 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 static bool
checkAttrExists(char *attributeName, char *attributeType, List *schema) checkAttrExists(const char *attributeName, const char *attributeType, List *schema)
{ {
List *s; List *s;
@ -641,19 +642,16 @@ checkAttrExists(char *attributeName, char *attributeType, List *schema)
{ {
ColumnDef *def = lfirst(s); ColumnDef *def = lfirst(s);
if (!strcmp(attributeName, def->colname)) if (strcmp(attributeName, def->colname)==0)
{ {
/* /*
* attribute exists. Make sure the types are the same. * attribute exists. Make sure the types are the same.
*/ */
if (strcmp(attributeType, def->typename->name) != 0) if (strcmp(attributeType, def->typename->name) != 0)
{ elog(ERROR, "CREATE TABLE: attribute \"%s\" type conflict (%s and %s)",
elog(ERROR, "%s and %s conflict for %s", attributeName, attributeType, def->typename->name);
attributeType, def->typename->name, attributeName); return true;
}
return 1;
} }
} }
return 0; return false;
} }

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -832,14 +832,14 @@ AlterTableStmt:
$$ = (Node *)n; $$ = (Node *)n;
} }
/* ALTER TABLE <name> DROP [COLUMN] <name> {RESTRICT|CASCADE} */ /* 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); AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'D'; n->subtype = 'D';
n->relname = $3; n->relname = $3;
n->inh = $4; n->inh = $4;
n->name = $7; n->name = $7;
/* n->behavior = $8; */ n->behavior = $8;
$$ = (Node *)n; $$ = (Node *)n;
} }
/* ALTER TABLE <name> ADD CONSTRAINT ... */ /* ALTER TABLE <name> ADD CONSTRAINT ... */
@ -856,7 +856,7 @@ AlterTableStmt:
| ALTER TABLE relation_name opt_inh_star DROP CONSTRAINT name drop_behavior | ALTER TABLE relation_name opt_inh_star DROP CONSTRAINT name drop_behavior
{ {
AlterTableStmt *n = makeNode(AlterTableStmt); AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'X'; n->subtype = 'X';
n->relname = $3; n->relname = $3;
n->inh = $4; n->inh = $4;
n->name = $7; n->name = $7;
@ -866,7 +866,8 @@ AlterTableStmt:
; ;
alter_column_action: alter_column_action:
SET DEFAULT a_expr_or_null { $$ = $3; } SET DEFAULT a_expr { $$ = $3; }
| SET DEFAULT NULL_P { $$ = NULL; }
| DROP DEFAULT { $$ = NULL; } | DROP DEFAULT { $$ = NULL; }
; ;
@ -2531,19 +2532,15 @@ UnlistenStmt: UNLISTEN relation_name
* *
* Transactions: * Transactions:
* *
* abort transaction * BEGIN / COMMIT / ROLLBACK
* (ABORT) * (also older versions END / ABORT)
* begin transaction
* (BEGIN)
* end transaction
* (END)
* *
*****************************************************************************/ *****************************************************************************/
TransactionStmt: ABORT_TRANS opt_trans TransactionStmt: ABORT_TRANS opt_trans
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->command = ABORT_TRANS; n->command = ROLLBACK;
$$ = (Node *)n; $$ = (Node *)n;
} }
| BEGIN_TRANS opt_trans | BEGIN_TRANS opt_trans
@ -2555,19 +2552,19 @@ TransactionStmt: ABORT_TRANS opt_trans
| COMMIT opt_trans | COMMIT opt_trans
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->command = END_TRANS; n->command = COMMIT;
$$ = (Node *)n; $$ = (Node *)n;
} }
| END_TRANS opt_trans | END_TRANS opt_trans
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->command = END_TRANS; n->command = COMMIT;
$$ = (Node *)n; $$ = (Node *)n;
} }
| ROLLBACK opt_trans | ROLLBACK opt_trans
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->command = ABORT_TRANS; n->command = ROLLBACK;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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()) \ if (IsAbortedTransactionBlockState()) \
{ \ { \
elog(NOTICE, "(transaction aborted): %s", \ elog(NOTICE, "current transaction is aborted, " \
"all queries ignored until end of transaction block"); \ "queries ignored until end of transaction block"); \
commandTag = "*ABORT STATE*"; \ commandTag = "*ABORT STATE*"; \
break; \ break; \
} \ } \
@ -98,13 +98,13 @@ ProcessUtility(Node *parsetree,
BeginTransactionBlock(); BeginTransactionBlock();
break; break;
case END_TRANS: case COMMIT:
PS_SET_STATUS(commandTag = "END"); PS_SET_STATUS(commandTag = "COMMIT");
EndTransactionBlock(); EndTransactionBlock();
break; break;
case ABORT_TRANS: case ROLLBACK:
PS_SET_STATUS(commandTag = "ABORT"); PS_SET_STATUS(commandTag = "ROLLBACK");
UserAbortTransactionBlock(); UserAbortTransactionBlock();
break; break;
} }
@ -278,17 +278,16 @@ ProcessUtility(Node *parsetree,
{ {
RenameStmt *stmt = (RenameStmt *) parsetree; RenameStmt *stmt = (RenameStmt *) parsetree;
PS_SET_STATUS(commandTag = "RENAME"); PS_SET_STATUS(commandTag = "ALTER");
CHECK_IF_ABORTED(); CHECK_IF_ABORTED();
relname = stmt->relname; relname = stmt->relname;
if (!allowSystemTableMods && IsSystemRelationName(relname)) if (!allowSystemTableMods && IsSystemRelationName(relname))
elog(ERROR, "class \"%s\" is a system catalog", elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
relname); relname);
#ifndef NO_SECURITY #ifndef NO_SECURITY
if (!pg_ownercheck(userName, relname, RELNAME)) if (!pg_ownercheck(userName, relname, RELNAME))
elog(ERROR, "you do not own class \"%s\"", elog(ERROR, "permission denied");
relname);
#endif #endif
/* ---------------- /* ----------------
@ -335,7 +334,7 @@ ProcessUtility(Node *parsetree,
{ {
AlterTableStmt *stmt = (AlterTableStmt *) parsetree; AlterTableStmt *stmt = (AlterTableStmt *) parsetree;
PS_SET_STATUS(commandTag = "ALTER TABLE"); PS_SET_STATUS(commandTag = "ALTER");
CHECK_IF_ABORTED(); CHECK_IF_ABORTED();
/* /*

View File

@ -26,7 +26,7 @@
# #
# #
# IDENTIFICATION # 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*) -E*)
MULTIBYTE=`echo $1 | sed 's/^-E//'` MULTIBYTE=`echo $1 | sed 's/^-E//'`
;; ;;
-*)
echo "$CMDNAME: invalid option: $1"
echo "Try -? for help."
exit 1
;;
*) *)
PGDATA=$1 PGDATA=$1
;; ;;
@ -218,15 +223,15 @@ if [ "$usage" ]; then
echo " $CMDNAME [options] datadir" echo " $CMDNAME [options] datadir"
echo echo
echo "Options:" 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" echo " -W, --pwprompt Prompt for a password for the new superuser's"
if [ -n "$MULTIBYTE" ] if [ -n "$MULTIBYTE" ]
then 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 fi
echo " -i, --sysid <sysid> Database sysid for the superuser" echo " -i, --sysid <sysid> Database sysid for the superuser"
echo "Less commonly used options: " 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 " -t, --template Re-initialize template database only"
echo " -d, --debug Generate lots of debugging output" echo " -d, --debug Generate lots of debugging output"
echo " -n, --noclean Do not clean up after errors" echo " -n, --noclean Do not clean up after errors"

View File

@ -22,7 +22,7 @@
* *
* *
* IDENTIFICATION * 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 * 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("pg_dump (PostgreSQL) " PG_RELEASE "." PG_VERSION "." PG_SUBVERSION);
puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc"); puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc");
puts("Portions Copyright (C) 1996 Regents of the University of California"); 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 '?': case '?':
/* getopt returns '?' on unknown argument. That's not /* getopt returns '?' on unknown argument. That's not
quite what we want */ quite what we want */
if (strcmp(argv[optind-1], "-?")==0) if (strcmp(argv[optind-1], "-?")==0 || strcmp(argv[optind-1], "--help")==0)
{ {
help(progname); help(progname);
exit(1); exit(1);

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "command.h" #include "command.h"
@ -361,7 +361,7 @@ exec_command(const char *cmd,
switch (cmd[1]) switch (cmd[1])
{ {
case '\0': case '\0':
case '?': case '+':
if (options[0]) if (options[0])
success = describeTableDetails(options[0], show_verbose); success = describeTableDetails(options[0], show_verbose);
else 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, "HOST", PQhost(pset.db));
SetVariable(pset.vars, "PORT", PQport(pset.db)); SetVariable(pset.vars, "PORT", PQport(pset.db));
pset.issuper = test_superuser(PQuser(pset.db));
return success; 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 * do_edit -- handler for \e
* *

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef COMMAND_H
#define COMMAND_H #define COMMAND_H
@ -36,6 +36,9 @@ HandleSlashCmds(const char *line,
bool bool
process_file(char *filename); process_file(char *filename);
bool
test_superuser(const char * username);
bool bool
do_pset(const char *param, do_pset(const char *param,
const char *value, const char *value,

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "common.h" #include "common.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef COMMON_H
#define COMMON_H #define COMMON_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "copy.h" #include "copy.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef COPY_H
#define COPY_H #define COPY_H

View File

@ -1,18 +1,22 @@
#!/usr/bin/perl #! /usr/bin/perl
#################################################################
# create_help.pl -- converts SGML docs to internal psql help
#
# Copyright 2000 by PostgreSQL Global Development Group
#
# $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 # This script automatically generates the help on SQL in psql from
# SGML docs. So far the format of the docs was consistent enough that # the SGML docs. So far the format of the docs was consistent
# this worked, but this here is my no means an SGML parser. # enough that this worked, but this here is my no means an SGML
# # parser.
# 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.
# #
# Call: perl create_help.pl sql_help.h # 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
# The name of the header file doesn't matter to this script, but it sure # sure does matter to the rest of the source.
# does matter to the rest of the source.
# #
# A rule for this is also in the psql makefile. # 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 print OUT
"/* "/*
* This file is automatically generated from the SGML documentation. * *** Do not change this file directly. Changes will be overwritten. ***
* Direct changes here will be overwritten. *
* This file was generated by
* $^X $0 $outputfile
* from the DocBook documentation in
* $docdir
*
*/ */
#ifndef $define #ifndef $define
#define $define #define $define
@ -76,7 +86,7 @@ foreach $file (sort readdir DIR) {
print OUT " { \"$cmdname\",\n \"$cmddesc\",\n \"$cmdsynopsis\" },\n\n"; print OUT " { \"$cmdname\",\n \"$cmddesc\",\n \"$cmdsynopsis\" },\n\n";
} }
else { 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";
} }
} }

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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.c,v 1.14 2000/01/20 15:29:20 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.15 2000/01/29 16:58:48 petere Exp $
*/ */
#include <c.h> #include <c.h>
#include "describe.h" #include "describe.h"
@ -504,7 +504,7 @@ xmalloc(size_t size)
tmp = malloc(size); tmp = malloc(size);
if (!tmp) if (!tmp)
{ {
perror("malloc"); psql_error("out of memory");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return tmp; return tmp;
@ -530,20 +530,20 @@ describeTableDetails(const char *name, bool desc)
/* truncate table name */ /* truncate table name */
if (strlen(name) > NAMEDATALEN) { if (strlen(name) > NAMEDATALEN) {
char *my_name = xmalloc(NAMEDATALEN+1); char *my_name = xmalloc(NAMEDATALEN+1);
strncpy(my_name, name, NAMEDATALEN); strncpy(my_name, name, NAMEDATALEN);
my_name[NAMEDATALEN] = '\0'; my_name[NAMEDATALEN] = '\0';
name = my_name; name = my_name;
} }
/* Get general table info */ /* Get general table info */
sprintf(buf, sprintf(buf,
"SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules\n" "SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules\n"
"FROM pg_class WHERE relname='%s'", "FROM pg_class WHERE relname='%s'",
name); name);
res = PSQLexec(buf); res = PSQLexec(buf);
if (!res) if (!res)
return false; return false;
/* Did we get anything? */ /* Did we get anything? */
if (PQntuples(res) == 0) if (PQntuples(res) == 0)
@ -567,15 +567,15 @@ describeTableDetails(const char *name, bool desc)
headers[1] = "Type"; headers[1] = "Type";
cols = 2; cols = 2;
if (tableinfo.relkind == 'r' || tableinfo.relkind == 's') if (tableinfo.relkind == 'r')
{ {
cols++; cols++;
headers[cols-1] = "Extra"; headers[cols-1] = "Modifier";
} }
if (desc) if (desc)
{ {
cols++; cols++;
headers[cols-1] = "Description"; headers[cols-1] = "Description";
} }
@ -598,19 +598,19 @@ describeTableDetails(const char *name, bool desc)
/* Check if table is a view */ /* Check if table is a view */
if (tableinfo.hasrules) { if (tableinfo.hasrules) {
PGresult *result; PGresult *result;
sprintf(buf, "SELECT definition FROM pg_views WHERE viewname = '%s'", name); sprintf(buf, "SELECT definition FROM pg_views WHERE viewname = '%s'", name);
result = PSQLexec(buf); result = PSQLexec(buf);
if (!result) if (!result)
{ {
PQclear(res); PQclear(res);
PQclear(result); PQclear(result);
return false; return false;
} }
if (PQntuples(result) > 0) if (PQntuples(result) > 0)
view_def = xstrdup(PQgetvalue(result, 0, 0)); view_def = xstrdup(PQgetvalue(result, 0, 0));
PQclear(result); PQclear(result);
} }
@ -621,115 +621,137 @@ describeTableDetails(const char *name, bool desc)
for (i = 0; i < PQntuples(res); i++) for (i = 0; i < PQntuples(res); i++)
{ {
int4 attypmod = atoi(PQgetvalue(res, i, 3)); int4 attypmod = atoi(PQgetvalue(res, i, 3));
const char *attype = PQgetvalue(res, i, 1); const char *attype = PQgetvalue(res, i, 1);
const char *typename;
bool isarray = false;
/* Name */ /* Name */
cells[i * cols + 0] = (char *)PQgetvalue(res, i, 0); /* don't free this afterwards */ cells[i * cols + 0] = (char *)PQgetvalue(res, i, 0); /* don't free this afterwards */
/* Type */ /* Type */
/* (convert some internal type names to "readable") */ if (attype[0] == '_')
{
isarray = true;
attype++;
}
/* (convert some internal type names to SQL'ish) */
if (strcmp(attype, "bpchar")==0)
typename = "char";
else if (strcmp(attype, "int2")==0)
typename = "smallint";
else if (strcmp(attype, "int4")==0)
typename = "integer";
else if (strcmp(attype, "int8")==0)
typename = "bigint";
else if (strcmp(attype, "bool")==0)
typename = "boolean";
else
typename = attype;
/* more might need to be added when date/time types are sorted out */
cells[i * cols + 1] = xmalloc(NAMEDATALEN + 16); cells[i * cols + 1] = xmalloc(NAMEDATALEN + 16);
if (strcmp(attype, "bpchar") == 0) if (strcmp(typename, "char") == 0)
sprintf(cells[i * cols + 1], "char(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 0); sprintf(cells[i * cols + 1], "char(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 1);
else if (strcmp(attype, "varchar") == 0) else if (strcmp(typename, "varchar") == 0)
sprintf(cells[i * cols + 1], "varchar(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 0); sprintf(cells[i * cols + 1], "varchar(%d)", attypmod != -1 ? attypmod - VARHDRSZ : 1);
else if (strcmp(attype, "numeric") == 0) else if (strcmp(typename, "numeric") == 0)
sprintf(cells[i * cols + 1], "numeric(%d,%d)", ((attypmod - VARHDRSZ) >> 16) & 0xffff, sprintf(cells[i * cols + 1], "numeric(%d,%d)", ((attypmod - VARHDRSZ) >> 16) & 0xffff,
(attypmod - VARHDRSZ) & 0xffff); (attypmod - VARHDRSZ) & 0xffff);
else if (attype[0] == '_')
sprintf(cells[i * cols + 1], "%s[]", attype + 1);
else else
strcpy(cells[i * cols + 1], attype); strcpy(cells[i * cols + 1], typename);
if (isarray)
strcat(cells[i * cols + 1], "[]");
/* Extra: not null and default */ /* Extra: not null and default */
/* (I'm cutting off the 'default' string at 128) */ /* (I'm cutting off the 'default' string at 128) */
if (tableinfo.relkind == 'r' || tableinfo.relkind == 's') if (tableinfo.relkind == 'r')
{ {
cells[i * cols + 2] = xmalloc(128 + 128); cells[i * cols + 2] = xmalloc(128 + 128);
cells[i * cols + 2][0] = '\0'; cells[i * cols + 2][0] = '\0';
if (strcmp(PQgetvalue(res, i, 4), "t") == 0) if (strcmp(PQgetvalue(res, i, 4), "t") == 0)
strcat(cells[i * cols + 2], "not null"); strcat(cells[i * cols + 2], "not null");
/* handle "default" here */ /* handle "default" here */
if (strcmp(PQgetvalue(res, i, 5), "t") == 0) if (strcmp(PQgetvalue(res, i, 5), "t") == 0)
{ {
PGresult *result; PGresult *result;
sprintf(buf, "SELECT substring(d.adsrc for 128) FROM pg_attrdef d, pg_class c\n" sprintf(buf, "SELECT substring(d.adsrc for 128) FROM pg_attrdef d, pg_class c\n"
"WHERE c.relname = '%s' AND c.oid = d.adrelid AND d.adnum = %s", "WHERE c.relname = '%s' AND c.oid = d.adrelid AND d.adnum = %s",
name, PQgetvalue(res, i, 6)); name, PQgetvalue(res, i, 6));
result = PSQLexec(buf); result = PSQLexec(buf);
if (!result) if (!result)
error = true; error = true;
else else
{ {
if (cells[i * cols + 2][0]) if (cells[i * cols + 2][0])
strcat(cells[i * cols + 2], " "); strcat(cells[i * cols + 2], " ");
strcat(cells[i * cols + 2], "default "); strcat(cells[i * cols + 2], "default ");
strcat(cells[i * cols + 2], PQgetvalue(result, 0, 0)); strcat(cells[i * cols + 2], PQgetvalue(result, 0, 0));
PQclear(result); PQclear(result);
} }
} }
} }
if (error)
break;
if (error)
break;
/* Description */ /* Description */
if (desc) if (desc)
cells[i * cols + cols-1] = (char*)PQgetvalue(res, i, 7); cells[i * cols + cols-1] = (char*)PQgetvalue(res, i, 7);
} }
/* Make title */ /* Make title */
title = xmalloc(20 + strlen(name)); title = xmalloc(22 + strlen(name));
switch (tableinfo.relkind) { switch (tableinfo.relkind) {
case 'r': case 'r':
if (view_def) if (view_def)
sprintf(title, "View \"%s\"", name); sprintf(title, "View \"%s\"", name);
else else
sprintf(title, "Table \"%s\"", name); sprintf(title, "Table \"%s\"", name);
break; break;
case 'S': case 'S':
sprintf(title, "Sequence \"%s\"", name); sprintf(title, "Sequence \"%s\"", name);
break; break;
case 'i': case 'i':
sprintf(title, "Index \"%s\"", name); sprintf(title, "Index \"%s\"", name);
break; break;
case 's': case 's':
sprintf(title, "System table \"%s\"", name); sprintf(title, "Special relation \"%s\"", name);
break; break;
default: default:
sprintf(title, "?%c?", tableinfo.relkind); sprintf(title, "?%c?", tableinfo.relkind);
} }
/* Make footers */ /* Make footers */
/* Information about the index */ /* Information about the index */
if (tableinfo.relkind == 'i') if (tableinfo.relkind == 'i')
{ {
PGresult * result; PGresult * result;
sprintf(buf, "SELECT i.indisunique, i.indisprimary, a.amname\n" sprintf(buf, "SELECT i.indisunique, i.indisprimary, a.amname\n"
"FROM pg_index i, pg_class c, pg_am a\n" "FROM pg_index i, pg_class c, pg_am a\n"
"WHERE i.indexrelid = c.oid AND c.relname = '%s' AND c.relam = a.oid", "WHERE i.indexrelid = c.oid AND c.relname = '%s' AND c.relam = a.oid",
name); name);
result = PSQLexec(buf); result = PSQLexec(buf);
if (!result) if (!result)
error = true; error = true;
else else
{ {
footers = xmalloc(2 * sizeof(*footers)); footers = xmalloc(2 * sizeof(*footers));
footers[0] = xmalloc(NAMEDATALEN + 32); footers[0] = xmalloc(NAMEDATALEN + 32);
sprintf(footers[0], "%s%s", sprintf(footers[0], "%s%s",
strcmp(PQgetvalue(result, 0, 0), "t")==0 ? "unique " : "", strcmp(PQgetvalue(result, 0, 0), "t")==0 ? "unique " : "",
PQgetvalue(result, 0, 2) PQgetvalue(result, 0, 2)
); );
if (strcmp(PQgetvalue(result, 0, 1), "t")==0) if (strcmp(PQgetvalue(result, 0, 1), "t")==0)
strcat(footers[0], " (primary key)"); strcat(footers[0], " (primary key)");
footers[1] = NULL; footers[1] = NULL;
} }
} }
/* Information about the view */ /* Information about the view */
else if (tableinfo.relkind == 'r' && view_def) else if (tableinfo.relkind == 'r' && view_def)
@ -743,131 +765,134 @@ describeTableDetails(const char *name, bool desc)
/* Information about the table */ /* Information about the table */
else if (tableinfo.relkind == 'r') else if (tableinfo.relkind == 'r')
{ {
PGresult *result1=NULL, *result2=NULL, *result3=NULL, *result4=NULL; PGresult *result1=NULL, *result2=NULL, *result3=NULL, *result4=NULL;
int index_count=0, constr_count=0, rule_count=0, trigger_count=0; int index_count=0, constr_count=0, rule_count=0, trigger_count=0;
int count_footers=0; int count_footers=0;
/* count indices */ /* count indices */
if (!error && tableinfo.hasindex) if (!error && tableinfo.hasindex)
{ {
sprintf(buf, "SELECT c2.relname\n" sprintf(buf, "SELECT c2.relname\n"
"FROM pg_class c, pg_class c2, pg_index i\n" "FROM pg_class c, pg_class c2, pg_index i\n"
"WHERE c.relname = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n" "WHERE c.relname = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
"ORDER BY c2.relname", "ORDER BY c2.relname",
name); name);
result1 = PSQLexec(buf); result1 = PSQLexec(buf);
if (!result1) if (!result1)
error = true; error = true;
else else
index_count = PQntuples(result1); index_count = PQntuples(result1);
} }
/* count table (and column) constraints */ /* count table (and column) constraints */
if (!error && tableinfo.checks) if (!error && tableinfo.checks)
{ {
sprintf(buf, "SELECT rcsrc\n" sprintf(buf, "SELECT rcsrc\n"
"FROM pg_relcheck r, pg_class c\n" "FROM pg_relcheck r, pg_class c\n"
"WHERE c.relname='%s' AND c.oid = r.rcrelid", "WHERE c.relname='%s' AND c.oid = r.rcrelid",
name); name);
result2 = PSQLexec(buf); result2 = PSQLexec(buf);
if (!result2) if (!result2)
error = true; error = true;
else else
constr_count = PQntuples(result2); constr_count = PQntuples(result2);
} }
/* count rules */ /* count rules */
if (!error && tableinfo.hasrules) if (!error && tableinfo.hasrules)
{ {
sprintf(buf, sprintf(buf,
"SELECT r.rulename\n" "SELECT r.rulename\n"
"FROM pg_rewrite r, pg_class c\n" "FROM pg_rewrite r, pg_class c\n"
"WHERE c.relname='%s' AND c.oid = r.ev_class", "WHERE c.relname='%s' AND c.oid = r.ev_class",
name); name);
result3 = PSQLexec(buf); result3 = PSQLexec(buf);
if (!result3) if (!result3)
error = true; error = true;
else else
rule_count = PQntuples(result3); rule_count = PQntuples(result3);
} }
/* count triggers */ /* count triggers */
if (!error && tableinfo.hasrules) if (!error && tableinfo.hasrules)
{ {
sprintf(buf, sprintf(buf,
"SELECT t.tgname\n" "SELECT t.tgname\n"
"FROM pg_trigger t, pg_class c\n" "FROM pg_trigger t, pg_class c\n"
"WHERE c.relname='%s' AND c.oid = t.tgrelid", "WHERE c.relname='%s' AND c.oid = t.tgrelid",
name); name);
result4 = PSQLexec(buf); result4 = PSQLexec(buf);
if (!result4) if (!result4)
error = true; error = true;
else else
trigger_count = PQntuples(result4); trigger_count = PQntuples(result4);
} }
footers = xmalloc((index_count + constr_count + rule_count + trigger_count + 1) * sizeof(*footers)); footers = xmalloc((index_count + constr_count + rule_count + trigger_count + 1)
* sizeof(*footers));
/* print indices */ /* print indices */
for (i = 0; i < index_count; i++) for (i = 0; i < index_count; i++)
{ {
sprintf(buf, "%s %s", sprintf(buf, "%s %s",
index_count==1 ? "Index:" : (i==0 ? "Indices:" : " "), index_count==1 ? "Index:" : (i==0 ? "Indices:" : " "),
PQgetvalue(result1, i, 0) PQgetvalue(result1, i, 0)
); );
if (i < index_count-1) if (i < index_count-1)
strcat(buf, ","); strcat(buf, ",");
footers[count_footers++] = xstrdup(buf); footers[count_footers++] = xstrdup(buf);
} }
/* print contraints */ /* print contraints */
for (i = 0; i < constr_count; i++) for (i = 0; i < constr_count; i++)
{ {
sprintf(buf, "%s %s", sprintf(buf, "%s %s",
constr_count==1 ? "Constraint:" : (i==0 ? "Constraints:" : " "), constr_count==1 ? "Constraint:" : (i==0 ? "Constraints:" : " "),
PQgetvalue(result2, i, 0) PQgetvalue(result2, i, 0)
); );
footers[count_footers++] = xstrdup(buf); footers[count_footers++] = xstrdup(buf);
} }
/* print rules */ /* print rules */
for (i = 0; i < rule_count; i++) for (i = 0; i < rule_count; i++)
{ {
sprintf(buf, "%s %s", sprintf(buf, "%s %s",
rule_count==1 ? "Rule:" : (i==0 ? "Rules:" : " "), rule_count==1 ? "Rule:" : (i==0 ? "Rules:" : " "),
PQgetvalue(result3, i, 0) PQgetvalue(result3, i, 0)
); );
if (i < rule_count-1) if (i < rule_count-1)
strcat(buf, ","); strcat(buf, ",");
footers[count_footers++] = xstrdup(buf); footers[count_footers++] = xstrdup(buf);
} }
/* print triggers */ /* print triggers */
for (i = 0; i < trigger_count; i++) for (i = 0; i < trigger_count; i++)
{ {
sprintf(buf, "%s %s", sprintf(buf, "%s %s",
trigger_count==1 ? "Trigger:" : (i==0 ? "Triggers:" : " "), trigger_count==1 ? "Trigger:" : (i==0 ? "Triggers:" : " "),
PQgetvalue(result4, i, 0) PQgetvalue(result4, i, 0)
); );
if (i < trigger_count-1) if (i < trigger_count-1)
strcat(buf, ","); strcat(buf, ",");
footers[count_footers++] = xstrdup(buf); footers[count_footers++] = xstrdup(buf);
} }
/* end of list marker */ /* end of list marker */
footers[count_footers] = NULL; footers[count_footers] = NULL;
PQclear(result1); PQclear(result1);
PQclear(result2); PQclear(result2);
PQclear(result3); PQclear(result3);
PQclear(result4); PQclear(result4);
} }
if (!error) if (!error)
printTable(title, headers, (const char**)cells, (const char**)footers, "llll", &myopt, pset.queryFout); printTable(title, headers,
(const char**)cells, (const char**)footers,
"llll", &myopt, pset.queryFout);
/* clean up */ /* clean up */
free(title); free(title);
@ -875,8 +900,8 @@ describeTableDetails(const char *name, bool desc)
for (i = 0; i < PQntuples(res); i++) for (i = 0; i < PQntuples(res); i++)
{ {
free(cells[i * cols + 1]); free(cells[i * cols + 1]);
if (tableinfo.relkind == 'r' || tableinfo.relkind == 's') if (tableinfo.relkind == 'r')
free(cells[i * cols + 2]); free(cells[i * cols + 2]);
} }
free(cells); free(cells);

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef DESCRIBE_H
#define DESCRIBE_H #define DESCRIBE_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "help.h" #include "help.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef HELP_H
#define HELP_H #define HELP_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "input.h" #include "input.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef INPUT_H
#define INPUT_H #define INPUT_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "large_obj.h" #include "large_obj.h"
@ -60,8 +60,8 @@ handle_transaction(void)
if (notice[0]) if (notice[0])
{ {
if ((!commit && strcmp(notice, "NOTICE: UserAbortTransactionBlock and not in in-progress state\n") != 0) || if ((!commit && strcmp(notice, "NOTICE: ROLLBACK: no transaction in progress\n") != 0) ||
(commit && strcmp(notice, "NOTICE: EndTransactionBlock and not inprogress/abort state\n") != 0)) (commit && strcmp(notice, "NOTICE: COMMIT: no transaction in progress\n") != 0))
fputs(notice, stderr); fputs(notice, stderr);
} }
else if (!QUIET()) else if (!QUIET())

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef LARGE_OBJ_H
#define LARGE_OBJ_H #define LARGE_OBJ_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef MAINLOOP_H
#define MAINLOOP_H #define MAINLOOP_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "print.h" #include "print.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef PRINT_H
#define PRINT_H #define PRINT_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "prompt.h" #include "prompt.h"
@ -39,7 +39,7 @@
* %n - database user name * %n - database user name
* %/ - current database * %/ - current database
* %~ - like %/ but "~" when database name equals user name * %~ - 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, * %R - in prompt1 normally =, or ^ if single line mode,
* or a ! if session is not connected to a database; * or a ! if session is not connected to a database;
* in prompt2 -, *, ', or "; * in prompt2 -, *, ', or ";
@ -194,7 +194,7 @@ get_prompt(promptStatus_t status)
case '#': case '#':
{ {
if (pset.db && strcmp(PQuser(pset.db), "postgres") == 0) if (pset.issuper)
buf[0] = '#'; buf[0] = '#';
else else
buf[0] = '>'; buf[0] = '>';

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef PROMPT_H
#define PROMPT_H #define PROMPT_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef SETTINGS_H
#define SETTINGS_H #define SETTINGS_H
@ -53,6 +53,9 @@ typedef struct _psqlSettings
char *progname; /* in case you renamed psql */ char *progname; /* in case you renamed psql */
char *inputfile; /* for error reporting */ char *inputfile; /* for error reporting */
unsigned lineno; /* also for error reporting */ unsigned lineno; /* also for error reporting */
bool issuper; /* is the current user a superuser?
(used to form the prompt) */
} PsqlSettings; } PsqlSettings;
extern PsqlSettings pset; extern PsqlSettings pset;

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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> #include <c.h>
@ -162,8 +162,8 @@ main(int argc, char **argv)
if (PQstatus(pset.db) == CONNECTION_BAD) if (PQstatus(pset.db) == CONNECTION_BAD)
{ {
fprintf(stderr, "%s: connection to database \"%s\" failed - %s", fprintf(stderr, "%s: %s",
pset.progname, PQdb(pset.db), PQerrorMessage(pset.db)); pset.progname, PQerrorMessage(pset.db));
PQfinish(pset.db); PQfinish(pset.db);
exit(EXIT_BADCONN); exit(EXIT_BADCONN);
} }
@ -188,6 +188,8 @@ main(int argc, char **argv)
SetVariable(pset.vars, "HOST", PQhost(pset.db)); SetVariable(pset.vars, "HOST", PQhost(pset.db));
SetVariable(pset.vars, "PORT", PQport(pset.db)); SetVariable(pset.vars, "PORT", PQport(pset.db));
pset.issuper = test_superuser(PQuser(pset.db));
if (!QUIET() && !pset.notty && !options.action) if (!QUIET() && !pset.notty && !options.action)
{ {
printf("Welcome to %s, the PostgreSQL interactive terminal.\n\n" 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; pset.getPassword = true;
break; break;
case '?': case '?':
if (strcmp(argv[optind-1], "-?")==0) /* Actual help option given */
if (strcmp(argv[optind-1], "-?")==0 || strcmp(argv[optind-1], "--help")==0)
{ {
usage(); usage();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
/* unknown option reported by getopt */
else else
{ {
fputs("Try -? for help.\n", stderr); 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 static void
process_psqlrc(void) process_psqlrc(void)
@ -498,12 +502,6 @@ process_psqlrc(void)
#define R_OK 0 #define R_OK 0
#endif #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 */ /* Look for one in the home dir */
home = getenv("HOME"); home = getenv("HOME");
@ -573,6 +571,6 @@ showVersion(void)
puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc"); puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc");
puts("Portions Copyright (C) 1996 Regents of the University of California"); 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."); puts("usage and distribution terms.");
} }

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "stringutils.h" #include "stringutils.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef STRINGUTILS_H
#define STRINGUTILS_H #define STRINGUTILS_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 $
*/ */
/*----------- /*-----------

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 #ifndef TAB_COMPLETE_H
#define TAB_COMPLETE_H #define TAB_COMPLETE_H

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 <c.h>
#include "variables.h" #include "variables.h"

View File

@ -1,9 +1,9 @@
/* /*
* psql - the PostgreSQL interactive terminal * 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 $
*/ */
/* /*

View File

@ -10,7 +10,7 @@
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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)); memset(&po,0,sizeof(po));
po.align = (pqbool)fillAlign; po.align = fillAlign;
po.fieldSep = (char *)fieldSep; po.fieldSep = (char *)fieldSep;
po.header = (pqbool)printHeader; po.header = printHeader;
PQprint(out,pgResult,&po); PQprint(out,pgResult,&po);
} }
@ -43,12 +43,12 @@ void PgDatabase::PrintTuples(FILE *out, int printAttName, int terseOutput,
memset(&po,0,sizeof(po)); memset(&po,0,sizeof(po));
po.align = (pqbool)width; po.align = width;
if(terseOutput) po.fieldSep = strdup("|"); if(terseOutput) po.fieldSep = strdup("|");
else po.fieldSep = ""; else po.fieldSep = "";
po.header = (pqbool)printAttName; po.header = printAttName;
PQprint(out,pgResult,&po); PQprint(out,pgResult,&po);
} }

View File

@ -25,7 +25,7 @@
* *
* *
* IDENTIFICATION * 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 "libpq-int.h"
#include "pqsignal.h" #include "pqsignal.h"
#ifdef MULTIBYTE
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#endif
#define DONOTICE(conn,message) \ #define DONOTICE(conn,message) \
((*(conn)->noticeHook) ((conn)->noticeArg, (message))) ((*(conn)->noticeHook) ((conn)->noticeArg, (message)))
@ -737,3 +742,52 @@ pqWait(int forRead, int forWrite, PGconn *conn)
return 0; 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 */

View File

@ -10,13 +10,13 @@
* didn't really belong there. * didn't really belong there.
* *
* IDENTIFICATION * 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-fe.h"
#include "libpq-int.h" #include "libpq-int.h"
#include "pqsignal.h" #include "pqsignal.h"
@ -36,21 +36,14 @@
#endif #endif
#endif #endif
#ifdef MULTIBYTE
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#endif
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
static struct winsize screen_size; static struct winsize screen_size;
#else #else
static struct winsize static struct winsize
{ {
int ws_row; int ws_row;
int ws_col; int ws_col;
} screen_size; } screen_size;
#endif #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, static void output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
unsigned char *fieldNotNum, int *fieldMax, char *border, unsigned char *fieldNotNum, int *fieldMax, char *border,
const int row_index); 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 * various flags and options. consult libpq-fe.h for
* details * 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 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 static void
do_field(const PQprintOpt *po, const PGresult *res, do_field(const PQprintOpt *po, const PGresult *res,
const int i, const int j, const int fs_len, 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 #if 0
fill(int length, int max, char filler, FILE *fp) /*
* 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
)
{ {
int count; #define DEFAULT_FIELD_SEP " "
count = max - length; int i,
while (count-- >= 0) j;
putc(filler, fp); 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 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);
}
}
}
#endif

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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() */ /* 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 typedef struct _PQprintOpt
{ {
pqbool header; /* print output field headings and row int header; /* print output field headings and row
* count */ * count */
pqbool align; /* fill align the fields */ int align; /* fill align the fields */
pqbool standard; /* old brain dead format */ int standard; /* old brain dead format */
pqbool html3; /* output html tables */ int html3; /* output html tables */
pqbool expanded; /* expand tables */ int expanded; /* expand tables */
pqbool pager; /* use pager for output if needed */ int pager; /* use pager for output if needed */
char *fieldSep; /* field separator */ char *fieldSep; /* field separator */
char *tableOpt; /* insert to HTML <table ...> */ char *tableOpt; /* insert to HTML <table ...> */
char *caption; /* HTML <caption> */ char *caption; /* HTML <caption> */
@ -296,8 +289,8 @@ extern "C"
extern int PQfsize(const PGresult *res, int field_num); extern int PQfsize(const PGresult *res, int field_num);
extern int PQfmod(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 *PQcmdStatus(const PGresult *res);
extern const char *PQoidStatus(const PGresult *res); /* old and ugly */ extern const char *PQoidStatus(const PGresult *res); /* old and ugly */
extern Oid PQoidValue(const PGresult *res); /* new and improved */ extern Oid PQoidValue(const PGresult *res); /* new and improved */
extern const char *PQcmdTuples(const PGresult *res); extern const char *PQcmdTuples(const PGresult *res);
extern const char *PQgetvalue(const PGresult *res, int tup_num, int field_num); 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); extern int PQgetlength(const PGresult *res, int tup_num, int field_num);
@ -319,33 +312,24 @@ extern "C"
const PGresult *res, const PGresult *res,
const PQprintOpt *ps); /* option structure */ const PQprintOpt *ps); /* option structure */
/* #if 0
* PQdisplayTuples() is a better version of PQprintTuples(), but both /*
* are obsoleted by PQprint(). * really old printing routines
*/ */
extern void PQdisplayTuples(const PGresult *res, extern void PQdisplayTuples(const PGresult *res,
FILE *fp, /* where to send the FILE *fp, /* where to send the output */
* output */ int fillAlign, /* pad the fields with spaces */
int fillAlign, /* pad the fields with const char *fieldSep, /* field separator */
* spaces */ int printHeader, /* display headers? */
const char *fieldSep, /* field separator */ int quiet);
int printHeader, /* display headers? */
int quiet); extern void PQprintTuples(const PGresult *res,
FILE *fout, /* output stream */
extern void PQprintTuples(const PGresult *res, int printAttName, /* print attribute names */
FILE *fout, /* output stream */ int terseOutput, /* delimiter bars */
int printAttName, /* print attribute names int width); /* width of column, if
* or not */ * 0, use variable width */
int terseOutput, /* delimiter bars or #endif
* 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);
/* === in fe-lobj.c === */ /* === in fe-lobj.c === */
@ -361,6 +345,14 @@ extern "C"
extern Oid lo_import(PGconn *conn, const char *filename); extern Oid lo_import(PGconn *conn, const char *filename);
extern int lo_export(PGconn *conn, Oid lobjId, 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 #ifdef __cplusplus
}; };

View File

@ -93,10 +93,10 @@ ERROR: renameatt: attribute "oid" exists
-- not in a xact -- not in a xact
abort; abort;
NOTICE: UserAbortTransactionBlock and not in in-progress state NOTICE: ROLLBACK: no transaction in progress
-- not in a xact -- not in a xact
end; end;
NOTICE: EndTransactionBlock and not inprogress/abort state NOTICE: COMMIT: no transaction in progress
-- --
-- DEFINE AGGREGATE -- DEFINE AGGREGATE