mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
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:
parent
7e7416bd4e
commit
2b84cbb60f
@ -274,8 +274,8 @@ PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
To begin, call conn=PQconnectStart("<connection_info_string>"). If
|
To begin, call <literal>conn=PQconnectStart("<connection_info_string>")</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 <table ...> */
|
char *tableOpt; /* insert to HTML <table ...> */
|
||||||
char *caption; /* HTML <caption> */
|
char *caption; /* HTML <caption> */
|
||||||
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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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.
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>></quote>.</para></listitem>
|
<quote>#</quote>, otherwise a <quote>></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
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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"
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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,
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,61 +621,83 @@ 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)
|
if (error)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Description */
|
/* Description */
|
||||||
if (desc)
|
if (desc)
|
||||||
@ -683,53 +705,53 @@ describeTableDetails(const char *name, bool desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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())
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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] = '>';
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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.");
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*-----------
|
/*-----------
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
extern void PQprintTuples(const PGresult *res,
|
||||||
FILE *fout, /* output stream */
|
FILE *fout, /* output stream */
|
||||||
int printAttName, /* print attribute names
|
int printAttName, /* print attribute names */
|
||||||
* or not */
|
int terseOutput, /* delimiter bars */
|
||||||
int terseOutput, /* delimiter bars or
|
int width); /* width of column, if
|
||||||
* not? */
|
* 0, use variable width */
|
||||||
int width); /* width of column, if
|
#endif
|
||||||
* 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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user