mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
pgindent run for 8.3.
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/******************************************************************************
|
||||
$PostgreSQL: pgsql/contrib/cube/cube.c,v 1.33 2007/06/05 21:31:03 tgl Exp $
|
||||
$PostgreSQL: pgsql/contrib/cube/cube.c,v 1.34 2007/11/15 21:14:29 momjian Exp $
|
||||
|
||||
This file contains routines that can be bound to a Postgres backend and
|
||||
called by the backend in the process of processing queries. The calling
|
||||
@ -306,7 +306,7 @@ cube_subset(PG_FUNCTION_ARGS)
|
||||
result->x[i + dim] = c->x[dx[i] + c->dim - 1];
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_NDBOX(result);
|
||||
}
|
||||
|
||||
@ -360,7 +360,7 @@ cube_out(PG_FUNCTION_ARGS)
|
||||
appendStringInfoChar(&buf, ')');
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(cube,0);
|
||||
PG_FREE_IF_COPY(cube, 0);
|
||||
PG_RETURN_CSTRING(buf.data);
|
||||
}
|
||||
|
||||
@ -381,20 +381,20 @@ g_cube_consistent(PG_FUNCTION_ARGS)
|
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
||||
NDBOX *query = PG_GETARG_NDBOX(1);
|
||||
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
|
||||
bool res;
|
||||
bool res;
|
||||
|
||||
/*
|
||||
* if entry is not leaf, use g_cube_internal_consistent, else use
|
||||
* g_cube_leaf_consistent
|
||||
*/
|
||||
if (GIST_LEAF(entry))
|
||||
res = g_cube_leaf_consistent( DatumGetNDBOX(entry->key),
|
||||
query, strategy);
|
||||
res = g_cube_leaf_consistent(DatumGetNDBOX(entry->key),
|
||||
query, strategy);
|
||||
else
|
||||
res = g_cube_internal_consistent( DatumGetNDBOX(entry->key),
|
||||
query, strategy);
|
||||
res = g_cube_internal_consistent(DatumGetNDBOX(entry->key),
|
||||
query, strategy);
|
||||
|
||||
PG_FREE_IF_COPY(query,1);
|
||||
PG_FREE_IF_COPY(query, 1);
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
@ -451,14 +451,15 @@ Datum
|
||||
g_cube_decompress(PG_FUNCTION_ARGS)
|
||||
{
|
||||
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
|
||||
NDBOX *key = DatumGetNDBOX(PG_DETOAST_DATUM(entry->key));
|
||||
NDBOX *key = DatumGetNDBOX(PG_DETOAST_DATUM(entry->key));
|
||||
|
||||
if (key != DatumGetNDBOX(entry->key))
|
||||
{
|
||||
GISTENTRY *retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||
|
||||
gistentryinit(*retval, PointerGetDatum(key),
|
||||
entry->rel, entry->page,
|
||||
entry->offset, FALSE);
|
||||
entry->rel, entry->page,
|
||||
entry->offset, FALSE);
|
||||
PG_RETURN_POINTER(retval);
|
||||
}
|
||||
PG_RETURN_POINTER(entry);
|
||||
@ -479,8 +480,8 @@ g_cube_penalty(PG_FUNCTION_ARGS)
|
||||
double tmp1,
|
||||
tmp2;
|
||||
|
||||
ud = cube_union_v0( DatumGetNDBOX(origentry->key),
|
||||
DatumGetNDBOX(newentry->key));
|
||||
ud = cube_union_v0(DatumGetNDBOX(origentry->key),
|
||||
DatumGetNDBOX(newentry->key));
|
||||
rt_cube_size(ud, &tmp1);
|
||||
rt_cube_size(DatumGetNDBOX(origentry->key), &tmp2);
|
||||
*result = (float) (tmp1 - tmp2);
|
||||
@ -812,12 +813,12 @@ cube_union(PG_FUNCTION_ARGS)
|
||||
{
|
||||
NDBOX *a = PG_GETARG_NDBOX(0),
|
||||
*b = PG_GETARG_NDBOX(1);
|
||||
NDBOX *res;
|
||||
NDBOX *res;
|
||||
|
||||
res = cube_union_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_NDBOX(res);
|
||||
}
|
||||
|
||||
@ -876,8 +877,9 @@ cube_inter(PG_FUNCTION_ARGS)
|
||||
a->x[i + a->dim]), result->x[i + a->dim]);
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
|
||||
/*
|
||||
* Is it OK to return a non-null intersection for non-overlapping boxes?
|
||||
*/
|
||||
@ -899,7 +901,7 @@ cube_size(PG_FUNCTION_ARGS)
|
||||
for (i = 0, j = a->dim; i < a->dim; i++, j++)
|
||||
result = result * Abs((a->x[j] - a->x[i]));
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_RETURN_FLOAT8(result);
|
||||
}
|
||||
|
||||
@ -1011,8 +1013,8 @@ cube_cmp(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_INT32(res);
|
||||
}
|
||||
|
||||
@ -1026,8 +1028,8 @@ cube_eq(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res == 0);
|
||||
}
|
||||
|
||||
@ -1041,8 +1043,8 @@ cube_ne(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res != 0);
|
||||
}
|
||||
|
||||
@ -1056,8 +1058,8 @@ cube_lt(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res < 0);
|
||||
}
|
||||
|
||||
@ -1071,8 +1073,8 @@ cube_gt(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res > 0);
|
||||
}
|
||||
|
||||
@ -1086,8 +1088,8 @@ cube_le(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res <= 0);
|
||||
}
|
||||
|
||||
@ -1101,8 +1103,8 @@ cube_ge(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_cmp_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res >= 0);
|
||||
}
|
||||
|
||||
@ -1157,8 +1159,8 @@ cube_contains(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_contains_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
@ -1173,8 +1175,8 @@ cube_contained(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_contains_v0(b, a);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
@ -1234,8 +1236,8 @@ cube_overlap(PG_FUNCTION_ARGS)
|
||||
|
||||
res = cube_overlap_v0(a, b);
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
@ -1281,8 +1283,8 @@ cube_distance(PG_FUNCTION_ARGS)
|
||||
distance += d * d;
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(b,1);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_FREE_IF_COPY(b, 1);
|
||||
PG_RETURN_FLOAT8(sqrt(distance));
|
||||
}
|
||||
|
||||
@ -1317,7 +1319,7 @@ cube_is_point(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_BOOL(FALSE);
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_RETURN_BOOL(TRUE);
|
||||
}
|
||||
|
||||
@ -1331,7 +1333,7 @@ cube_dim(PG_FUNCTION_ARGS)
|
||||
c = PG_GETARG_NDBOX(0);
|
||||
dim = c->dim;
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_INT32(c->dim);
|
||||
}
|
||||
|
||||
@ -1350,7 +1352,7 @@ cube_ll_coord(PG_FUNCTION_ARGS)
|
||||
if (c->dim >= n && n > 0)
|
||||
result = Min(c->x[n - 1], c->x[c->dim + n - 1]);
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_FLOAT8(result);
|
||||
}
|
||||
|
||||
@ -1369,7 +1371,7 @@ cube_ur_coord(PG_FUNCTION_ARGS)
|
||||
if (c->dim >= n && n > 0)
|
||||
result = Max(c->x[n - 1], c->x[c->dim + n - 1]);
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_FLOAT8(result);
|
||||
}
|
||||
|
||||
@ -1384,7 +1386,7 @@ cube_enlarge(PG_FUNCTION_ARGS)
|
||||
j,
|
||||
k;
|
||||
NDBOX *a;
|
||||
double r;
|
||||
double r;
|
||||
int4 n;
|
||||
|
||||
a = PG_GETARG_NDBOX(0);
|
||||
@ -1426,7 +1428,7 @@ cube_enlarge(PG_FUNCTION_ARGS)
|
||||
result->x[j] = r;
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(a,0);
|
||||
PG_FREE_IF_COPY(a, 0);
|
||||
PG_RETURN_NDBOX(result);
|
||||
}
|
||||
|
||||
@ -1490,7 +1492,7 @@ cube_c_f8(PG_FUNCTION_ARGS)
|
||||
result->x[result->dim - 1] = x;
|
||||
result->x[2 * result->dim - 1] = x;
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_NDBOX(result);
|
||||
}
|
||||
|
||||
@ -1521,6 +1523,6 @@ cube_c_f8_f8(PG_FUNCTION_ARGS)
|
||||
result->x[result->dim - 1] = x1;
|
||||
result->x[2 * result->dim - 1] = x2;
|
||||
|
||||
PG_FREE_IF_COPY(c,0);
|
||||
PG_FREE_IF_COPY(c, 0);
|
||||
PG_RETURN_NDBOX(result);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
* Darko Prenosil <Darko.Prenosil@finteh.hr>
|
||||
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.65 2007/08/27 01:24:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.66 2007/11/15 21:14:29 momjian Exp $
|
||||
* Copyright (c) 2001-2007, PostgreSQL Global Development Group
|
||||
* ALL RIGHTS RESERVED;
|
||||
*
|
||||
@ -256,10 +256,10 @@ dblink_connect(PG_FUNCTION_ARGS)
|
||||
pfree(rconn);
|
||||
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
|
||||
errmsg("password is required"),
|
||||
errdetail("Non-superuser cannot connect if the server does not request a password."),
|
||||
errhint("Target server's authentication method must be changed.")));
|
||||
(errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
|
||||
errmsg("password is required"),
|
||||
errdetail("Non-superuser cannot connect if the server does not request a password."),
|
||||
errhint("Target server's authentication method must be changed.")));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Copyright (c) 2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/dict_int/dict_int.c,v 1.1 2007/10/15 21:36:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/dict_int/dict_int.c,v 1.2 2007/11/15 21:14:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -19,24 +19,25 @@
|
||||
PG_MODULE_MAGIC;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int maxlen;
|
||||
bool rejectlong;
|
||||
} DictInt;
|
||||
typedef struct
|
||||
{
|
||||
int maxlen;
|
||||
bool rejectlong;
|
||||
} DictInt;
|
||||
|
||||
|
||||
PG_FUNCTION_INFO_V1(dintdict_init);
|
||||
Datum dintdict_init(PG_FUNCTION_ARGS);
|
||||
Datum dintdict_init(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(dintdict_lexize);
|
||||
Datum dintdict_lexize(PG_FUNCTION_ARGS);
|
||||
Datum dintdict_lexize(PG_FUNCTION_ARGS);
|
||||
|
||||
Datum
|
||||
dintdict_init(PG_FUNCTION_ARGS)
|
||||
{
|
||||
List *dictoptions = (List *) PG_GETARG_POINTER(0);
|
||||
DictInt *d;
|
||||
ListCell *l;
|
||||
List *dictoptions = (List *) PG_GETARG_POINTER(0);
|
||||
DictInt *d;
|
||||
ListCell *l;
|
||||
|
||||
d = (DictInt *) palloc0(sizeof(DictInt));
|
||||
d->maxlen = 6;
|
||||
@ -44,7 +45,7 @@ dintdict_init(PG_FUNCTION_ARGS)
|
||||
|
||||
foreach(l, dictoptions)
|
||||
{
|
||||
DefElem *defel = (DefElem *) lfirst(l);
|
||||
DefElem *defel = (DefElem *) lfirst(l);
|
||||
|
||||
if (pg_strcasecmp(defel->defname, "MAXLEN") == 0)
|
||||
{
|
||||
@ -62,22 +63,22 @@ dintdict_init(PG_FUNCTION_ARGS)
|
||||
defel->defname)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PG_RETURN_POINTER(d);
|
||||
}
|
||||
|
||||
Datum
|
||||
dintdict_lexize(PG_FUNCTION_ARGS)
|
||||
{
|
||||
DictInt *d = (DictInt*)PG_GETARG_POINTER(0);
|
||||
char *in = (char*)PG_GETARG_POINTER(1);
|
||||
char *txt = pnstrdup(in, PG_GETARG_INT32(2));
|
||||
TSLexeme *res=palloc(sizeof(TSLexeme)*2);
|
||||
DictInt *d = (DictInt *) PG_GETARG_POINTER(0);
|
||||
char *in = (char *) PG_GETARG_POINTER(1);
|
||||
char *txt = pnstrdup(in, PG_GETARG_INT32(2));
|
||||
TSLexeme *res = palloc(sizeof(TSLexeme) * 2);
|
||||
|
||||
res[1].lexeme = NULL;
|
||||
if (PG_GETARG_INT32(2) > d->maxlen)
|
||||
if (PG_GETARG_INT32(2) > d->maxlen)
|
||||
{
|
||||
if ( d->rejectlong )
|
||||
if (d->rejectlong)
|
||||
{
|
||||
/* reject by returning void array */
|
||||
pfree(txt);
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Copyright (c) 2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/dict_xsyn/dict_xsyn.c,v 1.1 2007/10/15 21:36:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/dict_xsyn/dict_xsyn.c,v 1.2 2007/11/15 21:14:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -24,29 +24,30 @@ PG_MODULE_MAGIC;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *key; /* Word */
|
||||
char *value; /* Unparsed list of synonyms, including the word itself */
|
||||
char *key; /* Word */
|
||||
char *value; /* Unparsed list of synonyms, including the
|
||||
* word itself */
|
||||
} Syn;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int len;
|
||||
Syn *syn;
|
||||
int len;
|
||||
Syn *syn;
|
||||
|
||||
bool keeporig;
|
||||
bool keeporig;
|
||||
} DictSyn;
|
||||
|
||||
|
||||
PG_FUNCTION_INFO_V1(dxsyn_init);
|
||||
Datum dxsyn_init(PG_FUNCTION_ARGS);
|
||||
Datum dxsyn_init(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(dxsyn_lexize);
|
||||
Datum dxsyn_lexize(PG_FUNCTION_ARGS);
|
||||
Datum dxsyn_lexize(PG_FUNCTION_ARGS);
|
||||
|
||||
static char *
|
||||
find_word(char *in, char **end)
|
||||
{
|
||||
char *start;
|
||||
char *start;
|
||||
|
||||
*end = NULL;
|
||||
while (*in && t_isspace(in))
|
||||
@ -71,12 +72,12 @@ compare_syn(const void *a, const void *b)
|
||||
}
|
||||
|
||||
static void
|
||||
read_dictionary(DictSyn *d, char *filename)
|
||||
read_dictionary(DictSyn * d, char *filename)
|
||||
{
|
||||
char *real_filename = get_tsearch_config_filename(filename, "rules");
|
||||
FILE *fin;
|
||||
char *line;
|
||||
int cur = 0;
|
||||
char *real_filename = get_tsearch_config_filename(filename, "rules");
|
||||
FILE *fin;
|
||||
char *line;
|
||||
int cur = 0;
|
||||
|
||||
if ((fin = AllocateFile(real_filename, "r")) == NULL)
|
||||
ereport(ERROR,
|
||||
@ -86,9 +87,9 @@ read_dictionary(DictSyn *d, char *filename)
|
||||
|
||||
while ((line = t_readline(fin)) != NULL)
|
||||
{
|
||||
char *value;
|
||||
char *key;
|
||||
char *end = NULL;
|
||||
char *value;
|
||||
char *key;
|
||||
char *end = NULL;
|
||||
|
||||
if (*line == '\0')
|
||||
continue;
|
||||
@ -130,9 +131,9 @@ read_dictionary(DictSyn *d, char *filename)
|
||||
Datum
|
||||
dxsyn_init(PG_FUNCTION_ARGS)
|
||||
{
|
||||
List *dictoptions = (List *) PG_GETARG_POINTER(0);
|
||||
DictSyn *d;
|
||||
ListCell *l;
|
||||
List *dictoptions = (List *) PG_GETARG_POINTER(0);
|
||||
DictSyn *d;
|
||||
ListCell *l;
|
||||
|
||||
d = (DictSyn *) palloc0(sizeof(DictSyn));
|
||||
d->len = 0;
|
||||
@ -141,7 +142,7 @@ dxsyn_init(PG_FUNCTION_ARGS)
|
||||
|
||||
foreach(l, dictoptions)
|
||||
{
|
||||
DefElem *defel = (DefElem *) lfirst(l);
|
||||
DefElem *defel = (DefElem *) lfirst(l);
|
||||
|
||||
if (pg_strcasecmp(defel->defname, "KEEPORIG") == 0)
|
||||
{
|
||||
@ -166,19 +167,19 @@ dxsyn_init(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
dxsyn_lexize(PG_FUNCTION_ARGS)
|
||||
{
|
||||
DictSyn *d = (DictSyn *) PG_GETARG_POINTER(0);
|
||||
char *in = (char *) PG_GETARG_POINTER(1);
|
||||
int length = PG_GETARG_INT32(2);
|
||||
Syn word;
|
||||
Syn *found;
|
||||
TSLexeme *res = NULL;
|
||||
DictSyn *d = (DictSyn *) PG_GETARG_POINTER(0);
|
||||
char *in = (char *) PG_GETARG_POINTER(1);
|
||||
int length = PG_GETARG_INT32(2);
|
||||
Syn word;
|
||||
Syn *found;
|
||||
TSLexeme *res = NULL;
|
||||
|
||||
if (!length || d->len == 0)
|
||||
PG_RETURN_POINTER(NULL);
|
||||
|
||||
/* Create search pattern */
|
||||
{
|
||||
char *temp = pnstrdup(in, length);
|
||||
char *temp = pnstrdup(in, length);
|
||||
|
||||
word.key = lowerstr(temp);
|
||||
pfree(temp);
|
||||
@ -186,7 +187,7 @@ dxsyn_lexize(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
/* Look for matching syn */
|
||||
found = (Syn *)bsearch(&word, d->syn, d->len, sizeof(Syn), compare_syn);
|
||||
found = (Syn *) bsearch(&word, d->syn, d->len, sizeof(Syn), compare_syn);
|
||||
pfree(word.key);
|
||||
|
||||
if (!found)
|
||||
@ -194,28 +195,28 @@ dxsyn_lexize(PG_FUNCTION_ARGS)
|
||||
|
||||
/* Parse string of synonyms and return array of words */
|
||||
{
|
||||
char *value = pstrdup(found->value);
|
||||
int value_length = strlen(value);
|
||||
char *pos = value;
|
||||
int nsyns = 0;
|
||||
bool is_first = true;
|
||||
char *value = pstrdup(found->value);
|
||||
int value_length = strlen(value);
|
||||
char *pos = value;
|
||||
int nsyns = 0;
|
||||
bool is_first = true;
|
||||
|
||||
res = palloc(0);
|
||||
|
||||
while(pos < value + value_length)
|
||||
while (pos < value + value_length)
|
||||
{
|
||||
char *end;
|
||||
char *syn = find_word(pos, &end);
|
||||
char *end;
|
||||
char *syn = find_word(pos, &end);
|
||||
|
||||
if (!syn)
|
||||
break;
|
||||
*end = '\0';
|
||||
|
||||
res = repalloc(res, sizeof(TSLexeme)*(nsyns + 2));
|
||||
res = repalloc(res, sizeof(TSLexeme) * (nsyns + 2));
|
||||
res[nsyns].lexeme = NULL;
|
||||
|
||||
/* first word is added to result only if KEEPORIG flag is set */
|
||||
if(d->keeporig || !is_first)
|
||||
if (d->keeporig || !is_first)
|
||||
{
|
||||
res[nsyns].lexeme = pstrdup(syn);
|
||||
res[nsyns + 1].lexeme = NULL;
|
||||
|
@ -50,7 +50,7 @@ typedef struct
|
||||
int comparePairs(const void *a, const void *b);
|
||||
int uniquePairs(Pairs * a, int4 l, int4 *buflen);
|
||||
|
||||
#define HStoreContainsStrategyNumber 7
|
||||
#define HStoreExistsStrategyNumber 9
|
||||
#define HStoreContainsStrategyNumber 7
|
||||
#define HStoreExistsStrategyNumber 9
|
||||
|
||||
#endif
|
||||
|
@ -1,24 +1,24 @@
|
||||
#include "hstore.h"
|
||||
|
||||
#include "access/gin.h"
|
||||
#include "access/gin.h"
|
||||
|
||||
#define KEYFLAG 'K'
|
||||
#define VALFLAG 'V'
|
||||
#define NULLFLAG 'N'
|
||||
#define KEYFLAG 'K'
|
||||
#define VALFLAG 'V'
|
||||
#define NULLFLAG 'N'
|
||||
|
||||
PG_FUNCTION_INFO_V1(gin_extract_hstore);
|
||||
Datum gin_extract_hstore(PG_FUNCTION_ARGS);
|
||||
Datum gin_extract_hstore(PG_FUNCTION_ARGS);
|
||||
|
||||
static text*
|
||||
makeitem( char *str, int len )
|
||||
static text *
|
||||
makeitem(char *str, int len)
|
||||
{
|
||||
text *item;
|
||||
text *item;
|
||||
|
||||
item = (text*)palloc( VARHDRSZ + len + 1 );
|
||||
item = (text *) palloc(VARHDRSZ + len + 1);
|
||||
SET_VARSIZE(item, VARHDRSZ + len + 1);
|
||||
|
||||
if ( str && len > 0 )
|
||||
memcpy( VARDATA(item)+1, str, len );
|
||||
if (str && len > 0)
|
||||
memcpy(VARDATA(item) + 1, str, len);
|
||||
|
||||
return item;
|
||||
}
|
||||
@ -26,37 +26,37 @@ makeitem( char *str, int len )
|
||||
Datum
|
||||
gin_extract_hstore(PG_FUNCTION_ARGS)
|
||||
{
|
||||
HStore *hs = PG_GETARG_HS(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
HStore *hs = PG_GETARG_HS(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
|
||||
*nentries = 2*hs->size;
|
||||
*nentries = 2 * hs->size;
|
||||
|
||||
if ( hs->size > 0 )
|
||||
if (hs->size > 0)
|
||||
{
|
||||
HEntry *ptr = ARRPTR(hs);
|
||||
char *words = STRPTR(hs);
|
||||
int i=0;
|
||||
HEntry *ptr = ARRPTR(hs);
|
||||
char *words = STRPTR(hs);
|
||||
int i = 0;
|
||||
|
||||
entries = (Datum*)palloc( sizeof(Datum) * 2 * hs->size );
|
||||
entries = (Datum *) palloc(sizeof(Datum) * 2 * hs->size);
|
||||
|
||||
while (ptr - ARRPTR(hs) < hs->size)
|
||||
{
|
||||
text *item;
|
||||
text *item;
|
||||
|
||||
item = makeitem( words + ptr->pos, ptr->keylen );
|
||||
item = makeitem(words + ptr->pos, ptr->keylen);
|
||||
*VARDATA(item) = KEYFLAG;
|
||||
entries[i++] = PointerGetDatum(item);
|
||||
|
||||
if ( ptr->valisnull )
|
||||
if (ptr->valisnull)
|
||||
{
|
||||
item = makeitem( NULL, 0 );
|
||||
item = makeitem(NULL, 0);
|
||||
*VARDATA(item) = NULLFLAG;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
item = makeitem( words + ptr->pos + ptr->keylen, ptr->vallen );
|
||||
item = makeitem(words + ptr->pos + ptr->keylen, ptr->vallen);
|
||||
*VARDATA(item) = VALFLAG;
|
||||
}
|
||||
entries[i++] = PointerGetDatum(item);
|
||||
@ -65,36 +65,37 @@ gin_extract_hstore(PG_FUNCTION_ARGS)
|
||||
}
|
||||
}
|
||||
|
||||
PG_FREE_IF_COPY(hs,0);
|
||||
PG_FREE_IF_COPY(hs, 0);
|
||||
PG_RETURN_POINTER(entries);
|
||||
}
|
||||
|
||||
PG_FUNCTION_INFO_V1(gin_extract_hstore_query);
|
||||
Datum gin_extract_hstore_query(PG_FUNCTION_ARGS);
|
||||
Datum gin_extract_hstore_query(PG_FUNCTION_ARGS);
|
||||
|
||||
Datum
|
||||
gin_extract_hstore_query(PG_FUNCTION_ARGS)
|
||||
{
|
||||
StrategyNumber strategy = PG_GETARG_UINT16(2);
|
||||
|
||||
if ( strategy == HStoreContainsStrategyNumber )
|
||||
if (strategy == HStoreContainsStrategyNumber)
|
||||
{
|
||||
PG_RETURN_DATUM( DirectFunctionCall2(
|
||||
gin_extract_hstore,
|
||||
PG_GETARG_DATUM(0),
|
||||
PG_GETARG_DATUM(1)
|
||||
));
|
||||
PG_RETURN_DATUM(DirectFunctionCall2(
|
||||
gin_extract_hstore,
|
||||
PG_GETARG_DATUM(0),
|
||||
PG_GETARG_DATUM(1)
|
||||
));
|
||||
}
|
||||
else if ( strategy == HStoreExistsStrategyNumber )
|
||||
else if (strategy == HStoreExistsStrategyNumber)
|
||||
{
|
||||
text *item, *q = PG_GETARG_TEXT_P(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
text *item,
|
||||
*q = PG_GETARG_TEXT_P(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
|
||||
*nentries = 1;
|
||||
entries = (Datum*)palloc( sizeof(Datum) );
|
||||
entries = (Datum *) palloc(sizeof(Datum));
|
||||
|
||||
item = makeitem( VARDATA(q), VARSIZE(q)-VARHDRSZ );
|
||||
item = makeitem(VARDATA(q), VARSIZE(q) - VARHDRSZ);
|
||||
*VARDATA(item) = KEYFLAG;
|
||||
entries[0] = PointerGetDatum(item);
|
||||
|
||||
@ -107,29 +108,28 @@ gin_extract_hstore_query(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
PG_FUNCTION_INFO_V1(gin_consistent_hstore);
|
||||
Datum gin_consistent_hstore(PG_FUNCTION_ARGS);
|
||||
Datum gin_consistent_hstore(PG_FUNCTION_ARGS);
|
||||
|
||||
Datum
|
||||
gin_consistent_hstore(PG_FUNCTION_ARGS)
|
||||
{
|
||||
StrategyNumber strategy = PG_GETARG_UINT16(1);
|
||||
bool res = true;
|
||||
bool res = true;
|
||||
|
||||
if ( strategy == HStoreContainsStrategyNumber )
|
||||
if (strategy == HStoreContainsStrategyNumber)
|
||||
{
|
||||
bool *check = (bool *) PG_GETARG_POINTER(0);
|
||||
HStore *query = PG_GETARG_HS(2);
|
||||
int i;
|
||||
bool *check = (bool *) PG_GETARG_POINTER(0);
|
||||
HStore *query = PG_GETARG_HS(2);
|
||||
int i;
|
||||
|
||||
for(i=0;res && i<2*query->size;i++)
|
||||
if ( check[i] == false )
|
||||
for (i = 0; res && i < 2 * query->size; i++)
|
||||
if (check[i] == false)
|
||||
res = false;
|
||||
}
|
||||
else if ( strategy == HStoreExistsStrategyNumber )
|
||||
else if (strategy == HStoreExistsStrategyNumber)
|
||||
res = true;
|
||||
else
|
||||
elog(ERROR, "Unsupported strategy number: %d", strategy);
|
||||
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
|
@ -275,13 +275,13 @@ tconvert(PG_FUNCTION_ARGS)
|
||||
int len;
|
||||
HStore *out;
|
||||
|
||||
if ( PG_ARGISNULL(0) )
|
||||
if (PG_ARGISNULL(0))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
key = PG_GETARG_TEXT_P(0);
|
||||
|
||||
if ( PG_ARGISNULL(1) )
|
||||
len = CALCDATASIZE(1, VARSIZE(key) );
|
||||
if (PG_ARGISNULL(1))
|
||||
len = CALCDATASIZE(1, VARSIZE(key));
|
||||
else
|
||||
{
|
||||
val = PG_GETARG_TEXT_P(1);
|
||||
@ -292,7 +292,7 @@ tconvert(PG_FUNCTION_ARGS)
|
||||
out->size = 1;
|
||||
|
||||
ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ;
|
||||
if ( PG_ARGISNULL(1) )
|
||||
if (PG_ARGISNULL(1))
|
||||
{
|
||||
ARRPTR(out)->vallen = 0;
|
||||
ARRPTR(out)->valisnull = true;
|
||||
@ -537,18 +537,18 @@ hs_contains(PG_FUNCTION_ARGS)
|
||||
|
||||
if (entry)
|
||||
{
|
||||
if ( te->valisnull || entry->valisnull )
|
||||
if (te->valisnull || entry->valisnull)
|
||||
{
|
||||
if ( !(te->valisnull && entry->valisnull) )
|
||||
if (!(te->valisnull && entry->valisnull))
|
||||
res = false;
|
||||
}
|
||||
else if ( te->vallen != entry->vallen ||
|
||||
strncmp(
|
||||
vv + entry->pos + entry->keylen,
|
||||
tv + te->pos + te->keylen,
|
||||
te->vallen)
|
||||
)
|
||||
res = false;
|
||||
else if (te->vallen != entry->vallen ||
|
||||
strncmp(
|
||||
vv + entry->pos + entry->keylen,
|
||||
tv + te->pos + te->keylen,
|
||||
te->vallen)
|
||||
)
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
res = false;
|
||||
|
@ -57,16 +57,17 @@ ginint4_queryextract(PG_FUNCTION_ARGS)
|
||||
}
|
||||
}
|
||||
|
||||
if ( nentries == 0 )
|
||||
if (nentries == 0)
|
||||
{
|
||||
switch( strategy )
|
||||
switch (strategy)
|
||||
{
|
||||
case BooleanSearchStrategy:
|
||||
case RTOverlapStrategyNumber:
|
||||
*nentries = -1; /* nobody can be found */
|
||||
break;
|
||||
default: /* require fullscan: GIN can't find void arrays */
|
||||
break;
|
||||
*nentries = -1; /* nobody can be found */
|
||||
break;
|
||||
default: /* require fullscan: GIN can't find void
|
||||
* arrays */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,10 +233,11 @@ g_int_decompress(PG_FUNCTION_ARGS)
|
||||
CHECKARRVALID(in);
|
||||
if (ARRISVOID(in))
|
||||
{
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key)) {
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key))
|
||||
{
|
||||
retval = palloc(sizeof(GISTENTRY));
|
||||
gistentryinit(*retval, PointerGetDatum(in),
|
||||
entry->rel, entry->page, entry->offset, FALSE);
|
||||
entry->rel, entry->page, entry->offset, FALSE);
|
||||
PG_RETURN_POINTER(retval);
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.6 2007/06/05 21:31:03 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.7 2007/11/15 21:14:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -506,7 +506,7 @@ ean2UPC(char *isn)
|
||||
* Returns the ean13 value of the string.
|
||||
*/
|
||||
static
|
||||
ean13
|
||||
ean13
|
||||
str2ean(const char *num)
|
||||
{
|
||||
ean13 ean = 0; /* current ean */
|
||||
|
@ -302,9 +302,9 @@ bt_page_items(PG_FUNCTION_ARGS)
|
||||
buffer = ReadBuffer(rel, blkno);
|
||||
|
||||
/*
|
||||
* We copy the page into local storage to avoid holding pin on
|
||||
* the buffer longer than we must, and possibly failing to
|
||||
* release it at all if the calling query doesn't fetch all rows.
|
||||
* We copy the page into local storage to avoid holding pin on the
|
||||
* buffer longer than we must, and possibly failing to release it at
|
||||
* all if the calling query doesn't fetch all rows.
|
||||
*/
|
||||
mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
|
||||
|
||||
|
@ -8,17 +8,17 @@
|
||||
* information as possible, even if it's nonsense. That's because if a
|
||||
* page is corrupt, we don't know why and how exactly it is corrupt, so we
|
||||
* let the user to judge it.
|
||||
*
|
||||
*
|
||||
* These functions are restricted to superusers for the fear of introducing
|
||||
* security holes if the input checking isn't as water-tight as it should.
|
||||
* You'd need to be superuser to obtain a raw page image anyway, so
|
||||
* security holes if the input checking isn't as water-tight as it should.
|
||||
* You'd need to be superuser to obtain a raw page image anyway, so
|
||||
* there's hardly any use case for using these without superuser-rights
|
||||
* anyway.
|
||||
*
|
||||
* Copyright (c) 2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/pageinspect/heapfuncs.c,v 1.2 2007/09/12 22:10:25 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pageinspect/heapfuncs.c,v 1.3 2007/11/15 21:14:30 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -34,10 +34,10 @@
|
||||
#include "utils/builtins.h"
|
||||
#include "miscadmin.h"
|
||||
|
||||
Datum heap_page_items(PG_FUNCTION_ARGS);
|
||||
Datum heap_page_items(PG_FUNCTION_ARGS);
|
||||
|
||||
#define GET_TEXT(str_) \
|
||||
DirectFunctionCall1(textin, CStringGetDatum(str_))
|
||||
DirectFunctionCall1(textin, CStringGetDatum(str_))
|
||||
|
||||
/*
|
||||
* bits_to_text
|
||||
@ -48,12 +48,12 @@ Datum heap_page_items(PG_FUNCTION_ARGS);
|
||||
static char *
|
||||
bits_to_text(bits8 *bits, int len)
|
||||
{
|
||||
int i;
|
||||
char *str;
|
||||
int i;
|
||||
char *str;
|
||||
|
||||
str = palloc(len + 1);
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
str[i] = (bits[(i / 8)] & (1 << (i % 8))) ? '1' : '0';
|
||||
|
||||
str[i] = '\0';
|
||||
@ -74,15 +74,15 @@ typedef struct heap_page_items_state
|
||||
TupleDesc tupd;
|
||||
Page page;
|
||||
uint16 offset;
|
||||
} heap_page_items_state;
|
||||
} heap_page_items_state;
|
||||
|
||||
Datum
|
||||
heap_page_items(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bytea *raw_page = PG_GETARG_BYTEA_P(0);
|
||||
bytea *raw_page = PG_GETARG_BYTEA_P(0);
|
||||
heap_page_items_state *inter_call_data = NULL;
|
||||
FuncCallContext *fctx;
|
||||
int raw_page_size;
|
||||
int raw_page_size;
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
@ -96,10 +96,10 @@ heap_page_items(PG_FUNCTION_ARGS)
|
||||
TupleDesc tupdesc;
|
||||
MemoryContext mctx;
|
||||
|
||||
if(raw_page_size < SizeOfPageHeaderData)
|
||||
ereport(ERROR,
|
||||
if (raw_page_size < SizeOfPageHeaderData)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("input page too small (%d bytes)", raw_page_size)));
|
||||
errmsg("input page too small (%d bytes)", raw_page_size)));
|
||||
|
||||
fctx = SRF_FIRSTCALL_INIT();
|
||||
mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
|
||||
@ -132,42 +132,42 @@ heap_page_items(PG_FUNCTION_ARGS)
|
||||
ItemId id;
|
||||
Datum values[13];
|
||||
bool nulls[13];
|
||||
uint16 lp_offset;
|
||||
uint16 lp_offset;
|
||||
uint16 lp_flags;
|
||||
uint16 lp_len;
|
||||
|
||||
memset(nulls, 0, sizeof(nulls));
|
||||
|
||||
/* Extract information from the line pointer */
|
||||
|
||||
|
||||
id = PageGetItemId(page, inter_call_data->offset);
|
||||
|
||||
lp_offset = ItemIdGetOffset(id);
|
||||
lp_flags = ItemIdGetFlags(id);
|
||||
lp_len = ItemIdGetLength(id);
|
||||
lp_offset = ItemIdGetOffset(id);
|
||||
lp_flags = ItemIdGetFlags(id);
|
||||
lp_len = ItemIdGetLength(id);
|
||||
|
||||
values[0] = UInt16GetDatum(inter_call_data->offset);
|
||||
values[1] = UInt16GetDatum(lp_offset);
|
||||
values[2] = UInt16GetDatum(lp_flags);
|
||||
values[3] = UInt16GetDatum(lp_len);
|
||||
|
||||
/* We do just enough validity checking to make sure we don't
|
||||
* reference data outside the page passed to us. The page
|
||||
* could be corrupt in many other ways, but at least we won't
|
||||
* crash.
|
||||
/*
|
||||
* We do just enough validity checking to make sure we don't reference
|
||||
* data outside the page passed to us. The page could be corrupt in
|
||||
* many other ways, but at least we won't crash.
|
||||
*/
|
||||
if (ItemIdHasStorage(id) &&
|
||||
lp_len >= sizeof(HeapTupleHeader) &&
|
||||
lp_offset == MAXALIGN(lp_offset) &&
|
||||
lp_offset + lp_len <= raw_page_size)
|
||||
{
|
||||
HeapTupleHeader tuphdr;
|
||||
int bits_len;
|
||||
HeapTupleHeader tuphdr;
|
||||
int bits_len;
|
||||
|
||||
/* Extract information from the tuple header */
|
||||
|
||||
tuphdr = (HeapTupleHeader) PageGetItem(page, id);
|
||||
|
||||
|
||||
values[4] = UInt32GetDatum(HeapTupleHeaderGetXmin(tuphdr));
|
||||
values[5] = UInt32GetDatum(HeapTupleHeaderGetXmax(tuphdr));
|
||||
values[6] = UInt32GetDatum(HeapTupleHeaderGetRawCommandId(tuphdr)); /* shared with xvac */
|
||||
@ -176,22 +176,23 @@ heap_page_items(PG_FUNCTION_ARGS)
|
||||
values[9] = UInt16GetDatum(tuphdr->t_infomask);
|
||||
values[10] = UInt8GetDatum(tuphdr->t_hoff);
|
||||
|
||||
/* We already checked that the item as is completely within
|
||||
* the raw page passed to us, with the length given in the line
|
||||
/*
|
||||
* We already checked that the item as is completely within the
|
||||
* raw page passed to us, with the length given in the line
|
||||
* pointer.. Let's check that t_hoff doesn't point over lp_len,
|
||||
* before using it to access t_bits and oid.
|
||||
*/
|
||||
if (tuphdr->t_hoff >= sizeof(HeapTupleHeader) &&
|
||||
if (tuphdr->t_hoff >= sizeof(HeapTupleHeader) &&
|
||||
tuphdr->t_hoff <= lp_len)
|
||||
{
|
||||
if (tuphdr->t_infomask & HEAP_HASNULL)
|
||||
{
|
||||
bits_len = tuphdr->t_hoff -
|
||||
(((char *)tuphdr->t_bits) - ((char *)tuphdr));
|
||||
bits_len = tuphdr->t_hoff -
|
||||
(((char *) tuphdr->t_bits) -((char *) tuphdr));
|
||||
|
||||
values[11] = GET_TEXT(
|
||||
bits_to_text(tuphdr->t_bits, bits_len * 8));
|
||||
}
|
||||
bits_to_text(tuphdr->t_bits, bits_len * 8));
|
||||
}
|
||||
else
|
||||
nulls[11] = true;
|
||||
|
||||
@ -208,17 +209,19 @@ heap_page_items(PG_FUNCTION_ARGS)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The line pointer is not used, or it's invalid. Set the rest of
|
||||
* the fields to NULL */
|
||||
int i;
|
||||
/*
|
||||
* The line pointer is not used, or it's invalid. Set the rest of
|
||||
* the fields to NULL
|
||||
*/
|
||||
int i;
|
||||
|
||||
for(i = 4; i <= 12; i++)
|
||||
for (i = 4; i <= 12; i++)
|
||||
nulls[i] = true;
|
||||
}
|
||||
|
||||
/* Build and return the result tuple. */
|
||||
resultTuple = heap_form_tuple(inter_call_data->tupd, values, nulls);
|
||||
result = HeapTupleGetDatum(resultTuple);
|
||||
/* Build and return the result tuple. */
|
||||
resultTuple = heap_form_tuple(inter_call_data->tupd, values, nulls);
|
||||
result = HeapTupleGetDatum(resultTuple);
|
||||
|
||||
inter_call_data->offset++;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
* Copyright (c) 2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/pageinspect/rawpage.c,v 1.2 2007/09/21 21:25:42 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pageinspect/rawpage.c,v 1.3 2007/11/15 21:14:30 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -26,8 +26,8 @@
|
||||
|
||||
PG_MODULE_MAGIC;
|
||||
|
||||
Datum get_raw_page(PG_FUNCTION_ARGS);
|
||||
Datum page_header(PG_FUNCTION_ARGS);
|
||||
Datum get_raw_page(PG_FUNCTION_ARGS);
|
||||
Datum page_header(PG_FUNCTION_ARGS);
|
||||
|
||||
/*
|
||||
* get_raw_page
|
||||
@ -43,9 +43,9 @@ get_raw_page(PG_FUNCTION_ARGS)
|
||||
uint32 blkno = PG_GETARG_UINT32(1);
|
||||
|
||||
Relation rel;
|
||||
RangeVar *relrv;
|
||||
bytea *raw_page;
|
||||
char *raw_page_data;
|
||||
RangeVar *relrv;
|
||||
bytea *raw_page;
|
||||
char *raw_page_data;
|
||||
Buffer buf;
|
||||
|
||||
if (!superuser())
|
||||
@ -61,12 +61,12 @@ get_raw_page(PG_FUNCTION_ARGS)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("cannot get raw page from view \"%s\"",
|
||||
RelationGetRelationName(rel))));
|
||||
RelationGetRelationName(rel))));
|
||||
if (rel->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("cannot get raw page from composite type \"%s\"",
|
||||
RelationGetRelationName(rel))));
|
||||
RelationGetRelationName(rel))));
|
||||
|
||||
if (blkno >= RelationGetNumberOfBlocks(rel))
|
||||
elog(ERROR, "block number %u is out of range for relation \"%s\"",
|
||||
@ -125,13 +125,13 @@ page_header(PG_FUNCTION_ARGS)
|
||||
raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
|
||||
|
||||
/*
|
||||
* Check that enough data was supplied, so that we don't try to access
|
||||
* fields outside the supplied buffer.
|
||||
* Check that enough data was supplied, so that we don't try to access
|
||||
* fields outside the supplied buffer.
|
||||
*/
|
||||
if(raw_page_size < sizeof(PageHeaderData))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("input page too small (%d bytes)", raw_page_size)));
|
||||
if (raw_page_size < sizeof(PageHeaderData))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("input page too small (%d bytes)", raw_page_size)));
|
||||
|
||||
page = (PageHeader) VARDATA(raw_page);
|
||||
|
||||
@ -154,12 +154,12 @@ page_header(PG_FUNCTION_ARGS)
|
||||
values[7] = UInt16GetDatum(PageGetPageLayoutVersion(page));
|
||||
values[8] = TransactionIdGetDatum(page->pd_prune_xid);
|
||||
|
||||
/* Build and return the tuple. */
|
||||
/* Build and return the tuple. */
|
||||
|
||||
memset(nulls, 0, sizeof(nulls));
|
||||
|
||||
tuple = heap_form_tuple(tupdesc, values, nulls);
|
||||
result = HeapTupleGetDatum(tuple);
|
||||
tuple = heap_form_tuple(tupdesc, values, nulls);
|
||||
result = HeapTupleGetDatum(tuple);
|
||||
|
||||
PG_RETURN_DATUM(result);
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* pg_buffercache_pages.c
|
||||
* display some contents of the buffer cache
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.13 2007/07/16 21:20:36 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.14 2007/11/15 21:14:30 momjian Exp $
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
@ -149,9 +149,9 @@ pg_buffercache_pages(PG_FUNCTION_ARGS)
|
||||
/*
|
||||
* And release locks. We do this in reverse order for two reasons:
|
||||
* (1) Anyone else who needs more than one of the locks will be trying
|
||||
* to lock them in increasing order; we don't want to release the other
|
||||
* process until it can get all the locks it needs.
|
||||
* (2) This avoids O(N^2) behavior inside LWLockRelease.
|
||||
* to lock them in increasing order; we don't want to release the
|
||||
* other process until it can get all the locks it needs. (2) This
|
||||
* avoids O(N^2) behavior inside LWLockRelease.
|
||||
*/
|
||||
for (i = NUM_BUFFER_PARTITIONS; --i >= 0;)
|
||||
LWLockRelease(FirstBufMappingLock + i);
|
||||
|
@ -1,12 +1,12 @@
|
||||
/*
|
||||
* pg_standby.c
|
||||
*
|
||||
*
|
||||
* Production-ready example of how to create a Warm Standby
|
||||
* database server using continuous archiving as a
|
||||
* database server using continuous archiving as a
|
||||
* replication mechanism
|
||||
*
|
||||
* We separate the parameters for archive and nextWALfile
|
||||
* so that we can check the archive exists, even if the
|
||||
* so that we can check the archive exists, even if the
|
||||
* WAL file doesn't (yet).
|
||||
*
|
||||
* This program will be executed once in full for each file
|
||||
@ -14,9 +14,9 @@
|
||||
*
|
||||
* It is designed to cater to a variety of needs, as well
|
||||
* providing a customizable section.
|
||||
*
|
||||
* Original author: Simon Riggs simon@2ndquadrant.com
|
||||
* Current maintainer: Simon Riggs
|
||||
*
|
||||
* Original author: Simon Riggs simon@2ndquadrant.com
|
||||
* Current maintainer: Simon Riggs
|
||||
*/
|
||||
#include "postgres_fe.h"
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef WIN32
|
||||
int getopt(int argc, char * const argv[], const char *optstring);
|
||||
int getopt(int argc, char *const argv[], const char *optstring);
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
@ -34,42 +34,44 @@ int getopt(int argc, char * const argv[], const char *optstring);
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! WIN32 */
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
/* Options and defaults */
|
||||
int sleeptime = 5; /* amount of time to sleep between file checks */
|
||||
int waittime = -1; /* how long we have been waiting, -1 no wait yet */
|
||||
int maxwaittime = 0; /* how long are we prepared to wait for? */
|
||||
int keepfiles = 0; /* number of WAL files to keep, 0 keep all */
|
||||
int maxretries = 3; /* number of retries on restore command */
|
||||
bool debug = false; /* are we debugging? */
|
||||
bool triggered = false; /* have we been triggered? */
|
||||
bool need_cleanup = false; /* do we need to remove files from archive? */
|
||||
int sleeptime = 5; /* amount of time to sleep between file checks */
|
||||
int waittime = -1; /* how long we have been waiting, -1 no wait
|
||||
* yet */
|
||||
int maxwaittime = 0; /* how long are we prepared to wait for? */
|
||||
int keepfiles = 0; /* number of WAL files to keep, 0 keep all */
|
||||
int maxretries = 3; /* number of retries on restore command */
|
||||
bool debug = false; /* are we debugging? */
|
||||
bool triggered = false; /* have we been triggered? */
|
||||
bool need_cleanup = false; /* do we need to remove files from
|
||||
* archive? */
|
||||
|
||||
static volatile sig_atomic_t signaled = false;
|
||||
|
||||
char *archiveLocation; /* where to find the archive? */
|
||||
char *triggerPath; /* where to find the trigger file? */
|
||||
char *xlogFilePath; /* where we are going to restore to */
|
||||
char *nextWALFileName; /* the file we need to get from archive */
|
||||
char *restartWALFileName; /* the file from which we can restart restore */
|
||||
char *priorWALFileName; /* the file we need to get from archive */
|
||||
char WALFilePath[MAXPGPATH];/* the file path including archive */
|
||||
char restoreCommand[MAXPGPATH]; /* run this to restore */
|
||||
char exclusiveCleanupFileName[MAXPGPATH]; /* the file we need to get from archive */
|
||||
char *archiveLocation; /* where to find the archive? */
|
||||
char *triggerPath; /* where to find the trigger file? */
|
||||
char *xlogFilePath; /* where we are going to restore to */
|
||||
char *nextWALFileName; /* the file we need to get from archive */
|
||||
char *restartWALFileName; /* the file from which we can restart restore */
|
||||
char *priorWALFileName; /* the file we need to get from archive */
|
||||
char WALFilePath[MAXPGPATH]; /* the file path including archive */
|
||||
char restoreCommand[MAXPGPATH]; /* run this to restore */
|
||||
char exclusiveCleanupFileName[MAXPGPATH]; /* the file we need to
|
||||
* get from archive */
|
||||
|
||||
#define RESTORE_COMMAND_COPY 0
|
||||
#define RESTORE_COMMAND_LINK 1
|
||||
int restoreCommandType;
|
||||
int restoreCommandType;
|
||||
|
||||
#define XLOG_DATA 0
|
||||
#define XLOG_HISTORY 1
|
||||
#define XLOG_BACKUP_LABEL 2
|
||||
int nextWALFileType;
|
||||
int nextWALFileType;
|
||||
|
||||
#define SET_RESTORE_COMMAND(cmd, arg1, arg2) \
|
||||
snprintf(restoreCommand, MAXPGPATH, cmd " \"%s\" \"%s\"", arg1, arg2)
|
||||
@ -86,21 +88,21 @@ struct stat stat_buf;
|
||||
* accessible directory. If you want to make other assumptions,
|
||||
* such as using a vendor-specific archive and access API, these
|
||||
* routines are the ones you'll need to change. You're
|
||||
* enouraged to submit any changes to pgsql-patches@postgresql.org
|
||||
* or personally to the current maintainer. Those changes may be
|
||||
* enouraged to submit any changes to pgsql-patches@postgresql.org
|
||||
* or personally to the current maintainer. Those changes may be
|
||||
* folded in to later versions of this program.
|
||||
*/
|
||||
|
||||
#define XLOG_DATA_FNAME_LEN 24
|
||||
#define XLOG_DATA_FNAME_LEN 24
|
||||
/* Reworked from access/xlog_internal.h */
|
||||
#define XLogFileName(fname, tli, log, seg) \
|
||||
snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)
|
||||
|
||||
/*
|
||||
* Initialize allows customized commands into the warm standby program.
|
||||
* Initialize allows customized commands into the warm standby program.
|
||||
*
|
||||
* As an example, and probably the common case, we use either
|
||||
* cp/ln commands on *nix, or copy/move command on Windows.
|
||||
* As an example, and probably the common case, we use either
|
||||
* cp/ln commands on *nix, or copy/move command on Windows.
|
||||
*
|
||||
*/
|
||||
static void
|
||||
@ -111,79 +113,79 @@ CustomizableInitialize(void)
|
||||
switch (restoreCommandType)
|
||||
{
|
||||
case RESTORE_COMMAND_LINK:
|
||||
SET_RESTORE_COMMAND("mklink",WALFilePath, xlogFilePath);
|
||||
SET_RESTORE_COMMAND("mklink", WALFilePath, xlogFilePath);
|
||||
case RESTORE_COMMAND_COPY:
|
||||
default:
|
||||
SET_RESTORE_COMMAND("copy",WALFilePath, xlogFilePath);
|
||||
SET_RESTORE_COMMAND("copy", WALFilePath, xlogFilePath);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
snprintf(WALFilePath, MAXPGPATH, "%s/%s", archiveLocation, nextWALFileName);
|
||||
switch (restoreCommandType)
|
||||
{
|
||||
case RESTORE_COMMAND_LINK:
|
||||
#if HAVE_WORKING_LINK
|
||||
SET_RESTORE_COMMAND("ln -s -f",WALFilePath, xlogFilePath);
|
||||
SET_RESTORE_COMMAND("ln -s -f", WALFilePath, xlogFilePath);
|
||||
break;
|
||||
#endif
|
||||
case RESTORE_COMMAND_COPY:
|
||||
default:
|
||||
SET_RESTORE_COMMAND("cp",WALFilePath, xlogFilePath);
|
||||
SET_RESTORE_COMMAND("cp", WALFilePath, xlogFilePath);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This code assumes that archiveLocation is a directory
|
||||
* You may wish to add code to check for tape libraries, etc..
|
||||
* So, since it is a directory, we use stat to test if its accessible
|
||||
* This code assumes that archiveLocation is a directory You may wish to
|
||||
* add code to check for tape libraries, etc.. So, since it is a
|
||||
* directory, we use stat to test if its accessible
|
||||
*/
|
||||
if (stat(archiveLocation, &stat_buf) != 0)
|
||||
{
|
||||
fprintf(stderr, "pg_standby: archiveLocation \"%s\" does not exist\n", archiveLocation);
|
||||
fprintf(stderr, "pg_standby: archiveLocation \"%s\" does not exist\n", archiveLocation);
|
||||
fflush(stderr);
|
||||
exit(2);
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* CustomizableNextWALFileReady()
|
||||
*
|
||||
*
|
||||
* Is the requested file ready yet?
|
||||
*/
|
||||
static bool
|
||||
static bool
|
||||
CustomizableNextWALFileReady()
|
||||
{
|
||||
if (stat(WALFilePath, &stat_buf) == 0)
|
||||
{
|
||||
/*
|
||||
* If its a backup file, return immediately
|
||||
* If its a regular file return only if its the right size already
|
||||
* If its a backup file, return immediately If its a regular file
|
||||
* return only if its the right size already
|
||||
*/
|
||||
if (strlen(nextWALFileName) > 24 &&
|
||||
strspn(nextWALFileName, "0123456789ABCDEF") == 24 &&
|
||||
strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".backup"),
|
||||
".backup") == 0)
|
||||
strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".backup"),
|
||||
".backup") == 0)
|
||||
{
|
||||
nextWALFileType = XLOG_BACKUP_LABEL;
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (stat_buf.st_size == XLOG_SEG_SIZE)
|
||||
{
|
||||
else if (stat_buf.st_size == XLOG_SEG_SIZE)
|
||||
{
|
||||
#ifdef WIN32
|
||||
/*
|
||||
* Windows reports that the file has the right number of bytes
|
||||
* even though the file is still being copied and cannot be
|
||||
* opened by pg_standby yet. So we wait for sleeptime secs
|
||||
* before attempting to restore. If that is not enough, we
|
||||
* will rely on the retry/holdoff mechanism.
|
||||
*/
|
||||
pg_usleep(sleeptime * 1000000L);
|
||||
|
||||
/*
|
||||
* Windows reports that the file has the right number of bytes
|
||||
* even though the file is still being copied and cannot be opened
|
||||
* by pg_standby yet. So we wait for sleeptime secs before
|
||||
* attempting to restore. If that is not enough, we will rely on
|
||||
* the retry/holdoff mechanism.
|
||||
*/
|
||||
pg_usleep(sleeptime * 1000000L);
|
||||
#endif
|
||||
nextWALFileType = XLOG_DATA;
|
||||
return true;
|
||||
}
|
||||
nextWALFileType = XLOG_DATA;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* If still too small, wait until it is the correct size
|
||||
@ -192,10 +194,10 @@ CustomizableNextWALFileReady()
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
fprintf(stderr, "file size greater than expected\n");
|
||||
fprintf(stderr, "file size greater than expected\n");
|
||||
fflush(stderr);
|
||||
}
|
||||
exit(3);
|
||||
exit(3);
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,35 +214,36 @@ CustomizableCleanupPriorWALFiles(void)
|
||||
*/
|
||||
if (nextWALFileType == XLOG_DATA)
|
||||
{
|
||||
int rc;
|
||||
DIR *xldir;
|
||||
struct dirent *xlde;
|
||||
int rc;
|
||||
DIR *xldir;
|
||||
struct dirent *xlde;
|
||||
|
||||
/*
|
||||
* Assume its OK to keep failing. The failure situation may change over
|
||||
* time, so we'd rather keep going on the main processing than fail
|
||||
* because we couldnt clean up yet.
|
||||
* Assume its OK to keep failing. The failure situation may change
|
||||
* over time, so we'd rather keep going on the main processing than
|
||||
* fail because we couldnt clean up yet.
|
||||
*/
|
||||
if ((xldir = opendir(archiveLocation)) != NULL)
|
||||
{
|
||||
while ((xlde = readdir(xldir)) != NULL)
|
||||
{
|
||||
/*
|
||||
* We ignore the timeline part of the XLOG segment identifiers in
|
||||
* deciding whether a segment is still needed. This ensures that we
|
||||
* won't prematurely remove a segment from a parent timeline. We could
|
||||
* probably be a little more proactive about removing segments of
|
||||
* non-parent timelines, but that would be a whole lot more
|
||||
* complicated.
|
||||
* We ignore the timeline part of the XLOG segment identifiers
|
||||
* in deciding whether a segment is still needed. This
|
||||
* ensures that we won't prematurely remove a segment from a
|
||||
* parent timeline. We could probably be a little more
|
||||
* proactive about removing segments of non-parent timelines,
|
||||
* but that would be a whole lot more complicated.
|
||||
*
|
||||
* We use the alphanumeric sorting property of the filenames to decide
|
||||
* which ones are earlier than the exclusiveCleanupFileName file.
|
||||
* Note that this means files are not removed in the order they were
|
||||
* originally written, in case this worries you.
|
||||
* We use the alphanumeric sorting property of the filenames
|
||||
* to decide which ones are earlier than the
|
||||
* exclusiveCleanupFileName file. Note that this means files
|
||||
* are not removed in the order they were originally written,
|
||||
* in case this worries you.
|
||||
*/
|
||||
if (strlen(xlde->d_name) == XLOG_DATA_FNAME_LEN &&
|
||||
strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
|
||||
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
|
||||
strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
|
||||
{
|
||||
#ifdef WIN32
|
||||
snprintf(WALFilePath, MAXPGPATH, "%s\\%s", archiveLocation, xlde->d_name);
|
||||
@ -249,7 +252,7 @@ CustomizableCleanupPriorWALFiles(void)
|
||||
#endif
|
||||
|
||||
if (debug)
|
||||
fprintf(stderr, "\nremoving \"%s\"", WALFilePath);
|
||||
fprintf(stderr, "\nremoving \"%s\"", WALFilePath);
|
||||
|
||||
rc = unlink(WALFilePath);
|
||||
if (rc != 0)
|
||||
@ -264,7 +267,7 @@ CustomizableCleanupPriorWALFiles(void)
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "pg_standby: archiveLocation \"%s\" open error\n", archiveLocation);
|
||||
fprintf(stderr, "pg_standby: archiveLocation \"%s\" open error\n", archiveLocation);
|
||||
|
||||
closedir(xldir);
|
||||
fflush(stderr);
|
||||
@ -278,19 +281,19 @@ CustomizableCleanupPriorWALFiles(void)
|
||||
|
||||
/*
|
||||
* SetWALFileNameForCleanup()
|
||||
*
|
||||
*
|
||||
* Set the earliest WAL filename that we want to keep on the archive
|
||||
* and decide whether we need_cleanup
|
||||
* and decide whether we need_cleanup
|
||||
*/
|
||||
static bool
|
||||
SetWALFileNameForCleanup(void)
|
||||
{
|
||||
uint32 tli = 1,
|
||||
log = 0,
|
||||
seg = 0;
|
||||
uint32 log_diff = 0,
|
||||
seg_diff = 0;
|
||||
bool cleanup = false;
|
||||
uint32 tli = 1,
|
||||
log = 0,
|
||||
seg = 0;
|
||||
uint32 log_diff = 0,
|
||||
seg_diff = 0;
|
||||
bool cleanup = false;
|
||||
|
||||
if (restartWALFileName)
|
||||
{
|
||||
@ -305,7 +308,7 @@ SetWALFileNameForCleanup(void)
|
||||
{
|
||||
log_diff = keepfiles / MaxSegmentsPerLogFile;
|
||||
seg_diff = keepfiles % MaxSegmentsPerLogFile;
|
||||
if (seg_diff > seg)
|
||||
if (seg_diff > seg)
|
||||
{
|
||||
log_diff++;
|
||||
seg = MaxSegmentsPerLogFile - seg_diff;
|
||||
@ -333,31 +336,30 @@ SetWALFileNameForCleanup(void)
|
||||
|
||||
/*
|
||||
* CheckForExternalTrigger()
|
||||
*
|
||||
*
|
||||
* Is there a trigger file?
|
||||
*/
|
||||
static bool
|
||||
static bool
|
||||
CheckForExternalTrigger(void)
|
||||
{
|
||||
int rc;
|
||||
int rc;
|
||||
|
||||
/*
|
||||
* Look for a trigger file, if that option has been selected
|
||||
* Look for a trigger file, if that option has been selected
|
||||
*
|
||||
* We use stat() here because triggerPath is always a file
|
||||
* rather than potentially being in an archive
|
||||
* We use stat() here because triggerPath is always a file rather than
|
||||
* potentially being in an archive
|
||||
*/
|
||||
if (triggerPath && stat(triggerPath, &stat_buf) == 0)
|
||||
{
|
||||
fprintf(stderr, "trigger file found\n");
|
||||
fprintf(stderr, "trigger file found\n");
|
||||
fflush(stderr);
|
||||
|
||||
/*
|
||||
* If trigger file found, we *must* delete it. Here's why:
|
||||
* When recovery completes, we will be asked again
|
||||
* for the same file from the archive using pg_standby
|
||||
* so must remove trigger file so we can reload file again
|
||||
* and come up correctly.
|
||||
* If trigger file found, we *must* delete it. Here's why: When
|
||||
* recovery completes, we will be asked again for the same file from
|
||||
* the archive using pg_standby so must remove trigger file so we can
|
||||
* reload file again and come up correctly.
|
||||
*/
|
||||
rc = unlink(triggerPath);
|
||||
if (rc != 0)
|
||||
@ -374,14 +376,14 @@ CheckForExternalTrigger(void)
|
||||
|
||||
/*
|
||||
* RestoreWALFileForRecovery()
|
||||
*
|
||||
*
|
||||
* Perform the action required to restore the file from archive
|
||||
*/
|
||||
static bool
|
||||
RestoreWALFileForRecovery(void)
|
||||
{
|
||||
int rc = 0;
|
||||
int numretries = 0;
|
||||
int rc = 0;
|
||||
int numretries = 0;
|
||||
|
||||
if (debug)
|
||||
{
|
||||
@ -401,7 +403,7 @@ RestoreWALFileForRecovery(void)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
pg_usleep(numretries++ * sleeptime * 1000000L);
|
||||
pg_usleep(numretries++ * sleeptime * 1000000L);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -441,13 +443,13 @@ sighandler(int sig)
|
||||
}
|
||||
|
||||
/*------------ MAIN ----------------------------------------*/
|
||||
int
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
|
||||
(void) signal(SIGINT, sighandler);
|
||||
(void) signal(SIGQUIT, sighandler);
|
||||
(void) signal(SIGINT, sighandler);
|
||||
(void) signal(SIGQUIT, sighandler);
|
||||
|
||||
while ((c = getopt(argc, argv, "cdk:lr:s:t:w:")) != -1)
|
||||
{
|
||||
@ -492,8 +494,8 @@ main(int argc, char **argv)
|
||||
case 't': /* Trigger file */
|
||||
triggerPath = optarg;
|
||||
if (CheckForExternalTrigger())
|
||||
exit(1); /* Normal exit, with non-zero */
|
||||
break;
|
||||
exit(1); /* Normal exit, with non-zero */
|
||||
break;
|
||||
case 'w': /* Max wait time */
|
||||
maxwaittime = atoi(optarg);
|
||||
if (maxwaittime < 0)
|
||||
@ -510,7 +512,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Parameter checking - after checking to see if trigger file present
|
||||
*/
|
||||
if (argc == 1)
|
||||
@ -521,8 +523,8 @@ main(int argc, char **argv)
|
||||
|
||||
/*
|
||||
* We will go to the archiveLocation to get nextWALFileName.
|
||||
* nextWALFileName may not exist yet, which would not be an error,
|
||||
* so we separate the archiveLocation and nextWALFileName so we can check
|
||||
* nextWALFileName may not exist yet, which would not be an error, so we
|
||||
* separate the archiveLocation and nextWALFileName so we can check
|
||||
* separately whether archiveLocation exists, if not that is an error
|
||||
*/
|
||||
if (optind < argc)
|
||||
@ -532,7 +534,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "pg_standby: must specify archiveLocation\n");
|
||||
fprintf(stderr, "pg_standby: must specify archiveLocation\n");
|
||||
usage();
|
||||
exit(2);
|
||||
}
|
||||
@ -544,7 +546,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "pg_standby: use %%f to specify nextWALFileName\n");
|
||||
fprintf(stderr, "pg_standby: use %%f to specify nextWALFileName\n");
|
||||
usage();
|
||||
exit(2);
|
||||
}
|
||||
@ -556,7 +558,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "pg_standby: use %%p to specify xlogFilePath\n");
|
||||
fprintf(stderr, "pg_standby: use %%p to specify xlogFilePath\n");
|
||||
usage();
|
||||
exit(2);
|
||||
}
|
||||
@ -573,14 +575,14 @@ main(int argc, char **argv)
|
||||
|
||||
if (debug)
|
||||
{
|
||||
fprintf(stderr, "\nTrigger file : %s", triggerPath ? triggerPath : "<not set>");
|
||||
fprintf(stderr, "\nWaiting for WAL file : %s", nextWALFileName);
|
||||
fprintf(stderr, "\nWAL file path : %s", WALFilePath);
|
||||
fprintf(stderr, "\nRestoring to... : %s", xlogFilePath);
|
||||
fprintf(stderr, "\nSleep interval : %d second%s",
|
||||
sleeptime, (sleeptime > 1 ? "s" : " "));
|
||||
fprintf(stderr, "\nMax wait interval : %d %s",
|
||||
maxwaittime, (maxwaittime > 0 ? "seconds" : "forever"));
|
||||
fprintf(stderr, "\nTrigger file : %s", triggerPath ? triggerPath : "<not set>");
|
||||
fprintf(stderr, "\nWaiting for WAL file : %s", nextWALFileName);
|
||||
fprintf(stderr, "\nWAL file path : %s", WALFilePath);
|
||||
fprintf(stderr, "\nRestoring to... : %s", xlogFilePath);
|
||||
fprintf(stderr, "\nSleep interval : %d second%s",
|
||||
sleeptime, (sleeptime > 1 ? "s" : " "));
|
||||
fprintf(stderr, "\nMax wait interval : %d %s",
|
||||
maxwaittime, (maxwaittime > 0 ? "seconds" : "forever"));
|
||||
fprintf(stderr, "\nCommand for restore : %s", restoreCommand);
|
||||
fprintf(stderr, "\nKeep archive history : %s and later", exclusiveCleanupFileName);
|
||||
fflush(stderr);
|
||||
@ -609,20 +611,20 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Main wait loop
|
||||
*/
|
||||
while (!CustomizableNextWALFileReady() && !triggered)
|
||||
{
|
||||
if (sleeptime <= 60)
|
||||
pg_usleep(sleeptime * 1000000L);
|
||||
pg_usleep(sleeptime * 1000000L);
|
||||
|
||||
if (signaled)
|
||||
{
|
||||
triggered = true;
|
||||
if (debug)
|
||||
{
|
||||
fprintf(stderr, "\nsignaled to exit\n");
|
||||
fprintf(stderr, "\nsignaled to exit\n");
|
||||
fflush(stderr);
|
||||
}
|
||||
}
|
||||
@ -631,36 +633,34 @@ main(int argc, char **argv)
|
||||
|
||||
if (debug)
|
||||
{
|
||||
fprintf(stderr, "\nWAL file not present yet.");
|
||||
fprintf(stderr, "\nWAL file not present yet.");
|
||||
if (triggerPath)
|
||||
fprintf(stderr, " Checking for trigger file...");
|
||||
fprintf(stderr, " Checking for trigger file...");
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
waittime += sleeptime;
|
||||
|
||||
|
||||
if (!triggered && (CheckForExternalTrigger() || (waittime >= maxwaittime && maxwaittime > 0)))
|
||||
{
|
||||
triggered = true;
|
||||
if (debug && waittime >= maxwaittime && maxwaittime > 0)
|
||||
fprintf(stderr, "\nTimed out after %d seconds\n",waittime);
|
||||
fprintf(stderr, "\nTimed out after %d seconds\n", waittime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Action on exit
|
||||
/*
|
||||
* Action on exit
|
||||
*/
|
||||
if (triggered)
|
||||
exit(1); /* Normal exit, with non-zero */
|
||||
exit(1); /* Normal exit, with non-zero */
|
||||
|
||||
/*
|
||||
* Once we have restored this file successfully we
|
||||
* can remove some prior WAL files.
|
||||
* If this restore fails we musn't remove any
|
||||
* file because some of them will be requested again
|
||||
* immediately after the failed restore, or when
|
||||
* we restart recovery.
|
||||
/*
|
||||
* Once we have restored this file successfully we can remove some prior
|
||||
* WAL files. If this restore fails we musn't remove any file because some
|
||||
* of them will be requested again immediately after the failed restore,
|
||||
* or when we restart recovery.
|
||||
*/
|
||||
if (RestoreWALFileForRecovery() && need_cleanup)
|
||||
CustomizableCleanupPriorWALFiles();
|
||||
|
@ -16,23 +16,23 @@ Datum gin_trgm_consistent(PG_FUNCTION_ARGS);
|
||||
Datum
|
||||
gin_extract_trgm(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *val = (text *) PG_GETARG_TEXT_P(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
TRGM *trg;
|
||||
text *val = (text *) PG_GETARG_TEXT_P(0);
|
||||
int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
|
||||
Datum *entries = NULL;
|
||||
TRGM *trg;
|
||||
int4 trglen;
|
||||
|
||||
|
||||
*nentries = 0;
|
||||
|
||||
|
||||
trg = generate_trgm(VARDATA(val), VARSIZE(val) - VARHDRSZ);
|
||||
trglen = ARRNELEM(trg);
|
||||
|
||||
|
||||
if (trglen > 0)
|
||||
{
|
||||
trgm *ptr;
|
||||
int4 i = 0,
|
||||
item;
|
||||
|
||||
trgm *ptr;
|
||||
int4 i = 0,
|
||||
item;
|
||||
|
||||
*nentries = (int32) trglen;
|
||||
entries = (Datum *) palloc(sizeof(Datum) * trglen);
|
||||
|
||||
@ -41,7 +41,7 @@ gin_extract_trgm(PG_FUNCTION_ARGS)
|
||||
{
|
||||
item = TRGMINT(ptr);
|
||||
entries[i++] = Int32GetDatum(item);
|
||||
|
||||
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
@ -52,20 +52,20 @@ gin_extract_trgm(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
gin_trgm_consistent(PG_FUNCTION_ARGS)
|
||||
{
|
||||
bool *check = (bool *) PG_GETARG_POINTER(0);
|
||||
text *query = (text *) PG_GETARG_TEXT_P(2);
|
||||
bool *check = (bool *) PG_GETARG_POINTER(0);
|
||||
text *query = (text *) PG_GETARG_TEXT_P(2);
|
||||
bool res = FALSE;
|
||||
TRGM *trg;
|
||||
TRGM *trg;
|
||||
int4 i,
|
||||
trglen,
|
||||
ntrue = 0;
|
||||
|
||||
|
||||
trg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ);
|
||||
trglen = ARRNELEM(trg);
|
||||
|
||||
|
||||
for (i = 0; i < trglen; i++)
|
||||
if (check[i])
|
||||
ntrue ++;
|
||||
ntrue++;
|
||||
|
||||
#ifdef DIVUNION
|
||||
res = (trglen == ntrue) ? true : ((((((float4) ntrue) / ((float4) (trglen - ntrue)))) >= trgm_limit) ? true : false);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.73 2007/10/22 10:40:47 mha Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.74 2007/11/15 21:14:31 momjian Exp $
|
||||
*
|
||||
* pgbench: a simple benchmark program for PostgreSQL
|
||||
* written by Tatsuo Ishii
|
||||
@ -53,9 +53,9 @@ extern int optind;
|
||||
|
||||
/* max number of clients allowed */
|
||||
#ifdef FD_SETSIZE
|
||||
#define MAXCLIENTS (FD_SETSIZE - 10)
|
||||
#define MAXCLIENTS (FD_SETSIZE - 10)
|
||||
#else
|
||||
#define MAXCLIENTS 1024
|
||||
#define MAXCLIENTS 1024
|
||||
#endif
|
||||
|
||||
int nclients = 1; /* default number of simulated clients */
|
||||
@ -201,7 +201,7 @@ getrand(int min, int max)
|
||||
|
||||
/* call PQexec() and exit() on failure */
|
||||
static void
|
||||
executeStatement(PGconn *con, const char* sql)
|
||||
executeStatement(PGconn *con, const char *sql)
|
||||
{
|
||||
PGresult *res;
|
||||
|
||||
@ -262,7 +262,7 @@ discard_response(CState * state)
|
||||
|
||||
/* check to see if the SQL result was good */
|
||||
static int
|
||||
check(CState *state, PGresult *res, int n)
|
||||
check(CState * state, PGresult *res, int n)
|
||||
{
|
||||
CState *st = &state[n];
|
||||
|
||||
@ -275,7 +275,7 @@ check(CState *state, PGresult *res, int n)
|
||||
default:
|
||||
fprintf(stderr, "Client %d aborted in state %d: %s",
|
||||
n, st->state, PQerrorMessage(st->con));
|
||||
remains--; /* I've aborted */
|
||||
remains--; /* I've aborted */
|
||||
PQfinish(st->con);
|
||||
st->con = NULL;
|
||||
return (-1);
|
||||
@ -452,12 +452,12 @@ top:
|
||||
|
||||
if (st->sleeping)
|
||||
{ /* are we sleeping? */
|
||||
int usec;
|
||||
struct timeval now;
|
||||
int usec;
|
||||
struct timeval now;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
usec = (st->until.tv_sec - now.tv_sec) * 1000000 +
|
||||
st->until.tv_usec - now.tv_usec;
|
||||
st->until.tv_usec - now.tv_usec;
|
||||
if (usec <= 0)
|
||||
st->sleeping = 0; /* Done sleeping, go ahead with next command */
|
||||
else
|
||||
@ -798,11 +798,11 @@ init(void)
|
||||
"drop table if exists accounts",
|
||||
"create table accounts(aid int not null,bid int,abalance int,filler char(84)) with (fillfactor=%d)",
|
||||
"drop table if exists history",
|
||||
"create table history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))"};
|
||||
"create table history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))"};
|
||||
static char *DDLAFTERs[] = {
|
||||
"alter table branches add primary key (bid)",
|
||||
"alter table tellers add primary key (tid)",
|
||||
"alter table accounts add primary key (aid)"};
|
||||
"alter table accounts add primary key (aid)"};
|
||||
|
||||
|
||||
char sql[256];
|
||||
@ -821,7 +821,8 @@ init(void)
|
||||
(strstr(DDLs[i], "create table tellers") == DDLs[i]) ||
|
||||
(strstr(DDLs[i], "create table accounts") == DDLs[i]))
|
||||
{
|
||||
char ddl_stmt[128];
|
||||
char ddl_stmt[128];
|
||||
|
||||
snprintf(ddl_stmt, 128, DDLs[i], fillfactor);
|
||||
executeStatement(con, ddl_stmt);
|
||||
continue;
|
||||
@ -990,7 +991,7 @@ process_commands(char *buf)
|
||||
pg_strcasecmp(my_commands->argv[2], "ms") != 0 &&
|
||||
pg_strcasecmp(my_commands->argv[2], "s"))
|
||||
{
|
||||
fprintf(stderr, "%s: unknown time unit '%s' - must be us, ms or s\n",
|
||||
fprintf(stderr, "%s: unknown time unit '%s' - must be us, ms or s\n",
|
||||
my_commands->argv[0], my_commands->argv[2]);
|
||||
return NULL;
|
||||
}
|
||||
@ -1204,7 +1205,7 @@ main(int argc, char **argv)
|
||||
int c;
|
||||
int is_init_mode = 0; /* initialize mode? */
|
||||
int is_no_vacuum = 0; /* no vacuum at all before testing? */
|
||||
int do_vacuum_accounts = 0; /* do vacuum accounts before testing? */
|
||||
int do_vacuum_accounts = 0; /* do vacuum accounts before testing? */
|
||||
int debug = 0; /* debug flag */
|
||||
int ttype = 0; /* transaction type. 0: TPC-B, 1: SELECT only,
|
||||
* 2: skip update of branches and tellers */
|
||||
@ -1308,7 +1309,7 @@ main(int argc, char **argv)
|
||||
fprintf(stderr, "Use limit/ulimit to increase the limit before using pgbench.\n");
|
||||
exit(1);
|
||||
}
|
||||
#endif /* HAVE_GETRLIMIT */
|
||||
#endif /* HAVE_GETRLIMIT */
|
||||
break;
|
||||
case 'C':
|
||||
is_connect = 1;
|
||||
@ -1615,8 +1616,8 @@ main(int argc, char **argv)
|
||||
|
||||
if (state[i].sleeping)
|
||||
{
|
||||
int this_usec;
|
||||
int sock = PQsocket(state[i].con);
|
||||
int this_usec;
|
||||
int sock = PQsocket(state[i].con);
|
||||
|
||||
if (min_usec < 0)
|
||||
{
|
||||
@ -1625,7 +1626,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
this_usec = (state[i].until.tv_sec - now.tv_sec) * 1000000 +
|
||||
state[i].until.tv_usec - now.tv_usec;
|
||||
state[i].until.tv_usec - now.tv_usec;
|
||||
|
||||
if (this_usec > 0 && (min_usec == 0 || this_usec < min_usec))
|
||||
min_usec = this_usec;
|
||||
@ -1657,11 +1658,11 @@ main(int argc, char **argv)
|
||||
timeout.tv_usec = min_usec % 1000000;
|
||||
|
||||
nsocks = select(maxsock + 1, &input_mask, (fd_set *) NULL,
|
||||
(fd_set *) NULL, &timeout);
|
||||
(fd_set *) NULL, &timeout);
|
||||
}
|
||||
else
|
||||
nsocks = select(maxsock + 1, &input_mask, (fd_set *) NULL,
|
||||
(fd_set *) NULL, (struct timeval *) NULL);
|
||||
(fd_set *) NULL, (struct timeval *) NULL);
|
||||
if (nsocks < 0)
|
||||
{
|
||||
if (errno == EINTR)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Butchered version of sshblowf.c from putty-0.59.
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/blf.c,v 1.8 2007/03/28 22:48:58 neilc Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/blf.c,v 1.9 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -251,7 +251,7 @@ static const uint32 sbox3[] = {
|
||||
|
||||
static void
|
||||
blowfish_encrypt(uint32 xL, uint32 xR, uint32 *output,
|
||||
BlowfishContext *ctx)
|
||||
BlowfishContext * ctx)
|
||||
{
|
||||
uint32 *S0 = ctx->S0;
|
||||
uint32 *S1 = ctx->S1;
|
||||
@ -285,7 +285,7 @@ blowfish_encrypt(uint32 xL, uint32 xR, uint32 *output,
|
||||
|
||||
static void
|
||||
blowfish_decrypt(uint32 xL, uint32 xR, uint32 *output,
|
||||
BlowfishContext *ctx)
|
||||
BlowfishContext * ctx)
|
||||
{
|
||||
uint32 *S0 = ctx->S0;
|
||||
uint32 *S1 = ctx->S1;
|
||||
@ -318,7 +318,7 @@ blowfish_decrypt(uint32 xL, uint32 xR, uint32 *output,
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_encrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
blowfish_encrypt_cbc(uint8 *blk, int len, BlowfishContext * ctx)
|
||||
{
|
||||
uint32 xL,
|
||||
xR,
|
||||
@ -351,7 +351,7 @@ blowfish_encrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_decrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
blowfish_decrypt_cbc(uint8 *blk, int len, BlowfishContext * ctx)
|
||||
{
|
||||
uint32 xL,
|
||||
xR,
|
||||
@ -384,7 +384,7 @@ blowfish_decrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_encrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
blowfish_encrypt_ecb(uint8 *blk, int len, BlowfishContext * ctx)
|
||||
{
|
||||
uint32 xL,
|
||||
xR,
|
||||
@ -405,7 +405,7 @@ blowfish_encrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_decrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
blowfish_decrypt_ecb(uint8 *blk, int len, BlowfishContext * ctx)
|
||||
{
|
||||
uint32 xL,
|
||||
xR,
|
||||
@ -426,7 +426,7 @@ blowfish_decrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx)
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_setkey(BlowfishContext *ctx,
|
||||
blowfish_setkey(BlowfishContext * ctx,
|
||||
const uint8 *key, short keybytes)
|
||||
{
|
||||
uint32 *S0 = ctx->S0;
|
||||
@ -437,7 +437,7 @@ blowfish_setkey(BlowfishContext *ctx,
|
||||
uint32 str[2];
|
||||
int i;
|
||||
|
||||
Assert(keybytes > 0 && keybytes <= (448/8));
|
||||
Assert(keybytes > 0 && keybytes <= (448 / 8));
|
||||
|
||||
for (i = 0; i < 18; i++)
|
||||
{
|
||||
@ -492,9 +492,8 @@ blowfish_setkey(BlowfishContext *ctx,
|
||||
}
|
||||
|
||||
void
|
||||
blowfish_setiv(BlowfishContext *ctx, const uint8 *iv)
|
||||
blowfish_setiv(BlowfishContext * ctx, const uint8 *iv)
|
||||
{
|
||||
ctx->iv0 = GET_32BIT_MSB_FIRST(iv);
|
||||
ctx->iv1 = GET_32BIT_MSB_FIRST(iv + 4);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $PostgreSQL: pgsql/contrib/pgcrypto/blf.h,v 1.6 2007/03/28 22:48:58 neilc Exp $ */
|
||||
/* $PostgreSQL: pgsql/contrib/pgcrypto/blf.h,v 1.7 2007/11/15 21:14:31 momjian Exp $ */
|
||||
/*
|
||||
* PuTTY is copyright 1997-2007 Simon Tatham.
|
||||
*
|
||||
@ -35,14 +35,12 @@ typedef struct
|
||||
S3[256],
|
||||
P[18];
|
||||
uint32 iv0,
|
||||
iv1; /* for CBC mode */
|
||||
} BlowfishContext;
|
||||
|
||||
void blowfish_setkey(BlowfishContext *ctx, const uint8 *key, short keybytes);
|
||||
void blowfish_setiv(BlowfishContext *ctx, const uint8 *iv);
|
||||
void blowfish_encrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx);
|
||||
void blowfish_decrypt_cbc(uint8 *blk, int len, BlowfishContext *ctx);
|
||||
void blowfish_encrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx);
|
||||
void blowfish_decrypt_ecb(uint8 *blk, int len, BlowfishContext *ctx);
|
||||
|
||||
iv1; /* for CBC mode */
|
||||
} BlowfishContext;
|
||||
|
||||
void blowfish_setkey(BlowfishContext * ctx, const uint8 *key, short keybytes);
|
||||
void blowfish_setiv(BlowfishContext * ctx, const uint8 *iv);
|
||||
void blowfish_encrypt_cbc(uint8 *blk, int len, BlowfishContext * ctx);
|
||||
void blowfish_decrypt_cbc(uint8 *blk, int len, BlowfishContext * ctx);
|
||||
void blowfish_encrypt_ecb(uint8 *blk, int len, BlowfishContext * ctx);
|
||||
void blowfish_decrypt_ecb(uint8 *blk, int len, BlowfishContext * ctx);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/crypt-blowfish.c,v 1.12 2007/04/06 05:36:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/crypt-blowfish.c,v 1.13 2007/11/15 21:14:31 momjian Exp $
|
||||
*
|
||||
* This code comes from John the Ripper password cracker, with reentrant
|
||||
* and crypt(3) interfaces added, but optimizations specific to password
|
||||
@ -436,7 +436,7 @@ BF_encode(char *dst, const BF_word * src, int size)
|
||||
}
|
||||
|
||||
static void
|
||||
BF_swap(BF_word *x, int count)
|
||||
BF_swap(BF_word * x, int count)
|
||||
{
|
||||
/* Swap on little-endian hardware, else do nothing */
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
|
@ -26,7 +26,7 @@
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.h,v 1.5 2006/10/04 00:29:46 momjian Exp $ */
|
||||
/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.h,v 1.6 2007/11/15 21:14:31 momjian Exp $ */
|
||||
|
||||
#ifndef IMATH_H_
|
||||
#define IMATH_H_
|
||||
@ -115,11 +115,12 @@ mp_result mp_int_mul(mp_int a, mp_int b, mp_int c); /* c = a * b */
|
||||
mp_result mp_int_mul_value(mp_int a, int value, mp_int c);
|
||||
mp_result mp_int_mul_pow2(mp_int a, int p2, mp_int c);
|
||||
mp_result mp_int_sqr(mp_int a, mp_int c); /* c = a * a */
|
||||
|
||||
mp_result
|
||||
mp_int_div(mp_int a, mp_int b, /* q = a / b */
|
||||
mp_int_div(mp_int a, mp_int b, /* q = a / b */
|
||||
mp_int q, mp_int r); /* r = a % b */
|
||||
mp_result
|
||||
mp_int_div_value(mp_int a, int value, /* q = a / value */
|
||||
mp_int_div_value(mp_int a, int value, /* q = a / value */
|
||||
mp_int q, int *r); /* r = a % value */
|
||||
mp_result
|
||||
mp_int_div_pow2(mp_int a, int p2, /* q = a / 2^p2 */
|
||||
|
@ -26,7 +26,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/internal.c,v 1.26 2007/03/28 22:48:58 neilc Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/internal.c,v 1.27 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
@ -251,7 +251,7 @@ struct int_ctx
|
||||
uint8 iv[INT_MAX_IV];
|
||||
union
|
||||
{
|
||||
BlowfishContext bf;
|
||||
BlowfishContext bf;
|
||||
rijndael_ctx rj;
|
||||
} ctx;
|
||||
unsigned keylen;
|
||||
@ -426,7 +426,7 @@ bf_block_size(PX_Cipher * c)
|
||||
static unsigned
|
||||
bf_key_size(PX_Cipher * c)
|
||||
{
|
||||
return 448/8;
|
||||
return 448 / 8;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
|
@ -26,7 +26,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.31 2007/09/29 02:18:15 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.32 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
@ -98,10 +98,13 @@ static void
|
||||
AES_cbc_encrypt(const uint8 *src, uint8 *dst, int len, AES_KEY *ctx, uint8 *iv, int enc)
|
||||
{
|
||||
memcpy(dst, src, len);
|
||||
if (enc) {
|
||||
if (enc)
|
||||
{
|
||||
aes_cbc_encrypt(ctx, iv, dst, len);
|
||||
memcpy(iv, dst + len - 16, 16);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
aes_cbc_decrypt(ctx, iv, dst, len);
|
||||
memcpy(iv, src + len - 16, 16);
|
||||
}
|
||||
@ -394,26 +397,27 @@ static int
|
||||
bf_check_supported_key_len(void)
|
||||
{
|
||||
static const uint8 key[56] = {
|
||||
0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87,0x78,0x69,
|
||||
0x5a,0x4b,0x3c,0x2d,0x1e,0x0f,0x00,0x11,0x22,0x33,
|
||||
0x44,0x55,0x66,0x77,0x04,0x68,0x91,0x04,0xc2,0xfd,
|
||||
0x3b,0x2f,0x58,0x40,0x23,0x64,0x1a,0xba,0x61,0x76,
|
||||
0x1f,0x1f,0x1f,0x1f,0x0e,0x0e,0x0e,0x0e,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff
|
||||
0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87, 0x78, 0x69,
|
||||
0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f, 0x00, 0x11, 0x22, 0x33,
|
||||
0x44, 0x55, 0x66, 0x77, 0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd,
|
||||
0x3b, 0x2f, 0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
|
||||
static const uint8 data[8] = {0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
|
||||
static const uint8 res[8] = {0xc0,0x45,0x04,0x01,0x2e,0x4e,0x1f,0x53};
|
||||
static const uint8 data[8] = {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
|
||||
static const uint8 res[8] = {0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53};
|
||||
static uint8 out[8];
|
||||
|
||||
BF_KEY bf_key;
|
||||
BF_KEY bf_key;
|
||||
|
||||
/* encrypt with 448bits key and verify output */
|
||||
BF_set_key(&bf_key, 56, key);
|
||||
BF_ecb_encrypt(data, out, &bf_key, BF_ENCRYPT);
|
||||
|
||||
if (memcmp(out, res, 8) != 0)
|
||||
return 0; /* Output does not match -> strong cipher is not supported */
|
||||
if (memcmp(out, res, 8) != 0)
|
||||
return 0; /* Output does not match -> strong cipher is
|
||||
* not supported */
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -421,18 +425,19 @@ static int
|
||||
bf_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv)
|
||||
{
|
||||
ossldata *od = c->ptr;
|
||||
static int bf_is_strong = -1;
|
||||
static int bf_is_strong = -1;
|
||||
|
||||
/*
|
||||
* Test if key len is supported. BF_set_key silently cut large keys and it could be
|
||||
* be a problem when user transfer crypted data from one server to another.
|
||||
* Test if key len is supported. BF_set_key silently cut large keys and it
|
||||
* could be be a problem when user transfer crypted data from one server
|
||||
* to another.
|
||||
*/
|
||||
|
||||
if( bf_is_strong == -1)
|
||||
|
||||
if (bf_is_strong == -1)
|
||||
bf_is_strong = bf_check_supported_key_len();
|
||||
|
||||
if( !bf_is_strong && klen>16 )
|
||||
return PXE_KEY_TOO_BIG;
|
||||
if (!bf_is_strong && klen > 16)
|
||||
return PXE_KEY_TOO_BIG;
|
||||
|
||||
/* Key len is supported. We can use it. */
|
||||
BF_set_key(&od->u.bf.key, klen, key);
|
||||
@ -750,13 +755,14 @@ ossl_aes_init(PX_Cipher * c, const uint8 *key, unsigned klen, const uint8 *iv)
|
||||
static int
|
||||
ossl_aes_key_init(ossldata * od, int type)
|
||||
{
|
||||
int err;
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Strong key support could be missing on some openssl installations.
|
||||
* We must check return value from set key function.
|
||||
*/
|
||||
* Strong key support could be missing on some openssl installations. We
|
||||
* must check return value from set key function.
|
||||
*/
|
||||
if (type == AES_ENCRYPT)
|
||||
err = AES_set_encrypt_key(od->key, od->klen * 8, &od->u.aes_key);
|
||||
err = AES_set_encrypt_key(od->key, od->klen * 8, &od->u.aes_key);
|
||||
else
|
||||
err = AES_set_decrypt_key(od->key, od->klen * 8, &od->u.aes_key);
|
||||
|
||||
@ -776,7 +782,7 @@ ossl_aes_ecb_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
|
||||
unsigned bs = gen_ossl_block_size(c);
|
||||
ossldata *od = c->ptr;
|
||||
const uint8 *end = data + dlen - bs;
|
||||
int err;
|
||||
int err;
|
||||
|
||||
if (!od->init)
|
||||
if ((err = ossl_aes_key_init(od, AES_ENCRYPT)) != 0)
|
||||
@ -794,7 +800,7 @@ ossl_aes_ecb_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
|
||||
unsigned bs = gen_ossl_block_size(c);
|
||||
ossldata *od = c->ptr;
|
||||
const uint8 *end = data + dlen - bs;
|
||||
int err;
|
||||
int err;
|
||||
|
||||
if (!od->init)
|
||||
if ((err = ossl_aes_key_init(od, AES_DECRYPT)) != 0)
|
||||
@ -810,12 +816,12 @@ ossl_aes_cbc_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
|
||||
uint8 *res)
|
||||
{
|
||||
ossldata *od = c->ptr;
|
||||
int err;
|
||||
int err;
|
||||
|
||||
if (!od->init)
|
||||
if ((err = ossl_aes_key_init(od, AES_ENCRYPT)) != 0)
|
||||
return err;
|
||||
|
||||
|
||||
AES_cbc_encrypt(data, res, dlen, &od->u.aes_key, od->iv, AES_ENCRYPT);
|
||||
return 0;
|
||||
}
|
||||
@ -825,7 +831,7 @@ ossl_aes_cbc_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen,
|
||||
uint8 *res)
|
||||
{
|
||||
ossldata *od = c->ptr;
|
||||
int err;
|
||||
int err;
|
||||
|
||||
if (!od->init)
|
||||
if ((err = ossl_aes_key_init(od, AES_DECRYPT)) != 0)
|
||||
|
@ -26,7 +26,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/pgp-compress.c,v 1.6 2007/01/14 20:55:14 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/pgp-compress.c,v 1.7 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
@ -312,7 +312,6 @@ pgp_decompress_filter(PullFilter ** res, PGP_Context * ctx, PullFilter * src)
|
||||
{
|
||||
return pullf_create(res, &decompress_filter, ctx, src);
|
||||
}
|
||||
|
||||
#else /* !HAVE_ZLIB */
|
||||
|
||||
int
|
||||
|
@ -26,7 +26,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/px.c,v 1.16 2007/08/23 16:15:51 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/px.c,v 1.17 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
@ -286,7 +286,7 @@ combo_decrypt(PX_Combo * cx, const uint8 *data, unsigned dlen,
|
||||
/* with padding, empty ciphertext is not allowed */
|
||||
if (cx->padding)
|
||||
return PXE_DECRYPT_FAILED;
|
||||
|
||||
|
||||
/* without padding, report empty result */
|
||||
*rlen = 0;
|
||||
return 0;
|
||||
|
@ -33,7 +33,7 @@
|
||||
*
|
||||
* $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/sha2.c,v 1.9 2007/04/06 05:36:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/pgcrypto/sha2.c,v 1.10 2007/11/15 21:14:31 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
@ -78,7 +78,7 @@
|
||||
(x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
|
||||
((tmp & 0x0000ffff0000ffffULL) << 16); \
|
||||
}
|
||||
#endif /* not bigendian */
|
||||
#endif /* not bigendian */
|
||||
|
||||
/*
|
||||
* Macro for incrementally adding the unsigned 64-bit integer n to the
|
||||
|
@ -159,16 +159,17 @@ pgstatindex(PG_FUNCTION_ARGS)
|
||||
|
||||
else if (P_ISLEAF(opaque))
|
||||
{
|
||||
int max_avail;
|
||||
max_avail = BLCKSZ - (BLCKSZ - ((PageHeader)page)->pd_special + SizeOfPageHeaderData);
|
||||
int max_avail;
|
||||
|
||||
max_avail = BLCKSZ - (BLCKSZ - ((PageHeader) page)->pd_special + SizeOfPageHeaderData);
|
||||
indexStat.max_avail += max_avail;
|
||||
indexStat.free_space += PageGetFreeSpace(page);
|
||||
|
||||
indexStat.leaf_pages++;
|
||||
|
||||
/*
|
||||
* If the next leaf is on an earlier block, it
|
||||
* means a fragmentation.
|
||||
* If the next leaf is on an earlier block, it means a
|
||||
* fragmentation.
|
||||
*/
|
||||
if (opaque->btpo_next != P_NONE && opaque->btpo_next < blkno)
|
||||
indexStat.fragments++;
|
||||
|
@ -552,8 +552,8 @@ crosstab(PG_FUNCTION_ARGS)
|
||||
xpstrdup(values[0], rowid);
|
||||
|
||||
/*
|
||||
* Check to see if the rowid is the same as that of the last
|
||||
* tuple sent -- if so, skip this tuple entirely
|
||||
* Check to see if the rowid is the same as that of the
|
||||
* last tuple sent -- if so, skip this tuple entirely
|
||||
*/
|
||||
if (!firstpass && xstreq(lastrowid, rowid))
|
||||
{
|
||||
@ -563,8 +563,8 @@ crosstab(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
/*
|
||||
* If rowid hasn't changed on us, continue building the
|
||||
* ouput tuple.
|
||||
* If rowid hasn't changed on us, continue building the ouput
|
||||
* tuple.
|
||||
*/
|
||||
if (xstreq(rowid, values[0]))
|
||||
{
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Copyright (c) 2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/test_parser/test_parser.c,v 1.1 2007/10/15 21:36:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/test_parser/test_parser.c,v 1.2 2007/11/15 21:14:31 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -22,40 +22,44 @@ PG_MODULE_MAGIC;
|
||||
*/
|
||||
|
||||
/* self-defined type */
|
||||
typedef struct {
|
||||
char * buffer; /* text to parse */
|
||||
int len; /* length of the text in buffer */
|
||||
int pos; /* position of the parser */
|
||||
} ParserState;
|
||||
typedef struct
|
||||
{
|
||||
char *buffer; /* text to parse */
|
||||
int len; /* length of the text in buffer */
|
||||
int pos; /* position of the parser */
|
||||
} ParserState;
|
||||
|
||||
/* copy-paste from wparser.h of tsearch2 */
|
||||
typedef struct {
|
||||
int lexid;
|
||||
char *alias;
|
||||
char *descr;
|
||||
} LexDescr;
|
||||
typedef struct
|
||||
{
|
||||
int lexid;
|
||||
char *alias;
|
||||
char *descr;
|
||||
} LexDescr;
|
||||
|
||||
/*
|
||||
* prototypes
|
||||
*/
|
||||
PG_FUNCTION_INFO_V1(testprs_start);
|
||||
Datum testprs_start(PG_FUNCTION_ARGS);
|
||||
Datum testprs_start(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(testprs_getlexeme);
|
||||
Datum testprs_getlexeme(PG_FUNCTION_ARGS);
|
||||
Datum testprs_getlexeme(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(testprs_end);
|
||||
Datum testprs_end(PG_FUNCTION_ARGS);
|
||||
Datum testprs_end(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(testprs_lextype);
|
||||
Datum testprs_lextype(PG_FUNCTION_ARGS);
|
||||
Datum testprs_lextype(PG_FUNCTION_ARGS);
|
||||
|
||||
/*
|
||||
* functions
|
||||
*/
|
||||
Datum testprs_start(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
testprs_start(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ParserState *pst = (ParserState *) palloc0(sizeof(ParserState));
|
||||
|
||||
pst->buffer = (char *) PG_GETARG_POINTER(0);
|
||||
pst->len = PG_GETARG_INT32(1);
|
||||
pst->pos = 0;
|
||||
@ -63,15 +67,16 @@ Datum testprs_start(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_POINTER(pst);
|
||||
}
|
||||
|
||||
Datum testprs_getlexeme(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
testprs_getlexeme(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ParserState *pst = (ParserState *) PG_GETARG_POINTER(0);
|
||||
char **t = (char **) PG_GETARG_POINTER(1);
|
||||
int *tlen = (int *) PG_GETARG_POINTER(2);
|
||||
ParserState *pst = (ParserState *) PG_GETARG_POINTER(0);
|
||||
char **t = (char **) PG_GETARG_POINTER(1);
|
||||
int *tlen = (int *) PG_GETARG_POINTER(2);
|
||||
int type;
|
||||
|
||||
*tlen = pst->pos;
|
||||
*t = pst->buffer + pst->pos;
|
||||
*t = pst->buffer + pst->pos;
|
||||
|
||||
if ((pst->buffer)[pst->pos] == ' ')
|
||||
{
|
||||
@ -81,7 +86,9 @@ Datum testprs_getlexeme(PG_FUNCTION_ARGS)
|
||||
while ((pst->buffer)[pst->pos] == ' ' &&
|
||||
pst->pos < pst->len)
|
||||
(pst->pos)++;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/* word type */
|
||||
type = 3;
|
||||
/* go to the next white-space character */
|
||||
@ -94,28 +101,29 @@ Datum testprs_getlexeme(PG_FUNCTION_ARGS)
|
||||
|
||||
/* we are finished if (*tlen == 0) */
|
||||
if (*tlen == 0)
|
||||
type=0;
|
||||
type = 0;
|
||||
|
||||
PG_RETURN_INT32(type);
|
||||
}
|
||||
|
||||
Datum testprs_end(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
testprs_end(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ParserState *pst = (ParserState *) PG_GETARG_POINTER(0);
|
||||
|
||||
pfree(pst);
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum testprs_lextype(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
testprs_lextype(PG_FUNCTION_ARGS)
|
||||
{
|
||||
/*
|
||||
* Remarks:
|
||||
* - we have to return the blanks for headline reason
|
||||
* - we use the same lexids like Teodor in the default
|
||||
* word parser; in this way we can reuse the headline
|
||||
* function of the default word parser.
|
||||
* Remarks: - we have to return the blanks for headline reason - we use
|
||||
* the same lexids like Teodor in the default word parser; in this way we
|
||||
* can reuse the headline function of the default word parser.
|
||||
*/
|
||||
LexDescr *descr = (LexDescr *) palloc(sizeof(LexDescr) * (2+1));
|
||||
LexDescr *descr = (LexDescr *) palloc(sizeof(LexDescr) * (2 + 1));
|
||||
|
||||
/* there are only two types in this parser */
|
||||
descr[0].lexid = 3;
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.2 2007/11/13 22:14:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.3 2007/11/15 21:14:31 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -24,8 +24,8 @@
|
||||
|
||||
PG_MODULE_MAGIC;
|
||||
|
||||
static Oid current_dictionary_oid = InvalidOid;
|
||||
static Oid current_parser_oid = InvalidOid;
|
||||
static Oid current_dictionary_oid = InvalidOid;
|
||||
static Oid current_parser_oid = InvalidOid;
|
||||
|
||||
/* insert given value at argument position 0 */
|
||||
#define INSERT_ARGUMENT0(argument, isnull) \
|
||||
@ -65,27 +65,27 @@ static Oid current_parser_oid = InvalidOid;
|
||||
} \
|
||||
PG_FUNCTION_INFO_V1(name)
|
||||
|
||||
static Oid GetCurrentDict(void);
|
||||
static Oid GetCurrentParser(void);
|
||||
static Oid GetCurrentDict(void);
|
||||
static Oid GetCurrentParser(void);
|
||||
|
||||
Datum tsa_lexize_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_lexize_bycurrent(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curdict(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curdict_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_token_type_current(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curprs(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curprs_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_parse_current(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curcfg(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curcfg_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_to_tsvector_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_to_tsquery_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_plainto_tsquery_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_headline_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_ts_stat(PG_FUNCTION_ARGS);
|
||||
Datum tsa_tsearch2(PG_FUNCTION_ARGS);
|
||||
Datum tsa_rewrite_accum(PG_FUNCTION_ARGS);
|
||||
Datum tsa_rewrite_finish(PG_FUNCTION_ARGS);
|
||||
Datum tsa_lexize_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_lexize_bycurrent(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curdict(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curdict_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_token_type_current(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curprs(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curprs_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_parse_current(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curcfg(PG_FUNCTION_ARGS);
|
||||
Datum tsa_set_curcfg_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_to_tsvector_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_to_tsquery_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_plainto_tsquery_name(PG_FUNCTION_ARGS);
|
||||
Datum tsa_headline_byname(PG_FUNCTION_ARGS);
|
||||
Datum tsa_ts_stat(PG_FUNCTION_ARGS);
|
||||
Datum tsa_tsearch2(PG_FUNCTION_ARGS);
|
||||
Datum tsa_rewrite_accum(PG_FUNCTION_ARGS);
|
||||
Datum tsa_rewrite_finish(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(tsa_lexize_byname);
|
||||
PG_FUNCTION_INFO_V1(tsa_lexize_bycurrent);
|
||||
@ -150,11 +150,11 @@ UNSUPPORTED_FUNCTION(tsa_get_covers);
|
||||
Datum
|
||||
tsa_lexize_byname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *dictname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
text *dictname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
|
||||
return DirectFunctionCall2(ts_lexize,
|
||||
ObjectIdGetDatum(TextGetObjectId(regdictionaryin, dictname)),
|
||||
ObjectIdGetDatum(TextGetObjectId(regdictionaryin, dictname)),
|
||||
arg1);
|
||||
}
|
||||
|
||||
@ -162,8 +162,8 @@ tsa_lexize_byname(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_lexize_bycurrent(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Datum arg0 = PG_GETARG_DATUM(0);
|
||||
Oid id = GetCurrentDict();
|
||||
Datum arg0 = PG_GETARG_DATUM(0);
|
||||
Oid id = GetCurrentDict();
|
||||
|
||||
return DirectFunctionCall2(ts_lexize,
|
||||
ObjectIdGetDatum(id),
|
||||
@ -174,7 +174,7 @@ tsa_lexize_bycurrent(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curdict(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid dict_oid = PG_GETARG_OID(0);
|
||||
Oid dict_oid = PG_GETARG_OID(0);
|
||||
|
||||
if (!SearchSysCacheExists(TSDICTOID,
|
||||
ObjectIdGetDatum(dict_oid),
|
||||
@ -191,8 +191,8 @@ tsa_set_curdict(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curdict_byname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *name = PG_GETARG_TEXT_P(0);
|
||||
Oid dict_oid;
|
||||
text *name = PG_GETARG_TEXT_P(0);
|
||||
Oid dict_oid;
|
||||
|
||||
dict_oid = TSDictionaryGetDictid(stringToQualifiedNameList(TextPGetCString(name)), false);
|
||||
|
||||
@ -213,7 +213,7 @@ tsa_token_type_current(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curprs(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid parser_oid = PG_GETARG_OID(0);
|
||||
Oid parser_oid = PG_GETARG_OID(0);
|
||||
|
||||
if (!SearchSysCacheExists(TSPARSEROID,
|
||||
ObjectIdGetDatum(parser_oid),
|
||||
@ -230,8 +230,8 @@ tsa_set_curprs(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curprs_byname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *name = PG_GETARG_TEXT_P(0);
|
||||
Oid parser_oid;
|
||||
text *name = PG_GETARG_TEXT_P(0);
|
||||
Oid parser_oid;
|
||||
|
||||
parser_oid = TSParserGetPrsid(stringToQualifiedNameList(TextPGetCString(name)), false);
|
||||
|
||||
@ -252,12 +252,12 @@ tsa_parse_current(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curcfg(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid arg0 = PG_GETARG_OID(0);
|
||||
char *name;
|
||||
Oid arg0 = PG_GETARG_OID(0);
|
||||
char *name;
|
||||
|
||||
name = DatumGetCString(DirectFunctionCall1(regconfigout,
|
||||
ObjectIdGetDatum(arg0)));
|
||||
|
||||
|
||||
set_config_option("default_text_search_config", name,
|
||||
PGC_USERSET,
|
||||
PGC_S_SESSION,
|
||||
@ -271,8 +271,8 @@ tsa_set_curcfg(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_set_curcfg_byname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *arg0 = PG_GETARG_TEXT_P(0);
|
||||
char *name;
|
||||
text *arg0 = PG_GETARG_TEXT_P(0);
|
||||
char *name;
|
||||
|
||||
name = TextPGetCString(arg0);
|
||||
|
||||
@ -289,9 +289,9 @@ tsa_set_curcfg_byname(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_to_tsvector_name(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
|
||||
config_oid = TextGetObjectId(regconfigin, cfgname);
|
||||
|
||||
@ -303,9 +303,9 @@ tsa_to_tsvector_name(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_to_tsquery_name(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
|
||||
config_oid = TextGetObjectId(regconfigin, cfgname);
|
||||
|
||||
@ -318,9 +318,9 @@ tsa_to_tsquery_name(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_plainto_tsquery_name(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
text *cfgname = PG_GETARG_TEXT_P(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Oid config_oid;
|
||||
|
||||
config_oid = TextGetObjectId(regconfigin, cfgname);
|
||||
|
||||
@ -332,22 +332,22 @@ tsa_plainto_tsquery_name(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
tsa_headline_byname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Datum arg0 = PG_GETARG_DATUM(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Datum arg2 = PG_GETARG_DATUM(2);
|
||||
Datum result;
|
||||
Oid config_oid;
|
||||
Datum arg0 = PG_GETARG_DATUM(0);
|
||||
Datum arg1 = PG_GETARG_DATUM(1);
|
||||
Datum arg2 = PG_GETARG_DATUM(2);
|
||||
Datum result;
|
||||
Oid config_oid;
|
||||
|
||||
/* first parameter has to be converted to oid */
|
||||
config_oid = DatumGetObjectId(DirectFunctionCall1(regconfigin,
|
||||
DirectFunctionCall1(textout, arg0)));
|
||||
DirectFunctionCall1(textout, arg0)));
|
||||
|
||||
if (PG_NARGS() == 3)
|
||||
result = DirectFunctionCall3(ts_headline_byid,
|
||||
ObjectIdGetDatum(config_oid), arg1, arg2);
|
||||
ObjectIdGetDatum(config_oid), arg1, arg2);
|
||||
else
|
||||
{
|
||||
Datum arg3 = PG_GETARG_DATUM(3);
|
||||
Datum arg3 = PG_GETARG_DATUM(3);
|
||||
|
||||
result = DirectFunctionCall4(ts_headline_byid_opt,
|
||||
ObjectIdGetDatum(config_oid),
|
||||
@ -371,11 +371,11 @@ tsa_tsearch2(PG_FUNCTION_ARGS)
|
||||
{
|
||||
TriggerData *trigdata;
|
||||
Trigger *trigger;
|
||||
char **tgargs;
|
||||
char **tgargs;
|
||||
int i;
|
||||
|
||||
/* Check call context */
|
||||
if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */
|
||||
if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */
|
||||
elog(ERROR, "tsvector_update_trigger: not fired by trigger manager");
|
||||
|
||||
trigdata = (TriggerData *) fcinfo->context;
|
||||
@ -388,7 +388,7 @@ tsa_tsearch2(PG_FUNCTION_ARGS)
|
||||
tgargs = (char **) palloc((trigger->tgnargs + 1) * sizeof(char *));
|
||||
tgargs[0] = trigger->tgargs[0];
|
||||
for (i = 1; i < trigger->tgnargs; i++)
|
||||
tgargs[i+1] = trigger->tgargs[i];
|
||||
tgargs[i + 1] = trigger->tgargs[i];
|
||||
|
||||
tgargs[1] = pstrdup(GetConfigOptionByName("default_text_search_config",
|
||||
NULL));
|
||||
|
@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (c) 2007 PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.c,v 1.3 2007/10/23 21:38:16 tgl Exp $
|
||||
* $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.c,v 1.4 2007/11/15 21:14:31 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -39,17 +39,17 @@
|
||||
PG_MODULE_MAGIC;
|
||||
|
||||
|
||||
Datum uuid_nil(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_dns(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_url(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_oid(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_x500(PG_FUNCTION_ARGS);
|
||||
Datum uuid_nil(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_dns(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_url(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_oid(PG_FUNCTION_ARGS);
|
||||
Datum uuid_ns_x500(PG_FUNCTION_ARGS);
|
||||
|
||||
Datum uuid_generate_v1(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v1mc(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v3(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v4(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v5(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v1(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v1mc(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v3(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v4(PG_FUNCTION_ARGS);
|
||||
Datum uuid_generate_v5(PG_FUNCTION_ARGS);
|
||||
|
||||
|
||||
PG_FUNCTION_INFO_V1(uuid_nil);
|
||||
@ -66,11 +66,11 @@ PG_FUNCTION_INFO_V1(uuid_generate_v5);
|
||||
|
||||
|
||||
static char *
|
||||
uuid_to_string(const uuid_t *uuid)
|
||||
uuid_to_string(const uuid_t * uuid)
|
||||
{
|
||||
char *buf = palloc(UUID_LEN_STR + 1);
|
||||
void *ptr = buf;
|
||||
size_t len = UUID_LEN_STR + 1;
|
||||
char *buf = palloc(UUID_LEN_STR + 1);
|
||||
void *ptr = buf;
|
||||
size_t len = UUID_LEN_STR + 1;
|
||||
|
||||
uuid_export(uuid, UUID_FMT_STR, &ptr, &len);
|
||||
|
||||
@ -79,7 +79,7 @@ uuid_to_string(const uuid_t *uuid)
|
||||
|
||||
|
||||
static void
|
||||
string_to_uuid(const char *str, uuid_t *uuid)
|
||||
string_to_uuid(const char *str, uuid_t * uuid)
|
||||
{
|
||||
uuid_import(uuid, UUID_FMT_STR, str, UUID_LEN_STR + 1);
|
||||
}
|
||||
@ -88,8 +88,8 @@ string_to_uuid(const char *str, uuid_t *uuid)
|
||||
static Datum
|
||||
special_uuid_value(const char *name)
|
||||
{
|
||||
uuid_t *uuid;
|
||||
char *str;
|
||||
uuid_t *uuid;
|
||||
char *str;
|
||||
|
||||
uuid_create(&uuid);
|
||||
uuid_load(uuid, name);
|
||||
@ -136,10 +136,10 @@ uuid_ns_x500(PG_FUNCTION_ARGS)
|
||||
|
||||
|
||||
static Datum
|
||||
uuid_generate_internal(int mode, const uuid_t *ns, const char *name)
|
||||
uuid_generate_internal(int mode, const uuid_t * ns, const char *name)
|
||||
{
|
||||
uuid_t *uuid;
|
||||
char *str;
|
||||
uuid_t *uuid;
|
||||
char *str;
|
||||
|
||||
uuid_create(&uuid);
|
||||
uuid_make(uuid, mode, ns, name);
|
||||
@ -165,7 +165,7 @@ uuid_generate_v1mc(PG_FUNCTION_ARGS)
|
||||
|
||||
|
||||
static Datum
|
||||
uuid_generate_v35_internal(int mode, pg_uuid_t *ns, text *name)
|
||||
uuid_generate_v35_internal(int mode, pg_uuid_t * ns, text *name)
|
||||
{
|
||||
uuid_t *ns_uuid;
|
||||
Datum result;
|
||||
@ -176,7 +176,7 @@ uuid_generate_v35_internal(int mode, pg_uuid_t *ns, text *name)
|
||||
|
||||
result = uuid_generate_internal(mode,
|
||||
ns_uuid,
|
||||
DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(name))));
|
||||
DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(name))));
|
||||
|
||||
uuid_destroy(ns_uuid);
|
||||
|
||||
|
Reference in New Issue
Block a user