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
8ecac94b
Commit
8ecac94b
authored
Jul 06, 2000
by
Tom Lane
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Functions on 'text' type updated to new fmgr style. 'text' is
now TOAST-able.
parent
40f64064
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
750 additions
and
687 deletions
+750
-687
src/backend/utils/adt/cash.c
src/backend/utils/adt/cash.c
+17
-16
src/backend/utils/adt/float.c
src/backend/utils/adt/float.c
+35
-27
src/backend/utils/adt/like.c
src/backend/utils/adt/like.c
+36
-30
src/backend/utils/adt/lztext.c
src/backend/utils/adt/lztext.c
+5
-11
src/backend/utils/adt/mac.c
src/backend/utils/adt/mac.c
+28
-15
src/backend/utils/adt/network.c
src/backend/utils/adt/network.c
+58
-63
src/backend/utils/adt/oracle_compat.c
src/backend/utils/adt/oracle_compat.c
+113
-138
src/backend/utils/adt/regexp.c
src/backend/utils/adt/regexp.c
+97
-76
src/backend/utils/adt/ruleutils.c
src/backend/utils/adt/ruleutils.c
+11
-9
src/backend/utils/adt/selfuncs.c
src/backend/utils/adt/selfuncs.c
+3
-2
src/backend/utils/adt/varlena.c
src/backend/utils/adt/varlena.c
+137
-128
src/backend/utils/adt/version.c
src/backend/utils/adt/version.c
+10
-11
src/backend/utils/fmgr/fmgr.c
src/backend/utils/fmgr/fmgr.c
+31
-1
src/include/catalog/catversion.h
src/include/catalog/catversion.h
+2
-2
src/include/catalog/pg_proc.h
src/include/catalog/pg_proc.h
+59
-59
src/include/catalog/pg_type.h
src/include/catalog/pg_type.h
+2
-2
src/include/fmgr.h
src/include/fmgr.h
+39
-21
src/include/utils/builtins.h
src/include/utils/builtins.h
+63
-61
src/include/utils/cash.h
src/include/utils/cash.h
+1
-1
src/include/utils/inet.h
src/include/utils/inet.h
+3
-14
No files found.
src/backend/utils/adt/cash.c
View file @
8ecac94b
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by
* workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
*
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.4
1 2000/07/03 23:09:50 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.4
2 2000/07/06 05:48:11 tgl
Exp $
*/
*/
#include <limits.h>
#include <limits.h>
...
@@ -41,7 +41,7 @@ static struct lconv *lconvert = NULL;
...
@@ -41,7 +41,7 @@ static struct lconv *lconvert = NULL;
* Cash is a pass-by-ref SQL type, so we must pass and return pointers.
* Cash is a pass-by-ref SQL type, so we must pass and return pointers.
* These macros and support routine hide the pass-by-refness.
* These macros and support routine hide the pass-by-refness.
*/
*/
#define PG_GETARG_CASH(n) (* ((Cash *)
DatumGetPointer(fcinfo->arg[n]
)))
#define PG_GETARG_CASH(n) (* ((Cash *)
PG_GETARG_POINTER(n
)))
#define PG_RETURN_CASH(x) return CashGetDatum(x)
#define PG_RETURN_CASH(x) return CashGetDatum(x)
static
Datum
static
Datum
...
@@ -677,10 +677,11 @@ cashsmaller(Cash *c1, Cash *c2)
...
@@ -677,10 +677,11 @@ cashsmaller(Cash *c1, Cash *c2)
* This converts a int4 as well but to a representation using words
* This converts a int4 as well but to a representation using words
* Obviously way North American centric - sorry
* Obviously way North American centric - sorry
*/
*/
text
*
Datum
cash_words_out
(
Cash
*
value
)
cash_words_out
(
PG_FUNCTION_ARGS
)
{
{
static
char
buf
[
128
];
Cash
value
=
PG_GETARG_CASH
(
0
);
char
buf
[
128
];
char
*
p
=
buf
;
char
*
p
=
buf
;
Cash
m0
;
Cash
m0
;
Cash
m1
;
Cash
m1
;
...
@@ -689,19 +690,19 @@ cash_words_out(Cash *value)
...
@@ -689,19 +690,19 @@ cash_words_out(Cash *value)
text
*
result
;
text
*
result
;
/* work with positive numbers */
/* work with positive numbers */
if
(
*
value
<
0
)
if
(
value
<
0
)
{
{
*
value
*=
-
1
;
value
=
-
value
;
strcpy
(
buf
,
"minus "
);
strcpy
(
buf
,
"minus "
);
p
+=
6
;
p
+=
6
;
}
}
else
else
*
buf
=
0
;
buf
[
0
]
=
'\0'
;
m0
=
*
value
%
100
;
/* cents */
m0
=
value
%
100
;
/* cents */
m1
=
(
*
value
/
100
)
%
1000
;
/* hundreds */
m1
=
(
value
/
100
)
%
1000
;
/* hundreds */
m2
=
(
*
value
/
100000
)
%
1000
;
/* thousands */
m2
=
(
value
/
100000
)
%
1000
;
/* thousands */
m3
=
*
value
/
100000000
%
1000
;
/* millions */
m3
=
value
/
100000000
%
1000
;
/* millions */
if
(
m3
)
if
(
m3
)
{
{
...
@@ -721,20 +722,20 @@ cash_words_out(Cash *value)
...
@@ -721,20 +722,20 @@ cash_words_out(Cash *value)
if
(
!*
p
)
if
(
!*
p
)
strcat
(
buf
,
"zero"
);
strcat
(
buf
,
"zero"
);
strcat
(
buf
,
(
int
)
(
*
value
/
100
)
==
1
?
" dollar and "
:
" dollars and "
);
strcat
(
buf
,
(
int
)
(
value
/
100
)
==
1
?
" dollar and "
:
" dollars and "
);
strcat
(
buf
,
num_word
(
m0
));
strcat
(
buf
,
num_word
(
m0
));
strcat
(
buf
,
m0
==
1
?
" cent"
:
" cents"
);
strcat
(
buf
,
m0
==
1
?
" cent"
:
" cents"
);
/* capitalize output */
/* capitalize output */
*
buf
=
toupper
(
*
buf
);
buf
[
0
]
=
toupper
(
buf
[
0
]
);
/* make a text type for output */
/* make a text type for output */
result
=
(
text
*
)
palloc
(
strlen
(
buf
)
+
VARHDRSZ
);
result
=
(
text
*
)
palloc
(
strlen
(
buf
)
+
VARHDRSZ
);
VARATT_SIZEP
(
result
)
=
strlen
(
buf
)
+
VARHDRSZ
;
VARATT_SIZEP
(
result
)
=
strlen
(
buf
)
+
VARHDRSZ
;
memcpy
(
VARDATA
(
result
),
buf
,
strlen
(
buf
));
memcpy
(
VARDATA
(
result
),
buf
,
strlen
(
buf
));
return
result
;
PG_RETURN_TEXT_P
(
result
)
;
}
/* cash_words_out() */
}
/*************************************************************************
/*************************************************************************
...
...
src/backend/utils/adt/float.c
View file @
8ecac94b
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.6
2 2000/07/03 23:09:50 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.6
3 2000/07/06 05:48:11 tgl
Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -941,91 +941,99 @@ i2tof(PG_FUNCTION_ARGS)
...
@@ -941,91 +941,99 @@ i2tof(PG_FUNCTION_ARGS)
/*
/*
* float8_text - converts a float8 number to a text string
* float8_text - converts a float8 number to a text string
*/
*/
text
*
Datum
float8_text
(
float64
num
)
float8_text
(
PG_FUNCTION_ARGS
)
{
{
float8
num
=
PG_GETARG_FLOAT8
(
0
);
text
*
result
;
text
*
result
;
int
len
;
int
len
;
char
*
str
;
char
*
str
;
str
=
float8out
(
num
);
str
=
float8out
(
&
num
);
/* XXX temporary hack */
len
=
(
strlen
(
str
)
+
VARHDRSZ
)
;
len
=
strlen
(
str
)
+
VARHDRSZ
;
result
=
palloc
(
len
);
result
=
(
text
*
)
palloc
(
len
);
VARATT_SIZEP
(
result
)
=
len
;
VARATT_SIZEP
(
result
)
=
len
;
mem
move
(
VARDATA
(
result
),
str
,
(
len
-
VARHDRSZ
));
mem
cpy
(
VARDATA
(
result
),
str
,
(
len
-
VARHDRSZ
));
pfree
(
str
);
pfree
(
str
);
return
result
;
}
/* float8_text() */
PG_RETURN_TEXT_P
(
result
);
}
/*
/*
* text_float8 - converts a text string to a float8 number
* text_float8 - converts a text string to a float8 number
*/
*/
float64
Datum
text_float8
(
text
*
string
)
text_float8
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
float64
result
;
float64
result
;
int
len
;
int
len
;
char
*
str
;
char
*
str
;
len
=
(
VARSIZE
(
string
)
-
VARHDRSZ
);
len
=
(
VARSIZE
(
string
)
-
VARHDRSZ
);
str
=
palloc
(
len
+
1
);
str
=
palloc
(
len
+
1
);
mem
move
(
str
,
VARDATA
(
string
),
len
);
mem
cpy
(
str
,
VARDATA
(
string
),
len
);
*
(
str
+
len
)
=
'\0'
;
*
(
str
+
len
)
=
'\0'
;
result
=
float8in
(
str
);
result
=
float8in
(
str
);
pfree
(
str
);
pfree
(
str
);
return
result
;
return
PointerGetDatum
(
result
)
;
}
/* text_float8() */
}
/*
/*
* float4_text - converts a float4 number to a text string
* float4_text - converts a float4 number to a text string
*/
*/
text
*
Datum
float4_text
(
float32
num
)
float4_text
(
PG_FUNCTION_ARGS
)
{
{
float4
num
=
PG_GETARG_FLOAT4
(
0
);
text
*
result
;
text
*
result
;
int
len
;
int
len
;
char
*
str
;
char
*
str
;
str
=
float4out
(
num
);
str
=
float4out
(
&
num
);
/* XXX temporary hack */
len
=
(
strlen
(
str
)
+
VARHDRSZ
)
;
len
=
strlen
(
str
)
+
VARHDRSZ
;
result
=
palloc
(
len
);
result
=
(
text
*
)
palloc
(
len
);
VARATT_SIZEP
(
result
)
=
len
;
VARATT_SIZEP
(
result
)
=
len
;
mem
move
(
VARDATA
(
result
),
str
,
(
len
-
VARHDRSZ
));
mem
cpy
(
VARDATA
(
result
),
str
,
(
len
-
VARHDRSZ
));
pfree
(
str
);
pfree
(
str
);
return
result
;
}
/* float4_text() */
PG_RETURN_TEXT_P
(
result
);
}
/*
/*
* text_float4 - converts a text string to a float4 number
* text_float4 - converts a text string to a float4 number
*/
*/
float32
Datum
text_float4
(
text
*
string
)
text_float4
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
float32
result
;
float32
result
;
int
len
;
int
len
;
char
*
str
;
char
*
str
;
len
=
(
VARSIZE
(
string
)
-
VARHDRSZ
);
len
=
(
VARSIZE
(
string
)
-
VARHDRSZ
);
str
=
palloc
(
len
+
1
);
str
=
palloc
(
len
+
1
);
mem
move
(
str
,
VARDATA
(
string
),
len
);
mem
cpy
(
str
,
VARDATA
(
string
),
len
);
*
(
str
+
len
)
=
'\0'
;
*
(
str
+
len
)
=
'\0'
;
result
=
float4in
(
str
);
result
=
float4in
(
str
);
pfree
(
str
);
pfree
(
str
);
return
result
;
return
PointerGetDatum
(
result
)
;
}
/* text_float4() */
}
/*
/*
...
...
src/backend/utils/adt/like.c
View file @
8ecac94b
...
@@ -11,15 +11,16 @@
...
@@ -11,15 +11,16 @@
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.3
5 2000/06/14 18:59:42 momjian
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.3
6 2000/07/06 05:48:11 tgl
Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
#include "postgres.h"
#include "postgres.h"
#include "mb/pg_wchar.h"
#include "mb/pg_wchar.h"
#include "utils/builtins.h"
#include "utils/builtins.h"
static
int
like
(
pg_wchar
*
text
,
pg_wchar
*
p
);
static
bool
like
(
pg_wchar
*
text
,
pg_wchar
*
p
);
/*
/*
* interface routines called by the function manager
* interface routines called by the function manager
...
@@ -30,20 +31,17 @@ static int like(pg_wchar * text, pg_wchar * p);
...
@@ -30,20 +31,17 @@ static int like(pg_wchar * text, pg_wchar * p);
a generic fixed length like routine
a generic fixed length like routine
s - the string to match against (not necessarily null-terminated)
s - the string to match against (not necessarily null-terminated)
p - the pattern
p - the pattern
(as text*)
charlen - the length of the string
charlen - the length of the string
*/
*/
static
bool
static
bool
fixedlen_like
(
char
*
s
,
struct
varlena
*
p
,
int
charlen
)
fixedlen_like
(
char
*
s
,
text
*
p
,
int
charlen
)
{
{
pg_wchar
*
sterm
,
pg_wchar
*
sterm
,
*
pterm
;
*
pterm
;
int
result
;
bool
result
;
int
len
;
int
len
;
if
(
!
s
||
!
p
)
return
FALSE
;
/* be sure sterm is null-terminated */
/* be sure sterm is null-terminated */
#ifdef MULTIBYTE
#ifdef MULTIBYTE
sterm
=
(
pg_wchar
*
)
palloc
((
charlen
+
1
)
*
sizeof
(
pg_wchar
));
sterm
=
(
pg_wchar
*
)
palloc
((
charlen
+
1
)
*
sizeof
(
pg_wchar
));
...
@@ -54,7 +52,7 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
...
@@ -54,7 +52,7 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
#endif
#endif
/*
/*
* p is a text
= varlena
, not a string so we have to make a string
* p is a text, not a string so we have to make a string
* from the vl_data field of the struct.
* from the vl_data field of the struct.
*/
*/
...
@@ -65,8 +63,8 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
...
@@ -65,8 +63,8 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
(
void
)
pg_mb2wchar_with_len
((
unsigned
char
*
)
VARDATA
(
p
),
pterm
,
len
);
(
void
)
pg_mb2wchar_with_len
((
unsigned
char
*
)
VARDATA
(
p
),
pterm
,
len
);
#else
#else
pterm
=
(
char
*
)
palloc
(
len
+
1
);
pterm
=
(
char
*
)
palloc
(
len
+
1
);
mem
move
(
pterm
,
VARDATA
(
p
),
len
);
mem
cpy
(
pterm
,
VARDATA
(
p
),
len
);
*
(
pterm
+
len
)
=
(
char
)
NULL
;
*
(
pterm
+
len
)
=
'\0'
;
#endif
#endif
/* do the regexp matching */
/* do the regexp matching */
...
@@ -75,35 +73,43 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
...
@@ -75,35 +73,43 @@ fixedlen_like(char *s, struct varlena * p, int charlen)
pfree
(
sterm
);
pfree
(
sterm
);
pfree
(
pterm
);
pfree
(
pterm
);
return
(
bool
)
result
;
return
result
;
}
}
bool
Datum
namelike
(
NameData
*
n
,
struct
varlena
*
p
)
namelike
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
n
)
Name
n
=
PG_GETARG_NAME
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
fixedlen_like
(
NameStr
(
*
n
),
p
,
NAMEDATALEN
);
PG_RETURN_BOOL
(
fixedlen_like
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
))));
}
}
bool
Datum
namenlike
(
NameData
*
s
,
struct
varlena
*
p
)
namenlike
(
PG_FUNCTION_ARGS
)
{
{
return
!
namelike
(
s
,
p
);
Name
n
=
PG_GETARG_NAME
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_like
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
))));
}
}
bool
Datum
textlike
(
struct
varlena
*
s
,
struct
varlena
*
p
)
textlike
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
s
)
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
fixedlen_like
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
);
PG_RETURN_BOOL
(
fixedlen_like
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
));
}
}
bool
Datum
textnlike
(
struct
varlena
*
s
,
struct
varlena
*
p
)
textnlike
(
PG_FUNCTION_ARGS
)
{
{
return
!
textlike
(
s
,
p
);
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_like
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
));
}
}
...
@@ -221,11 +227,11 @@ DoMatch(pg_wchar * text, pg_wchar * p)
...
@@ -221,11 +227,11 @@ DoMatch(pg_wchar * text, pg_wchar * p)
/*
/*
** User-level routine. Returns TRUE or FALSE.
** User-level routine. Returns TRUE or FALSE.
*/
*/
static
int
static
bool
like
(
pg_wchar
*
text
,
pg_wchar
*
p
)
like
(
pg_wchar
*
text
,
pg_wchar
*
p
)
{
{
/* Fast path for match-everything pattern */
/* Fast path for match-everything pattern */
if
(
p
[
0
]
==
'%'
&&
p
[
1
]
==
'\0'
)
if
(
p
[
0
]
==
'%'
&&
p
[
1
]
==
'\0'
)
return
TRUE
;
return
true
;
return
DoMatch
(
text
,
p
)
==
LIKE_TRUE
;
return
DoMatch
(
text
,
p
)
==
LIKE_TRUE
;
}
}
src/backend/utils/adt/lztext.c
View file @
8ecac94b
/* ----------
/* ----------
* lztext.c -
* lztext.c -
*
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.
9 2000/07/05 10:09:53 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.
10 2000/07/06 05:48:11 tgl
Exp $
*
*
* Text type with internal LZ compressed representation. Uses the
* Text type with internal LZ compressed representation. Uses the
* standard PostgreSQL compression method.
* standard PostgreSQL compression method.
...
@@ -174,19 +174,13 @@ lztextoctetlen(lztext *lz)
...
@@ -174,19 +174,13 @@ lztextoctetlen(lztext *lz)
* Convert text to lztext
* Convert text to lztext
* ----------
* ----------
*/
*/
lztext
*
Datum
text_lztext
(
text
*
txt
)
text_lztext
(
PG_FUNCTION_ARGS
)
{
{
text
*
txt
=
PG_GETARG_TEXT_P
(
0
);
lztext
*
result
;
lztext
*
result
;
int32
rawsize
;
int32
rawsize
;
/* ----------
* Handle NULL
* ----------
*/
if
(
txt
==
NULL
)
return
NULL
;
/* ----------
/* ----------
* Copy the entire attribute
* Copy the entire attribute
* ----------
* ----------
...
@@ -196,7 +190,7 @@ text_lztext(text *txt)
...
@@ -196,7 +190,7 @@ text_lztext(text *txt)
VARATT_SIZEP
(
result
)
=
rawsize
+
VARHDRSZ
;
VARATT_SIZEP
(
result
)
=
rawsize
+
VARHDRSZ
;
memcpy
(
VARATT_DATA
(
result
),
VARATT_DATA
(
txt
),
rawsize
);
memcpy
(
VARATT_DATA
(
result
),
VARATT_DATA
(
txt
),
rawsize
);
return
result
;
PG_RETURN_POINTER
(
result
)
;
}
}
...
...
src/backend/utils/adt/mac.c
View file @
8ecac94b
/*
/*
* PostgreSQL type definitions for MAC addresses.
* PostgreSQL type definitions for MAC addresses.
*
*
* $
Id: mac.c,v 1.15 2000/07/03 23:09:52 wieck
Exp $
* $
Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.16 2000/07/06 05:48:11 tgl
Exp $
*/
*/
#include "postgres.h"
#include "postgres.h"
#include "utils/builtins.h"
#include "utils/builtins.h"
manufacturer
manufacturers
[]
=
{
/*
* macaddr is a pass-by-reference datatype.
*/
#define PG_GETARG_MACADDR_P(n) ((macaddr *) PG_GETARG_POINTER(n))
#define PG_RETURN_MACADDR_P(x) return PointerGetDatum(x)
typedef
struct
manufacturer
{
unsigned
char
a
;
unsigned
char
b
;
unsigned
char
c
;
char
*
name
;
}
manufacturer
;
static
manufacturer
manufacturers
[]
=
{
{
0x00
,
0x00
,
0x0C
,
"Cisco"
},
{
0x00
,
0x00
,
0x0C
,
"Cisco"
},
{
0x00
,
0x00
,
0x0E
,
"Fujitsu"
},
{
0x00
,
0x00
,
0x0E
,
"Fujitsu"
},
{
0x00
,
0x00
,
0x0F
,
"NeXT"
},
{
0x00
,
0x00
,
0x0F
,
"NeXT"
},
...
@@ -290,19 +306,17 @@ macaddr_cmp(macaddr *a1, macaddr *a2)
...
@@ -290,19 +306,17 @@ macaddr_cmp(macaddr *a1, macaddr *a2)
}
}
/*
/*
* The special manufacturer fetching function.
See "mac.h".
* The special manufacturer fetching function.
*/
*/
text
*
Datum
macaddr_manuf
(
macaddr
*
addr
)
macaddr_manuf
(
PG_FUNCTION_ARGS
)
{
{
macaddr
*
addr
=
PG_GETARG_MACADDR_P
(
0
);
manufacturer
*
manuf
;
manufacturer
*
manuf
;
int
length
;
int
length
;
text
*
result
;
text
*
result
;
if
(
!
PointerIsValid
(
addr
))
return
NULL
;
for
(
manuf
=
manufacturers
;
manuf
->
name
!=
NULL
;
manuf
++
)
for
(
manuf
=
manufacturers
;
manuf
->
name
!=
NULL
;
manuf
++
)
{
{
if
((
manuf
->
a
==
addr
->
a
)
&&
if
((
manuf
->
a
==
addr
->
a
)
&&
...
@@ -312,17 +326,16 @@ macaddr_manuf(macaddr *addr)
...
@@ -312,17 +326,16 @@ macaddr_manuf(macaddr *addr)
}
}
if
(
manuf
->
name
==
NULL
)
if
(
manuf
->
name
==
NULL
)
{
{
result
=
palloc
(
VARHDRSZ
+
1
);
/* Not known, so return empty string */
memset
(
result
,
0
,
VARHDRSZ
+
1
);
result
=
palloc
(
VARHDRSZ
);
VARATT_SIZEP
(
result
)
=
VARHDRSZ
+
1
;
VARATT_SIZEP
(
result
)
=
VARHDRSZ
;
}
}
else
else
{
{
length
=
strlen
(
manuf
->
name
)
+
1
;
length
=
strlen
(
manuf
->
name
);
result
=
palloc
(
length
+
VARHDRSZ
);
result
=
palloc
(
length
+
VARHDRSZ
);
memset
(
result
,
0
,
length
+
VARHDRSZ
);
VARATT_SIZEP
(
result
)
=
length
+
VARHDRSZ
;
VARATT_SIZEP
(
result
)
=
length
+
VARHDRSZ
;
memcpy
(
VARDATA
(
result
),
manuf
->
name
,
length
);
memcpy
(
VARDATA
(
result
),
manuf
->
name
,
length
);
}
}
return
result
;
PG_RETURN_TEXT_P
(
result
)
;
}
}
src/backend/utils/adt/network.c
View file @
8ecac94b
...
@@ -3,21 +3,29 @@
...
@@ -3,21 +3,29 @@
* is for IP V4 CIDR notation, but prepared for V6: just
* is for IP V4 CIDR notation, but prepared for V6: just
* add the necessary bits where the comments indicate.
* add the necessary bits where the comments indicate.
*
*
* $Id: network.c,v 1.22 2000/07/03 23:09:52 wieck Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.23 2000/07/06 05:48:11 tgl Exp $
*
* Jon Postel RIP 16 Oct 1998
* Jon Postel RIP 16 Oct 1998
*/
*/
#include <sys/types.h>
#include "postgres.h"
#include <sys/socket.h>
#include <errno.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
#include "postgres.h"
#include "utils/builtins.h"
#include "utils/builtins.h"
/*
* inet is a pass-by-reference datatype. It's not toastable, and we
* don't try to hide the pass-by-refness, so these macros are simple.
*/
#define PG_GETARG_INET_P(n) ((inet *) PG_GETARG_POINTER(n))
#define PG_RETURN_INET_P(x) return PointerGetDatum(x)
static
int
v4bitncmp
(
unsigned
int
a1
,
unsigned
int
a2
,
int
bits
);
static
int
v4bitncmp
(
unsigned
int
a1
,
unsigned
int
a2
,
int
bits
);
/*
/*
...
@@ -315,17 +323,15 @@ network_cmp(inet *a1, inet *a2)
...
@@ -315,17 +323,15 @@ network_cmp(inet *a1, inet *a2)
return
0
;
return
0
;
}
}
text
*
Datum
network_host
(
inet
*
ip
)
network_host
(
PG_FUNCTION_ARGS
)
{
{
inet
*
ip
=
PG_GETARG_INET_P
(
0
);
text
*
ret
;
text
*
ret
;
int
len
;
int
len
;
char
*
ptr
,
char
*
ptr
,
tmp
[
sizeof
(
"255.255.255.255/32"
)];
tmp
[
sizeof
(
"255.255.255.255/32"
)];
if
(
!
PointerIsValid
(
ip
))
return
NULL
;
if
(
ip_type
(
ip
))
if
(
ip_type
(
ip
))
elog
(
ERROR
,
"CIDR type has no host part"
);
elog
(
ERROR
,
"CIDR type has no host part"
);
...
@@ -339,16 +345,16 @@ network_host(inet *ip)
...
@@ -339,16 +345,16 @@ network_host(inet *ip)
/* Go for an IPV6 address here, before faulting out: */
/* Go for an IPV6 address here, before faulting out: */
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
/* Suppress /n if present */
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
*
ptr
=
0
;
*
ptr
=
'\0'
;
len
=
VARHDRSZ
+
strlen
(
tmp
)
+
1
;
ret
=
palloc
(
len
);
/* Return string as a text datum */
if
(
ret
==
NULL
)
len
=
strlen
(
tmp
);
elog
(
ERROR
,
"unable to allocate memory in network_host()"
);
ret
=
(
text
*
)
palloc
(
len
+
VARHDRSZ
);
VARATT_SIZEP
(
ret
)
=
len
+
VARHDRSZ
;
VARATT_SIZEP
(
ret
)
=
len
;
memcpy
(
VARDATA
(
ret
),
tmp
,
len
);
strcpy
(
VARDATA
(
ret
),
tmp
);
PG_RETURN_TEXT_P
(
ret
);
return
(
ret
);
}
}
int4
int4
...
@@ -360,17 +366,15 @@ network_masklen(inet *ip)
...
@@ -360,17 +366,15 @@ network_masklen(inet *ip)
return
ip_bits
(
ip
);
return
ip_bits
(
ip
);
}
}
text
*
Datum
network_broadcast
(
inet
*
ip
)
network_broadcast
(
PG_FUNCTION_ARGS
)
{
{
inet
*
ip
=
PG_GETARG_INET_P
(
0
);
text
*
ret
;
text
*
ret
;
int
len
;
int
len
;
char
*
ptr
,
char
*
ptr
,
tmp
[
sizeof
(
"255.255.255.255/32"
)];
tmp
[
sizeof
(
"255.255.255.255/32"
)];
if
(
!
PointerIsValid
(
ip
))
return
NULL
;
if
(
ip_family
(
ip
)
==
AF_INET
)
if
(
ip_family
(
ip
)
==
AF_INET
)
{
{
/* It's an IP V4 address: */
/* It's an IP V4 address: */
...
@@ -383,34 +387,31 @@ network_broadcast(inet *ip)
...
@@ -383,34 +387,31 @@ network_broadcast(inet *ip)
if
(
inet_net_ntop
(
AF_INET
,
&
addr
,
32
,
tmp
,
sizeof
(
tmp
))
==
NULL
)
if
(
inet_net_ntop
(
AF_INET
,
&
addr
,
32
,
tmp
,
sizeof
(
tmp
))
==
NULL
)
elog
(
ERROR
,
"unable to print address (%s)"
,
strerror
(
errno
));
elog
(
ERROR
,
"unable to print address (%s)"
,
strerror
(
errno
));
}
}
else
else
/* Go for an IPV6 address here, before faulting out: */
/* Go for an IPV6 address here, before faulting out: */
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
/* Suppress /n if present */
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
*
ptr
=
0
;
*
ptr
=
'\0'
;
len
=
VARHDRSZ
+
strlen
(
tmp
)
+
1
;
ret
=
palloc
(
len
);
/* Return string as a text datum */
if
(
ret
==
NULL
)
len
=
strlen
(
tmp
);
elog
(
ERROR
,
"unable to allocate memory in network_broadcast()"
);
ret
=
(
text
*
)
palloc
(
len
+
VARHDRSZ
);
VARATT_SIZEP
(
ret
)
=
len
+
VARHDRSZ
;
VARATT_SIZEP
(
ret
)
=
len
;
memcpy
(
VARDATA
(
ret
),
tmp
,
len
);
strcpy
(
VARDATA
(
ret
),
tmp
);
PG_RETURN_TEXT_P
(
ret
);
return
(
ret
);
}
}
text
*
Datum
network_network
(
inet
*
ip
)
network_network
(
PG_FUNCTION_ARGS
)
{
{
inet
*
ip
=
PG_GETARG_INET_P
(
0
);
text
*
ret
;
text
*
ret
;
int
len
;
int
len
;
char
tmp
[
sizeof
(
"255.255.255.255/32"
)];
char
tmp
[
sizeof
(
"255.255.255.255/32"
)];
if
(
!
PointerIsValid
(
ip
))
return
NULL
;
if
(
ip_family
(
ip
)
==
AF_INET
)
if
(
ip_family
(
ip
)
==
AF_INET
)
{
{
/* It's an IP V4 address: */
/* It's an IP V4 address: */
...
@@ -418,33 +419,28 @@ network_network(inet *ip)
...
@@ -418,33 +419,28 @@ network_network(inet *ip)
if
(
inet_cidr_ntop
(
AF_INET
,
&
addr
,
ip_bits
(
ip
),
tmp
,
sizeof
(
tmp
))
==
NULL
)
if
(
inet_cidr_ntop
(
AF_INET
,
&
addr
,
ip_bits
(
ip
),
tmp
,
sizeof
(
tmp
))
==
NULL
)
elog
(
ERROR
,
"unable to print network (%s)"
,
strerror
(
errno
));
elog
(
ERROR
,
"unable to print network (%s)"
,
strerror
(
errno
));
}
}
else
else
/* Go for an IPV6 address here, before faulting out: */
/* Go for an IPV6 address here, before faulting out: */
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
len
=
VARHDRSZ
+
strlen
(
tmp
)
+
1
;
/* Return string as a text datum */
ret
=
palloc
(
len
);
len
=
strlen
(
tmp
);
if
(
ret
==
NULL
)
ret
=
(
text
*
)
palloc
(
len
+
VARHDRSZ
);
elog
(
ERROR
,
"unable to allocate memory in network_network()"
);
VARATT_SIZEP
(
ret
)
=
len
+
VARHDRSZ
;
memcpy
(
VARDATA
(
ret
),
tmp
,
len
);
VARATT_SIZEP
(
ret
)
=
len
;
PG_RETURN_TEXT_P
(
ret
);
strcpy
(
VARDATA
(
ret
),
tmp
);
return
(
ret
);
}
}
text
*
Datum
network_netmask
(
inet
*
ip
)
network_netmask
(
PG_FUNCTION_ARGS
)
{
{
inet
*
ip
=
PG_GETARG_INET_P
(
0
);
text
*
ret
;
text
*
ret
;
int
len
;
int
len
;
char
*
ptr
,
char
*
ptr
,
tmp
[
sizeof
(
"255.255.255.255/32"
)];
tmp
[
sizeof
(
"255.255.255.255/32"
)];
if
(
!
PointerIsValid
(
ip
))
return
NULL
;
if
(
ip_family
(
ip
)
==
AF_INET
)
if
(
ip_family
(
ip
)
==
AF_INET
)
{
{
/* It's an IP V4 address: */
/* It's an IP V4 address: */
...
@@ -453,22 +449,21 @@ network_netmask(inet *ip)
...
@@ -453,22 +449,21 @@ network_netmask(inet *ip)
if
(
inet_net_ntop
(
AF_INET
,
&
addr
,
32
,
tmp
,
sizeof
(
tmp
))
==
NULL
)
if
(
inet_net_ntop
(
AF_INET
,
&
addr
,
32
,
tmp
,
sizeof
(
tmp
))
==
NULL
)
elog
(
ERROR
,
"unable to print netmask (%s)"
,
strerror
(
errno
));
elog
(
ERROR
,
"unable to print netmask (%s)"
,
strerror
(
errno
));
}
}
else
else
/* Go for an IPV6 address here, before faulting out: */
/* Go for an IPV6 address here, before faulting out: */
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
/* Suppress /n if present */
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
if
((
ptr
=
strchr
(
tmp
,
'/'
))
!=
NULL
)
*
ptr
=
0
;
*
ptr
=
'\0'
;
len
=
VARHDRSZ
+
strlen
(
tmp
)
+
1
;
ret
=
palloc
(
len
);
/* Return string as a text datum */
if
(
ret
==
NULL
)
len
=
strlen
(
tmp
);
elog
(
ERROR
,
"unable to allocate memory in network_netmask()"
);
ret
=
(
text
*
)
palloc
(
len
+
VARHDRSZ
);
VARATT_SIZEP
(
ret
)
=
len
+
VARHDRSZ
;
VARATT_SIZEP
(
ret
)
=
len
;
memcpy
(
VARDATA
(
ret
),
tmp
,
len
);
strcpy
(
VARDATA
(
ret
),
tmp
);
PG_RETURN_TEXT_P
(
ret
);
return
(
ret
);
}
}
/*
/*
...
...
src/backend/utils/adt/oracle_compat.c
View file @
8ecac94b
/*
/*
* Edmund Mergl <E.Mergl@bawue.de>
* Edmund Mergl <E.Mergl@bawue.de>
*
*
* $
Id: oracle_compat.c,v 1.26 2000/07/03 23:09:52 wieck
Exp $
* $
Header: /cvsroot/pgsql/src/backend/utils/adt/oracle_compat.c,v 1.27 2000/07/06 05:48:11 tgl
Exp $
*
*
*/
*/
#include <ctype.h>
#include <ctype.h>
#include "postgres.h"
#include "postgres.h"
#include "utils/builtins.h"
#include "utils/builtins.h"
...
@@ -17,7 +18,7 @@
...
@@ -17,7 +18,7 @@
*
*
* Syntax:
* Syntax:
*
*
* text
*lower(text *
string)
* text
lower(text
string)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -25,27 +26,24 @@
...
@@ -25,27 +26,24 @@
*
*
********************************************************************/
********************************************************************/
text
*
Datum
lower
(
text
*
string
)
lower
(
PG_FUNCTION_ARGS
)
{
{
text
*
ret
;
text
*
string
=
PG_GETARG_TEXT_P_COPY
(
0
);
char
*
ptr
,
char
*
ptr
;
*
ptr_ret
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
))
/* Since we copied the string, we can scribble directly on the value */
return
string
;
ret
=
(
text
*
)
palloc
(
VARSIZE
(
string
));
VARATT_SIZEP
(
ret
)
=
VARSIZE
(
string
);
ptr
=
VARDATA
(
string
);
ptr
=
VARDATA
(
string
);
ptr_ret
=
VARDATA
(
ret
)
;
m
=
VARSIZE
(
string
)
-
VARHDRSZ
;
while
(
m
--
)
while
(
m
--
>
0
)
*
ptr_ret
++
=
tolower
((
unsigned
char
)
*
ptr
++
);
{
*
ptr
=
tolower
((
unsigned
char
)
*
ptr
);
ptr
++
;
}
return
ret
;
PG_RETURN_TEXT_P
(
string
)
;
}
}
...
@@ -55,7 +53,7 @@ lower(text *string)
...
@@ -55,7 +53,7 @@ lower(text *string)
*
*
* Syntax:
* Syntax:
*
*
* text
*upper(text *
string)
* text
upper(text
string)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -63,27 +61,24 @@ lower(text *string)
...
@@ -63,27 +61,24 @@ lower(text *string)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
upper
(
text
*
string
)
upper
(
PG_FUNCTION_ARGS
)
{
{
text
*
ret
;
text
*
string
=
PG_GETARG_TEXT_P_COPY
(
0
);
char
*
ptr
,
char
*
ptr
;
*
ptr_ret
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
))
/* Since we copied the string, we can scribble directly on the value */
return
string
;
ret
=
(
text
*
)
palloc
(
VARSIZE
(
string
));
VARATT_SIZEP
(
ret
)
=
VARSIZE
(
string
);
ptr
=
VARDATA
(
string
);
ptr
=
VARDATA
(
string
);
ptr_ret
=
VARDATA
(
ret
)
;
m
=
VARSIZE
(
string
)
-
VARHDRSZ
;
while
(
m
--
)
while
(
m
--
>
0
)
*
ptr_ret
++
=
toupper
((
unsigned
char
)
*
ptr
++
);
{
*
ptr
=
toupper
((
unsigned
char
)
*
ptr
);
ptr
++
;
}
return
ret
;
PG_RETURN_TEXT_P
(
string
)
;
}
}
...
@@ -93,7 +88,7 @@ upper(text *string)
...
@@ -93,7 +88,7 @@ upper(text *string)
*
*
* Syntax:
* Syntax:
*
*
* text
*initcap(text *
string)
* text
initcap(text
string)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -103,35 +98,34 @@ upper(text *string)
...
@@ -103,35 +98,34 @@ upper(text *string)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
initcap
(
text
*
string
)
initcap
(
PG_FUNCTION_ARGS
)
{
{
text
*
ret
;
text
*
string
=
PG_GETARG_TEXT_P_COPY
(
0
);
char
*
ptr
,
char
*
ptr
;
*
ptr_ret
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
))
/* Since we copied the string, we can scribble directly on the value */
return
string
;
ret
=
(
text
*
)
palloc
(
VARSIZE
(
string
));
VARATT_SIZEP
(
ret
)
=
VARSIZE
(
string
);
ptr
=
VARDATA
(
string
);
ptr
=
VARDATA
(
string
);
ptr_ret
=
VARDATA
(
ret
)
;
m
=
VARSIZE
(
string
)
-
VARHDRSZ
;
*
ptr_ret
++
=
toupper
((
unsigned
char
)
*
ptr
++
);
if
(
m
>
0
)
--
m
;
{
*
ptr
=
toupper
((
unsigned
char
)
*
ptr
);
ptr
++
;
m
--
;
}
while
(
m
--
)
while
(
m
--
>
0
)
{
{
if
(
*
(
ptr_ret
-
1
)
==
' '
||
*
(
ptr_ret
-
1
)
==
' '
)
if
(
isspace
(
ptr
[
-
1
])
)
*
ptr
_ret
++
=
toupper
((
unsigned
char
)
*
ptr
++
);
*
ptr
=
toupper
((
unsigned
char
)
*
ptr
);
else
else
*
ptr_ret
++
=
tolower
((
unsigned
char
)
*
ptr
++
);
*
ptr
=
tolower
((
unsigned
char
)
*
ptr
);
ptr
++
;
}
}
return
ret
;
PG_RETURN_TEXT_P
(
string
)
;
}
}
...
@@ -141,7 +135,7 @@ initcap(text *string)
...
@@ -141,7 +135,7 @@ initcap(text *string)
*
*
* Syntax:
* Syntax:
*
*
* text
*lpad(text *string1, int4 len, text *
string2)
* text
lpad(text string1, int4 len, text
string2)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -196,7 +190,7 @@ lpad(PG_FUNCTION_ARGS)
...
@@ -196,7 +190,7 @@ lpad(PG_FUNCTION_ARGS)
*
*
* Syntax:
* Syntax:
*
*
* text
*rpad(text *string1, int4 len, text *
string2)
* text
rpad(text string1, int4 len, text
string2)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -251,7 +245,7 @@ rpad(PG_FUNCTION_ARGS)
...
@@ -251,7 +245,7 @@ rpad(PG_FUNCTION_ARGS)
*
*
* Syntax:
* Syntax:
*
*
* text
*btrim(text *string, text *
set)
* text
btrim(text string, text
set)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -260,9 +254,11 @@ rpad(PG_FUNCTION_ARGS)
...
@@ -260,9 +254,11 @@ rpad(PG_FUNCTION_ARGS)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
btrim
(
text
*
string
,
text
*
set
)
btrim
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
text
*
set
=
PG_GETARG_TEXT_P
(
1
);
text
*
ret
;
text
*
ret
;
char
*
ptr
,
char
*
ptr
,
*
end
,
*
end
,
...
@@ -270,18 +266,17 @@ btrim(text *string, text *set)
...
@@ -270,18 +266,17 @@ btrim(text *string, text *set)
*
end2
;
*
end2
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
if
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
)
||
(
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
)
(
set
==
(
text
*
)
NULL
)
||
PG_RETURN_TEXT_P
(
string
);
((
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
))
return
string
;
ptr
=
VARDATA
(
string
);
ptr
=
VARDATA
(
string
);
ptr2
=
VARDATA
(
set
)
;
end
=
VARDATA
(
string
)
+
VARSIZE
(
string
)
-
VARHDRSZ
-
1
;
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
while
(
m
--
)
while
(
m
>
0
)
{
{
ptr2
=
VARDATA
(
set
);
while
(
ptr2
<=
end2
)
while
(
ptr2
<=
end2
)
{
{
if
(
*
ptr
==
*
ptr2
)
if
(
*
ptr
==
*
ptr2
)
...
@@ -291,16 +286,12 @@ btrim(text *string, text *set)
...
@@ -291,16 +286,12 @@ btrim(text *string, text *set)
if
(
ptr2
>
end2
)
if
(
ptr2
>
end2
)
break
;
break
;
ptr
++
;
ptr
++
;
ptr2
=
VARDATA
(
set
)
;
m
--
;
}
}
++
m
;
while
(
m
>
0
)
end
=
VARDATA
(
string
)
+
VARSIZE
(
string
)
-
VARHDRSZ
-
1
;
ptr2
=
VARDATA
(
set
);
while
(
m
--
)
{
{
ptr2
=
VARDATA
(
set
);
while
(
ptr2
<=
end2
)
while
(
ptr2
<=
end2
)
{
{
if
(
*
end
==
*
ptr2
)
if
(
*
end
==
*
ptr2
)
...
@@ -309,18 +300,16 @@ btrim(text *string, text *set)
...
@@ -309,18 +300,16 @@ btrim(text *string, text *set)
}
}
if
(
ptr2
>
end2
)
if
(
ptr2
>
end2
)
break
;
break
;
--
end
;
end
--
;
ptr2
=
VARDATA
(
set
)
;
m
--
;
}
}
++
m
;
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
memcpy
(
VARDATA
(
ret
),
ptr
,
m
);
memcpy
(
VARDATA
(
ret
),
ptr
,
m
);
return
ret
;
PG_RETURN_TEXT_P
(
ret
)
;
}
/* btrim() */
}
/********************************************************************
/********************************************************************
...
@@ -329,7 +318,7 @@ btrim(text *string, text *set)
...
@@ -329,7 +318,7 @@ btrim(text *string, text *set)
*
*
* Syntax:
* Syntax:
*
*
* text
*ltrim(text *string, text *
set)
* text
ltrim(text string, text
set)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -338,27 +327,27 @@ btrim(text *string, text *set)
...
@@ -338,27 +327,27 @@ btrim(text *string, text *set)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
ltrim
(
text
*
string
,
text
*
set
)
ltrim
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
text
*
set
=
PG_GETARG_TEXT_P
(
1
);
text
*
ret
;
text
*
ret
;
char
*
ptr
,
char
*
ptr
,
*
ptr2
,
*
ptr2
,
*
end2
;
*
end2
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
if
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
)
||
(
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
)
(
set
==
(
text
*
)
NULL
)
||
PG_RETURN_TEXT_P
(
string
);
((
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
))
return
string
;
ptr
=
VARDATA
(
string
);
ptr
=
VARDATA
(
string
);
ptr2
=
VARDATA
(
set
);
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
while
(
m
--
)
while
(
m
>
0
)
{
{
ptr2
=
VARDATA
(
set
);
while
(
ptr2
<=
end2
)
while
(
ptr2
<=
end2
)
{
{
if
(
*
ptr
==
*
ptr2
)
if
(
*
ptr
==
*
ptr2
)
...
@@ -368,17 +357,14 @@ ltrim(text *string, text *set)
...
@@ -368,17 +357,14 @@ ltrim(text *string, text *set)
if
(
ptr2
>
end2
)
if
(
ptr2
>
end2
)
break
;
break
;
ptr
++
;
ptr
++
;
ptr2
=
VARDATA
(
set
)
;
m
--
;
}
}
++
m
;
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
memcpy
(
VARDATA
(
ret
),
ptr
,
m
);
memcpy
(
VARDATA
(
ret
),
ptr
,
m
);
return
ret
;
PG_RETURN_TEXT_P
(
ret
)
;
}
}
...
@@ -388,7 +374,7 @@ ltrim(text *string, text *set)
...
@@ -388,7 +374,7 @@ ltrim(text *string, text *set)
*
*
* Syntax:
* Syntax:
*
*
* text
*rtrim(text *string, text *
set)
* text
rtrim(text string, text
set)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -397,54 +383,46 @@ ltrim(text *string, text *set)
...
@@ -397,54 +383,46 @@ ltrim(text *string, text *set)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
rtrim
(
text
*
string
,
text
*
set
)
rtrim
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
text
*
set
=
PG_GETARG_TEXT_P
(
1
);
text
*
ret
;
text
*
ret
;
char
*
ptr
,
char
*
ptr
,
*
end
,
*
ptr2
,
*
ptr2
,
*
end2
,
*
end2
;
*
ptr_ret
;
int
m
;
int
m
;
if
((
string
==
(
text
*
)
NULL
)
||
if
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
||
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
)
||
(
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
)
(
set
==
(
text
*
)
NULL
)
||
PG_RETURN_TEXT_P
(
string
);
((
VARSIZE
(
set
)
-
VARHDRSZ
)
<=
0
))
return
string
;
ptr
=
VARDATA
(
string
)
+
VARSIZE
(
string
)
-
VARHDRSZ
-
1
;
ptr
=
VARDATA
(
string
);
ptr2
=
VARDATA
(
set
)
;
end
=
VARDATA
(
string
)
+
VARSIZE
(
string
)
-
VARHDRSZ
-
1
;
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
end2
=
VARDATA
(
set
)
+
VARSIZE
(
set
)
-
VARHDRSZ
-
1
;
while
(
m
--
)
while
(
m
>
0
)
{
{
ptr2
=
VARDATA
(
set
);
while
(
ptr2
<=
end2
)
while
(
ptr2
<=
end2
)
{
{
if
(
*
ptr
==
*
ptr2
)
if
(
*
end
==
*
ptr2
)
break
;
break
;
++
ptr2
;
++
ptr2
;
}
}
if
(
ptr2
>
end2
)
if
(
ptr2
>
end2
)
break
;
break
;
--
ptr
;
end
--
;
ptr2
=
VARDATA
(
set
)
;
m
--
;
}
}
++
m
;
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
ret
=
(
text
*
)
palloc
(
VARHDRSZ
+
m
);
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
VARATT_SIZEP
(
ret
)
=
VARHDRSZ
+
m
;
#ifdef NOT_USED
memcpy
(
VARDATA
(
ret
),
ptr
,
m
);
memcpy
(
VARDATA
(
ret
),
ptr
-
VARSIZE
(
ret
)
+
m
,
m
);
#endif
ptr_ret
=
VARDATA
(
ret
)
+
m
-
1
;
while
(
m
--
)
*
ptr_ret
--
=
*
ptr
--
;
return
ret
;
PG_RETURN_TEXT_P
(
ret
)
;
}
}
...
@@ -454,7 +432,7 @@ rtrim(text *string, text *set)
...
@@ -454,7 +432,7 @@ rtrim(text *string, text *set)
*
*
* Syntax:
* Syntax:
*
*
* text
*translate(text *string, text *from, text *
to)
* text
translate(text string, text from, text
to)
*
*
* Purpose:
* Purpose:
*
*
...
@@ -465,9 +443,12 @@ rtrim(text *string, text *set)
...
@@ -465,9 +443,12 @@ rtrim(text *string, text *set)
*
*
********************************************************************/
********************************************************************/
text
*
Datum
translate
(
text
*
string
,
text
*
from
,
text
*
to
)
translate
(
PG_FUNCTION_ARGS
)
{
{
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
text
*
from
=
PG_GETARG_TEXT_P
(
1
);
text
*
to
=
PG_GETARG_TEXT_P
(
2
);
text
*
result
;
text
*
result
;
char
*
from_ptr
,
char
*
from_ptr
,
*
to_ptr
;
*
to_ptr
;
...
@@ -479,13 +460,8 @@ translate(text *string, text *from, text *to)
...
@@ -479,13 +460,8 @@ translate(text *string, text *from, text *to)
retlen
,
retlen
,
i
;
i
;
if
(
string
==
(
text
*
)
NULL
||
from
==
(
text
*
)
NULL
||
to
==
(
text
*
)
NULL
)
return
(
text
*
)
NULL
;
if
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
)
if
((
m
=
VARSIZE
(
string
)
-
VARHDRSZ
)
<=
0
)
return
string
;
PG_RETURN_TEXT_P
(
string
)
;
fromlen
=
VARSIZE
(
from
)
-
VARHDRSZ
;
fromlen
=
VARSIZE
(
from
)
-
VARHDRSZ
;
from_ptr
=
VARDATA
(
from
);
from_ptr
=
VARDATA
(
from
);
...
@@ -536,21 +512,20 @@ translate(text *string, text *from, text *to)
...
@@ -536,21 +512,20 @@ translate(text *string, text *from, text *to)
* won't live long anyway.
* won't live long anyway.
*/
*/
return
result
;
PG_RETURN_TEXT_P
(
result
)
;
}
}
int4
Datum
ascii
(
text
*
string
)
ascii
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
PointerIsValid
(
string
))
text
*
string
=
PG_GETARG_TEXT_P
(
0
);
return
0
;
if
(
VARSIZE
(
string
)
<=
VARHDRSZ
)
if
(
VARSIZE
(
string
)
<=
VARHDRSZ
)
return
0
;
PG_RETURN_INT32
(
0
)
;
return
((
int
)
*
(
VARDATA
(
string
)));
PG_RETURN_INT32
((
int32
)
*
((
unsigned
char
*
)
VARDATA
(
string
)));
}
/* ascii() */
}
Datum
Datum
...
...
src/backend/utils/adt/regexp.c
View file @
8ecac94b
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.3
1 2000/07/05 23:11:35
tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.3
2 2000/07/06 05:48:11
tgl Exp $
*
*
* Alistair Crooks added the code for the regex caching
* Alistair Crooks added the code for the regex caching
* agc - cached the regular expressions used - there's a good chance
* agc - cached the regular expressions used - there's a good chance
...
@@ -25,12 +25,10 @@
...
@@ -25,12 +25,10 @@
* instead of `oldest' when compiling regular expressions - benign
* instead of `oldest' when compiling regular expressions - benign
* results mostly, although occasionally it bit you...
* results mostly, although occasionally it bit you...
*
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
#include "postgres.h"
#include "postgres.h"
#include "regex/regex.h"
#include "regex/regex.h"
#include "utils/builtins.h"
#include "utils/builtins.h"
...
@@ -46,7 +44,6 @@
...
@@ -46,7 +44,6 @@
/* this structure describes a cached regular expression */
/* this structure describes a cached regular expression */
struct
cached_re_str
struct
cached_re_str
{
{
struct
varlena
*
cre_text
;
/* pattern as a text* */
char
*
cre_s
;
/* pattern as null-terminated string */
char
*
cre_s
;
/* pattern as null-terminated string */
int
cre_type
;
/* compiled-type: extended,icase etc */
int
cre_type
;
/* compiled-type: extended,icase etc */
regex_t
cre_re
;
/* the compiled regular expression */
regex_t
cre_re
;
/* the compiled regular expression */
...
@@ -59,38 +56,35 @@ static unsigned long lru; /* system lru tag */
...
@@ -59,38 +56,35 @@ static unsigned long lru; /* system lru tag */
/* attempt to compile `re' as an re, then match it against text */
/* attempt to compile `re' as an re, then match it against text */
/* cflags - flag to regcomp indicates case sensitivity */
/* cflags - flag to regcomp indicates case sensitivity */
static
int
static
bool
RE_compile_and_execute
(
struct
varlena
*
text_re
,
char
*
text
,
int
cflags
)
RE_compile_and_execute
(
text
*
text_re
,
char
*
text
,
int
cflags
)
{
{
char
*
re
;
int
oldest
;
int
oldest
;
int
n
;
int
i
;
int
i
;
char
*
re
;
int
regcomp_result
;
int
regcomp_result
;
/* Convert 'text' pattern to null-terminated string */
re
=
DatumGetCString
(
DirectFunctionCall1
(
textout
,
re
=
DatumGetCString
(
DirectFunctionCall1
(
textout
,
PointerGetDatum
(
text_re
)));
PointerGetDatum
(
text_re
)));
/* find a previously compiled regular expression */
/* find a previously compiled regular expression */
for
(
i
=
0
;
i
<
rec
;
i
++
)
for
(
i
=
0
;
i
<
rec
;
i
++
)
{
{
if
(
rev
[
i
].
cre_s
)
if
(
rev
[
i
].
cre_s
)
{
{
if
(
strcmp
(
rev
[
i
].
cre_s
,
re
)
==
0
)
if
(
strcmp
(
rev
[
i
].
cre_s
,
re
)
==
0
&&
rev
[
i
].
cre_type
==
cflags
)
{
{
if
(
rev
[
i
].
cre_type
==
cflags
)
rev
[
i
].
cre_lru
=
++
lru
;
{
pfree
(
re
);
rev
[
i
].
cre_lru
=
++
lru
;
return
(
pg95_regexec
(
&
rev
[
i
].
cre_re
,
pfree
(
re
);
text
,
0
,
return
(
pg95_regexec
(
&
rev
[
i
].
cre_re
,
(
regmatch_t
*
)
NULL
,
0
)
==
0
);
text
,
0
,
(
regmatch_t
*
)
NULL
,
0
)
==
0
);
}
}
}
}
}
}
}
/* we didn't find it - make room in the cache for it */
/* we didn't find it - make room in the cache for it */
if
(
rec
==
MAX_CACHED_RES
)
if
(
rec
==
MAX_CACHED_RES
)
{
{
...
@@ -120,22 +114,18 @@ RE_compile_and_execute(struct varlena * text_re, char *text, int cflags)
...
@@ -120,22 +114,18 @@ RE_compile_and_execute(struct varlena * text_re, char *text, int cflags)
* persist across transactions
* persist across transactions
*/
*/
free
(
rev
[
oldest
].
cre_s
);
free
(
rev
[
oldest
].
cre_s
);
rev
[
oldest
].
cre_s
=
(
char
*
)
NULL
;
}
}
/* compile the re */
/* compile the re */
regcomp_result
=
pg95_regcomp
(
&
rev
[
oldest
].
cre_re
,
re
,
cflags
);
regcomp_result
=
pg95_regcomp
(
&
rev
[
oldest
].
cre_re
,
re
,
cflags
);
if
(
regcomp_result
==
0
)
if
(
regcomp_result
==
0
)
{
{
n
=
strlen
(
re
);
/*
/*
* use malloc/free for the cre_s field because the storage has to
* use malloc/free for the cre_s field because the storage has to
* persist across transactions
* persist across transactions
*/
*/
rev
[
oldest
].
cre_s
=
(
char
*
)
malloc
(
n
+
1
);
rev
[
oldest
].
cre_s
=
strdup
(
re
);
memmove
(
rev
[
oldest
].
cre_s
,
re
,
n
);
rev
[
oldest
].
cre_s
[
n
]
=
0
;
rev
[
oldest
].
cre_text
=
text_re
;
rev
[
oldest
].
cre_lru
=
++
lru
;
rev
[
oldest
].
cre_lru
=
++
lru
;
rev
[
oldest
].
cre_type
=
cflags
;
rev
[
oldest
].
cre_type
=
cflags
;
pfree
(
re
);
pfree
(
re
);
...
@@ -148,38 +138,29 @@ RE_compile_and_execute(struct varlena * text_re, char *text, int cflags)
...
@@ -148,38 +138,29 @@ RE_compile_and_execute(struct varlena * text_re, char *text, int cflags)
char
errMsg
[
1000
];
char
errMsg
[
1000
];
/* re didn't compile */
/* re didn't compile */
rev
[
oldest
].
cre_s
=
(
char
*
)
NULL
;
pg95_regerror
(
regcomp_result
,
&
rev
[
oldest
].
cre_re
,
errMsg
,
pg95_regerror
(
regcomp_result
,
&
rev
[
oldest
].
cre_re
,
errMsg
,
sizeof
(
errMsg
));
sizeof
(
errMsg
));
elog
(
ERROR
,
"regcomp failed with error %s"
,
errMsg
);
elog
(
ERROR
,
"regcomp failed with error %s"
,
errMsg
);
}
}
/* not reached */
/* not reached */
return
0
;
return
false
;
}
}
/*
* interface routines called by the function manager
*/
/*
/*
fixedlen_regexeq:
fixedlen_regexeq:
a generic fixed length regexp routine
a generic fixed length regexp routine
s - the string to match against (not necessarily null-terminated)
s - the string to match against (not necessarily null-terminated)
p - the pattern
p - the pattern
(as a text*)
charlen - the length of the string
charlen - the length of the string
*/
*/
static
bool
static
bool
fixedlen_regexeq
(
char
*
s
,
struct
varlena
*
p
,
int
charlen
,
int
cflags
)
fixedlen_regexeq
(
char
*
s
,
text
*
p
,
int
charlen
,
int
cflags
)
{
{
char
*
sterm
;
char
*
sterm
;
int
result
;
bool
result
;
if
(
!
s
||
!
p
)
return
FALSE
;
/* be sure sterm is null-terminated */
/* be sure sterm is null-terminated */
sterm
=
(
char
*
)
palloc
(
charlen
+
1
);
sterm
=
(
char
*
)
palloc
(
charlen
+
1
);
...
@@ -189,73 +170,113 @@ fixedlen_regexeq(char *s, struct varlena * p, int charlen, int cflags)
...
@@ -189,73 +170,113 @@ fixedlen_regexeq(char *s, struct varlena * p, int charlen, int cflags)
pfree
(
sterm
);
pfree
(
sterm
);
return
(
bool
)
result
;
return
result
;
}
}
/*
/*
*
routines that use the regexp stuff
*
interface routines called by the function manager
*/
*/
bool
nameregexeq
(
NameData
*
n
,
struct
varlena
*
p
)
Datum
nameregexeq
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
n
)
Name
n
=
PG_GETARG_NAME
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
NAMEDATALEN
,
REG_EXTENDED
);
PG_RETURN_BOOL
(
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
)),
REG_EXTENDED
));
}
}
bool
Datum
nameregexne
(
NameData
*
s
,
struct
varlena
*
p
)
nameregexne
(
PG_FUNCTION_ARGS
)
{
{
return
!
nameregexeq
(
s
,
p
);
Name
n
=
PG_GETARG_NAME
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
)),
REG_EXTENDED
));
}
}
bool
Datum
textregexeq
(
struct
varlena
*
s
,
struct
varlena
*
p
)
textregexeq
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
s
)
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_EXTENDED
);
PG_RETURN_BOOL
(
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_EXTENDED
));
}
}
bool
Datum
textregexne
(
struct
varlena
*
s
,
struct
varlena
*
p
)
textregexne
(
PG_FUNCTION_ARGS
)
{
{
return
!
textregexeq
(
s
,
p
);
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_EXTENDED
));
}
}
/*
/*
* routines that use the regexp stuff, but ignore the case.
* routines that use the regexp stuff, but ignore the case.
* for this, we use the REG_ICASE flag to pg95_regcomp
* for this, we use the REG_ICASE flag to pg95_regcomp
*/
*/
bool
texticregexeq
(
struct
varlena
*
s
,
struct
varlena
*
p
)
Datum
texticregexeq
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
s
)
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
(
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_ICASE
|
REG_EXTENDED
));
PG_RETURN_BOOL
(
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_ICASE
|
REG_EXTENDED
));
}
}
bool
Datum
texticregexne
(
struct
varlena
*
s
,
struct
varlena
*
p
)
texticregexne
(
PG_FUNCTION_ARGS
)
{
{
return
!
texticregexeq
(
s
,
p
);
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_regexeq
(
VARDATA
(
s
),
p
,
VARSIZE
(
s
)
-
VARHDRSZ
,
REG_ICASE
|
REG_EXTENDED
));
}
}
bool
Datum
nameicregexeq
(
NameData
*
n
,
struct
varlena
*
p
)
nameicregexeq
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
n
)
Name
n
=
PG_GETARG_NAME
(
0
);
return
FALSE
;
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
return
(
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
NAMEDATALEN
,
REG_ICASE
|
REG_EXTENDED
));
PG_RETURN_BOOL
(
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
)),
REG_ICASE
|
REG_EXTENDED
));
}
}
bool
Datum
nameicregexne
(
NameData
*
s
,
struct
varlena
*
p
)
nameicregexne
(
PG_FUNCTION_ARGS
)
{
{
return
!
nameicregexeq
(
s
,
p
);
Name
n
=
PG_GETARG_NAME
(
0
);
text
*
p
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
!
fixedlen_regexeq
(
NameStr
(
*
n
),
p
,
strlen
(
NameStr
(
*
n
)),
REG_ICASE
|
REG_EXTENDED
));
}
}
src/backend/utils/adt/ruleutils.c
View file @
8ecac94b
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
* out of its tuple
* out of its tuple
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.5
5 2000/07/03 23:09:52 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.5
6 2000/07/06 05:48:11 tgl
Exp $
*
*
* This software is copyrighted by Jan Wieck - Hamburg.
* This software is copyrighted by Jan Wieck - Hamburg.
*
*
...
@@ -123,9 +123,10 @@ static bool check_if_rte_used_walker(Node *node,
...
@@ -123,9 +123,10 @@ static bool check_if_rte_used_walker(Node *node,
* to recreate the rule
* to recreate the rule
* ----------
* ----------
*/
*/
text
*
Datum
pg_get_ruledef
(
NameData
*
rname
)
pg_get_ruledef
(
PG_FUNCTION_ARGS
)
{
{
Name
rname
=
PG_GETARG_NAME
(
0
);
text
*
ruledef
;
text
*
ruledef
;
Datum
args
[
1
];
Datum
args
[
1
];
char
nulls
[
2
];
char
nulls
[
2
];
...
@@ -180,10 +181,10 @@ pg_get_ruledef(NameData *rname)
...
@@ -180,10 +181,10 @@ pg_get_ruledef(NameData *rname)
{
{
if
(
SPI_finish
()
!=
SPI_OK_FINISH
)
if
(
SPI_finish
()
!=
SPI_OK_FINISH
)
elog
(
ERROR
,
"get_ruledef: SPI_finish() failed"
);
elog
(
ERROR
,
"get_ruledef: SPI_finish() failed"
);
ruledef
=
SPI_
palloc
(
VARHDRSZ
+
1
);
ruledef
=
palloc
(
VARHDRSZ
+
1
);
VARATT_SIZEP
(
ruledef
)
=
VARHDRSZ
+
1
;
VARATT_SIZEP
(
ruledef
)
=
VARHDRSZ
+
1
;
VARDATA
(
ruledef
)[
0
]
=
'-'
;
VARDATA
(
ruledef
)[
0
]
=
'-'
;
return
ruledef
;
PG_RETURN_TEXT_P
(
ruledef
)
;
}
}
ruletup
=
SPI_tuptable
->
vals
[
0
];
ruletup
=
SPI_tuptable
->
vals
[
0
];
...
@@ -212,7 +213,7 @@ pg_get_ruledef(NameData *rname)
...
@@ -212,7 +213,7 @@ pg_get_ruledef(NameData *rname)
* Easy - isn't it?
* Easy - isn't it?
* ----------
* ----------
*/
*/
return
ruledef
;
PG_RETURN_TEXT_P
(
ruledef
)
;
}
}
...
@@ -221,9 +222,10 @@ pg_get_ruledef(NameData *rname)
...
@@ -221,9 +222,10 @@ pg_get_ruledef(NameData *rname)
* only return the SELECT part of a view
* only return the SELECT part of a view
* ----------
* ----------
*/
*/
text
*
Datum
pg_get_viewdef
(
NameData
*
rname
)
pg_get_viewdef
(
PG_FUNCTION_ARGS
)
{
{
Name
rname
=
PG_GETARG_NAME
(
0
);
text
*
ruledef
;
text
*
ruledef
;
Datum
args
[
2
];
Datum
args
[
2
];
char
nulls
[
3
];
char
nulls
[
3
];
...
@@ -311,7 +313,7 @@ pg_get_viewdef(NameData *rname)
...
@@ -311,7 +313,7 @@ pg_get_viewdef(NameData *rname)
* Easy - isn't it?
* Easy - isn't it?
* ----------
* ----------
*/
*/
return
ruledef
;
PG_RETURN_TEXT_P
(
ruledef
)
;
}
}
...
...
src/backend/utils/adt/selfuncs.c
View file @
8ecac94b
...
@@ -15,7 +15,7 @@
...
@@ -15,7 +15,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.7
4 2000/07/05 23:11:35
tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.7
5 2000/07/06 05:48:11
tgl Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -1820,7 +1820,8 @@ string_lessthan(const char *str1, const char *str2, Oid datatype)
...
@@ -1820,7 +1820,8 @@ string_lessthan(const char *str1, const char *str2, Oid datatype)
switch
(
datatype
)
switch
(
datatype
)
{
{
case
TEXTOID
:
case
TEXTOID
:
result
=
text_lt
((
text
*
)
datum1
,
(
text
*
)
datum2
);
result
=
DatumGetBool
(
DirectFunctionCall2
(
text_lt
,
datum1
,
datum2
));
break
;
break
;
case
BPCHAROID
:
case
BPCHAROID
:
...
...
src/backend/utils/adt/varlena.c
View file @
8ecac94b
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.6
2 2000/07/05 23:11:35
tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.6
3 2000/07/06 05:48:11
tgl Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -196,21 +196,16 @@ textout(PG_FUNCTION_ARGS)
...
@@ -196,21 +196,16 @@ textout(PG_FUNCTION_ARGS)
* returns the logical length of a text*
* returns the logical length of a text*
* (which is less than the VARSIZE of the text*)
* (which is less than the VARSIZE of the text*)
*/
*/
int32
Datum
textlen
(
text
*
t
)
textlen
(
PG_FUNCTION_ARGS
)
{
{
text
*
t
=
PG_GETARG_TEXT_P
(
0
);
#ifdef MULTIBYTE
#ifdef MULTIBYTE
unsigned
char
*
s
;
unsigned
char
*
s
;
int
len
,
int
len
,
l
,
l
,
wl
;
wl
;
#endif
if
(
!
PointerIsValid
(
t
))
return
0
;
#ifdef MULTIBYTE
len
=
0
;
len
=
0
;
s
=
VARDATA
(
t
);
s
=
VARDATA
(
t
);
l
=
VARSIZE
(
t
)
-
VARHDRSZ
;
l
=
VARSIZE
(
t
)
-
VARHDRSZ
;
...
@@ -221,30 +216,35 @@ textlen(text *t)
...
@@ -221,30 +216,35 @@ textlen(text *t)
s
+=
wl
;
s
+=
wl
;
len
++
;
len
++
;
}
}
return
(
len
);
PG_RETURN_INT32
(
len
);
#else
#else
return
VARSIZE
(
t
)
-
VARHDRSZ
;
PG_RETURN_INT32
(
VARSIZE
(
t
)
-
VARHDRSZ
)
;
#endif
#endif
}
}
/* textlen() */
/*
/*
* textoctetlen -
* textoctetlen -
* returns the physical length of a text*
* returns the physical length of a text*
* (which is less than the VARSIZE of the text*)
* (which is less than the VARSIZE of the text*)
*
* XXX is it actually appropriate to return the compressed length
* when the value is compressed? It's not at all clear to me that
* this is what SQL92 has in mind ...
*/
*/
int32
Datum
textoctetlen
(
text
*
t
)
textoctetlen
(
PG_FUNCTION_ARGS
)
{
{
if
(
!
PointerIsValid
(
t
))
struct
varattrib
*
t
=
(
struct
varattrib
*
)
PG_GETARG_RAW_VARLENA_P
(
0
);
return
0
;
return
VARSIZE
(
t
)
-
VARHDRSZ
;
if
(
!
VARATT_IS_EXTERNAL
(
t
))
}
/* textoctetlen() */
PG_RETURN_INT32
(
VARATT_SIZE
(
t
)
-
VARHDRSZ
);
PG_RETURN_INT32
(
t
->
va_content
.
va_external
.
va_extsize
);
}
/*
/*
* textcat -
* textcat -
* takes two text* and returns a text* that is the concaten
t
ation of
* takes two text* and returns a text* that is the concatenation of
* the two.
* the two.
*
*
* Rewritten by Sapa, sapa@hq.icb.chel.su. 8-Jul-96.
* Rewritten by Sapa, sapa@hq.icb.chel.su. 8-Jul-96.
...
@@ -252,32 +252,27 @@ textoctetlen(text *t)
...
@@ -252,32 +252,27 @@ textoctetlen(text *t)
* Allocate space for output in all cases.
* Allocate space for output in all cases.
* XXX - thomas 1997-07-10
* XXX - thomas 1997-07-10
*/
*/
text
*
Datum
textcat
(
text
*
t1
,
text
*
t2
)
textcat
(
PG_FUNCTION_ARGS
)
{
{
text
*
t1
=
PG_GETARG_TEXT_P
(
0
);
text
*
t2
=
PG_GETARG_TEXT_P
(
1
);
int
len1
,
int
len1
,
len2
,
len2
,
len
;
len
;
char
*
ptr
;
text
*
result
;
text
*
result
;
char
*
ptr
;
if
(
!
PointerIsValid
(
t1
)
||
!
PointerIsValid
(
t2
))
return
NULL
;
len1
=
(
VARSIZE
(
t1
)
-
VARHDRSZ
);
len1
=
(
VARSIZE
(
t1
)
-
VARHDRSZ
);
if
(
len1
<
0
)
if
(
len1
<
0
)
len1
=
0
;
len1
=
0
;
while
(
len1
>
0
&&
VARDATA
(
t1
)[
len1
-
1
]
==
'\0'
)
len1
--
;
len2
=
(
VARSIZE
(
t2
)
-
VARHDRSZ
);
len2
=
(
VARSIZE
(
t2
)
-
VARHDRSZ
);
if
(
len2
<
0
)
if
(
len2
<
0
)
len2
=
0
;
len2
=
0
;
while
(
len2
>
0
&&
VARDATA
(
t2
)[
len2
-
1
]
==
'\0'
)
len2
--
;
len
=
len1
+
len2
+
VARHDRSZ
;
len
=
len1
+
len2
+
VARHDRSZ
;
result
=
palloc
(
len
);
result
=
(
text
*
)
palloc
(
len
);
/* Set size of result string... */
/* Set size of result string... */
VARATT_SIZEP
(
result
)
=
len
;
VARATT_SIZEP
(
result
)
=
len
;
...
@@ -289,8 +284,8 @@ textcat(text *t1, text *t2)
...
@@ -289,8 +284,8 @@ textcat(text *t1, text *t2)
if
(
len2
>
0
)
if
(
len2
>
0
)
memcpy
(
ptr
+
len1
,
VARDATA
(
t2
),
len2
);
memcpy
(
ptr
+
len1
,
VARDATA
(
t2
),
len2
);
return
result
;
PG_RETURN_TEXT_P
(
result
)
;
}
/* textcat() */
}
/*
/*
* text_substr()
* text_substr()
...
@@ -383,9 +378,11 @@ text_substr(PG_FUNCTION_ARGS)
...
@@ -383,9 +378,11 @@ text_substr(PG_FUNCTION_ARGS)
* Added multi-byte support.
* Added multi-byte support.
* - Tatsuo Ishii 1998-4-21
* - Tatsuo Ishii 1998-4-21
*/
*/
int32
Datum
textpos
(
text
*
t1
,
text
*
t2
)
textpos
(
PG_FUNCTION_ARGS
)
{
{
text
*
t1
=
PG_GETARG_TEXT_P
(
0
);
text
*
t2
=
PG_GETARG_TEXT_P
(
1
);
int
pos
;
int
pos
;
int
px
,
int
px
,
p
;
p
;
...
@@ -393,18 +390,13 @@ textpos(text *t1, text *t2)
...
@@ -393,18 +390,13 @@ textpos(text *t1, text *t2)
len2
;
len2
;
pg_wchar
*
p1
,
pg_wchar
*
p1
,
*
p2
;
*
p2
;
#ifdef MULTIBYTE
#ifdef MULTIBYTE
pg_wchar
*
ps1
,
pg_wchar
*
ps1
,
*
ps2
;
*
ps2
;
#endif
#endif
if
(
!
PointerIsValid
(
t1
)
||
!
PointerIsValid
(
t2
))
if
(
VARSIZE
(
t2
)
<=
VARHDRSZ
)
return
0
;
PG_RETURN_INT32
(
1
);
/* result for empty pattern */
if
(
VARSIZE
(
t2
)
<=
0
)
return
1
;
len1
=
(
VARSIZE
(
t1
)
-
VARHDRSZ
);
len1
=
(
VARSIZE
(
t1
)
-
VARHDRSZ
);
len2
=
(
VARSIZE
(
t2
)
-
VARHDRSZ
);
len2
=
(
VARSIZE
(
t2
)
-
VARHDRSZ
);
...
@@ -438,43 +430,51 @@ textpos(text *t1, text *t2)
...
@@ -438,43 +430,51 @@ textpos(text *t1, text *t2)
pfree
(
ps1
);
pfree
(
ps1
);
pfree
(
ps2
);
pfree
(
ps2
);
#endif
#endif
return
pos
;
PG_RETURN_INT32
(
pos
)
;
}
/* textpos() */
}
/*
/*
* texteq - returns
1
iff arguments are equal
* texteq - returns
true
iff arguments are equal
* textne - returns
1
iff arguments are not equal
* textne - returns
true
iff arguments are not equal
*/
*/
bool
Datum
texteq
(
text
*
arg1
,
text
*
arg2
)
texteq
(
PG_FUNCTION_ARGS
)
{
{
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
int
len
;
int
len
;
char
*
a1p
,
char
*
a1p
,
*
a2p
;
*
a2p
;
if
(
arg1
==
NULL
||
arg2
==
NULL
)
if
(
VARSIZE
(
arg1
)
!=
VARSIZE
(
arg2
))
return
(
bool
)
NULL
;
PG_RETURN_BOOL
(
false
);
if
((
len
=
arg1
->
vl_len
)
!=
arg2
->
vl_len
)
return
(
bool
)
0
;
a1p
=
arg1
->
vl_dat
;
a2p
=
arg2
->
vl_dat
;
/*
len
=
VARSIZE
(
arg1
)
-
VARHDRSZ
;
* Varlenas are stored as the total size (data + size variable)
* followed by the data. Use VARHDRSZ instead of explicit sizeof() -
a1p
=
VARDATA
(
arg1
);
* thomas 1997-07-10
a2p
=
VARDATA
(
arg2
);
*/
len
-=
VARHDRSZ
;
PG_RETURN_BOOL
(
memcmp
(
a1p
,
a2p
,
len
)
==
0
);
while
(
len
--
!=
0
)
}
if
(
*
a1p
++
!=
*
a2p
++
)
return
(
bool
)
0
;
Datum
return
(
bool
)
1
;
textne
(
PG_FUNCTION_ARGS
)
}
/* texteq() */
bool
textne
(
text
*
arg1
,
text
*
arg2
)
{
{
return
(
bool
)
!
texteq
(
arg1
,
arg2
);
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
int
len
;
char
*
a1p
,
*
a2p
;
if
(
VARSIZE
(
arg1
)
!=
VARSIZE
(
arg2
))
PG_RETURN_BOOL
(
true
);
len
=
VARSIZE
(
arg1
)
-
VARHDRSZ
;
a1p
=
VARDATA
(
arg1
);
a2p
=
VARDATA
(
arg2
);
PG_RETURN_BOOL
(
memcmp
(
a1p
,
a2p
,
len
)
!=
0
);
}
}
/* varstr_cmp()
/* varstr_cmp()
...
@@ -515,7 +515,7 @@ varstr_cmp(char *arg1, int len1, char *arg2, int len2)
...
@@ -515,7 +515,7 @@ varstr_cmp(char *arg1, int len1, char *arg2, int len2)
#endif
#endif
return
result
;
return
result
;
}
/* varstr_cmp() */
}
/* text_cmp()
/* text_cmp()
...
@@ -534,9 +534,6 @@ text_cmp(text *arg1, text *arg2)
...
@@ -534,9 +534,6 @@ text_cmp(text *arg1, text *arg2)
int
len1
,
int
len1
,
len2
;
len2
;
if
(
arg1
==
NULL
||
arg2
==
NULL
)
return
(
bool
)
FALSE
;
a1p
=
VARDATA
(
arg1
);
a1p
=
VARDATA
(
arg1
);
a2p
=
VARDATA
(
arg2
);
a2p
=
VARDATA
(
arg2
);
...
@@ -544,68 +541,82 @@ text_cmp(text *arg1, text *arg2)
...
@@ -544,68 +541,82 @@ text_cmp(text *arg1, text *arg2)
len2
=
VARSIZE
(
arg2
)
-
VARHDRSZ
;
len2
=
VARSIZE
(
arg2
)
-
VARHDRSZ
;
return
varstr_cmp
(
a1p
,
len1
,
a2p
,
len2
);
return
varstr_cmp
(
a1p
,
len1
,
a2p
,
len2
);
}
/* text_cmp() */
}
/*
text_lt()
/*
* Comparison function for text strings.
* Comparison function
s
for text strings.
*/
*/
bool
text_lt
(
text
*
arg1
,
text
*
arg2
)
Datum
text_lt
(
PG_FUNCTION_ARGS
)
{
{
return
(
bool
)
(
text_cmp
(
arg1
,
arg2
)
<
0
);
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
}
/* text_lt() */
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
/* text_le()
PG_RETURN_BOOL
(
text_cmp
(
arg1
,
arg2
)
<
0
);
* Comparison function for text strings.
}
*/
bool
Datum
text_le
(
text
*
arg1
,
text
*
arg2
)
text_le
(
PG_FUNCTION_ARGS
)
{
{
return
(
bool
)
(
text_cmp
(
arg1
,
arg2
)
<=
0
);
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
}
/* text_le() */
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
bool
PG_RETURN_BOOL
(
text_cmp
(
arg1
,
arg2
)
<=
0
);
text_gt
(
text
*
arg1
,
text
*
arg2
)
}
Datum
text_gt
(
PG_FUNCTION_ARGS
)
{
{
return
(
bool
)
!
text_le
(
arg1
,
arg2
);
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
text_cmp
(
arg1
,
arg2
)
>
0
);
}
}
bool
Datum
text_ge
(
text
*
arg1
,
text
*
arg2
)
text_ge
(
PG_FUNCTION_ARGS
)
{
{
return
(
bool
)
!
text_lt
(
arg1
,
arg2
);
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
PG_RETURN_BOOL
(
text_cmp
(
arg1
,
arg2
)
>=
0
);
}
}
text
*
Datum
text_larger
(
text
*
arg1
,
text
*
arg2
)
text_larger
(
PG_FUNCTION_ARGS
)
{
{
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
text
*
result
;
text
*
result
;
text
*
temp
;
text
*
temp
;
temp
=
((
text_cmp
(
arg1
,
arg2
)
<=
0
)
?
arg2
:
arg1
);
temp
=
((
text_cmp
(
arg1
,
arg2
)
>
0
)
?
arg1
:
arg2
);
/* Make a copy */
/* Make a copy
--- temporary hack until nodeAgg.c is smarter
*/
result
=
(
text
*
)
palloc
(
VARSIZE
(
temp
));
result
=
(
text
*
)
palloc
(
VARSIZE
(
temp
));
mem
move
((
char
*
)
result
,
(
char
*
)
temp
,
VARSIZE
(
temp
));
mem
cpy
((
char
*
)
result
,
(
char
*
)
temp
,
VARSIZE
(
temp
));
return
(
result
);
PG_RETURN_TEXT_P
(
result
);
}
}
text
*
Datum
text_smaller
(
text
*
arg1
,
text
*
arg2
)
text_smaller
(
PG_FUNCTION_ARGS
)
{
{
text
*
arg1
=
PG_GETARG_TEXT_P
(
0
);
text
*
arg2
=
PG_GETARG_TEXT_P
(
1
);
text
*
result
;
text
*
result
;
text
*
temp
;
text
*
temp
;
temp
=
((
text_cmp
(
arg1
,
arg2
)
>
0
)
?
arg2
:
arg1
);
temp
=
((
text_cmp
(
arg1
,
arg2
)
<
0
)
?
arg1
:
arg2
);
/* Make a copy */
/* Make a copy
--- temporary hack until nodeAgg.c is smarter
*/
result
=
(
text
*
)
palloc
(
VARSIZE
(
temp
));
result
=
(
text
*
)
palloc
(
VARSIZE
(
temp
));
mem
move
((
char
*
)
result
,
(
char
*
)
temp
,
VARSIZE
(
temp
));
mem
cpy
((
char
*
)
result
,
(
char
*
)
temp
,
VARSIZE
(
temp
));
return
(
result
);
PG_RETURN_TEXT_P
(
result
);
}
}
/*-------------------------------------------------------------
/*-------------------------------------------------------------
...
@@ -780,28 +791,28 @@ byteaSetBit(PG_FUNCTION_ARGS)
...
@@ -780,28 +791,28 @@ byteaSetBit(PG_FUNCTION_ARGS)
/* text_name()
/* text_name()
* Converts a text
() type to a NameData
type.
* Converts a text
type to a Name
type.
*/
*/
NameData
*
Datum
text_name
(
text
*
s
)
text_name
(
PG_FUNCTION_ARGS
)
{
{
NameData
*
result
;
text
*
s
=
PG_GETARG_TEXT_P
(
0
);
Name
result
;
int
len
;
int
len
;
if
(
s
==
NULL
)
return
NULL
;
len
=
VARSIZE
(
s
)
-
VARHDRSZ
;
len
=
VARSIZE
(
s
)
-
VARHDRSZ
;
if
(
len
>
NAMEDATALEN
)
len
=
NAMEDATALEN
;
/* Truncate oversize input */
if
(
len
>=
NAMEDATALEN
)
len
=
NAMEDATALEN
-
1
;
#ifdef STRINGDEBUG
#ifdef STRINGDEBUG
printf
(
"text- convert string length %d (%d) ->%d
\n
"
,
printf
(
"text- convert string length %d (%d) ->%d
\n
"
,
VARSIZE
(
s
)
-
VARHDRSZ
,
VARSIZE
(
s
),
len
);
VARSIZE
(
s
)
-
VARHDRSZ
,
VARSIZE
(
s
),
len
);
#endif
#endif
result
=
palloc
(
NAMEDATALEN
);
result
=
(
Name
)
palloc
(
NAMEDATALEN
);
StrNCpy
(
NameStr
(
*
result
),
VARDATA
(
s
),
NAMEDATALEN
);
memcpy
(
NameStr
(
*
result
),
VARDATA
(
s
),
len
);
/* now null pad to full length... */
/* now null pad to full length... */
while
(
len
<
NAMEDATALEN
)
while
(
len
<
NAMEDATALEN
)
...
@@ -810,21 +821,19 @@ text_name(text *s)
...
@@ -810,21 +821,19 @@ text_name(text *s)
len
++
;
len
++
;
}
}
return
result
;
PG_RETURN_NAME
(
result
)
;
}
/* text_name() */
}
/* name_text()
/* name_text()
* Converts a Name
Data
type to a text type.
* Converts a Name type to a text type.
*/
*/
text
*
Datum
name_text
(
NameData
*
s
)
name_text
(
PG_FUNCTION_ARGS
)
{
{
Name
s
=
PG_GETARG_NAME
(
0
);
text
*
result
;
text
*
result
;
int
len
;
int
len
;
if
(
s
==
NULL
)
return
NULL
;
len
=
strlen
(
NameStr
(
*
s
));
len
=
strlen
(
NameStr
(
*
s
));
#ifdef STRINGDEBUG
#ifdef STRINGDEBUG
...
@@ -833,8 +842,8 @@ name_text(NameData *s)
...
@@ -833,8 +842,8 @@ name_text(NameData *s)
#endif
#endif
result
=
palloc
(
VARHDRSZ
+
len
);
result
=
palloc
(
VARHDRSZ
+
len
);
strncpy
(
VARDATA
(
result
),
NameStr
(
*
s
),
len
)
;
VARATT_SIZEP
(
result
)
=
VARHDRSZ
+
len
;
VARATT_SIZEP
(
result
)
=
len
+
VARHDRSZ
;
memcpy
(
VARDATA
(
result
),
NameStr
(
*
s
),
len
)
;
return
result
;
PG_RETURN_TEXT_P
(
result
)
;
}
/* name_text() */
}
src/backend/utils/adt/version.c
View file @
8ecac94b
/*-------------------------------------------------------------------------
/*-------------------------------------------------------------------------
*
*
* version.c
* version.c
* Returns the version string
* Returns the
PostgreSQL
version string
*
*
* IDENTIFICATION
* IDENTIFICATION
*
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.1
1 2000/07/03 23:09:54 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.1
2 2000/07/06 05:48:11 tgl
Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
#include "postgres.h"
#include "postgres.h"
#include "utils/builtins.h"
text
*
version
(
void
);
text
*
Datum
version
(
void
)
pgsql_version
(
PG_FUNCTION_ARGS
)
{
{
int
n
=
strlen
(
PG_VERSION_STR
)
+
VARHDRSZ
;
int
n
=
strlen
(
PG_VERSION_STR
);
text
*
ret
=
(
text
*
)
palloc
(
n
);
text
*
ret
=
(
text
*
)
palloc
(
n
+
VARHDRSZ
);
VARATT_SIZEP
(
ret
)
=
n
;
VARATT_SIZEP
(
ret
)
=
n
+
VARHDRSZ
;
memcpy
(
VARDATA
(
ret
),
PG_VERSION_STR
,
strlen
(
PG_VERSION_STR
)
);
memcpy
(
VARDATA
(
ret
),
PG_VERSION_STR
,
n
);
return
ret
;
PG_RETURN_TEXT_P
(
ret
)
;
}
}
src/backend/utils/fmgr/fmgr.c
View file @
8ecac94b
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
*
*
*
*
* IDENTIFICATION
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.4
4 2000/07/05 23:11:40
tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.4
5 2000/07/06 05:48:13
tgl Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -1284,3 +1284,33 @@ Float8GetDatum(float8 X)
...
@@ -1284,3 +1284,33 @@ Float8GetDatum(float8 X)
*
retval
=
X
;
*
retval
=
X
;
return
PointerGetDatum
(
retval
);
return
PointerGetDatum
(
retval
);
}
}
/*-------------------------------------------------------------------------
* Support routines for toastable datatypes
*-------------------------------------------------------------------------
*/
struct
varlena
*
pg_detoast_datum
(
struct
varlena
*
datum
)
{
if
(
VARATT_IS_EXTENDED
(
datum
))
return
(
struct
varlena
*
)
heap_tuple_untoast_attr
((
varattrib
*
)
datum
);
else
return
datum
;
}
struct
varlena
*
pg_detoast_datum_copy
(
struct
varlena
*
datum
)
{
if
(
VARATT_IS_EXTENDED
(
datum
))
return
(
struct
varlena
*
)
heap_tuple_untoast_attr
((
varattrib
*
)
datum
);
else
{
/* Make a modifiable copy of the varlena object */
Size
len
=
VARSIZE
(
datum
);
struct
varlena
*
result
=
(
struct
varlena
*
)
palloc
(
len
);
memcpy
(
result
,
datum
,
len
);
return
result
;
}
}
src/include/catalog/catversion.h
View file @
8ecac94b
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,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: catversion.h,v 1.3
4 2000/07/03 23:19:04 wieck
Exp $
* $Id: catversion.h,v 1.3
5 2000/07/06 05:48:22 tgl
Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -53,6 +53,6 @@
...
@@ -53,6 +53,6 @@
*/
*/
/* yyyymmddN */
/* yyyymmddN */
#define CATALOG_VERSION_NO 2000070
4
1
#define CATALOG_VERSION_NO 2000070
6
1
#endif
#endif
src/include/catalog/pg_proc.h
View file @
8ecac94b
This diff is collapsed.
Click to expand it.
src/include/catalog/pg_type.h
View file @
8ecac94b
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,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: pg_type.h,v 1.9
0 2000/07/03 23:10:05 wieck
Exp $
* $Id: pg_type.h,v 1.9
1 2000/07/06 05:48:27 tgl
Exp $
*
*
* NOTES
* NOTES
* the genbki.sh script reads this file and generates .bki
* the genbki.sh script reads this file and generates .bki
...
@@ -200,7 +200,7 @@ DATA(insert OID = 24 ( regproc PGUID 4 16 t b t \054 0 0 regprocin regpro
...
@@ -200,7 +200,7 @@ DATA(insert OID = 24 ( regproc PGUID 4 16 t b t \054 0 0 regprocin regpro
DESCR
(
"registered procedure"
);
DESCR
(
"registered procedure"
);
#define REGPROCOID 24
#define REGPROCOID 24
DATA
(
insert
OID
=
25
(
text
PGUID
-
1
-
1
f
b
t
\
054
0
18
textin
textout
textin
textout
i
p
_null_
));
DATA
(
insert
OID
=
25
(
text
PGUID
-
1
-
1
f
b
t
\
054
0
18
textin
textout
textin
textout
i
x
_null_
));
DESCR
(
"variable-length string, no limit specified"
);
DESCR
(
"variable-length string, no limit specified"
);
#define TEXTOID 25
#define TEXTOID 25
...
...
src/include/fmgr.h
View file @
8ecac94b
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,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: fmgr.h,v 1.
6 2000/06/14 05:24:50
tgl Exp $
* $Id: fmgr.h,v 1.
7 2000/07/06 05:48:17
tgl Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -94,22 +94,30 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
...
@@ -94,22 +94,30 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
/* Standard parameter list for fmgr-compatible functions */
/* Standard parameter list for fmgr-compatible functions */
#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo
#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo
/* If function is not marked "proisstrict" in pg_proc, it must check for
/*
* If function is not marked "proisstrict" in pg_proc, it must check for
* null arguments using this macro. Do not try to GETARG a null argument!
* null arguments using this macro. Do not try to GETARG a null argument!
*/
*/
#define PG_ARGISNULL(n) (fcinfo->argnull[n])
#define PG_ARGISNULL(n) (fcinfo->argnull[n])
#if 1
/*
/* VERY TEMPORARY until some TOAST support is committed ... */
* Support for fetching detoasted copies of toastable datatypes (all of
#define PG_DETOAST_DATUM(datum) \
* which are varlena types). pg_detoast_datum() gives you either the input
((struct varlena *) DatumGetPointer(datum))
* datum (if not toasted) or a detoasted copy allocated with palloc().
#else
* pg_detoast_datum_copy() always gives you a palloc'd copy --- use it
/* Eventually it will look more like this... */
* if you need a modifiable copy of the input. Caller is expected to have
#define PG_DETOAST_DATUM(datum) \
* checked for null inputs first, if necessary.
(VARATT_IS_EXTENDED(DatumGetPointer(datum)) ? \
*
(struct varlena *) heap_tuple_untoast_attr((varattrib *) DatumGetPointer(datum)) : \
* Note: it'd be nice if these could be macros, but I see no way to do that
(struct varlena *) DatumGetPointer(datum))
* without evaluating the arguments multiple times, which is NOT acceptable.
#endif
*/
extern
struct
varlena
*
pg_detoast_datum
(
struct
varlena
*
datum
);
extern
struct
varlena
*
pg_detoast_datum_copy
(
struct
varlena
*
datum
);
#define PG_DETOAST_DATUM(datum) \
pg_detoast_datum((struct varlena *) DatumGetPointer(datum))
#define PG_DETOAST_DATUM_COPY(datum) \
pg_detoast_datum_copy((struct varlena *) DatumGetPointer(datum))
/* Macros for fetching arguments of standard types */
/* Macros for fetching arguments of standard types */
...
@@ -133,15 +141,25 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
...
@@ -133,15 +141,25 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
/* use this if you want the input datum de-toasted: */
/* use this if you want the input datum de-toasted: */
#define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n))
#define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n))
/* DatumGetFoo macros for varlena types will typically look like this: */
/* DatumGetFoo macros for varlena types will typically look like this: */
#define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X))
#define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X))
#define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X))
#define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X))
#define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X))
#define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X))
#define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X))
#define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X))
/* And we also offer variants that return an OK-to-write copy */
#define DatumGetByteaPCopy(X) ((bytea *) PG_DETOAST_DATUM_COPY(X))
#define DatumGetTextPCopy(X) ((text *) PG_DETOAST_DATUM_COPY(X))
#define DatumGetBpCharPCopy(X) ((BpChar *) PG_DETOAST_DATUM_COPY(X))
#define DatumGetVarCharPCopy(X) ((VarChar *) PG_DETOAST_DATUM_COPY(X))
/* GETARG macros for varlena types will typically look like this: */
/* GETARG macros for varlena types will typically look like this: */
#define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n))
#define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n))
#define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n))
#define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n))
#define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n))
#define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n))
#define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n))
#define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n))
/* And we also offer variants that return an OK-to-write copy */
#define PG_GETARG_BYTEA_P_COPY(n) DatumGetByteaPCopy(PG_GETARG_DATUM(n))
#define PG_GETARG_TEXT_P_COPY(n) DatumGetTextPCopy(PG_GETARG_DATUM(n))
#define PG_GETARG_BPCHAR_P_COPY(n) DatumGetBpCharPCopy(PG_GETARG_DATUM(n))
#define PG_GETARG_VARCHAR_P_COPY(n) DatumGetVarCharPCopy(PG_GETARG_DATUM(n))
/* To return a NULL do this: */
/* To return a NULL do this: */
#define PG_RETURN_NULL() \
#define PG_RETURN_NULL() \
...
...
src/include/utils/builtins.h
View file @
8ecac94b
...
@@ -7,7 +7,7 @@
...
@@ -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: builtins.h,v 1.1
19 2000/07/05 23:11:51
tgl Exp $
* $Id: builtins.h,v 1.1
20 2000/07/06 05:48:30
tgl Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -243,10 +243,10 @@ extern Datum i4tof(PG_FUNCTION_ARGS);
...
@@ -243,10 +243,10 @@ extern Datum i4tof(PG_FUNCTION_ARGS);
extern
Datum
i2tof
(
PG_FUNCTION_ARGS
);
extern
Datum
i2tof
(
PG_FUNCTION_ARGS
);
extern
int32
ftoi4
(
float32
num
);
extern
int32
ftoi4
(
float32
num
);
extern
Datum
ftoi2
(
PG_FUNCTION_ARGS
);
extern
Datum
ftoi2
(
PG_FUNCTION_ARGS
);
extern
float64
text_float8
(
text
*
str
);
extern
Datum
text_float8
(
PG_FUNCTION_ARGS
);
extern
float32
text_float4
(
text
*
str
);
extern
Datum
text_float4
(
PG_FUNCTION_ARGS
);
extern
text
*
float8_text
(
float64
num
);
extern
Datum
float8_text
(
PG_FUNCTION_ARGS
);
extern
text
*
float4_text
(
float32
num
);
extern
Datum
float4_text
(
PG_FUNCTION_ARGS
);
extern
float64
dround
(
float64
arg1
);
extern
float64
dround
(
float64
arg1
);
extern
float64
dtrunc
(
float64
arg1
);
extern
float64
dtrunc
(
float64
arg1
);
extern
float64
dsqrt
(
float64
arg1
);
extern
float64
dsqrt
(
float64
arg1
);
...
@@ -321,15 +321,14 @@ extern Datum oid_text(PG_FUNCTION_ARGS);
...
@@ -321,15 +321,14 @@ extern Datum oid_text(PG_FUNCTION_ARGS);
extern
Datum
text_oid
(
PG_FUNCTION_ARGS
);
extern
Datum
text_oid
(
PG_FUNCTION_ARGS
);
/* regexp.c */
/* regexp.c */
extern
bool
nameregexeq
(
NameData
*
n
,
struct
varlena
*
p
);
extern
Datum
nameregexeq
(
PG_FUNCTION_ARGS
);
extern
bool
nameregexne
(
NameData
*
s
,
struct
varlena
*
p
);
extern
Datum
nameregexne
(
PG_FUNCTION_ARGS
);
extern
bool
textregexeq
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
textregexeq
(
PG_FUNCTION_ARGS
);
extern
bool
textregexne
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
textregexne
(
PG_FUNCTION_ARGS
);
extern
bool
nameicregexeq
(
NameData
*
s
,
struct
varlena
*
p
);
extern
Datum
nameicregexeq
(
PG_FUNCTION_ARGS
);
extern
bool
nameicregexne
(
NameData
*
s
,
struct
varlena
*
p
);
extern
Datum
nameicregexne
(
PG_FUNCTION_ARGS
);
extern
bool
texticregexeq
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
texticregexeq
(
PG_FUNCTION_ARGS
);
extern
bool
texticregexne
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
texticregexne
(
PG_FUNCTION_ARGS
);
/* regproc.c */
/* regproc.c */
extern
Datum
regprocin
(
PG_FUNCTION_ARGS
);
extern
Datum
regprocin
(
PG_FUNCTION_ARGS
);
...
@@ -341,8 +340,8 @@ extern Datum regproctooid(PG_FUNCTION_ARGS);
...
@@ -341,8 +340,8 @@ extern Datum regproctooid(PG_FUNCTION_ARGS);
#define RegprocToOid(rp) ((Oid) (rp))
#define RegprocToOid(rp) ((Oid) (rp))
/* ruleutils.c */
/* ruleutils.c */
extern
text
*
pg_get_ruledef
(
NameData
*
rname
);
extern
Datum
pg_get_ruledef
(
PG_FUNCTION_ARGS
);
extern
text
*
pg_get_viewdef
(
NameData
*
rname
);
extern
Datum
pg_get_viewdef
(
PG_FUNCTION_ARGS
);
extern
Datum
pg_get_indexdef
(
PG_FUNCTION_ARGS
);
extern
Datum
pg_get_indexdef
(
PG_FUNCTION_ARGS
);
extern
Datum
pg_get_userbyid
(
PG_FUNCTION_ARGS
);
extern
Datum
pg_get_userbyid
(
PG_FUNCTION_ARGS
);
extern
char
*
deparse_expression
(
Node
*
expr
,
List
*
rangetables
,
extern
char
*
deparse_expression
(
Node
*
expr
,
List
*
rangetables
,
...
@@ -438,22 +437,22 @@ extern int32 varcharoctetlen(char *arg);
...
@@ -438,22 +437,22 @@ extern int32 varcharoctetlen(char *arg);
/* varlena.c */
/* varlena.c */
extern
Datum
textin
(
PG_FUNCTION_ARGS
);
extern
Datum
textin
(
PG_FUNCTION_ARGS
);
extern
Datum
textout
(
PG_FUNCTION_ARGS
);
extern
Datum
textout
(
PG_FUNCTION_ARGS
);
extern
text
*
textcat
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
textcat
(
PG_FUNCTION_ARGS
);
extern
bool
texteq
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
texteq
(
PG_FUNCTION_ARGS
);
extern
bool
textne
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
textne
(
PG_FUNCTION_ARGS
);
extern
int
varstr_cmp
(
char
*
arg1
,
int
len1
,
char
*
arg2
,
int
len2
);
extern
Datum
text_lt
(
PG_FUNCTION_ARGS
);
extern
bool
text_lt
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_le
(
PG_FUNCTION_ARGS
);
extern
bool
text_le
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_gt
(
PG_FUNCTION_ARGS
);
extern
bool
text_gt
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_ge
(
PG_FUNCTION_ARGS
);
extern
bool
text_ge
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_larger
(
PG_FUNCTION_ARGS
);
extern
text
*
text_larger
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_smaller
(
PG_FUNCTION_ARGS
);
extern
text
*
text_smaller
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
textlen
(
PG_FUNCTION_ARGS
);
extern
int32
textlen
(
text
*
arg
);
extern
Datum
textoctetlen
(
PG_FUNCTION_ARGS
);
extern
int32
textoctetlen
(
text
*
arg
);
extern
Datum
textpos
(
PG_FUNCTION_ARGS
);
extern
int32
textpos
(
text
*
arg1
,
text
*
arg2
);
extern
Datum
text_substr
(
PG_FUNCTION_ARGS
);
extern
Datum
text_substr
(
PG_FUNCTION_ARGS
);
extern
text
*
name_text
(
NameData
*
s
);
extern
Datum
name_text
(
PG_FUNCTION_ARGS
);
extern
NameData
*
text_name
(
text
*
s
);
extern
Datum
text_name
(
PG_FUNCTION_ARGS
);
extern
int
varstr_cmp
(
char
*
arg1
,
int
len1
,
char
*
arg2
,
int
len2
);
extern
bytea
*
byteain
(
char
*
inputText
);
extern
bytea
*
byteain
(
char
*
inputText
);
extern
char
*
byteaout
(
bytea
*
vlena
);
extern
char
*
byteaout
(
bytea
*
vlena
);
...
@@ -463,26 +462,29 @@ extern Datum byteaGetBit(PG_FUNCTION_ARGS);
...
@@ -463,26 +462,29 @@ extern Datum byteaGetBit(PG_FUNCTION_ARGS);
extern
Datum
byteaSetByte
(
PG_FUNCTION_ARGS
);
extern
Datum
byteaSetByte
(
PG_FUNCTION_ARGS
);
extern
Datum
byteaSetBit
(
PG_FUNCTION_ARGS
);
extern
Datum
byteaSetBit
(
PG_FUNCTION_ARGS
);
/* version.c */
extern
Datum
pgsql_version
(
PG_FUNCTION_ARGS
);
/* like.c */
/* like.c */
extern
bool
namelike
(
NameData
*
n
,
struct
varlena
*
p
);
extern
Datum
namelike
(
PG_FUNCTION_ARGS
);
extern
bool
namenlike
(
NameData
*
s
,
struct
varlena
*
p
);
extern
Datum
namenlike
(
PG_FUNCTION_ARGS
);
extern
bool
textlike
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
textlike
(
PG_FUNCTION_ARGS
);
extern
bool
textnlike
(
struct
varlena
*
s
,
struct
varlena
*
p
);
extern
Datum
textnlike
(
PG_FUNCTION_ARGS
);
/* oracle_compat.c */
/* oracle_compat.c */
extern
text
*
lower
(
text
*
string
);
extern
Datum
lower
(
PG_FUNCTION_ARGS
);
extern
text
*
upper
(
text
*
string
);
extern
Datum
upper
(
PG_FUNCTION_ARGS
);
extern
text
*
initcap
(
text
*
string
);
extern
Datum
initcap
(
PG_FUNCTION_ARGS
);
extern
Datum
lpad
(
PG_FUNCTION_ARGS
);
extern
Datum
lpad
(
PG_FUNCTION_ARGS
);
extern
Datum
rpad
(
PG_FUNCTION_ARGS
);
extern
Datum
rpad
(
PG_FUNCTION_ARGS
);
extern
text
*
btrim
(
text
*
string
,
text
*
set
);
extern
Datum
btrim
(
PG_FUNCTION_ARGS
);
extern
text
*
ltrim
(
text
*
string
,
text
*
set
);
extern
Datum
ltrim
(
PG_FUNCTION_ARGS
);
extern
text
*
rtrim
(
text
*
string
,
text
*
set
);
extern
Datum
rtrim
(
PG_FUNCTION_ARGS
);
extern
text
*
translate
(
text
*
string
,
text
*
from
,
text
*
to
);
extern
Datum
translate
(
PG_FUNCTION_ARGS
);
extern
Datum
ichar
(
PG_FUNCTION_ARGS
);
extern
Datum
ichar
(
PG_FUNCTION_ARGS
);
extern
Datum
repeat
(
PG_FUNCTION_ARGS
);
extern
Datum
repeat
(
PG_FUNCTION_ARGS
);
extern
int4
ascii
(
text
*
string
);
extern
Datum
ascii
(
PG_FUNCTION_ARGS
);
/* acl.c */
/* acl.c */
...
@@ -510,11 +512,11 @@ extern bool network_sup(inet *a1, inet *a2);
...
@@ -510,11 +512,11 @@ extern bool network_sup(inet *a1, inet *a2);
extern
bool
network_supeq
(
inet
*
a1
,
inet
*
a2
);
extern
bool
network_supeq
(
inet
*
a1
,
inet
*
a2
);
extern
int4
network_cmp
(
inet
*
a1
,
inet
*
a2
);
extern
int4
network_cmp
(
inet
*
a1
,
inet
*
a2
);
extern
text
*
network_network
(
inet
*
addr
);
extern
Datum
network_network
(
PG_FUNCTION_ARGS
);
extern
text
*
network_netmask
(
inet
*
addr
);
extern
Datum
network_netmask
(
PG_FUNCTION_ARGS
);
extern
int4
network_masklen
(
inet
*
addr
);
extern
int4
network_masklen
(
inet
*
addr
);
extern
text
*
network_broadcast
(
inet
*
addr
);
extern
Datum
network_broadcast
(
PG_FUNCTION_ARGS
);
extern
text
*
network_host
(
inet
*
addr
);
extern
Datum
network_host
(
PG_FUNCTION_ARGS
);
/* mac.c */
/* mac.c */
extern
macaddr
*
macaddr_in
(
char
*
str
);
extern
macaddr
*
macaddr_in
(
char
*
str
);
...
@@ -526,7 +528,7 @@ extern bool macaddr_ge(macaddr *a1, macaddr *a2);
...
@@ -526,7 +528,7 @@ extern bool macaddr_ge(macaddr *a1, macaddr *a2);
extern
bool
macaddr_gt
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
bool
macaddr_gt
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
bool
macaddr_ne
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
bool
macaddr_ne
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
int4
macaddr_cmp
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
int4
macaddr_cmp
(
macaddr
*
a1
,
macaddr
*
a2
);
extern
text
*
macaddr_manuf
(
macaddr
*
addr
);
extern
Datum
macaddr_manuf
(
PG_FUNCTION_ARGS
);
/* numeric.c */
/* numeric.c */
extern
Datum
numeric_in
(
PG_FUNCTION_ARGS
);
extern
Datum
numeric_in
(
PG_FUNCTION_ARGS
);
...
@@ -572,19 +574,19 @@ extern Numeric float8_numeric(float64 val);
...
@@ -572,19 +574,19 @@ extern Numeric float8_numeric(float64 val);
extern
float64
numeric_float8
(
Numeric
num
);
extern
float64
numeric_float8
(
Numeric
num
);
/* lztext.c */
/* lztext.c */
lztext
*
lztextin
(
char
*
str
);
extern
lztext
*
lztextin
(
char
*
str
);
char
*
lztextout
(
lztext
*
lz
);
extern
char
*
lztextout
(
lztext
*
lz
);
text
*
lztext_text
(
lztext
*
lz
);
extern
text
*
lztext_text
(
lztext
*
lz
);
lztext
*
text_lztext
(
text
*
txt
);
extern
Datum
text_lztext
(
PG_FUNCTION_ARGS
);
int32
lztextlen
(
lztext
*
lz
);
extern
int32
lztextlen
(
lztext
*
lz
);
int32
lztextoctetlen
(
lztext
*
lz
);
extern
int32
lztextoctetlen
(
lztext
*
lz
);
int32
lztext_cmp
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
int32
lztext_cmp
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_eq
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_eq
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_ne
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_ne
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_gt
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_gt
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_ge
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_ge
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_lt
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_lt
(
lztext
*
lz1
,
lztext
*
lz2
);
bool
lztext_le
(
lztext
*
lz1
,
lztext
*
lz2
);
extern
bool
lztext_le
(
lztext
*
lz1
,
lztext
*
lz2
);
/* ri_triggers.c */
/* ri_triggers.c */
extern
Datum
RI_FKey_check_ins
(
PG_FUNCTION_ARGS
);
extern
Datum
RI_FKey_check_ins
(
PG_FUNCTION_ARGS
);
...
...
src/include/utils/cash.h
View file @
8ecac94b
...
@@ -44,6 +44,6 @@ extern Datum cash_div_int2(PG_FUNCTION_ARGS);
...
@@ -44,6 +44,6 @@ extern Datum cash_div_int2(PG_FUNCTION_ARGS);
extern
Cash
*
cashlarger
(
Cash
*
c1
,
Cash
*
c2
);
extern
Cash
*
cashlarger
(
Cash
*
c1
,
Cash
*
c2
);
extern
Cash
*
cashsmaller
(
Cash
*
c1
,
Cash
*
c2
);
extern
Cash
*
cashsmaller
(
Cash
*
c1
,
Cash
*
c2
);
extern
text
*
cash_words_out
(
Cash
*
value
);
extern
Datum
cash_words_out
(
PG_FUNCTION_ARGS
);
#endif
/* CASH_H */
#endif
/* CASH_H */
src/include/utils/inet.h
View file @
8ecac94b
/*-------------------------------------------------------------------------
/*-------------------------------------------------------------------------
*
*
*
builtins
.h
*
inet
.h
* Declarations for operations on
built-in
types.
* Declarations for operations on
INET data
types.
*
*
*
*
* 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: inet.h,v 1.
6 2000/01/26 05:58:38 momjian
Exp $
* $Id: inet.h,v 1.
7 2000/07/06 05:48:31 tgl
Exp $
*
*
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*/
*/
...
@@ -45,15 +45,4 @@ typedef struct macaddr
...
@@ -45,15 +45,4 @@ typedef struct macaddr
unsigned
char
f
;
unsigned
char
f
;
}
macaddr
;
}
macaddr
;
typedef
struct
manufacturer
{
unsigned
char
a
;
unsigned
char
b
;
unsigned
char
c
;
char
*
name
;
}
manufacturer
;
extern
manufacturer
manufacturers
[];
#endif
/* MAC_H */
#endif
/* MAC_H */
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