Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
a0402817
Commit
a0402817
authored
Jan 10, 2000
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move fixes for >8 indexed fields.
parent
b99f3006
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
268 additions
and
268 deletions
+268
-268
src/backend/parser/analyze.c
src/backend/parser/analyze.c
+6
-6
src/backend/utils/adt/int.c
src/backend/utils/adt/int.c
+17
-20
src/bin/psql/describe.c
src/bin/psql/describe.c
+239
-239
src/include/config.h.in
src/include/config.h.in
+5
-0
src/include/postgres.h
src/include/postgres.h
+1
-3
No files found.
src/backend/parser/analyze.c
View file @
a0402817
...
...
@@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: analyze.c,v 1.12
7 2000/01/06 20:46:49 wieck
Exp $
* $Id: analyze.c,v 1.12
8 2000/01/10 05:20:21 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -674,7 +674,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
fkconstraint
=
(
FkConstraint
*
)
constraint
;
fkconstraint
->
fk_attrs
=
lappend
(
NIL
,
id
);
fkconstraints
=
lappend
(
fkconstraints
,
constraint
);
continue
;
}
...
...
@@ -960,7 +960,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
*/
if
(
fkconstraint
->
fk_attrs
!=
NIL
&&
fkconstraint
->
pk_attrs
==
NIL
)
transformFkeyGetPrimaryKey
(
fkconstraint
);
/*
* Build a CREATE CONSTRAINT TRIGGER statement for the CHECK
* action.
...
...
@@ -1016,7 +1016,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
extras_after
=
lappend
(
extras_after
,
(
Node
*
)
fk_trigger
);
/*
* Build a CREATE CONSTRAINT TRIGGER statement for the
* Build a CREATE CONSTRAINT TRIGGER statement for the
* ON DELETE action fired on the PK table !!!
*
*/
...
...
@@ -1084,7 +1084,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
extras_after
=
lappend
(
extras_after
,
(
Node
*
)
fk_trigger
);
/*
* Build a CREATE CONSTRAINT TRIGGER statement for the
* Build a CREATE CONSTRAINT TRIGGER statement for the
* ON UPDATE action fired on the PK table !!!
*
*/
...
...
@@ -1679,7 +1679,7 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
* using the attribute names of the PK relation descriptor
* ----------
*/
for
(
i
=
0
;
i
<
8
&&
indexStruct
->
indkey
[
i
]
!=
0
;
i
++
)
for
(
i
=
0
;
i
<
INDEX_MAX_KEYS
&&
indexStruct
->
indkey
[
i
]
!=
0
;
i
++
)
{
pkattno
=
indexStruct
->
indkey
[
i
];
pkattr
=
(
Ident
*
)
makeNode
(
Ident
);
...
...
src/backend/utils/adt/int.c
View file @
a0402817
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.2
7 1999/07/17 20:17:56
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.2
8 2000/01/10 05:20:23
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -76,29 +76,26 @@ int2out(int16 sh)
* Fills any nonexistent digits with NULLs.
*/
int16
*
int28in
(
char
*
shs
)
int28in
(
char
*
intString
)
{
int16
*
result
;
int
nums
;
int
slot
;
if
(
shs
==
NULL
)
if
(
intString
==
NULL
)
return
NULL
;
result
=
(
int16
*
)
palloc
(
sizeof
(
int16
[
8
]));
if
((
nums
=
sscanf
(
shs
,
"%hd%hd%hd%hd%hd%hd%hd%hd"
,
&
result
[
0
],
&
result
[
1
],
&
result
[
2
],
&
result
[
3
],
&
result
[
4
],
&
result
[
5
],
&
result
[
6
],
&
result
[
7
]))
!=
8
)
result
=
(
int16
*
)
palloc
(
sizeof
(
int16
[
INDEX_MAX_KEYS
]));
for
(
slot
=
0
;
*
intString
&&
slot
<
INDEX_MAX_KEYS
;
slot
++
)
{
do
result
[
nums
++
]
=
0
;
while
(
nums
<
8
);
if
(
sscanf
(
intString
,
"%hd"
,
&
result
[
slot
])
!=
1
)
break
;
while
(
*
intString
&&
*
intString
!=
' '
)
intString
++
;
}
while
(
slot
<
INDEX_MAX_KEYS
)
result
[
slot
++
]
=
0
;
return
result
;
}
...
...
@@ -120,10 +117,10 @@ int28out(int16 *shs)
result
[
1
]
=
'\0'
;
return
result
;
}
rp
=
result
=
(
char
*
)
palloc
(
8
*
7
);
/* assumes sign, 5 digits,
*
' ' */
rp
=
result
=
(
char
*
)
palloc
(
INDEX_MAX_KEYS
*
7
);
/* assumes sign, 5 digits,
' ' */
sp
=
shs
;
for
(
num
=
8
;
num
!=
0
;
num
--
)
for
(
num
=
INDEX_MAX_KEYS
;
num
!=
0
;
num
--
)
{
itoa
(
*
sp
++
,
rp
);
while
(
*++
rp
!=
'\0'
)
...
...
src/bin/psql/describe.c
View file @
a0402817
...
...
@@ -47,15 +47,15 @@ describeAggregates(const char *name, PsqlSettings *pset, bool verbose, bool desc
strcpy
(
buf
,
"SELECT a.aggname AS
\"
Name
\"
, t.typname AS
\"
Type
\"
"
);
if
(
verbose
)
strcat
(
buf
,
" ,u.usename as
\"
Owner
\"
"
);
strcat
(
buf
,
" ,u.usename as
\"
Owner
\"
"
);
if
(
desc
)
strcat
(
buf
,
",
\n
obj_description(a.oid) as
\"
Description
\"
"
);
strcat
(
buf
,
!
verbose
?
(
"
\n
FROM pg_aggregate a, pg_type t
\n
"
"WHERE a.aggbasetype = t.oid
\n
"
)
:
"WHERE a.aggbasetype = t.oid
\n
"
)
:
(
"
\n
FROM pg_aggregate a, pg_type t, pg_user u
\n
"
"WHERE a.aggbasetype = t.oid AND a.aggowner = u.usesysid
\n
"
)
);
"WHERE a.aggbasetype = t.oid AND a.aggowner = u.usesysid
\n
"
)
);
if
(
name
)
{
...
...
@@ -68,16 +68,16 @@ describeAggregates(const char *name, PsqlSettings *pset, bool verbose, bool desc
"UNION
\n
"
"SELECT a.aggname AS
\"
Name
\"
, '(all types)' as
\"
Type
\"
"
);
if
(
verbose
)
strcat
(
buf
,
" ,u.usename as
\"
Owner
\"
"
);
strcat
(
buf
,
" ,u.usename as
\"
Owner
\"
"
);
if
(
desc
)
strcat
(
buf
,
",
\n
obj_description(a.oid) as
\"
Description
\"
"
);
strcat
(
buf
,
!
verbose
?
(
"
\n
FROM pg_aggregate a
\n
"
"WHERE a.aggbasetype = 0
\n
"
)
:
"WHERE a.aggbasetype = 0
\n
"
)
:
(
"
\n
FROM pg_aggregate a, pg_user u
\n
"
"WHERE a.aggbasetype = 0 AND a.aggowner = u.usesysid
\n
"
)
);
"WHERE a.aggbasetype = 0 AND a.aggowner = u.usesysid
\n
"
)
);
if
(
name
)
{
strcat
(
buf
,
" AND a.aggname ~* '"
);
...
...
@@ -117,22 +117,22 @@ describeFunctions(const char *name, PsqlSettings *pset, bool verbose, bool desc)
* arguments, but have no types defined for those arguments
*/
strcpy
(
buf
,
"SELECT t.typname as
\"
Result
\"
, p.proname as
\"
Function
\"
,
\n
"
"SELECT t.typname as
\"
Result
\"
, p.proname as
\"
Function
\"
,
\n
"
" oid8types(p.proargtypes) as
\"
Arguments
\"
"
);
if
(
verbose
)
strcat
(
buf
,
",
\n
u.usename as
\"
Owner
\"
, l.lanname as
\"
Language
\"
, p.prosrc as
\"
Source
\"
"
);
strcat
(
buf
,
",
\n
u.usename as
\"
Owner
\"
, l.lanname as
\"
Language
\"
, p.prosrc as
\"
Source
\"
"
);
if
(
desc
)
strcat
(
buf
,
",
\n
obj_description(p.oid) as
\"
Description
\"
"
);
if
(
!
verbose
)
strcat
(
buf
,
"
\n
FROM pg_proc p, pg_type t
\n
"
"WHERE p.prorettype = t.oid and (pronargs = 0 or oid8types(p.proargtypes) != '')
\n
"
);
strcat
(
buf
,
"
\n
FROM pg_proc p, pg_type t
\n
"
"WHERE p.prorettype = t.oid and (pronargs = 0 or oid8types(p.proargtypes) != '')
\n
"
);
else
strcat
(
buf
,
"
\n
FROM pg_proc p, pg_type t, pg_language l, pg_user u
\n
"
"WHERE p.prorettype = t.oid AND p.prolang = l.oid AND p.proowner = u.usesysid
\n
"
" AND (pronargs = 0 or oid8types(p.proargtypes) != '')
\n
"
);
strcat
(
buf
,
"
\n
FROM pg_proc p, pg_type t, pg_language l, pg_user u
\n
"
"WHERE p.prorettype = t.oid AND p.prolang = l.oid AND p.proowner = u.usesysid
\n
"
" AND (pronargs = 0 or oid8types(p.proargtypes) != '')
\n
"
);
if
(
name
)
{
...
...
@@ -171,10 +171,10 @@ describeTypes(const char *name, PsqlSettings *pset, bool verbose, bool desc)
strcpy
(
buf
,
"SELECT t.typname AS
\"
Type
\"
"
);
if
(
verbose
)
strcat
(
buf
,
",
\n
(CASE WHEN t.typlen=-1 THEN 'var'::text ELSE t.typlen::text END) as
\"
Length
\"
"
",
\n
u.usename as
\"
Owner
\"
"
);
strcat
(
buf
,
",
\n
(CASE WHEN t.typlen=-1 THEN 'var'::text ELSE t.typlen::text END) as
\"
Length
\"
"
",
\n
u.usename as
\"
Owner
\"
"
);
/*
* Let's always show descriptions for this. There is room.
* bjm 1999/12/31
...
...
@@ -185,11 +185,11 @@ describeTypes(const char *name, PsqlSettings *pset, bool verbose, bool desc)
* do not include user relations (typrelid!=0)
*/
strcat
(
buf
,
!
verbose
?
(
"
\n
FROM pg_type t
\n
"
"WHERE t.typrelid = 0 AND t.typname !~ '^_.*'
\n
"
)
:
(
"
\n
FROM pg_type t, pg_user u
\n
"
"WHERE t.typrelid = 0 AND t.typname !~ '^_.*' AND t.typowner = u.usesysid
\n
"
)
);
(
"
\n
FROM pg_type t
\n
"
"WHERE t.typrelid = 0 AND t.typname !~ '^_.*'
\n
"
)
:
(
"
\n
FROM pg_type t, pg_user u
\n
"
"WHERE t.typrelid = 0 AND t.typname !~ '^_.*' AND t.typowner = u.usesysid
\n
"
)
);
if
(
name
)
{
...
...
@@ -230,14 +230,14 @@ describeOperators(const char *name, PsqlSettings *pset, bool verbose, bool desc)
/* FIXME: Use outer joins here when ready */
strcpy
(
buf
,
"SELECT o.oprname AS
\"
Op
\"
,
\n
"
"SELECT o.oprname AS
\"
Op
\"
,
\n
"
" t1.typname AS
\"
Left arg
\"
,
\n
"
" t2.typname AS
\"
Right arg
\"
,
\n
"
" t0.typname AS
\"
Result
\"
"
);
if
(
desc
)
strcat
(
buf
,
",
\n
obj_description(p.oid) as
\"
Description
\"
"
);
strcat
(
buf
,
"
\n
FROM pg_proc p, pg_type t0,
\n
"
"
\n
FROM pg_proc p, pg_type t0,
\n
"
" pg_type t1, pg_type t2,
\n
"
" pg_operator o
\n
"
"WHERE p.prorettype = t0.oid AND
\n
"
...
...
@@ -319,7 +319,7 @@ listAllDbs(PsqlSettings *pset, bool desc)
printQueryOpt
myopt
=
pset
->
popt
;
strcpy
(
buf
,
"SELECT pg_database.datname as
\"
Database
\"
,
\n
"
"SELECT pg_database.datname as
\"
Database
\"
,
\n
"
" pg_user.usename as
\"
Owner
\"
"
);
#ifdef MULTIBYTE
strcat
(
buf
,
...
...
@@ -541,7 +541,7 @@ xmalloc(size_t size)
bool
describeTableDetails
(
const
char
*
name
,
PsqlSettings
*
pset
,
bool
desc
)
{
char
buf
[
512
+
8
*
NAMEDATALEN
];
char
buf
[
512
+
INDEX_MAX_KEYS
*
NAMEDATALEN
];
PGresult
*
res
=
NULL
;
printTableOpt
myopt
=
pset
->
popt
.
topt
;
int
i
;
...
...
@@ -557,20 +557,20 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
/* truncate table name */
if
(
strlen
(
name
)
>
NAMEDATALEN
)
{
char
*
my_name
=
xmalloc
(
NAMEDATALEN
+
1
);
strncpy
(
my_name
,
name
,
NAMEDATALEN
);
my_name
[
NAMEDATALEN
]
=
'\0'
;
name
=
my_name
;
char
*
my_name
=
xmalloc
(
NAMEDATALEN
+
1
);
strncpy
(
my_name
,
name
,
NAMEDATALEN
);
my_name
[
NAMEDATALEN
]
=
'\0'
;
name
=
my_name
;
}
/* Get general table info */
sprintf
(
buf
,
"SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules
\n
"
"FROM pg_class WHERE relname='%s'"
,
name
);
"SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules
\n
"
"FROM pg_class WHERE relname='%s'"
,
name
);
res
=
PSQLexec
(
pset
,
buf
);
if
(
!
res
)
return
false
;
return
false
;
/* Did we get anything? */
if
(
PQntuples
(
res
)
==
0
)
...
...
@@ -596,13 +596,13 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
if
(
tableinfo
.
relkind
==
'r'
||
tableinfo
.
relkind
==
's'
)
{
cols
++
;
headers
[
cols
-
1
]
=
"Extra"
;
cols
++
;
headers
[
cols
-
1
]
=
"Extra"
;
}
if
(
desc
)
{
cols
++
;
cols
++
;
headers
[
cols
-
1
]
=
"Description"
;
}
...
...
@@ -625,19 +625,19 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
/* Check if table is a view */
if
(
tableinfo
.
hasrules
)
{
PGresult
*
result
;
sprintf
(
buf
,
"SELECT definition FROM pg_views WHERE viewname = '%s'"
,
name
);
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
{
PQclear
(
res
);
PQclear
(
result
);
return
false
;
}
if
(
PQntuples
(
result
)
>
0
)
view_def
=
xstrdup
(
PQgetvalue
(
result
,
0
,
0
));
PQclear
(
result
);
PGresult
*
result
;
sprintf
(
buf
,
"SELECT definition FROM pg_views WHERE viewname = '%s'"
,
name
);
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
{
PQclear
(
res
);
PQclear
(
result
);
return
false
;
}
if
(
PQntuples
(
result
)
>
0
)
view_def
=
xstrdup
(
PQgetvalue
(
result
,
0
,
0
));
PQclear
(
result
);
}
...
...
@@ -652,9 +652,9 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
/* Name */
cells
[
i
*
cols
+
0
]
=
(
char
*
)
PQgetvalue
(
res
,
i
,
0
);
/* don't free this afterwards */
/* Type */
/* (convert some internal type names to "readable") */
/* (convert some internal type names to "readable") */
cells
[
i
*
cols
+
1
]
=
xmalloc
(
NAMEDATALEN
+
16
);
if
(
strcmp
(
attype
,
"bpchar"
)
==
0
)
sprintf
(
cells
[
i
*
cols
+
1
],
"char(%d)"
,
attypmod
!=
-
1
?
attypmod
-
VARHDRSZ
:
0
);
...
...
@@ -671,38 +671,38 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
/* Extra: not null and default */
/* (I'm cutting off the 'default' string at 128) */
if
(
tableinfo
.
relkind
==
'r'
||
tableinfo
.
relkind
==
's'
)
{
cells
[
i
*
cols
+
2
]
=
xmalloc
(
128
+
128
);
cells
[
i
*
cols
+
2
][
0
]
=
'\0'
;
if
(
strcmp
(
PQgetvalue
(
res
,
i
,
4
),
"t"
)
==
0
)
strcat
(
cells
[
i
*
cols
+
2
],
"not null"
);
/* handle "default" here */
if
(
strcmp
(
PQgetvalue
(
res
,
i
,
5
),
"t"
)
==
0
)
{
PGresult
*
result
;
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"
,
name
,
PQgetvalue
(
res
,
i
,
6
));
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
error
=
true
;
else
{
if
(
cells
[
i
*
cols
+
2
][
0
])
strcat
(
cells
[
i
*
cols
+
2
],
" "
);
strcat
(
cells
[
i
*
cols
+
2
],
"default "
);
strcat
(
cells
[
i
*
cols
+
2
],
PQgetvalue
(
result
,
0
,
0
));
PQclear
(
result
);
}
}
}
if
(
error
)
break
;
if
(
tableinfo
.
relkind
==
'r'
||
tableinfo
.
relkind
==
's'
)
{
cells
[
i
*
cols
+
2
]
=
xmalloc
(
128
+
128
);
cells
[
i
*
cols
+
2
][
0
]
=
'\0'
;
if
(
strcmp
(
PQgetvalue
(
res
,
i
,
4
),
"t"
)
==
0
)
strcat
(
cells
[
i
*
cols
+
2
],
"not null"
);
/* handle "default" here */
if
(
strcmp
(
PQgetvalue
(
res
,
i
,
5
),
"t"
)
==
0
)
{
PGresult
*
result
;
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"
,
name
,
PQgetvalue
(
res
,
i
,
6
));
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
error
=
true
;
else
{
if
(
cells
[
i
*
cols
+
2
][
0
])
strcat
(
cells
[
i
*
cols
+
2
],
" "
);
strcat
(
cells
[
i
*
cols
+
2
],
"default "
);
strcat
(
cells
[
i
*
cols
+
2
],
PQgetvalue
(
result
,
0
,
0
));
PQclear
(
result
);
}
}
}
if
(
error
)
break
;
/* Description */
if
(
desc
)
...
...
@@ -713,50 +713,50 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
title
=
xmalloc
(
20
+
strlen
(
name
));
switch
(
tableinfo
.
relkind
)
{
case
'r'
:
if
(
view_def
)
sprintf
(
title
,
"View
\"
%s
\"
"
,
name
);
else
sprintf
(
title
,
"Table
\"
%s
\"
"
,
name
);
break
;
if
(
view_def
)
sprintf
(
title
,
"View
\"
%s
\"
"
,
name
);
else
sprintf
(
title
,
"Table
\"
%s
\"
"
,
name
);
break
;
case
'S'
:
sprintf
(
title
,
"Sequence
\"
%s
\"
"
,
name
);
break
;
sprintf
(
title
,
"Sequence
\"
%s
\"
"
,
name
);
break
;
case
'i'
:
sprintf
(
title
,
"Index
\"
%s
\"
"
,
name
);
break
;
sprintf
(
title
,
"Index
\"
%s
\"
"
,
name
);
break
;
case
's'
:
sprintf
(
title
,
"System table
\"
%s
\"
"
,
name
);
break
;
sprintf
(
title
,
"System table
\"
%s
\"
"
,
name
);
break
;
default:
sprintf
(
title
,
"?%c?"
,
tableinfo
.
relkind
);
sprintf
(
title
,
"?%c?"
,
tableinfo
.
relkind
);
}
/* Make footers */
/* Information about the index */
if
(
tableinfo
.
relkind
==
'i'
)
{
PGresult
*
result
;
sprintf
(
buf
,
"SELECT i.indisunique, i.indisprimary, a.amname
\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"
,
name
);
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
error
=
true
;
else
{
footers
=
xmalloc
(
2
*
sizeof
(
*
footers
));
footers
[
0
]
=
xmalloc
(
NAMEDATALEN
+
32
);
sprintf
(
footers
[
0
],
"%s%s"
,
strcmp
(
PQgetvalue
(
result
,
0
,
0
),
"t"
)
==
0
?
"unique "
:
""
,
PQgetvalue
(
result
,
0
,
2
)
);
if
(
strcmp
(
PQgetvalue
(
result
,
0
,
1
),
"t"
)
==
0
)
strcat
(
footers
[
0
],
" (primary key)"
);
footers
[
1
]
=
NULL
;
}
PGresult
*
result
;
sprintf
(
buf
,
"SELECT i.indisunique, i.indisprimary, a.amname
\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"
,
name
);
result
=
PSQLexec
(
pset
,
buf
);
if
(
!
result
)
error
=
true
;
else
{
footers
=
xmalloc
(
2
*
sizeof
(
*
footers
));
footers
[
0
]
=
xmalloc
(
NAMEDATALEN
+
32
);
sprintf
(
footers
[
0
],
"%s%s"
,
strcmp
(
PQgetvalue
(
result
,
0
,
0
),
"t"
)
==
0
?
"unique "
:
""
,
PQgetvalue
(
result
,
0
,
2
)
);
if
(
strcmp
(
PQgetvalue
(
result
,
0
,
1
),
"t"
)
==
0
)
strcat
(
footers
[
0
],
" (primary key)"
);
footers
[
1
]
=
NULL
;
}
}
/* Information about the view */
else
if
(
tableinfo
.
relkind
==
'r'
&&
view_def
)
...
...
@@ -770,132 +770,132 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
/* Information about the table */
else
if
(
tableinfo
.
relkind
==
'r'
)
{
PGresult
*
result1
=
NULL
,
*
result2
=
NULL
,
*
result3
=
NULL
,
*
result4
=
NULL
;
int
index_count
=
0
,
constr_count
=
0
,
rule_count
=
0
,
trigger_count
=
0
;
int
count_footers
=
0
;
PGresult
*
result1
=
NULL
,
*
result2
=
NULL
,
*
result3
=
NULL
,
*
result4
=
NULL
;
int
index_count
=
0
,
constr_count
=
0
,
rule_count
=
0
,
trigger_count
=
0
;
int
count_footers
=
0
;
/* count indices */
if
(
!
error
&&
tableinfo
.
hasindex
)
{
sprintf
(
buf
,
"SELECT c2.relname
\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
"
"ORDER BY c2.relname"
,
name
);
result1
=
PSQLexec
(
pset
,
buf
);
if
(
!
result1
)
error
=
true
;
else
index_count
=
PQntuples
(
result1
);
}
/* count table (and column) constraints */
if
(
!
error
&&
tableinfo
.
checks
)
{
sprintf
(
buf
,
"SELECT rcsrc
\n
"
"FROM pg_relcheck r, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = r.rcrelid"
,
name
);
result2
=
PSQLexec
(
pset
,
buf
);
if
(
!
result2
)
error
=
true
;
else
constr_count
=
PQntuples
(
result2
);
}
/* count rules */
if
(
!
error
&&
tableinfo
.
hasrules
)
{
sprintf
(
buf
,
"SELECT r.rulename
\n
"
"FROM pg_rewrite r, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = r.ev_class"
,
name
);
result3
=
PSQLexec
(
pset
,
buf
);
if
(
!
result3
)
error
=
true
;
else
rule_count
=
PQntuples
(
result3
);
}
/* count triggers */
if
(
!
error
&&
tableinfo
.
hasrules
)
{
sprintf
(
buf
,
"SELECT t.tgname
\n
"
"FROM pg_trigger t, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = t.tgrelid"
,
name
);
result4
=
PSQLexec
(
pset
,
buf
);
if
(
!
result4
)
error
=
true
;
else
trigger_count
=
PQntuples
(
result4
);
}
footers
=
xmalloc
((
index_count
+
constr_count
+
rule_count
+
trigger_count
+
1
)
*
sizeof
(
*
footers
));
/* print indices */
for
(
i
=
0
;
i
<
index_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
index_count
==
1
?
"Index:"
:
(
i
==
0
?
"Indices:"
:
" "
),
PQgetvalue
(
result1
,
i
,
0
)
);
if
(
i
<
index_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
if
(
!
error
&&
tableinfo
.
hasindex
)
{
sprintf
(
buf
,
"SELECT c2.relname
\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
"
"ORDER BY c2.relname"
,
name
);
result1
=
PSQLexec
(
pset
,
buf
);
if
(
!
result1
)
error
=
true
;
else
index_count
=
PQntuples
(
result1
);
}
/* count table (and column) constraints */
if
(
!
error
&&
tableinfo
.
checks
)
{
sprintf
(
buf
,
"SELECT rcsrc
\n
"
"FROM pg_relcheck r, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = r.rcrelid"
,
name
);
result2
=
PSQLexec
(
pset
,
buf
);
if
(
!
result2
)
error
=
true
;
else
constr_count
=
PQntuples
(
result2
);
}
/* count rules */
if
(
!
error
&&
tableinfo
.
hasrules
)
{
sprintf
(
buf
,
"SELECT r.rulename
\n
"
"FROM pg_rewrite r, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = r.ev_class"
,
name
);
result3
=
PSQLexec
(
pset
,
buf
);
if
(
!
result3
)
error
=
true
;
else
rule_count
=
PQntuples
(
result3
);
}
/* count triggers */
if
(
!
error
&&
tableinfo
.
hasrules
)
{
sprintf
(
buf
,
"SELECT t.tgname
\n
"
"FROM pg_trigger t, pg_class c
\n
"
"WHERE c.relname='%s' AND c.oid = t.tgrelid"
,
name
);
result4
=
PSQLexec
(
pset
,
buf
);
if
(
!
result4
)
error
=
true
;
else
trigger_count
=
PQntuples
(
result4
);
}
footers
=
xmalloc
((
index_count
+
constr_count
+
rule_count
+
trigger_count
+
1
)
*
sizeof
(
*
footers
));
/* print indices */
for
(
i
=
0
;
i
<
index_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
index_count
==
1
?
"Index:"
:
(
i
==
0
?
"Indices:"
:
" "
),
PQgetvalue
(
result1
,
i
,
0
)
);
if
(
i
<
index_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
}
/* print contraints */
for
(
i
=
0
;
i
<
constr_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
constr_count
==
1
?
"Constraint:"
:
(
i
==
0
?
"Constraints:"
:
" "
),
PQgetvalue
(
result2
,
i
,
0
)
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
/* print contraints */
for
(
i
=
0
;
i
<
constr_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
constr_count
==
1
?
"Constraint:"
:
(
i
==
0
?
"Constraints:"
:
" "
),
PQgetvalue
(
result2
,
i
,
0
)
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
}
/* print rules */
for
(
i
=
0
;
i
<
rule_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
rule_count
==
1
?
"Rule:"
:
(
i
==
0
?
"Rules:"
:
" "
),
PQgetvalue
(
result3
,
i
,
0
)
);
if
(
i
<
rule_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
/* print rules */
for
(
i
=
0
;
i
<
rule_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
rule_count
==
1
?
"Rule:"
:
(
i
==
0
?
"Rules:"
:
" "
),
PQgetvalue
(
result3
,
i
,
0
)
);
if
(
i
<
rule_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
}
/* print triggers */
for
(
i
=
0
;
i
<
trigger_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
trigger_count
==
1
?
"Trigger:"
:
(
i
==
0
?
"Triggers:"
:
" "
),
PQgetvalue
(
result4
,
i
,
0
)
);
if
(
i
<
trigger_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
/* print triggers */
for
(
i
=
0
;
i
<
trigger_count
;
i
++
)
{
sprintf
(
buf
,
"%s %s"
,
trigger_count
==
1
?
"Trigger:"
:
(
i
==
0
?
"Triggers:"
:
" "
),
PQgetvalue
(
result4
,
i
,
0
)
);
if
(
i
<
trigger_count
-
1
)
strcat
(
buf
,
","
);
footers
[
count_footers
++
]
=
xstrdup
(
buf
);
}
/* end of list marker */
footers
[
count_footers
]
=
NULL
;
/* end of list marker */
footers
[
count_footers
]
=
NULL
;
PQclear
(
result1
);
PQclear
(
result2
);
PQclear
(
result3
);
PQclear
(
result4
);
PQclear
(
result1
);
PQclear
(
result2
);
PQclear
(
result3
);
PQclear
(
result4
);
}
if
(
!
error
)
{
myopt
.
tuples_only
=
false
;
printTable
(
title
,
headers
,
(
const
char
**
)
cells
,
(
const
char
**
)
footers
,
"llll"
,
&
myopt
,
pset
->
queryFout
);
myopt
.
tuples_only
=
false
;
printTable
(
title
,
headers
,
(
const
char
**
)
cells
,
(
const
char
**
)
footers
,
"llll"
,
&
myopt
,
pset
->
queryFout
);
}
/* clean up */
...
...
@@ -904,8 +904,8 @@ describeTableDetails(const char *name, PsqlSettings *pset, bool desc)
for
(
i
=
0
;
i
<
PQntuples
(
res
);
i
++
)
{
free
(
cells
[
i
*
cols
+
1
]);
if
(
tableinfo
.
relkind
==
'r'
||
tableinfo
.
relkind
==
's'
)
free
(
cells
[
i
*
cols
+
2
]);
if
(
tableinfo
.
relkind
==
'r'
||
tableinfo
.
relkind
==
's'
)
free
(
cells
[
i
*
cols
+
2
]);
}
free
(
cells
);
...
...
@@ -994,10 +994,10 @@ listTables(const char *infotype, const char *name, PsqlSettings *pset, bool desc
strcat
(
buf
,
"
\n
UNION
\n\n
"
);
strcat
(
buf
,
"SELECT c.relname as
\"
Name
\"
,
\n
"
"SELECT c.relname as
\"
Name
\"
,
\n
"
" (CASE WHEN relkind = 'S' THEN 'sequence'::text ELSE 'index'::text END) as
\"
Type
\"
,
\n
"
" u.usename as
\"
Owner
\"
"
);
" u.usename as
\"
Owner
\"
"
);
if
(
desc
)
strcat
(
buf
,
", obj_description(c.oid) as
\"
Description
\"
"
);
strcat
(
buf
,
"
\n
FROM pg_class c, pg_user u
\n
"
...
...
src/include/config.h.in
View file @
a0402817
...
...
@@ -92,6 +92,11 @@
*/
#define INDEXSCAN_PATCH
/*
* Maximum number of columns in an index.
*/
#define INDEX_MAX_KEYS 8
/*
* Enables debugging print statements in the date/time support routines.
* Particularly useful for porting to a new platform/OS combination.
...
...
src/include/postgres.h
View file @
a0402817
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1995, Regents of the University of California
*
* $Id: postgres.h,v 1.3
2 2000/01/10 04:36:3
6 momjian Exp $
* $Id: postgres.h,v 1.3
3 2000/01/10 05:20:2
6 momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -101,8 +101,6 @@ struct varlena
typedef
struct
varlena
bytea
;
typedef
struct
varlena
text
;
#define INDEX_MAX_KEYS 8
/* maximum number of keys in an index
* definition */
typedef
int2
int28
[
INDEX_MAX_KEYS
];
typedef
Oid
oid8
[
INDEX_MAX_KEYS
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment