diff options
522 files changed, 21508 insertions, 17381 deletions
diff --git a/contrib/adminpack/adminpack.c b/contrib/adminpack/adminpack.c index 3213420ba15..dc756e4303f 100644 --- a/contrib/adminpack/adminpack.c +++ b/contrib/adminpack/adminpack.c @@ -4,11 +4,11 @@ * * * Copyright (c) 2002 - 2006, PostgreSQL Global Development Group - * + * * Author: Andreas Pflug <[email protected]> * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.3 2006/07/11 16:35:30 momjian Exp $ + * $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.4 2006/10/04 00:29:44 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -35,7 +35,6 @@ #ifdef unlink #undef unlink #endif - #endif extern DLLIMPORT char *DataDir; @@ -44,20 +43,20 @@ extern DLLIMPORT char *Log_filename; PG_MODULE_MAGIC; -Datum pg_file_write(PG_FUNCTION_ARGS); -Datum pg_file_rename(PG_FUNCTION_ARGS); -Datum pg_file_unlink(PG_FUNCTION_ARGS); -Datum pg_logdir_ls(PG_FUNCTION_ARGS); +Datum pg_file_write(PG_FUNCTION_ARGS); +Datum pg_file_rename(PG_FUNCTION_ARGS); +Datum pg_file_unlink(PG_FUNCTION_ARGS); +Datum pg_logdir_ls(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(pg_file_write); PG_FUNCTION_INFO_V1(pg_file_rename); PG_FUNCTION_INFO_V1(pg_file_unlink); PG_FUNCTION_INFO_V1(pg_logdir_ls); -typedef struct +typedef struct { - char *location; - DIR *dirdesc; + char *location; + DIR *dirdesc; } directory_fctx; /*----------------------- @@ -65,30 +64,31 @@ typedef struct */ /* - * Return an absolute path. Argument may be absolute or + * Return an absolute path. Argument may be absolute or * relative to the DataDir. */ -static char *absClusterPath(text *arg, bool logAllowed) +static char * +absClusterPath(text *arg, bool logAllowed) { - char *filename; - int len=VARSIZE(arg) - VARHDRSZ; - int dlen = strlen(DataDir); + char *filename; + int len = VARSIZE(arg) - VARHDRSZ; + int dlen = strlen(DataDir); - filename = palloc(len+1); + filename = palloc(len + 1); memcpy(filename, VARDATA(arg), len); filename[len] = 0; if (strstr(filename, "..") != NULL) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("No .. allowed in filenames")))); - + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + (errmsg("No .. allowed in filenames")))); + if (is_absolute_path(filename)) { - if (logAllowed && !strncmp(filename, Log_directory, strlen(Log_directory))) - return filename; + if (logAllowed && !strncmp(filename, Log_directory, strlen(Log_directory))) + return filename; if (strncmp(filename, DataDir, dlen)) - ereport(ERROR, + ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("Absolute path not allowed")))); @@ -96,7 +96,8 @@ static char *absClusterPath(text *arg, bool logAllowed) } else { - char *absname = palloc(dlen+len+2); + char *absname = palloc(dlen + len + 2); + sprintf(absname, "%s/%s", DataDir, filename); pfree(filename); return absname; @@ -111,9 +112,9 @@ static void requireSuperuser(void) { if (!superuser()) - ereport(ERROR, + ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("only superuser may access generic file functions")))); + (errmsg("only superuser may access generic file functions")))); } @@ -122,12 +123,13 @@ requireSuperuser(void) * generic file handling functions */ -Datum pg_file_write(PG_FUNCTION_ARGS) +Datum +pg_file_write(PG_FUNCTION_ARGS) { - FILE *f; - char *filename; - text *data; - int64 count = 0; + FILE *f; + char *filename; + text *data; + int64 count = 0; requireSuperuser(); @@ -136,16 +138,17 @@ Datum pg_file_write(PG_FUNCTION_ARGS) if (PG_ARGISNULL(2) || !PG_GETARG_BOOL(2)) { - struct stat fst; + struct stat fst; + if (stat(filename, &fst) >= 0) - ereport(ERROR, + ereport(ERROR, (ERRCODE_DUPLICATE_FILE, errmsg("file %s exists", filename))); - f = fopen(filename, "wb"); + f = fopen(filename, "wb"); } else - f = fopen(filename, "ab"); + f = fopen(filename, "ab"); if (!f) { @@ -159,7 +162,7 @@ Datum pg_file_write(PG_FUNCTION_ARGS) count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f); if (count != VARSIZE(data) - VARHDRSZ) - ereport(ERROR, + ereport(ERROR, (errcode_for_file_access(), errmsg("error writing file %s: %m", filename))); } @@ -169,22 +172,25 @@ Datum pg_file_write(PG_FUNCTION_ARGS) } -Datum pg_file_rename(PG_FUNCTION_ARGS) +Datum +pg_file_rename(PG_FUNCTION_ARGS) { - char *fn1, *fn2, *fn3; - int rc; + char *fn1, + *fn2, + *fn3; + int rc; requireSuperuser(); if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) PG_RETURN_NULL(); - fn1=absClusterPath(PG_GETARG_TEXT_P(0), false); - fn2=absClusterPath(PG_GETARG_TEXT_P(1), false); + fn1 = absClusterPath(PG_GETARG_TEXT_P(0), false); + fn2 = absClusterPath(PG_GETARG_TEXT_P(1), false); if (PG_ARGISNULL(2)) - fn3=0; + fn3 = 0; else - fn3=absClusterPath(PG_GETARG_TEXT_P(2), false); + fn3 = absClusterPath(PG_GETARG_TEXT_P(2), false); if (access(fn1, W_OK) < 0) { @@ -192,7 +198,7 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) (errcode_for_file_access(), errmsg("file %s not accessible: %m", fn1))); - PG_RETURN_BOOL(false); + PG_RETURN_BOOL(false); } if (fn3 && access(fn2, W_OK) < 0) @@ -201,7 +207,7 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) (errcode_for_file_access(), errmsg("file %s not accessible: %m", fn2))); - PG_RETURN_BOOL(false); + PG_RETURN_BOOL(false); } @@ -212,10 +218,10 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) (ERRCODE_DUPLICATE_FILE, errmsg("cannot rename to target file %s", fn3 ? fn3 : fn2))); } - + if (fn3) { - if (rename(fn2, fn3) != 0) + if (rename(fn2, fn3) != 0) { ereport(ERROR, (errcode_for_file_access(), @@ -231,7 +237,7 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) { ereport(ERROR, (errcode_for_file_access(), - errmsg("could not rename %s back to %s: %m", fn3, fn2))); + errmsg("could not rename %s back to %s: %m", fn3, fn2))); } else { @@ -244,9 +250,9 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) } else if (rename(fn1, fn2) != 0) { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("renaming %s to %s %m", fn1, fn2))); + ereport(WARNING, + (errcode_for_file_access(), + errmsg("renaming %s to %s %m", fn1, fn2))); ereport(ERROR, (errcode_for_file_access(), errmsg("could not rename %s to %s: %m", fn1, fn2))); @@ -256,20 +262,21 @@ Datum pg_file_rename(PG_FUNCTION_ARGS) } -Datum pg_file_unlink(PG_FUNCTION_ARGS) +Datum +pg_file_unlink(PG_FUNCTION_ARGS) { - char *filename; + char *filename; requireSuperuser(); - filename = absClusterPath(PG_GETARG_TEXT_P(0), false); + filename = absClusterPath(PG_GETARG_TEXT_P(0), false); if (access(filename, W_OK) < 0) { - if (errno == ENOENT) - PG_RETURN_BOOL(false); + if (errno == ENOENT) + PG_RETURN_BOOL(false); else - ereport(ERROR, + ereport(ERROR, (errcode_for_file_access(), errmsg("file %s not accessible: %m", filename))); @@ -287,17 +294,18 @@ Datum pg_file_unlink(PG_FUNCTION_ARGS) } -Datum pg_logdir_ls(PG_FUNCTION_ARGS) +Datum +pg_logdir_ls(PG_FUNCTION_ARGS) { FuncCallContext *funcctx; struct dirent *de; directory_fctx *fctx; - if (!superuser()) + if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("only superuser can list the log directory")))); - + if (memcmp(Log_filename, "postgresql-%Y-%m-%d_%H%M%S.log", 30) != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -306,17 +314,17 @@ Datum pg_logdir_ls(PG_FUNCTION_ARGS) if (SRF_IS_FIRSTCALL()) { MemoryContext oldcontext; - TupleDesc tupdesc; + TupleDesc tupdesc; - funcctx=SRF_FIRSTCALL_INIT(); + funcctx = SRF_FIRSTCALL_INIT(); oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); fctx = palloc(sizeof(directory_fctx)); if (is_absolute_path(Log_directory)) - fctx->location = Log_directory; + fctx->location = Log_directory; else { - fctx->location = palloc(strlen(DataDir) + strlen(Log_directory) +2); + fctx->location = palloc(strlen(DataDir) + strlen(Log_directory) + 2); sprintf(fctx->location, "%s/%s", DataDir, Log_directory); } tupdesc = CreateTemplateTupleDesc(2, false); @@ -326,11 +334,11 @@ Datum pg_logdir_ls(PG_FUNCTION_ARGS) TEXTOID, -1, 0); funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); - + fctx->dirdesc = AllocateDir(fctx->location); if (!fctx->dirdesc) - ereport(ERROR, + ereport(ERROR, (errcode_for_file_access(), errmsg("%s is not browsable: %m", fctx->location))); @@ -338,47 +346,47 @@ Datum pg_logdir_ls(PG_FUNCTION_ARGS) MemoryContextSwitchTo(oldcontext); } - funcctx=SRF_PERCALL_SETUP(); - fctx = (directory_fctx*) funcctx->user_fctx; + funcctx = SRF_PERCALL_SETUP(); + fctx = (directory_fctx *) funcctx->user_fctx; - if (!fctx->dirdesc) /* not a readable directory */ + if (!fctx->dirdesc) /* not a readable directory */ SRF_RETURN_DONE(funcctx); while ((de = readdir(fctx->dirdesc)) != NULL) { - char *values[2]; - HeapTuple tuple; - - char *field[MAXDATEFIELDS]; + char *values[2]; + HeapTuple tuple; + + char *field[MAXDATEFIELDS]; char lowstr[MAXDATELEN + 1]; - int dtype; - int nf, ftype[MAXDATEFIELDS]; + int dtype; + int nf, + ftype[MAXDATEFIELDS]; fsec_t fsec; - int tz = 0; - struct pg_tm date; + int tz = 0; + struct pg_tm date; /* - * Default format: - * postgresql-YYYY-MM-DD_HHMMSS.log + * Default format: postgresql-YYYY-MM-DD_HHMMSS.log */ if (strlen(de->d_name) != 32 - || memcmp(de->d_name, "postgresql-", 11) + || memcmp(de->d_name, "postgresql-", 11) || de->d_name[21] != '_' || strcmp(de->d_name + 28, ".log")) - continue; + continue; values[1] = palloc(strlen(fctx->location) + strlen(de->d_name) + 2); sprintf(values[1], "%s/%s", fctx->location, de->d_name); - values[0] = de->d_name + 11; /* timestamp */ + values[0] = de->d_name + 11; /* timestamp */ values[0][17] = 0; - /* parse and decode expected timestamp */ + /* parse and decode expected timestamp */ if (ParseDateTime(values[0], lowstr, MAXDATELEN, field, ftype, MAXDATEFIELDS, &nf)) - continue; + continue; if (DecodeDateTime(field, ftype, nf, &dtype, &date, &fsec, &tz)) - continue; + continue; /* Seems the format fits the expected format; feed it into the tuple */ diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c index 16ba5340fbf..9d3b46648ef 100644 --- a/contrib/cube/cube.c +++ b/contrib/cube/cube.c @@ -1,5 +1,5 @@ /****************************************************************************** - $PostgreSQL: pgsql/contrib/cube/cube.c,v 1.29 2006/09/10 17:36:50 tgl Exp $ + $PostgreSQL: pgsql/contrib/cube/cube.c,v 1.30 2006/10/04 00:29:44 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 @@ -159,7 +159,7 @@ Datum cube_in(PG_FUNCTION_ARGS) { void *result; - char *str; + char *str; str = PG_GETARG_CSTRING(0); @@ -170,7 +170,7 @@ cube_in(PG_FUNCTION_ARGS) cube_scanner_finish(); - PG_RETURN_POINTER (result); + PG_RETURN_POINTER(result); } /* Allow conversion from text to cube to allow input of computed strings */ @@ -178,11 +178,11 @@ cube_in(PG_FUNCTION_ARGS) Datum cube(PG_FUNCTION_ARGS) { - char *cstring; + char *cstring; cstring = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(PG_GETARG_TEXT_P(0)))); - PG_RETURN_DATUM (DirectFunctionCall1 (cube_in, PointerGetDatum(cstring))); + PG_RETURN_DATUM(DirectFunctionCall1(cube_in, PointerGetDatum(cstring))); } @@ -192,12 +192,14 @@ cube(PG_FUNCTION_ARGS) Datum cube_a_f8_f8(PG_FUNCTION_ARGS) { - int i; - int dim; - int size; - NDBOX *result; - ArrayType *ur, *ll; - double *dur, *dll; + int i; + int dim; + int size; + NDBOX *result; + ArrayType *ur, + *ll; + double *dur, + *dll; ur = (ArrayType *) PG_GETARG_VARLENA_P(0); ll = (ArrayType *) PG_GETARG_VARLENA_P(1); @@ -205,31 +207,31 @@ cube_a_f8_f8(PG_FUNCTION_ARGS) if (ARR_HASNULL(ur) || ARR_HASNULL(ll)) { ereport(ERROR, - (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), - errmsg("Cannot work with NULL arrays"))); + (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), + errmsg("Cannot work with NULL arrays"))); } dim = ARRNELEMS(ur); if (ARRNELEMS(ll) != dim) { ereport(ERROR, - (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), - errmsg("UR and LL arrays must be of same length"))); + (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), + errmsg("UR and LL arrays must be of same length"))); } dur = ARRPTR(ur); dll = ARRPTR(ll); size = offsetof(NDBOX, x[0]) + sizeof(double) * 2 * dim; - result = (NDBOX *) palloc (size); - memset (result, 0, size); + result = (NDBOX *) palloc(size); + memset(result, 0, size); result->size = size; result->dim = dim; - for (i=0; i<dim; i++) + for (i = 0; i < dim; i++) { result->x[i] = dur[i]; - result->x[i+dim] = dll[i]; + result->x[i + dim] = dll[i]; } PG_RETURN_POINTER(result); @@ -241,20 +243,20 @@ cube_a_f8_f8(PG_FUNCTION_ARGS) Datum cube_a_f8(PG_FUNCTION_ARGS) { - int i; - int dim; - int size; - NDBOX *result; - ArrayType *ur; - double *dur; + int i; + int dim; + int size; + NDBOX *result; + ArrayType *ur; + double *dur; ur = (ArrayType *) PG_GETARG_VARLENA_P(0); if (ARR_HASNULL(ur)) { ereport(ERROR, - (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), - errmsg("Cannot work with NULL arrays"))); + (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), + errmsg("Cannot work with NULL arrays"))); } dim = ARRNELEMS(ur); @@ -262,15 +264,15 @@ cube_a_f8(PG_FUNCTION_ARGS) dur = ARRPTR(ur); size = offsetof(NDBOX, x[0]) + sizeof(double) * 2 * dim; - result = (NDBOX *) palloc (size); - memset (result, 0, size); + result = (NDBOX *) palloc(size); + memset(result, 0, size); result->size = size; result->dim = dim; - for (i=0; i<dim; i++) + for (i = 0; i < dim; i++) { result->x[i] = dur[i]; - result->x[i+dim] = dur[i]; + result->x[i + dim] = dur[i]; } PG_RETURN_POINTER(result); @@ -279,10 +281,13 @@ cube_a_f8(PG_FUNCTION_ARGS) Datum cube_subset(PG_FUNCTION_ARGS) { - NDBOX *c, *result; - ArrayType *idx; - int size, dim, i; - int *dx; + NDBOX *c, + *result; + ArrayType *idx; + int size, + dim, + i; + int *dx; c = (NDBOX *) PG_GETARG_POINTER(0); idx = (ArrayType *) PG_GETARG_VARLENA_P(1); @@ -290,30 +295,30 @@ cube_subset(PG_FUNCTION_ARGS) if (ARR_HASNULL(idx)) { ereport(ERROR, - (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), - errmsg("Cannot work with NULL arrays"))); + (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), + errmsg("Cannot work with NULL arrays"))); } - dx = (int4 *) ARR_DATA_PTR (idx); + dx = (int4 *) ARR_DATA_PTR(idx); dim = ARRNELEMS(idx); size = offsetof(NDBOX, x[0]) + sizeof(double) * 2 * dim; - result = (NDBOX *) palloc (size); - memset (result, 0, size); + result = (NDBOX *) palloc(size); + memset(result, 0, size); result->size = size; result->dim = dim; - for (i=0; i<dim; i++) + for (i = 0; i < dim; i++) { if ((dx[i] <= 0) || (dx[i] > c->dim)) { - pfree (result); + pfree(result); ereport(ERROR, - (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), - errmsg("Index out of bounds"))); + (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), + errmsg("Index out of bounds"))); } - result->x[i] = c->x[dx[i]-1]; - result->x[i+dim] = c->x[dx[i]+c->dim-1]; + result->x[i] = c->x[dx[i] - 1]; + result->x[i + dim] = c->x[dx[i] + c->dim - 1]; } PG_RETURN_POINTER(result); @@ -327,11 +332,11 @@ cube_out(PG_FUNCTION_ARGS) int dim; int i; int ndig; - NDBOX *cube; + NDBOX *cube; initStringInfo(&buf); - cube = (NDBOX *) PG_GETARG_POINTER (0); + cube = (NDBOX *) PG_GETARG_POINTER(0); dim = cube->dim; @@ -369,7 +374,7 @@ cube_out(PG_FUNCTION_ARGS) appendStringInfoChar(&buf, ')'); } - PG_RETURN_CSTRING (buf.data); + PG_RETURN_CSTRING(buf.data); } @@ -383,11 +388,11 @@ cube_out(PG_FUNCTION_ARGS) ** the predicate x op query == FALSE, where op is the oper ** corresponding to strategy in the pg_amop table. */ -Datum +Datum g_cube_consistent(PG_FUNCTION_ARGS) { - GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - NDBOX *query = (NDBOX *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); + NDBOX *query = (NDBOX *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); /* @@ -414,7 +419,7 @@ g_cube_union(PG_FUNCTION_ARGS) NDBOX *out = (NDBOX *) NULL; NDBOX *tmp; int *sizep; - GistEntryVector *entryvec; + GistEntryVector *entryvec; entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); sizep = (int *) PG_GETARG_POINTER(1); @@ -446,15 +451,15 @@ g_cube_union(PG_FUNCTION_ARGS) */ Datum -g_cube_compress (PG_FUNCTION_ARGS) +g_cube_compress(PG_FUNCTION_ARGS) { - PG_RETURN_DATUM(PG_GETARG_DATUM(0)); + PG_RETURN_DATUM(PG_GETARG_DATUM(0)); } Datum -g_cube_decompress (PG_FUNCTION_ARGS) +g_cube_decompress(PG_FUNCTION_ARGS) { - PG_RETURN_DATUM(PG_GETARG_DATUM(0)); + PG_RETURN_DATUM(PG_GETARG_DATUM(0)); } @@ -463,17 +468,17 @@ g_cube_decompress (PG_FUNCTION_ARGS) ** As in the R-tree paper, we use change in area as our penalty metric */ Datum -g_cube_penalty (PG_FUNCTION_ARGS) +g_cube_penalty(PG_FUNCTION_ARGS) { - GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0); - GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1); - float *result = (float *) PG_GETARG_POINTER(2); + GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0); + GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1); + float *result = (float *) PG_GETARG_POINTER(2); NDBOX *ud; double tmp1, tmp2; ud = cube_union_v0((NDBOX *) DatumGetPointer(origentry->key), - (NDBOX *) DatumGetPointer(newentry->key)); + (NDBOX *) DatumGetPointer(newentry->key)); rt_cube_size(ud, &tmp1); rt_cube_size((NDBOX *) DatumGetPointer(origentry->key), &tmp2); *result = (float) (tmp1 - tmp2); @@ -481,7 +486,7 @@ g_cube_penalty (PG_FUNCTION_ARGS) /* * fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result); */ - PG_RETURN_FLOAT8 (*result); + PG_RETURN_FLOAT8(*result); } @@ -493,8 +498,8 @@ g_cube_penalty (PG_FUNCTION_ARGS) Datum g_cube_picksplit(PG_FUNCTION_ARGS) { - GistEntryVector *entryvec; - GIST_SPLITVEC *v; + GistEntryVector *entryvec; + GIST_SPLITVEC *v; OffsetNumber i, j; NDBOX *datum_alpha, @@ -546,9 +551,9 @@ g_cube_picksplit(PG_FUNCTION_ARGS) /* size_waste = size_union - size_inter; */ union_d = cube_union_v0(datum_alpha, datum_beta); rt_cube_size(union_d, &size_union); - inter_d = (NDBOX *) DatumGetPointer (DirectFunctionCall2 - (cube_inter, - entryvec->vector[i].key, entryvec->vector[j].key)); + inter_d = (NDBOX *) DatumGetPointer(DirectFunctionCall2 + (cube_inter, + entryvec->vector[i].key, entryvec->vector[j].key)); rt_cube_size(inter_d, &size_inter); size_waste = size_union - size_inter; @@ -649,12 +654,13 @@ g_cube_picksplit(PG_FUNCTION_ARGS) Datum g_cube_same(PG_FUNCTION_ARGS) { - NDBOX *b1, *b2; - bool *result; - - b1 = (NDBOX *) PG_GETARG_POINTER (0); - b2 = (NDBOX *) PG_GETARG_POINTER (1); - result = (bool *) PG_GETARG_POINTER (2); + NDBOX *b1, + *b2; + bool *result; + + b1 = (NDBOX *) PG_GETARG_POINTER(0); + b2 = (NDBOX *) PG_GETARG_POINTER(1); + result = (bool *) PG_GETARG_POINTER(2); if (cube_cmp_v0(b1, b2) == 0) *result = TRUE; @@ -664,7 +670,7 @@ g_cube_same(PG_FUNCTION_ARGS) /* * fprintf(stderr, "same: %s\n", (*result ? "TRUE" : "FALSE" )); */ - PG_RETURN_POINTER (result); + PG_RETURN_POINTER(result); } /* @@ -803,14 +809,15 @@ cube_union_v0(NDBOX * a, NDBOX * b) } Datum -cube_union (PG_FUNCTION_ARGS) +cube_union(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); - PG_RETURN_POINTER(cube_union_v0(a,b)); + PG_RETURN_POINTER(cube_union_v0(a, b)); } /* cube_inter */ @@ -818,7 +825,9 @@ Datum cube_inter(PG_FUNCTION_ARGS) { int i; - NDBOX *result, *a, *b; + NDBOX *result, + *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -874,17 +883,17 @@ cube_inter(PG_FUNCTION_ARGS) /* * Is it OK to return a non-null intersection for non-overlapping boxes? */ - PG_RETURN_POINTER (result); + PG_RETURN_POINTER(result); } /* cube_size */ Datum cube_size(PG_FUNCTION_ARGS) { - NDBOX *a; + NDBOX *a; int i, j; - double result; + double result; a = (NDBOX *) PG_GETARG_POINTER(0); @@ -892,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_RETURN_FLOAT8 (result); + PG_RETURN_FLOAT8(result); } void @@ -994,10 +1003,11 @@ cube_cmp_v0(NDBOX * a, NDBOX * b) return 0; } -Datum +Datum cube_cmp(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1009,7 +1019,8 @@ cube_cmp(PG_FUNCTION_ARGS) Datum cube_eq(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1021,7 +1032,8 @@ cube_eq(PG_FUNCTION_ARGS) Datum cube_ne(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1033,7 +1045,8 @@ cube_ne(PG_FUNCTION_ARGS) Datum cube_lt(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1045,7 +1058,8 @@ cube_lt(PG_FUNCTION_ARGS) Datum cube_gt(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1057,7 +1071,8 @@ cube_gt(PG_FUNCTION_ARGS) Datum cube_le(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1069,7 +1084,8 @@ cube_le(PG_FUNCTION_ARGS) Datum cube_ge(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1122,7 +1138,8 @@ cube_contains_v0(NDBOX * a, NDBOX * b) Datum cube_contains(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1135,12 +1152,13 @@ cube_contains(PG_FUNCTION_ARGS) Datum cube_contained(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); - PG_RETURN_BOOL (cube_contains_v0(b, a)); + PG_RETURN_BOOL(cube_contains_v0(b, a)); } /* Overlap */ @@ -1193,12 +1211,13 @@ cube_overlap_v0(NDBOX * a, NDBOX * b) Datum cube_overlap(PG_FUNCTION_ARGS) { - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); - PG_RETURN_BOOL (cube_overlap_v0(a, b)); + PG_RETURN_BOOL(cube_overlap_v0(a, b)); } @@ -1213,7 +1232,8 @@ cube_distance(PG_FUNCTION_ARGS) int i; double d, distance; - NDBOX *a, *b; + NDBOX *a, + *b; a = (NDBOX *) PG_GETARG_POINTER(0); b = (NDBOX *) PG_GETARG_POINTER(1); @@ -1266,7 +1286,7 @@ cube_is_point(PG_FUNCTION_ARGS) { int i, j; - NDBOX *a; + NDBOX *a; a = (NDBOX *) PG_GETARG_POINTER(0); @@ -1283,7 +1303,7 @@ cube_is_point(PG_FUNCTION_ARGS) Datum cube_dim(PG_FUNCTION_ARGS) { - NDBOX *c; + NDBOX *c; c = (NDBOX *) PG_GETARG_POINTER(0); @@ -1397,8 +1417,8 @@ cube_f8(PG_FUNCTION_ARGS) result->dim = 1; result->x[0] = PG_GETARG_FLOAT8(0); result->x[1] = result->x[0]; - - PG_RETURN_POINTER (result); + + PG_RETURN_POINTER(result); } /* Create a one dimensional box */ @@ -1416,7 +1436,7 @@ cube_f8_f8(PG_FUNCTION_ARGS) result->x[0] = PG_GETARG_FLOAT8(0); result->x[1] = PG_GETARG_FLOAT8(1); - PG_RETURN_POINTER (result); + PG_RETURN_POINTER(result); } /* Add a dimension to an existing cube with the same values for the new @@ -1431,7 +1451,7 @@ cube_c_f8(PG_FUNCTION_ARGS) int i; c = (NDBOX *) PG_GETARG_POINTER(0); - x = PG_GETARG_FLOAT8 (1); + x = PG_GETARG_FLOAT8(1); size = offsetof(NDBOX, x[0]) + sizeof(double) * (c->dim + 1) *2; result = (NDBOX *) palloc(size); @@ -1446,7 +1466,7 @@ cube_c_f8(PG_FUNCTION_ARGS) result->x[result->dim - 1] = x; result->x[2 * result->dim - 1] = x; - PG_RETURN_POINTER(result); + PG_RETURN_POINTER(result); } /* Add a dimension to an existing cube */ @@ -1455,13 +1475,14 @@ cube_c_f8_f8(PG_FUNCTION_ARGS) { NDBOX *c; NDBOX *result; - double x1, x2; + double x1, + x2; int size; int i; c = (NDBOX *) PG_GETARG_POINTER(0); - x1 = PG_GETARG_FLOAT8 (1); - x2 = PG_GETARG_FLOAT8 (2); + x1 = PG_GETARG_FLOAT8(1); + x2 = PG_GETARG_FLOAT8(2); size = offsetof(NDBOX, x[0]) + sizeof(double) * (c->dim + 1) *2; result = (NDBOX *) palloc(size); @@ -1476,7 +1497,5 @@ cube_c_f8_f8(PG_FUNCTION_ARGS) result->x[result->dim - 1] = x1; result->x[2 * result->dim - 1] = x2; - PG_RETURN_POINTER(result); + PG_RETURN_POINTER(result); } - - diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 7a46673b6b1..08fb6328fbc 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -8,7 +8,7 @@ * Darko Prenosil <[email protected]> * Shridhar Daithankar <[email protected]> * - * $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.58 2006/09/02 21:11:15 joe Exp $ + * $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.59 2006/10/04 00:29:44 momjian Exp $ * Copyright (c) 2001-2006, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * @@ -362,11 +362,11 @@ dblink_open(PG_FUNCTION_ARGS) DBLINK_RES_INTERNALERROR("begin error"); PQclear(res); rconn->newXactForCursor = TRUE; + /* * Since transaction state was IDLE, we force cursor count to - * initially be 0. This is needed as a previous ABORT might - * have wiped out our transaction without maintaining the - * cursor count for us. + * initially be 0. This is needed as a previous ABORT might have wiped + * out our transaction without maintaining the cursor count for us. */ rconn->openCursorCount = 0; } @@ -621,8 +621,8 @@ dblink_fetch(PG_FUNCTION_ARGS) if (PQnfields(res) != tupdesc->natts) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("remote query result rowtype does not match " - "the specified FROM clause rowtype"))); + errmsg("remote query result rowtype does not match " + "the specified FROM clause rowtype"))); /* fast track when no results */ if (funcctx->max_calls < 1) @@ -827,7 +827,7 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get) if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && - PQresultStatus(res) != PGRES_TUPLES_OK)) + PQresultStatus(res) != PGRES_TUPLES_OK)) { if (fail) DBLINK_RES_ERROR("sql error"); @@ -839,33 +839,33 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get) SRF_RETURN_DONE(funcctx); } } - + if (PQresultStatus(res) == PGRES_COMMAND_OK) { is_sql_cmd = true; - + /* need a tuple descriptor representing one TEXT column */ tupdesc = CreateTemplateTupleDesc(1, false); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "status", - TEXTOID, -1, 0); - + TEXTOID, -1, 0); + /* - * and save a copy of the command status string to return as our - * result tuple - */ + * and save a copy of the command status string to return as + * our result tuple + */ sql_cmd_status = PQcmdStatus(res); funcctx->max_calls = 1; } else funcctx->max_calls = PQntuples(res); - + /* got results, keep track of them */ funcctx->user_fctx = res; - + /* if needed, close the connection to the database and cleanup */ if (freeconn) PQfinish(conn); - + if (!is_sql_cmd) { /* get a tuple descriptor for our result type */ @@ -878,26 +878,29 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get) /* failed to determine actual type of RECORD */ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("function returning record called in context " - "that cannot accept type record"))); + errmsg("function returning record called in context " + "that cannot accept type record"))); break; default: /* result type isn't composite */ elog(ERROR, "return type must be a row type"); break; } - + /* make sure we have a persistent copy of the tupdesc */ tupdesc = CreateTupleDescCopy(tupdesc); } - - /* check result and tuple descriptor have the same number of columns */ + + /* + * check result and tuple descriptor have the same number of + * columns + */ if (PQnfields(res) != tupdesc->natts) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("remote query result rowtype does not match " - "the specified FROM clause rowtype"))); - + errmsg("remote query result rowtype does not match " + "the specified FROM clause rowtype"))); + /* fast track when no results */ if (funcctx->max_calls < 1) { @@ -905,11 +908,11 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get) PQclear(res); SRF_RETURN_DONE(funcctx); } - + /* store needed metadata for subsequent calls */ attinmeta = TupleDescGetAttInMetadata(tupdesc); funcctx->attinmeta = attinmeta; - + MemoryContextSwitchTo(oldcontext); } else @@ -991,9 +994,9 @@ PG_FUNCTION_INFO_V1(dblink_get_connections); Datum dblink_get_connections(PG_FUNCTION_ARGS) { - HASH_SEQ_STATUS status; - remoteConnHashEnt *hentry; - ArrayBuildState *astate = NULL; + HASH_SEQ_STATUS status; + remoteConnHashEnt *hentry; + ArrayBuildState *astate = NULL; if (remoteConnHash) { @@ -1019,19 +1022,19 @@ dblink_get_connections(PG_FUNCTION_ARGS) * * Returns 1 if the connection is busy, 0 otherwise * Params: - * text connection_name - name of the connection to check - * + * text connection_name - name of the connection to check + * */ PG_FUNCTION_INFO_V1(dblink_is_busy); Datum dblink_is_busy(PG_FUNCTION_ARGS) { - char *msg; - PGconn *conn = NULL; - char *conname = NULL; - char *connstr = NULL; - remoteConn *rconn = NULL; - bool freeconn = false; + char *msg; + PGconn *conn = NULL; + char *conname = NULL; + char *connstr = NULL; + remoteConn *rconn = NULL; + bool freeconn = false; DBLINK_INIT; DBLINK_GET_CONN; @@ -1045,27 +1048,27 @@ dblink_is_busy(PG_FUNCTION_ARGS) /* * Cancels a running request on a connection * - * Returns text: + * Returns text: * "OK" if the cancel request has been sent correctly, - * an error message otherwise - * + * an error message otherwise + * * Params: - * text connection_name - name of the connection to check - * + * text connection_name - name of the connection to check + * */ PG_FUNCTION_INFO_V1(dblink_cancel_query); Datum dblink_cancel_query(PG_FUNCTION_ARGS) { - char *msg; - int res = 0; - PGconn *conn = NULL; - char *conname = NULL; - char *connstr = NULL; - remoteConn *rconn = NULL; - bool freeconn = false; - PGcancel *cancel; - char errbuf[256]; + char *msg; + int res = 0; + PGconn *conn = NULL; + char *conname = NULL; + char *connstr = NULL; + remoteConn *rconn = NULL; + bool freeconn = false; + PGcancel *cancel; + char errbuf[256]; DBLINK_INIT; DBLINK_GET_CONN; @@ -1077,7 +1080,7 @@ dblink_cancel_query(PG_FUNCTION_ARGS) PQfreeCancel(cancel); if (res == 0) - PG_RETURN_TEXT_P(GET_TEXT("OK")); + PG_RETURN_TEXT_P(GET_TEXT("OK")); else PG_RETURN_TEXT_P(GET_TEXT(errbuf)); } @@ -1086,23 +1089,23 @@ dblink_cancel_query(PG_FUNCTION_ARGS) /* * Get error message from a connection * - * Returns text: + * Returns text: * "OK" if no error, an error message otherwise - * + * * Params: - * text connection_name - name of the connection to check - * + * text connection_name - name of the connection to check + * */ PG_FUNCTION_INFO_V1(dblink_error_message); Datum dblink_error_message(PG_FUNCTION_ARGS) { - char *msg; - PGconn *conn = NULL; - char *conname = NULL; - char *connstr = NULL; - remoteConn *rconn = NULL; - bool freeconn = false; + char *msg; + PGconn *conn = NULL; + char *conname = NULL; + char *connstr = NULL; + remoteConn *rconn = NULL; + bool freeconn = false; DBLINK_INIT; DBLINK_GET_CONN; @@ -1859,7 +1862,7 @@ get_sql_delete(Oid relid, int2vector *pkattnums, int16 pknumatts, char **tgt_pka char *relname; TupleDesc tupdesc; int natts; - StringInfoData buf; + StringInfoData buf; int i; initStringInfo(&buf); diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h index 5fb59996103..20ae203416a 100644 --- a/contrib/hstore/hstore.h +++ b/contrib/hstore/hstore.h @@ -11,39 +11,42 @@ #include "storage/bufpage.h" -typedef struct { - uint16 keylen; - uint16 vallen; - uint32 - valisnull:1, - pos:31; -} HEntry; - - -typedef struct { - int4 len; - int4 size; - char data[1]; -} HStore; +typedef struct +{ + uint16 keylen; + uint16 vallen; + uint32 + valisnull:1, + pos:31; +} HEntry; + + +typedef struct +{ + int4 len; + int4 size; + char data[1]; +} HStore; #define HSHRDSIZE (2*sizeof(int4)) #define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) ) -#define ARRPTR(x) ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) ) -#define STRPTR(x) ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) ) +#define ARRPTR(x) ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) ) +#define STRPTR(x) ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) ) -#define PG_GETARG_HS(x) ((HStore*)PG_DETOAST_DATUM(PG_GETARG_DATUM(x))) +#define PG_GETARG_HS(x) ((HStore*)PG_DETOAST_DATUM(PG_GETARG_DATUM(x))) -typedef struct { - char *key; - char *val; - uint16 keylen; - uint16 vallen; - bool isnull; - bool needfree; -} Pairs; +typedef struct +{ + char *key; + char *val; + uint16 keylen; + uint16 vallen; + bool isnull; + bool needfree; +} Pairs; -int comparePairs(const void *a, const void *b); -int uniquePairs(Pairs * a, int4 l, int4 *buflen); +int comparePairs(const void *a, const void *b); +int uniquePairs(Pairs * a, int4 l, int4 *buflen); #endif diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c index f1c87382665..4220a5541d1 100644 --- a/contrib/hstore/hstore_gist.c +++ b/contrib/hstore/hstore_gist.c @@ -7,8 +7,8 @@ /* bigint defines */ #define BITBYTE 8 -#define SIGLENINT 4 /* >122 => key will toast, so very slow!!! */ -#define SIGLEN ( sizeof(int)*SIGLENINT ) +#define SIGLENINT 4 /* >122 => key will toast, so very slow!!! */ +#define SIGLEN ( sizeof(int)*SIGLENINT ) #define SIGLENBIT (SIGLEN*BITBYTE) typedef char BITVEC[SIGLEN]; @@ -36,22 +36,23 @@ typedef char *BITVECP; #define HASHVAL(val) (((unsigned int)(val)) % SIGLENBIT) #define HASH(sign, val) SETBIT((sign), HASHVAL(val)) -typedef struct { - int4 len; - int4 flag; - char data[1]; -} GISTTYPE; +typedef struct +{ + int4 len; + int4 flag; + char data[1]; +} GISTTYPE; -#define ALLISTRUE 0x04 +#define ALLISTRUE 0x04 -#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE ) +#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE ) -#define GTHDRSIZE ( sizeof(int4)*2 ) +#define GTHDRSIZE ( sizeof(int4)*2 ) #define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) ) - -#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) ) -#define SUMBIT(val) ( \ +#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) ) + +#define SUMBIT(val) ( \ GETBITBYTE((val),0) + \ GETBITBYTE((val),1) + \ GETBITBYTE((val),2) + \ @@ -67,20 +68,22 @@ typedef struct { #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) ) PG_FUNCTION_INFO_V1(ghstore_in); -Datum ghstore_in(PG_FUNCTION_ARGS); +Datum ghstore_in(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(ghstore_out); -Datum ghstore_out(PG_FUNCTION_ARGS); - +Datum ghstore_out(PG_FUNCTION_ARGS); + Datum -ghstore_in(PG_FUNCTION_ARGS) { +ghstore_in(PG_FUNCTION_ARGS) +{ elog(ERROR, "Not implemented"); PG_RETURN_DATUM(0); } Datum -ghstore_out(PG_FUNCTION_ARGS) { +ghstore_out(PG_FUNCTION_ARGS) +{ elog(ERROR, "Not implemented"); PG_RETURN_DATUM(0); } @@ -93,36 +96,41 @@ PG_FUNCTION_INFO_V1(ghstore_picksplit); PG_FUNCTION_INFO_V1(ghstore_union); PG_FUNCTION_INFO_V1(ghstore_same); -Datum ghstore_consistent(PG_FUNCTION_ARGS); -Datum ghstore_compress(PG_FUNCTION_ARGS); -Datum ghstore_decompress(PG_FUNCTION_ARGS); -Datum ghstore_penalty(PG_FUNCTION_ARGS); -Datum ghstore_picksplit(PG_FUNCTION_ARGS); -Datum ghstore_union(PG_FUNCTION_ARGS); -Datum ghstore_same(PG_FUNCTION_ARGS); +Datum ghstore_consistent(PG_FUNCTION_ARGS); +Datum ghstore_compress(PG_FUNCTION_ARGS); +Datum ghstore_decompress(PG_FUNCTION_ARGS); +Datum ghstore_penalty(PG_FUNCTION_ARGS); +Datum ghstore_picksplit(PG_FUNCTION_ARGS); +Datum ghstore_union(PG_FUNCTION_ARGS); +Datum ghstore_same(PG_FUNCTION_ARGS); Datum -ghstore_compress(PG_FUNCTION_ARGS) { +ghstore_compress(PG_FUNCTION_ARGS) +{ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); GISTENTRY *retval = entry; - - if (entry->leafkey) { - GISTTYPE *res = (GISTTYPE*)palloc(CALCGTSIZE(0)); - HStore *toastedval = (HStore *) DatumGetPointer(entry->key); - HStore *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key)); - HEntry *ptr = ARRPTR(val); - char *words = STRPTR(val); - - memset(res,0,CALCGTSIZE(0)); - res->len=CALCGTSIZE(0); - - while(ptr-ARRPTR(val) < val->size) { - int h; - h = crc32_sz((char*)(words+ptr->pos), ptr->keylen); - HASH( GETSIGN(res), h); - if ( !ptr->valisnull ) { - h = crc32_sz((char *)(words+ptr->pos+ptr->keylen), ptr->vallen); - HASH( GETSIGN(res), h); + + if (entry->leafkey) + { + GISTTYPE *res = (GISTTYPE *) palloc(CALCGTSIZE(0)); + HStore *toastedval = (HStore *) DatumGetPointer(entry->key); + HStore *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key)); + HEntry *ptr = ARRPTR(val); + char *words = STRPTR(val); + + memset(res, 0, CALCGTSIZE(0)); + res->len = CALCGTSIZE(0); + + while (ptr - ARRPTR(val) < val->size) + { + int h; + + h = crc32_sz((char *) (words + ptr->pos), ptr->keylen); + HASH(GETSIGN(res), h); + if (!ptr->valisnull) + { + h = crc32_sz((char *) (words + ptr->pos + ptr->keylen), ptr->vallen); + HASH(GETSIGN(res), h); } ptr++; } @@ -135,14 +143,16 @@ ghstore_compress(PG_FUNCTION_ARGS) { entry->rel, entry->page, entry->offset, FALSE); - } else if ( !ISALLTRUE(DatumGetPointer(entry->key)) ) { - int4 i; + } + else if (!ISALLTRUE(DatumGetPointer(entry->key))) + { + int4 i; GISTTYPE *res; - BITVECP sign = GETSIGN(DatumGetPointer(entry->key)); - + BITVECP sign = GETSIGN(DatumGetPointer(entry->key)); + LOOPBYTE( - if ((sign[i] & 0xff) != 0xff) - PG_RETURN_POINTER(retval); + if ((sign[i] & 0xff) != 0xff) + PG_RETURN_POINTER(retval); ); res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE)); @@ -152,7 +162,7 @@ ghstore_compress(PG_FUNCTION_ARGS) { retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(res), entry->rel, entry->page, - entry->offset, + entry->offset, FALSE); } @@ -160,15 +170,17 @@ ghstore_compress(PG_FUNCTION_ARGS) { } Datum -ghstore_decompress(PG_FUNCTION_ARGS) { +ghstore_decompress(PG_FUNCTION_ARGS) +{ PG_RETURN_DATUM(PG_GETARG_DATUM(0)); } Datum -ghstore_same(PG_FUNCTION_ARGS) { +ghstore_same(PG_FUNCTION_ARGS) +{ GISTTYPE *a = (GISTTYPE *) PG_GETARG_POINTER(0); GISTTYPE *b = (GISTTYPE *) PG_GETARG_POINTER(1); - bool *result = (bool *) PG_GETARG_POINTER(2); + bool *result = (bool *) PG_GETARG_POINTER(2); if (ISALLTRUE(a) && ISALLTRUE(b)) *result = true; @@ -176,83 +188,97 @@ ghstore_same(PG_FUNCTION_ARGS) { *result = false; else if (ISALLTRUE(b)) *result = false; - else { - int4 i; - BITVECP sa = GETSIGN(a), - sb = GETSIGN(b); + else + { + int4 i; + BITVECP sa = GETSIGN(a), + sb = GETSIGN(b); + *result = true; LOOPBYTE( - if (sa[i] != sb[i]) { - *result = false; - break; - } + if (sa[i] != sb[i]) + { + *result = false; + break; + } ); } PG_RETURN_POINTER(result); } static int4 -sizebitvec(BITVECP sign) { - int4 size = 0, i; +sizebitvec(BITVECP sign) +{ + int4 size = 0, + i; + LOOPBYTE( - size += SUMBIT(sign); - sign = (BITVECP) (((char *) sign) + 1); + size += SUMBIT(sign); + sign = (BITVECP) (((char *) sign) + 1); ); return size; } - + static int -hemdistsign(BITVECP a, BITVECP b) { - int i,dist=0; +hemdistsign(BITVECP a, BITVECP b) +{ + int i, + dist = 0; LOOPBIT( - if ( GETBIT(a,i) != GETBIT(b,i) ) + if (GETBIT(a, i) != GETBIT(b, i)) dist++; ); return dist; } static int -hemdist(GISTTYPE *a, GISTTYPE *b) { - if ( ISALLTRUE(a) ) { +hemdist(GISTTYPE * a, GISTTYPE * b) +{ + if (ISALLTRUE(a)) + { if (ISALLTRUE(b)) return 0; else - return SIGLENBIT-sizebitvec(GETSIGN(b)); - } else if (ISALLTRUE(b)) - return SIGLENBIT-sizebitvec(GETSIGN(a)); + return SIGLENBIT - sizebitvec(GETSIGN(b)); + } + else if (ISALLTRUE(b)) + return SIGLENBIT - sizebitvec(GETSIGN(a)); - return hemdistsign( GETSIGN(a), GETSIGN(b) ); + return hemdistsign(GETSIGN(a), GETSIGN(b)); } static int4 unionkey(BITVECP sbase, GISTTYPE * add) { - int4 i; - BITVECP sadd = GETSIGN(add); + int4 i; + BITVECP sadd = GETSIGN(add); if (ISALLTRUE(add)) return 1; LOOPBYTE( - sbase[i] |= sadd[i]; + sbase[i] |= sadd[i]; ); return 0; } Datum -ghstore_union(PG_FUNCTION_ARGS) { - GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); - int4 len = entryvec->n; - - int *size = (int *) PG_GETARG_POINTER(1); - BITVEC base; - int4 i; - int4 flag = 0; +ghstore_union(PG_FUNCTION_ARGS) +{ + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); + int4 len = entryvec->n; + + int *size = (int *) PG_GETARG_POINTER(1); + BITVEC base; + int4 i; + int4 flag = 0; GISTTYPE *result; MemSet((void *) base, 0, sizeof(BITVEC)); - for (i = 0; i < len; i++) { - if (unionkey(base, GETENTRY(entryvec, i))) { + for (i = 0; i < len; i++) + { + if (unionkey(base, GETENTRY(entryvec, i))) + { flag = ALLISTRUE; break; } @@ -269,64 +295,72 @@ ghstore_union(PG_FUNCTION_ARGS) { } Datum -ghstore_penalty(PG_FUNCTION_ARGS) { +ghstore_penalty(PG_FUNCTION_ARGS) +{ GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0); /* always ISSIGNKEY */ GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1); - float *penalty = (float *) PG_GETARG_POINTER(2); + float *penalty = (float *) PG_GETARG_POINTER(2); GISTTYPE *origval = (GISTTYPE *) DatumGetPointer(origentry->key); GISTTYPE *newval = (GISTTYPE *) DatumGetPointer(newentry->key); - *penalty=hemdist(origval,newval); + *penalty = hemdist(origval, newval); PG_RETURN_POINTER(penalty); } -typedef struct { +typedef struct +{ OffsetNumber pos; - int4 cost; -} SPLITCOST; + int4 cost; +} SPLITCOST; static int -comparecost(const void *a, const void *b) { +comparecost(const void *a, const void *b) +{ return ((SPLITCOST *) a)->cost - ((SPLITCOST *) b)->cost; } Datum -ghstore_picksplit(PG_FUNCTION_ARGS) { - GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); +ghstore_picksplit(PG_FUNCTION_ARGS) +{ + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); OffsetNumber maxoff = entryvec->n - 2; GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); OffsetNumber k, j; - GISTTYPE *datum_l, + GISTTYPE *datum_l, *datum_r; - BITVECP union_l, + BITVECP union_l, union_r; - int4 size_alpha, size_beta; - int4 size_waste, + int4 size_alpha, + size_beta; + int4 size_waste, waste = -1; - int4 nbytes; + int4 nbytes; OffsetNumber seed_1 = 0, seed_2 = 0; OffsetNumber *left, *right; - BITVECP ptr; - int i; + BITVECP ptr; + int i; SPLITCOST *costvector; - GISTTYPE *_k, + GISTTYPE *_k, *_j; nbytes = (maxoff + 2) * sizeof(OffsetNumber); v->spl_left = (OffsetNumber *) palloc(nbytes); v->spl_right = (OffsetNumber *) palloc(nbytes); - for (k = FirstOffsetNumber; k < maxoff; k = OffsetNumberNext(k)) { + for (k = FirstOffsetNumber; k < maxoff; k = OffsetNumberNext(k)) + { _k = GETENTRY(entryvec, k); - for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j)) { - size_waste=hemdist(_k, GETENTRY(entryvec, j)); - if (size_waste > waste ) { + for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j)) + { + size_waste = hemdist(_k, GETENTRY(entryvec, j)); + if (size_waste > waste) + { waste = size_waste; seed_1 = k; seed_2 = j; @@ -346,26 +380,32 @@ ghstore_picksplit(PG_FUNCTION_ARGS) { } /* form initial .. */ - if (ISALLTRUE(GETENTRY(entryvec, seed_1))) { + if (ISALLTRUE(GETENTRY(entryvec, seed_1))) + { datum_l = (GISTTYPE *) palloc(GTHDRSIZE); datum_l->len = GTHDRSIZE; datum_l->flag = ALLISTRUE; - } else { + } + else + { datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); datum_l->len = GTHDRSIZE + SIGLEN; datum_l->flag = 0; memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC)) -; + ; } - if (ISALLTRUE(GETENTRY(entryvec, seed_2))) { + if (ISALLTRUE(GETENTRY(entryvec, seed_2))) + { datum_r = (GISTTYPE *) palloc(GTHDRSIZE); datum_r->len = GTHDRSIZE; datum_r->flag = ALLISTRUE; - } else { + } + else + { datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); datum_r->len = GTHDRSIZE + SIGLEN; datum_r->flag = 0; - memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC)) ; + memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC)); } maxoff = OffsetNumberNext(maxoff); @@ -375,50 +415,63 @@ ghstore_picksplit(PG_FUNCTION_ARGS) { { costvector[j - 1].pos = j; _j = GETENTRY(entryvec, j); - size_alpha = hemdist(datum_l,_j); - size_beta = hemdist(datum_r,_j); + size_alpha = hemdist(datum_l, _j); + size_beta = hemdist(datum_r, _j); costvector[j - 1].cost = abs(size_alpha - size_beta); } qsort((void *) costvector, maxoff, sizeof(SPLITCOST), comparecost); - union_l=GETSIGN(datum_l); - union_r=GETSIGN(datum_r); + union_l = GETSIGN(datum_l); + union_r = GETSIGN(datum_r); - for (k = 0; k < maxoff; k++) { + for (k = 0; k < maxoff; k++) + { j = costvector[k].pos; - if (j == seed_1) { + if (j == seed_1) + { *left++ = j; v->spl_nleft++; continue; - } else if (j == seed_2) { + } + else if (j == seed_2) + { *right++ = j; v->spl_nright++; continue; } _j = GETENTRY(entryvec, j); - size_alpha = hemdist(datum_l,_j); - size_beta = hemdist(datum_r,_j); + size_alpha = hemdist(datum_l, _j); + size_beta = hemdist(datum_r, _j); - if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.0001)) { - if (ISALLTRUE(datum_l) || ISALLTRUE(_j) ) { + if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.0001)) + { + if (ISALLTRUE(datum_l) || ISALLTRUE(_j)) + { if (!ISALLTRUE(datum_l)) MemSet((void *) union_l, 0xff, sizeof(BITVEC)); - } else { - ptr=GETSIGN(_j); + } + else + { + ptr = GETSIGN(_j); LOOPBYTE( - union_l[i] |= ptr[i]; + union_l[i] |= ptr[i]; ); } *left++ = j; v->spl_nleft++; - } else { - if (ISALLTRUE(datum_r) || ISALLTRUE(_j) ) { + } + else + { + if (ISALLTRUE(datum_r) || ISALLTRUE(_j)) + { if (!ISALLTRUE(datum_r)) MemSet((void *) union_r, 0xff, sizeof(BITVEC)); - } else { - ptr=GETSIGN(_j); + } + else + { + ptr = GETSIGN(_j); LOOPBYTE( - union_r[i] |= ptr[i]; + union_r[i] |= ptr[i]; ); } *right++ = j; @@ -436,36 +489,41 @@ ghstore_picksplit(PG_FUNCTION_ARGS) { } -Datum -ghstore_consistent(PG_FUNCTION_ARGS) { - GISTTYPE *entry = (GISTTYPE*) DatumGetPointer( ((GISTENTRY *) PG_GETARG_POINTER(0))->key ); - HStore *query=PG_GETARG_HS(1); - bool res=true; - HEntry *qe = ARRPTR(query); - char *qv = STRPTR(query); - BITVECP sign; - - if ( ISALLTRUE(entry) ) { - PG_FREE_IF_COPY(query,1); +Datum +ghstore_consistent(PG_FUNCTION_ARGS) +{ + GISTTYPE *entry = (GISTTYPE *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key); + HStore *query = PG_GETARG_HS(1); + bool res = true; + HEntry *qe = ARRPTR(query); + char *qv = STRPTR(query); + BITVECP sign; + + if (ISALLTRUE(entry)) + { + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(true); } - sign=GETSIGN(entry); - while(res && qe-ARRPTR(query) < query->size) { - int crc = crc32_sz((char *)(qv + qe->pos), qe->keylen); - if (GETBIT(sign,HASHVAL(crc))) { - if ( !qe->valisnull ) { - crc = crc32_sz((char *)(qv + qe->pos + qe->keylen), qe->vallen); - if ( !GETBIT(sign,HASHVAL(crc)) ) - res=false; + sign = GETSIGN(entry); + while (res && qe - ARRPTR(query) < query->size) + { + int crc = crc32_sz((char *) (qv + qe->pos), qe->keylen); + + if (GETBIT(sign, HASHVAL(crc))) + { + if (!qe->valisnull) + { + crc = crc32_sz((char *) (qv + qe->pos + qe->keylen), qe->vallen); + if (!GETBIT(sign, HASHVAL(crc))) + res = false; } - } else - res=false; + } + else + res = false; qe++; } - PG_FREE_IF_COPY(query,1); + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(res); } - - diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index 051a411a993..e01cb4e7599 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -3,304 +3,396 @@ PG_MODULE_MAGIC; -typedef struct { - char *begin; - char *ptr; - char *cur; - char *word; - int wordlen; - - Pairs *pairs; - int pcur; - int plen; -} HSParser; +typedef struct +{ + char *begin; + char *ptr; + char *cur; + char *word; + int wordlen; + + Pairs *pairs; + int pcur; + int plen; +} HSParser; #define RESIZEPRSBUF \ do { \ - if ( state->cur - state->word + 1 >= state->wordlen ) \ - { \ - int4 clen = state->cur - state->word; \ - state->wordlen *= 2; \ - state->word = (char*)repalloc( (void*)state->word, state->wordlen ); \ - state->cur = state->word + clen; \ - } \ + if ( state->cur - state->word + 1 >= state->wordlen ) \ + { \ + int4 clen = state->cur - state->word; \ + state->wordlen *= 2; \ + state->word = (char*)repalloc( (void*)state->word, state->wordlen ); \ + state->cur = state->word + clen; \ + } \ } while (0) -#define GV_WAITVAL 0 -#define GV_INVAL 1 -#define GV_INESCVAL 2 -#define GV_WAITESCIN 3 -#define GV_WAITESCESCIN 4 +#define GV_WAITVAL 0 +#define GV_INVAL 1 +#define GV_INESCVAL 2 +#define GV_WAITESCIN 3 +#define GV_WAITESCESCIN 4 static bool -get_val( HSParser *state, bool ignoreeq, bool *escaped ) { - int st = GV_WAITVAL; - state->wordlen=32; - state->cur = state->word = palloc( state->wordlen ); - *escaped=false; - - while(1) { - if ( st == GV_WAITVAL ) { - if ( *(state->ptr) == '"' ) { - *escaped=true; +get_val(HSParser * state, bool ignoreeq, bool *escaped) +{ + int st = GV_WAITVAL; + + state->wordlen = 32; + state->cur = state->word = palloc(state->wordlen); + *escaped = false; + + while (1) + { + if (st == GV_WAITVAL) + { + if (*(state->ptr) == '"') + { + *escaped = true; st = GV_INESCVAL; - } else if ( *(state->ptr) == '\0' ) { + } + else if (*(state->ptr) == '\0') + { return false; - } else if ( *(state->ptr) == '=' && !ignoreeq ) { - elog(ERROR,"Syntax error near '%c' at postion %d", *(state->ptr), (int4)(state->ptr-state->begin)); - } else if ( *(state->ptr) == '\\' ) { + } + else if (*(state->ptr) == '=' && !ignoreeq) + { + elog(ERROR, "Syntax error near '%c' at postion %d", *(state->ptr), (int4) (state->ptr - state->begin)); + } + else if (*(state->ptr) == '\\') + { st = GV_WAITESCIN; - } else if ( !isspace((unsigned char) *(state->ptr)) ) { + } + else if (!isspace((unsigned char) *(state->ptr))) + { *(state->cur) = *(state->ptr); state->cur++; st = GV_INVAL; } - } else if ( st == GV_INVAL ) { - if ( *(state->ptr) == '\\' ) { + } + else if (st == GV_INVAL) + { + if (*(state->ptr) == '\\') + { st = GV_WAITESCIN; - } else if ( *(state->ptr) == '=' && !ignoreeq ) { + } + else if (*(state->ptr) == '=' && !ignoreeq) + { state->ptr--; return true; - } else if ( *(state->ptr) == ',' && ignoreeq ) { + } + else if (*(state->ptr) == ',' && ignoreeq) + { state->ptr--; return true; - } else if ( isspace((unsigned char) *(state->ptr)) ) { + } + else if (isspace((unsigned char) *(state->ptr))) + { return true; - } else if ( *(state->ptr) == '\0' ) { + } + else if (*(state->ptr) == '\0') + { state->ptr--; return true; - } else { + } + else + { RESIZEPRSBUF; *(state->cur) = *(state->ptr); state->cur++; } - } else if ( st == GV_INESCVAL ) { - if ( *(state->ptr) == '\\' ) { + } + else if (st == GV_INESCVAL) + { + if (*(state->ptr) == '\\') + { st = GV_WAITESCESCIN; - } else if ( *(state->ptr) == '"' ) { + } + else if (*(state->ptr) == '"') + { return true; - } else if ( *(state->ptr) == '\0' ) { - elog(ERROR,"Unexpected end of string"); - } else { + } + else if (*(state->ptr) == '\0') + { + elog(ERROR, "Unexpected end of string"); + } + else + { RESIZEPRSBUF; *(state->cur) = *(state->ptr); state->cur++; } - } else if ( st == GV_WAITESCIN ) { - if ( *(state->ptr) == '\0' ) - elog(ERROR,"Unexpected end of string"); + } + else if (st == GV_WAITESCIN) + { + if (*(state->ptr) == '\0') + elog(ERROR, "Unexpected end of string"); RESIZEPRSBUF; *(state->cur) = *(state->ptr); state->cur++; - st = GV_INVAL; - } else if ( st == GV_WAITESCESCIN ) { - if ( *(state->ptr) == '\0' ) - elog(ERROR,"Unexpected end of string"); + st = GV_INVAL; + } + else if (st == GV_WAITESCESCIN) + { + if (*(state->ptr) == '\0') + elog(ERROR, "Unexpected end of string"); RESIZEPRSBUF; *(state->cur) = *(state->ptr); state->cur++; st = GV_INESCVAL; - } else - elog(ERROR,"Unknown state %d at postion line %d in file '%s'", st, __LINE__, __FILE__); + } + else + elog(ERROR, "Unknown state %d at postion line %d in file '%s'", st, __LINE__, __FILE__); state->ptr++; - } + } return false; } #define WKEY 0 #define WVAL 1 -#define WEQ 2 -#define WGT 3 +#define WEQ 2 +#define WGT 3 #define WDEL 4 static void -parse_hstore( HSParser *state ) { - int st = WKEY; - bool escaped=false; - - state->plen=16; - state->pairs = (Pairs*)palloc( sizeof(Pairs) * state->plen ); - state->pcur=0; +parse_hstore(HSParser * state) +{ + int st = WKEY; + bool escaped = false; + + state->plen = 16; + state->pairs = (Pairs *) palloc(sizeof(Pairs) * state->plen); + state->pcur = 0; state->ptr = state->begin; - state->word=NULL; + state->word = NULL; - while(1) { - if (st == WKEY) { - if ( !get_val(state, false, &escaped) ) + while (1) + { + if (st == WKEY) + { + if (!get_val(state, false, &escaped)) return; - if ( state->pcur >= state->plen ) { + if (state->pcur >= state->plen) + { state->plen *= 2; - state->pairs = (Pairs*)repalloc( state->pairs, sizeof(Pairs) * state->plen ); + state->pairs = (Pairs *) repalloc(state->pairs, sizeof(Pairs) * state->plen); } - state->pairs[ state->pcur ].key = state->word; - state->pairs[ state->pcur ].keylen = state->cur - state->word; - state->pairs[ state->pcur ].val=NULL; - state->word=NULL; + state->pairs[state->pcur].key = state->word; + state->pairs[state->pcur].keylen = state->cur - state->word; + state->pairs[state->pcur].val = NULL; + state->word = NULL; st = WEQ; - } else if ( st == WEQ ) { - if ( *(state->ptr) == '=' ) { + } + else if (st == WEQ) + { + if (*(state->ptr) == '=') + { st = WGT; - } else if ( *(state->ptr) == '\0' ) { - elog(ERROR,"Unexpectd end of string"); - } else if (!isspace((unsigned char) *(state->ptr))) { - elog(ERROR,"Syntax error near '%c' at postion %d", *(state->ptr), (int4)(state->ptr-state->begin)); } - } else if ( st == WGT ) { - if ( *(state->ptr) == '>' ) { + else if (*(state->ptr) == '\0') + { + elog(ERROR, "Unexpectd end of string"); + } + else if (!isspace((unsigned char) *(state->ptr))) + { + elog(ERROR, "Syntax error near '%c' at postion %d", *(state->ptr), (int4) (state->ptr - state->begin)); + } + } + else if (st == WGT) + { + if (*(state->ptr) == '>') + { st = WVAL; - } else if ( *(state->ptr) == '\0' ) { - elog(ERROR,"Unexpectd end of string"); - } else { - elog(ERROR,"Syntax error near '%c' at postion %d", *(state->ptr), (int4)(state->ptr-state->begin)); } - } else if ( st == WVAL ) { - if ( !get_val(state, true, &escaped) ) - elog(ERROR,"Unexpected end of string"); - state->pairs[ state->pcur ].val = state->word; - state->pairs[ state->pcur ].vallen = state->cur - state->word; - state->pairs[ state->pcur ].isnull = false; - state->pairs[ state->pcur ].needfree = true; - if ( state->cur - state->word == 4 && !escaped) { + else if (*(state->ptr) == '\0') + { + elog(ERROR, "Unexpectd end of string"); + } + else + { + elog(ERROR, "Syntax error near '%c' at postion %d", *(state->ptr), (int4) (state->ptr - state->begin)); + } + } + else if (st == WVAL) + { + if (!get_val(state, true, &escaped)) + elog(ERROR, "Unexpected end of string"); + state->pairs[state->pcur].val = state->word; + state->pairs[state->pcur].vallen = state->cur - state->word; + state->pairs[state->pcur].isnull = false; + state->pairs[state->pcur].needfree = true; + if (state->cur - state->word == 4 && !escaped) + { state->word[4] = '\0'; - if ( 0==pg_strcasecmp(state->word, "null") ) - state->pairs[ state->pcur ].isnull=true; - } - state->word=NULL; + if (0 == pg_strcasecmp(state->word, "null")) + state->pairs[state->pcur].isnull = true; + } + state->word = NULL; state->pcur++; st = WDEL; - } else if ( st == WDEL ) { - if ( *(state->ptr) == ',' ) { + } + else if (st == WDEL) + { + if (*(state->ptr) == ',') + { st = WKEY; - } else if ( *(state->ptr) == '\0' ) { + } + else if (*(state->ptr) == '\0') + { return; - } else if (!isspace((unsigned char) *(state->ptr))) { - elog(ERROR,"Syntax error near '%c' at postion %d", *(state->ptr), (int4)(state->ptr-state->begin)); } - } else - elog(ERROR,"Unknown state %d at line %d in file '%s'", st, __LINE__, __FILE__); + else if (!isspace((unsigned char) *(state->ptr))) + { + elog(ERROR, "Syntax error near '%c' at postion %d", *(state->ptr), (int4) (state->ptr - state->begin)); + } + } + else + elog(ERROR, "Unknown state %d at line %d in file '%s'", st, __LINE__, __FILE__); state->ptr++; } -} +} int -comparePairs(const void *a, const void *b) { - if ( ((Pairs*)a)->keylen == ((Pairs*)b)->keylen ) { - int res = strncmp( - ((Pairs*)a)->key, - ((Pairs*)b)->key, - ((Pairs*)a)->keylen - ); - if ( res ) +comparePairs(const void *a, const void *b) +{ + if (((Pairs *) a)->keylen == ((Pairs *) b)->keylen) + { + int res = strncmp( + ((Pairs *) a)->key, + ((Pairs *) b)->key, + ((Pairs *) a)->keylen + ); + + if (res) return res; /* guarantee that neddfree willl be later */ - if ( ((Pairs*)b)->needfree == ((Pairs*)a)->needfree ) + if (((Pairs *) b)->needfree == ((Pairs *) a)->needfree) return 0; - else if ( ((Pairs*)a)->needfree ) + else if (((Pairs *) a)->needfree) return 1; else - return -1; + return -1; } - return ( ((Pairs*)a)->keylen > ((Pairs*)b)->keylen ) ? 1 : -1; + return (((Pairs *) a)->keylen > ((Pairs *) b)->keylen) ? 1 : -1; } int -uniquePairs(Pairs * a, int4 l, int4 *buflen) { - Pairs *ptr, *res; - - *buflen=0; - if ( l < 2 ) { - if ( l==1 ) - *buflen = a->keylen + ((a->isnull) ? 0 : a->vallen) ; +uniquePairs(Pairs * a, int4 l, int4 *buflen) +{ + Pairs *ptr, + *res; + + *buflen = 0; + if (l < 2) + { + if (l == 1) + *buflen = a->keylen + ((a->isnull) ? 0 : a->vallen); return l; } qsort((void *) a, l, sizeof(Pairs), comparePairs); - ptr=a+1; - res=a; - while( ptr - a < l ) { - if ( ptr->keylen == res->keylen && strncmp( ptr->key, res->key, res->keylen )==0 ) { - if ( ptr->needfree ) { + ptr = a + 1; + res = a; + while (ptr - a < l) + { + if (ptr->keylen == res->keylen && strncmp(ptr->key, res->key, res->keylen) == 0) + { + if (ptr->needfree) + { pfree(ptr->key); pfree(ptr->val); } - } else { - *buflen += res->keylen + (( res->isnull ) ? 0 : res->vallen); + } + else + { + *buflen += res->keylen + ((res->isnull) ? 0 : res->vallen); res++; - memcpy(res,ptr,sizeof(Pairs)); + memcpy(res, ptr, sizeof(Pairs)); } ptr++; } - *buflen += res->keylen + (( res->isnull ) ? 0 : res->vallen); + *buflen += res->keylen + ((res->isnull) ? 0 : res->vallen); return res + 1 - a; } static void -freeHSParse(HSParser *state) { - int i; - - if ( state->word ) pfree( state->word ); - for (i=0;i<state->pcur;i++) - if ( state->pairs[i].needfree ) { - if (state->pairs[i].key) pfree(state->pairs[i].key); - if (state->pairs[i].val) pfree(state->pairs[i].val); +freeHSParse(HSParser * state) +{ + int i; + + if (state->word) + pfree(state->word); + for (i = 0; i < state->pcur; i++) + if (state->pairs[i].needfree) + { + if (state->pairs[i].key) + pfree(state->pairs[i].key); + if (state->pairs[i].val) + pfree(state->pairs[i].val); } - pfree( state->pairs ); + pfree(state->pairs); } PG_FUNCTION_INFO_V1(hstore_in); -Datum hstore_in(PG_FUNCTION_ARGS); +Datum hstore_in(PG_FUNCTION_ARGS); Datum -hstore_in(PG_FUNCTION_ARGS) { - HSParser state; - int4 len,buflen,i; - HStore *out; - HEntry *entries; - char *ptr; - - state.begin = PG_GETARG_CSTRING(0); +hstore_in(PG_FUNCTION_ARGS) +{ + HSParser state; + int4 len, + buflen, + i; + HStore *out; + HEntry *entries; + char *ptr; + + state.begin = PG_GETARG_CSTRING(0); parse_hstore(&state); - if ( state.pcur == 0 ) { + if (state.pcur == 0) + { freeHSParse(&state); - len = CALCDATASIZE(0,0); + len = CALCDATASIZE(0, 0); out = palloc(len); - out->len=len; - out->size=0; + out->len = len; + out->size = 0; PG_RETURN_POINTER(out); } state.pcur = uniquePairs(state.pairs, state.pcur, &buflen); - len=CALCDATASIZE(state.pcur, buflen); + len = CALCDATASIZE(state.pcur, buflen); out = palloc(len); - out->len=len; - out->size=state.pcur; + out->len = len; + out->size = state.pcur; - entries=ARRPTR(out); + entries = ARRPTR(out); ptr = STRPTR(out); - for(i=0;i<out->size;i++) { + for (i = 0; i < out->size; i++) + { entries[i].keylen = state.pairs[i].keylen; entries[i].pos = ptr - STRPTR(out); memcpy(ptr, state.pairs[i].key, state.pairs[i].keylen); - ptr+=entries[i].keylen; + ptr += entries[i].keylen; entries[i].valisnull = state.pairs[i].isnull; - if ( entries[i].valisnull ) - entries[i].vallen=4; /* null */ - else { + if (entries[i].valisnull) + entries[i].vallen = 4; /* null */ + else + { entries[i].vallen = state.pairs[i].vallen; - memcpy(ptr, state.pairs[i].val,state.pairs[i].vallen); - ptr+=entries[i].vallen; + memcpy(ptr, state.pairs[i].val, state.pairs[i].vallen); + ptr += entries[i].vallen; } } @@ -308,63 +400,74 @@ hstore_in(PG_FUNCTION_ARGS) { PG_RETURN_POINTER(out); } -static char* -cpw(char *dst, char *src, int len) { - char *ptr = src; +static char * +cpw(char *dst, char *src, int len) +{ + char *ptr = src; - while(ptr-src<len) { - if ( *ptr == '"' || *ptr == '\\' ) - *dst++='\\'; + while (ptr - src < len) + { + if (*ptr == '"' || *ptr == '\\') + *dst++ = '\\'; *dst++ = *ptr++; } return dst; } PG_FUNCTION_INFO_V1(hstore_out); -Datum hstore_out(PG_FUNCTION_ARGS); +Datum hstore_out(PG_FUNCTION_ARGS); Datum -hstore_out(PG_FUNCTION_ARGS) { - HStore *in = PG_GETARG_HS(0); - int buflen,i; - char *out,*ptr; - char *base = STRPTR(in); - HEntry *entries = ARRPTR(in); - - if ( in->size==0 ) { - out=palloc(1); - *out='\0'; - PG_FREE_IF_COPY(in,0); +hstore_out(PG_FUNCTION_ARGS) +{ + HStore *in = PG_GETARG_HS(0); + int buflen, + i; + char *out, + *ptr; + char *base = STRPTR(in); + HEntry *entries = ARRPTR(in); + + if (in->size == 0) + { + out = palloc(1); + *out = '\0'; + PG_FREE_IF_COPY(in, 0); PG_RETURN_CSTRING(out); } - buflen = ( 4 /* " */ + 2 /* => */ + 2 /*, */ )*in->size + - 2 /* esc */ * ( in->len - CALCDATASIZE(in->size,0) ); - - out=ptr=palloc(buflen); - for(i=0;i<in->size;i++) { - *ptr++='"'; - ptr = cpw( ptr, base + entries[i].pos, entries[i].keylen ); - *ptr++='"'; - *ptr++='='; - *ptr++='>'; - if ( entries[i].valisnull ) { - *ptr++='N'; - *ptr++='U'; - *ptr++='L'; - *ptr++='L'; - } else { - *ptr++='"'; - ptr = cpw( ptr, base + entries[i].pos + entries[i].keylen, entries[i].vallen ); - *ptr++='"'; + buflen = (4 /* " */ + 2 /* => */ + 2 /* , */ ) * in->size + + 2 /* esc */ * (in->len - CALCDATASIZE(in->size, 0)); + + out = ptr = palloc(buflen); + for (i = 0; i < in->size; i++) + { + *ptr++ = '"'; + ptr = cpw(ptr, base + entries[i].pos, entries[i].keylen); + *ptr++ = '"'; + *ptr++ = '='; + *ptr++ = '>'; + if (entries[i].valisnull) + { + *ptr++ = 'N'; + *ptr++ = 'U'; + *ptr++ = 'L'; + *ptr++ = 'L'; + } + else + { + *ptr++ = '"'; + ptr = cpw(ptr, base + entries[i].pos + entries[i].keylen, entries[i].vallen); + *ptr++ = '"'; } - if ( i+1 != in->size ) { - *ptr++=','; - *ptr++=' '; + if (i + 1 != in->size) + { + *ptr++ = ','; + *ptr++ = ' '; } } - *ptr='\0'; + *ptr = '\0'; - PG_FREE_IF_COPY(in,0); + PG_FREE_IF_COPY(in, 0); PG_RETURN_CSTRING(out); } diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c index 12f783cb256..971e93cf314 100644 --- a/contrib/hstore/hstore_op.c +++ b/contrib/hstore/hstore_op.c @@ -7,20 +7,22 @@ static HEntry * -findkey(HStore *hs, char *key, int keylen) { - HEntry *StopLow = ARRPTR(hs); - HEntry *StopHigh = StopLow + hs->size; - HEntry *StopMiddle; - int difference; - char *base = STRPTR(hs); - - while (StopLow < StopHigh) { +findkey(HStore * hs, char *key, int keylen) +{ + HEntry *StopLow = ARRPTR(hs); + HEntry *StopHigh = StopLow + hs->size; + HEntry *StopMiddle; + int difference; + char *base = STRPTR(hs); + + while (StopLow < StopHigh) + { StopMiddle = StopLow + (StopHigh - StopLow) / 2; - if ( StopMiddle->keylen == keylen ) - difference=strncmp(base+StopMiddle->pos, key, StopMiddle->keylen); + if (StopMiddle->keylen == keylen) + difference = strncmp(base + StopMiddle->pos, key, StopMiddle->keylen); else - difference=(StopMiddle->keylen > keylen) ? 1 : -1; + difference = (StopMiddle->keylen > keylen) ? 1 : -1; if (difference == 0) return StopMiddle; @@ -29,520 +31,583 @@ findkey(HStore *hs, char *key, int keylen) { else StopHigh = StopMiddle; } - + return NULL; } PG_FUNCTION_INFO_V1(fetchval); -Datum fetchval(PG_FUNCTION_ARGS); +Datum fetchval(PG_FUNCTION_ARGS); Datum -fetchval(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - text *key = PG_GETARG_TEXT_P(1); - HEntry *entry; - text *out; - - if ((entry=findkey(hs,VARDATA(key), VARSIZE(key)-VARHDRSZ))==NULL || entry->valisnull) { - PG_FREE_IF_COPY(hs,0); - PG_FREE_IF_COPY(key,1); +fetchval(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + text *key = PG_GETARG_TEXT_P(1); + HEntry *entry; + text *out; + + if ((entry = findkey(hs, VARDATA(key), VARSIZE(key) - VARHDRSZ)) == NULL || entry->valisnull) + { + PG_FREE_IF_COPY(hs, 0); + PG_FREE_IF_COPY(key, 1); PG_RETURN_NULL(); } - out=palloc(VARHDRSZ+entry->vallen); - memcpy(VARDATA(out),STRPTR(hs) + entry->pos + entry->keylen, entry->vallen); - VARATT_SIZEP(out) = VARHDRSZ+entry->vallen; + out = palloc(VARHDRSZ + entry->vallen); + memcpy(VARDATA(out), STRPTR(hs) + entry->pos + entry->keylen, entry->vallen); + VARATT_SIZEP(out) = VARHDRSZ + entry->vallen; - PG_FREE_IF_COPY(hs,0); - PG_FREE_IF_COPY(key,1); + PG_FREE_IF_COPY(hs, 0); + PG_FREE_IF_COPY(key, 1); PG_RETURN_POINTER(out); } PG_FUNCTION_INFO_V1(exists); -Datum exists(PG_FUNCTION_ARGS); +Datum exists(PG_FUNCTION_ARGS); Datum -exists(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - text *key = PG_GETARG_TEXT_P(1); - HEntry *entry; +exists(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + text *key = PG_GETARG_TEXT_P(1); + HEntry *entry; - entry=findkey(hs,VARDATA(key), VARSIZE(key)-VARHDRSZ); + entry = findkey(hs, VARDATA(key), VARSIZE(key) - VARHDRSZ); - PG_FREE_IF_COPY(hs,0); - PG_FREE_IF_COPY(key,1); + PG_FREE_IF_COPY(hs, 0); + PG_FREE_IF_COPY(key, 1); PG_RETURN_BOOL(entry); } PG_FUNCTION_INFO_V1(defined); -Datum defined(PG_FUNCTION_ARGS); +Datum defined(PG_FUNCTION_ARGS); Datum -defined(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - text *key = PG_GETARG_TEXT_P(1); - HEntry *entry; - bool res; +defined(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + text *key = PG_GETARG_TEXT_P(1); + HEntry *entry; + bool res; - entry=findkey(hs,VARDATA(key), VARSIZE(key)-VARHDRSZ); + entry = findkey(hs, VARDATA(key), VARSIZE(key) - VARHDRSZ); - res = ( entry && !entry->valisnull ) ? true : false; + res = (entry && !entry->valisnull) ? true : false; - PG_FREE_IF_COPY(hs,0); - PG_FREE_IF_COPY(key,1); + PG_FREE_IF_COPY(hs, 0); + PG_FREE_IF_COPY(key, 1); PG_RETURN_BOOL(res); } PG_FUNCTION_INFO_V1(delete); -Datum delete(PG_FUNCTION_ARGS); +Datum delete(PG_FUNCTION_ARGS); Datum -delete(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - text *key = PG_GETARG_TEXT_P(1); - HStore *out = palloc(hs->len); - char *ptrs, *ptrd; - HEntry *es, *ed; - - out->len=hs->len; - out->size=hs->size; /* temprorary! */ - - ptrs=STRPTR(hs); - es =ARRPTR(hs); - ptrd=STRPTR(out); - ed =ARRPTR(out); - - while( es - ARRPTR(hs) < hs->size ) { - if ( !(es->keylen == VARSIZE(key) - VARHDRSZ && strncmp(ptrs, VARDATA(key), es->keylen)==0) ) { - memcpy( ed, es, sizeof(HEntry) ); - memcpy( ptrd, ptrs, es->keylen + ( (es->valisnull) ? 0 : es->vallen ) ); +delete(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + text *key = PG_GETARG_TEXT_P(1); + HStore *out = palloc(hs->len); + char *ptrs, + *ptrd; + HEntry *es, + *ed; + + out->len = hs->len; + out->size = hs->size; /* temprorary! */ + + ptrs = STRPTR(hs); + es = ARRPTR(hs); + ptrd = STRPTR(out); + ed = ARRPTR(out); + + while (es - ARRPTR(hs) < hs->size) + { + if (!(es->keylen == VARSIZE(key) - VARHDRSZ && strncmp(ptrs, VARDATA(key), es->keylen) == 0)) + { + memcpy(ed, es, sizeof(HEntry)); + memcpy(ptrd, ptrs, es->keylen + ((es->valisnull) ? 0 : es->vallen)); ed->pos = ptrd - STRPTR(out); - ptrd += es->keylen + ( (es->valisnull) ? 0 : es->vallen ); + ptrd += es->keylen + ((es->valisnull) ? 0 : es->vallen); ed++; } - ptrs += es->keylen + ( (es->valisnull) ? 0 : es->vallen ); + ptrs += es->keylen + ((es->valisnull) ? 0 : es->vallen); es++; } - if ( ed - ARRPTR(out) != out->size ) { - int buflen=ptrd-STRPTR(out); + if (ed - ARRPTR(out) != out->size) + { + int buflen = ptrd - STRPTR(out); + ptrd = STRPTR(out); out->size = ed - ARRPTR(out); - memmove( STRPTR(out), ptrd, buflen); + memmove(STRPTR(out), ptrd, buflen); out->len = CALCDATASIZE(out->size, buflen); } - - PG_FREE_IF_COPY(hs,0); - PG_FREE_IF_COPY(key,1); + + PG_FREE_IF_COPY(hs, 0); + PG_FREE_IF_COPY(key, 1); PG_RETURN_POINTER(out); } PG_FUNCTION_INFO_V1(hs_concat); -Datum hs_concat(PG_FUNCTION_ARGS); +Datum hs_concat(PG_FUNCTION_ARGS); Datum -hs_concat(PG_FUNCTION_ARGS) { - HStore *s1 = PG_GETARG_HS(0); - HStore *s2 = PG_GETARG_HS(1); - HStore *out = palloc( s1->len + s2->len ); - char *ps1, *ps2, *pd; - HEntry *es1, *es2, *ed; +hs_concat(PG_FUNCTION_ARGS) +{ + HStore *s1 = PG_GETARG_HS(0); + HStore *s2 = PG_GETARG_HS(1); + HStore *out = palloc(s1->len + s2->len); + char *ps1, + *ps2, + *pd; + HEntry *es1, + *es2, + *ed; out->len = s1->len + s2->len; out->size = s1->size + s2->size; - ps1=STRPTR(s1); - ps2=STRPTR(s2); - pd=STRPTR(out); - es1=ARRPTR(s1); - es2=ARRPTR(s2); - ed=ARRPTR(out); - - while( es1 - ARRPTR(s1) < s1->size && es2 - ARRPTR(s2) < s2->size ) { - int difference; - if ( es1->keylen == es2->keylen ) - difference=strncmp(ps1, ps2, es1->keylen); + ps1 = STRPTR(s1); + ps2 = STRPTR(s2); + pd = STRPTR(out); + es1 = ARRPTR(s1); + es2 = ARRPTR(s2); + ed = ARRPTR(out); + + while (es1 - ARRPTR(s1) < s1->size && es2 - ARRPTR(s2) < s2->size) + { + int difference; + + if (es1->keylen == es2->keylen) + difference = strncmp(ps1, ps2, es1->keylen); else - difference=(es1->keylen > es2->keylen) ? 1 : -1; + difference = (es1->keylen > es2->keylen) ? 1 : -1; - if ( difference == 0 ) { - memcpy( ed, es2, sizeof(HEntry) ); - memcpy( pd, ps2, es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ) ); + if (difference == 0) + { + memcpy(ed, es2, sizeof(HEntry)); + memcpy(pd, ps2, es2->keylen + ((es2->valisnull) ? 0 : es2->vallen)); ed->pos = pd - STRPTR(out); - pd += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + pd += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); ed++; - - ps1 += es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ); + + ps1 += es1->keylen + ((es1->valisnull) ? 0 : es1->vallen); es1++; - ps2 += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + ps2 += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); es2++; - } else if ( difference > 0 ) { - memcpy( ed, es2, sizeof(HEntry) ); - memcpy( pd, ps2, es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ) ); + } + else if (difference > 0) + { + memcpy(ed, es2, sizeof(HEntry)); + memcpy(pd, ps2, es2->keylen + ((es2->valisnull) ? 0 : es2->vallen)); ed->pos = pd - STRPTR(out); - pd += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + pd += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); ed++; - - ps2 += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + + ps2 += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); es2++; - } else { - memcpy( ed, es1, sizeof(HEntry) ); - memcpy( pd, ps1, es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ) ); + } + else + { + memcpy(ed, es1, sizeof(HEntry)); + memcpy(pd, ps1, es1->keylen + ((es1->valisnull) ? 0 : es1->vallen)); ed->pos = pd - STRPTR(out); - pd += es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ); + pd += es1->keylen + ((es1->valisnull) ? 0 : es1->vallen); ed++; - - ps1 += es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ); + + ps1 += es1->keylen + ((es1->valisnull) ? 0 : es1->vallen); es1++; } } - while( es1 - ARRPTR(s1) < s1->size ) { - memcpy( ed, es1, sizeof(HEntry) ); - memcpy( pd, ps1, es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ) ); + while (es1 - ARRPTR(s1) < s1->size) + { + memcpy(ed, es1, sizeof(HEntry)); + memcpy(pd, ps1, es1->keylen + ((es1->valisnull) ? 0 : es1->vallen)); ed->pos = pd - STRPTR(out); - pd += es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ); + pd += es1->keylen + ((es1->valisnull) ? 0 : es1->vallen); ed++; - - ps1 += es1->keylen + ( (es1->valisnull) ? 0 : es1->vallen ); + + ps1 += es1->keylen + ((es1->valisnull) ? 0 : es1->vallen); es1++; } - while( es2 - ARRPTR(s2) < s2->size ) { - memcpy( ed, es2, sizeof(HEntry) ); - memcpy( pd, ps2, es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ) ); + while (es2 - ARRPTR(s2) < s2->size) + { + memcpy(ed, es2, sizeof(HEntry)); + memcpy(pd, ps2, es2->keylen + ((es2->valisnull) ? 0 : es2->vallen)); ed->pos = pd - STRPTR(out); - pd += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + pd += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); ed++; - - ps2 += es2->keylen + ( (es2->valisnull) ? 0 : es2->vallen ); + + ps2 += es2->keylen + ((es2->valisnull) ? 0 : es2->vallen); es2++; } - if ( ed - ARRPTR(out) != out->size ) { - int buflen=pd-STRPTR(out); + if (ed - ARRPTR(out) != out->size) + { + int buflen = pd - STRPTR(out); + pd = STRPTR(out); out->size = ed - ARRPTR(out); - memmove( STRPTR(out), pd, buflen); + memmove(STRPTR(out), pd, buflen); out->len = CALCDATASIZE(out->size, buflen); } - - PG_FREE_IF_COPY(s1,0); - PG_FREE_IF_COPY(s2,1); + + PG_FREE_IF_COPY(s1, 0); + PG_FREE_IF_COPY(s2, 1); PG_RETURN_POINTER(out); } PG_FUNCTION_INFO_V1(tconvert); -Datum tconvert(PG_FUNCTION_ARGS); +Datum tconvert(PG_FUNCTION_ARGS); Datum -tconvert(PG_FUNCTION_ARGS) { - text *key = PG_GETARG_TEXT_P(0); - text *val = PG_GETARG_TEXT_P(1); - int len; - HStore *out; - - len=CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2*VARHDRSZ); +tconvert(PG_FUNCTION_ARGS) +{ + text *key = PG_GETARG_TEXT_P(0); + text *val = PG_GETARG_TEXT_P(1); + int len; + HStore *out; + + len = CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2 * VARHDRSZ); out = palloc(len); - out->len=len; - out->size=1; + out->len = len; + out->size = 1; ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ; ARRPTR(out)->vallen = VARSIZE(val) - VARHDRSZ; ARRPTR(out)->valisnull = false; - ARRPTR(out)->pos=0; + ARRPTR(out)->pos = 0; - memcpy( STRPTR(out), VARDATA(key), ARRPTR(out)->keylen ); - memcpy( STRPTR(out) + ARRPTR(out)->keylen, VARDATA(val), ARRPTR(out)->vallen ); - - PG_FREE_IF_COPY(key,0); - PG_FREE_IF_COPY(val,1); + memcpy(STRPTR(out), VARDATA(key), ARRPTR(out)->keylen); + memcpy(STRPTR(out) + ARRPTR(out)->keylen, VARDATA(val), ARRPTR(out)->vallen); + + PG_FREE_IF_COPY(key, 0); + PG_FREE_IF_COPY(val, 1); PG_RETURN_POINTER(out); } PG_FUNCTION_INFO_V1(akeys); -Datum akeys(PG_FUNCTION_ARGS); +Datum akeys(PG_FUNCTION_ARGS); Datum -akeys(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - Datum *d; - ArrayType *a; - HEntry *ptr=ARRPTR(hs); - char *base=STRPTR(hs); - - d=(Datum*)palloc(sizeof(Datum)*(hs->size+1)); - while( ptr-ARRPTR(hs) < hs->size ) { - text *item=(text*)palloc(VARHDRSZ + ptr->keylen); - VARATT_SIZEP(item) = VARHDRSZ+ptr->keylen; +akeys(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + Datum *d; + ArrayType *a; + HEntry *ptr = ARRPTR(hs); + char *base = STRPTR(hs); + + d = (Datum *) palloc(sizeof(Datum) * (hs->size + 1)); + while (ptr - ARRPTR(hs) < hs->size) + { + text *item = (text *) palloc(VARHDRSZ + ptr->keylen); + + VARATT_SIZEP(item) = VARHDRSZ + ptr->keylen; memcpy(VARDATA(item), base + ptr->pos, ptr->keylen); - d[ ptr-ARRPTR(hs) ] = PointerGetDatum(item); + d[ptr - ARRPTR(hs)] = PointerGetDatum(item); ptr++; } - + a = construct_array( - d, - hs->size, - TEXTOID, - -1, - false, - 'i' - ); - - ptr=ARRPTR(hs); - while( ptr-ARRPTR(hs) < hs->size ) { - pfree(DatumGetPointer(d[ ptr-ARRPTR(hs) ])); + d, + hs->size, + TEXTOID, + -1, + false, + 'i' + ); + + ptr = ARRPTR(hs); + while (ptr - ARRPTR(hs) < hs->size) + { + pfree(DatumGetPointer(d[ptr - ARRPTR(hs)])); ptr++; } pfree(d); - PG_FREE_IF_COPY(hs,0); + PG_FREE_IF_COPY(hs, 0); PG_RETURN_POINTER(a); } PG_FUNCTION_INFO_V1(avals); -Datum avals(PG_FUNCTION_ARGS); +Datum avals(PG_FUNCTION_ARGS); Datum -avals(PG_FUNCTION_ARGS) { - HStore *hs = PG_GETARG_HS(0); - Datum *d; - ArrayType *a; - HEntry *ptr=ARRPTR(hs); - char *base=STRPTR(hs); - - d=(Datum*)palloc(sizeof(Datum)*(hs->size+1)); - while( ptr-ARRPTR(hs) < hs->size ) { - int vallen = (ptr->valisnull) ? 0 : ptr->vallen; - text *item=(text*)palloc(VARHDRSZ + vallen); - VARATT_SIZEP(item) = VARHDRSZ+vallen; +avals(PG_FUNCTION_ARGS) +{ + HStore *hs = PG_GETARG_HS(0); + Datum *d; + ArrayType *a; + HEntry *ptr = ARRPTR(hs); + char *base = STRPTR(hs); + + d = (Datum *) palloc(sizeof(Datum) * (hs->size + 1)); + while (ptr - ARRPTR(hs) < hs->size) + { + int vallen = (ptr->valisnull) ? 0 : ptr->vallen; + text *item = (text *) palloc(VARHDRSZ + vallen); + + VARATT_SIZEP(item) = VARHDRSZ + vallen; memcpy(VARDATA(item), base + ptr->pos + ptr->keylen, vallen); - d[ ptr-ARRPTR(hs) ] = PointerGetDatum(item); + d[ptr - ARRPTR(hs)] = PointerGetDatum(item); ptr++; } - + a = construct_array( - d, - hs->size, - TEXTOID, - -1, - false, - 'i' - ); - - ptr=ARRPTR(hs); - while( ptr-ARRPTR(hs) < hs->size ) { - pfree(DatumGetPointer(d[ ptr-ARRPTR(hs) ])); + d, + hs->size, + TEXTOID, + -1, + false, + 'i' + ); + + ptr = ARRPTR(hs); + while (ptr - ARRPTR(hs) < hs->size) + { + pfree(DatumGetPointer(d[ptr - ARRPTR(hs)])); ptr++; } pfree(d); - PG_FREE_IF_COPY(hs,0); + PG_FREE_IF_COPY(hs, 0); PG_RETURN_POINTER(a); } -typedef struct { - HStore *hs; - int i; -} AKStore; +typedef struct +{ + HStore *hs; + int i; +} AKStore; static void -setup_firstcall(FuncCallContext *funcctx, HStore *hs) { - MemoryContext oldcontext; - AKStore *st; +setup_firstcall(FuncCallContext *funcctx, HStore * hs) +{ + MemoryContext oldcontext; + AKStore *st; oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - st=(AKStore*)palloc( sizeof(AKStore) ); - st->i=0; - st->hs = (HStore*)palloc(hs->len); - memcpy( st->hs, hs, hs->len ); + st = (AKStore *) palloc(sizeof(AKStore)); + st->i = 0; + st->hs = (HStore *) palloc(hs->len); + memcpy(st->hs, hs, hs->len); - funcctx->user_fctx = (void*)st; + funcctx->user_fctx = (void *) st; MemoryContextSwitchTo(oldcontext); } PG_FUNCTION_INFO_V1(skeys); -Datum skeys(PG_FUNCTION_ARGS); +Datum skeys(PG_FUNCTION_ARGS); Datum -skeys(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - AKStore *st; +skeys(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + AKStore *st; + + if (SRF_IS_FIRSTCALL()) + { + HStore *hs = PG_GETARG_HS(0); - if (SRF_IS_FIRSTCALL()) { - HStore *hs = PG_GETARG_HS(0); funcctx = SRF_FIRSTCALL_INIT(); setup_firstcall(funcctx, hs); - PG_FREE_IF_COPY(hs,0); + PG_FREE_IF_COPY(hs, 0); } funcctx = SRF_PERCALL_SETUP(); - st = (AKStore*)funcctx->user_fctx; - - if ( st->i < st->hs->size ) { - HEntry *ptr = &(ARRPTR(st->hs)[st->i]); - text *item=(text*)palloc(VARHDRSZ + ptr->keylen); + st = (AKStore *) funcctx->user_fctx; + + if (st->i < st->hs->size) + { + HEntry *ptr = &(ARRPTR(st->hs)[st->i]); + text *item = (text *) palloc(VARHDRSZ + ptr->keylen); - VARATT_SIZEP(item) = VARHDRSZ+ptr->keylen; + VARATT_SIZEP(item) = VARHDRSZ + ptr->keylen; memcpy(VARDATA(item), STRPTR(st->hs) + ptr->pos, ptr->keylen); st->i++; SRF_RETURN_NEXT(funcctx, PointerGetDatum(item)); } - - pfree( st->hs ); - pfree( st ); - SRF_RETURN_DONE(funcctx); + pfree(st->hs); + pfree(st); + + SRF_RETURN_DONE(funcctx); } PG_FUNCTION_INFO_V1(svals); -Datum svals(PG_FUNCTION_ARGS); +Datum svals(PG_FUNCTION_ARGS); Datum -svals(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - AKStore *st; +svals(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + AKStore *st; + + if (SRF_IS_FIRSTCALL()) + { + HStore *hs = PG_GETARG_HS(0); - if (SRF_IS_FIRSTCALL()) { - HStore *hs = PG_GETARG_HS(0); funcctx = SRF_FIRSTCALL_INIT(); setup_firstcall(funcctx, hs); - PG_FREE_IF_COPY(hs,0); + PG_FREE_IF_COPY(hs, 0); } funcctx = SRF_PERCALL_SETUP(); - st = (AKStore*)funcctx->user_fctx; - - if ( st->i < st->hs->size ) { - HEntry *ptr = &(ARRPTR(st->hs)[st->i]); + st = (AKStore *) funcctx->user_fctx; - if ( ptr->valisnull ) { - ReturnSetInfo *rsi; + if (st->i < st->hs->size) + { + HEntry *ptr = &(ARRPTR(st->hs)[st->i]); + + if (ptr->valisnull) + { + ReturnSetInfo *rsi; st->i++; (funcctx)->call_cntr++; rsi = (ReturnSetInfo *) fcinfo->resultinfo; rsi->isDone = ExprMultipleResult; PG_RETURN_NULL(); - } else { - int vallen = ptr->vallen; - text *item=(text*)palloc(VARHDRSZ + vallen); + } + else + { + int vallen = ptr->vallen; + text *item = (text *) palloc(VARHDRSZ + vallen); - VARATT_SIZEP(item) = VARHDRSZ+vallen; + VARATT_SIZEP(item) = VARHDRSZ + vallen; memcpy(VARDATA(item), STRPTR(st->hs) + ptr->pos + ptr->keylen, vallen); st->i++; SRF_RETURN_NEXT(funcctx, PointerGetDatum(item)); } } - - pfree( st->hs ); - pfree( st ); - SRF_RETURN_DONE(funcctx); + pfree(st->hs); + pfree(st); + + SRF_RETURN_DONE(funcctx); } PG_FUNCTION_INFO_V1(hs_contains); -Datum hs_contains(PG_FUNCTION_ARGS); +Datum hs_contains(PG_FUNCTION_ARGS); Datum -hs_contains(PG_FUNCTION_ARGS) { - HStore *val = PG_GETARG_HS(0); - HStore *tmpl = PG_GETARG_HS(1); - bool res = true; - HEntry *te = ARRPTR(tmpl); - char *vv = STRPTR(val); - char *tv = STRPTR(tmpl); - - while(res && te-ARRPTR(tmpl) < tmpl->size) { - HEntry *entry = findkey(val, tv + te->pos, te->keylen); - if ( entry ) { - if ( ! te->valisnull ) { - if ( entry->valisnull || !( - te->vallen==entry->vallen && - strncmp( - vv + entry->pos + entry->keylen, - tv + te->pos + te->keylen, - te->vallen ) == 0 - ) ) - res=false; +hs_contains(PG_FUNCTION_ARGS) +{ + HStore *val = PG_GETARG_HS(0); + HStore *tmpl = PG_GETARG_HS(1); + bool res = true; + HEntry *te = ARRPTR(tmpl); + char *vv = STRPTR(val); + char *tv = STRPTR(tmpl); + + while (res && te - ARRPTR(tmpl) < tmpl->size) + { + HEntry *entry = findkey(val, tv + te->pos, te->keylen); + + if (entry) + { + if (!te->valisnull) + { + if (entry->valisnull || !( + te->vallen == entry->vallen && + strncmp( + vv + entry->pos + entry->keylen, + tv + te->pos + te->keylen, + te->vallen) == 0 + )) + res = false; } - } else + } + else res = false; te++; } - PG_FREE_IF_COPY(val,0); - PG_FREE_IF_COPY(tmpl,1); + PG_FREE_IF_COPY(val, 0); + PG_FREE_IF_COPY(tmpl, 1); PG_RETURN_BOOL(res); } - + PG_FUNCTION_INFO_V1(hs_contained); -Datum hs_contained(PG_FUNCTION_ARGS); +Datum hs_contained(PG_FUNCTION_ARGS); Datum -hs_contained(PG_FUNCTION_ARGS) { - PG_RETURN_DATUM( DirectFunctionCall2( - hs_contains, - PG_GETARG_DATUM(1), - PG_GETARG_DATUM(0) - )); +hs_contained(PG_FUNCTION_ARGS) +{ + PG_RETURN_DATUM(DirectFunctionCall2( + hs_contains, + PG_GETARG_DATUM(1), + PG_GETARG_DATUM(0) + )); } PG_FUNCTION_INFO_V1(each); -Datum each(PG_FUNCTION_ARGS); +Datum each(PG_FUNCTION_ARGS); Datum -each(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - AKStore *st; +each(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + AKStore *st; - if (SRF_IS_FIRSTCALL()) { - TupleDesc tupdesc; - MemoryContext oldcontext; - HStore *hs = PG_GETARG_HS(0); + if (SRF_IS_FIRSTCALL()) + { + TupleDesc tupdesc; + MemoryContext oldcontext; + HStore *hs = PG_GETARG_HS(0); funcctx = SRF_FIRSTCALL_INIT(); oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - st=(AKStore*)palloc( sizeof(AKStore) ); - st->i=0; - st->hs = (HStore*)palloc(hs->len); - memcpy( st->hs, hs, hs->len ); - funcctx->user_fctx = (void*)st; - + st = (AKStore *) palloc(sizeof(AKStore)); + st->i = 0; + st->hs = (HStore *) palloc(hs->len); + memcpy(st->hs, hs, hs->len); + funcctx->user_fctx = (void *) st; + tupdesc = RelationNameGetTupleDesc("hs_each"); funcctx->slot = TupleDescGetSlot(tupdesc); funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); MemoryContextSwitchTo(oldcontext); - PG_FREE_IF_COPY(hs,0); + PG_FREE_IF_COPY(hs, 0); } funcctx = SRF_PERCALL_SETUP(); - st = (AKStore*)funcctx->user_fctx; - - if ( st->i < st->hs->size ) { - HEntry *ptr = &(ARRPTR(st->hs)[st->i]); - Datum res, dvalues[2]; - char nulls[] = {' ', ' '}; - text *item; - HeapTuple tuple; - - item=(text*)palloc(VARHDRSZ + ptr->keylen); - VARATT_SIZEP(item) = VARHDRSZ+ptr->keylen; + st = (AKStore *) funcctx->user_fctx; + + if (st->i < st->hs->size) + { + HEntry *ptr = &(ARRPTR(st->hs)[st->i]); + Datum res, + dvalues[2]; + char nulls[] = {' ', ' '}; + text *item; + HeapTuple tuple; + + item = (text *) palloc(VARHDRSZ + ptr->keylen); + VARATT_SIZEP(item) = VARHDRSZ + ptr->keylen; memcpy(VARDATA(item), STRPTR(st->hs) + ptr->pos, ptr->keylen); dvalues[0] = PointerGetDatum(item); - if ( ptr->valisnull ) { - dvalues[1]=(Datum)0; - nulls[1]='n'; - } else { - int vallen = ptr->vallen; + if (ptr->valisnull) + { + dvalues[1] = (Datum) 0; + nulls[1] = 'n'; + } + else + { + int vallen = ptr->vallen; - item=(text*)palloc(VARHDRSZ + vallen); - VARATT_SIZEP(item) = VARHDRSZ+vallen; + item = (text *) palloc(VARHDRSZ + vallen); + VARATT_SIZEP(item) = VARHDRSZ + vallen; memcpy(VARDATA(item), STRPTR(st->hs) + ptr->pos + ptr->keylen, vallen); dvalues[1] = PointerGetDatum(item); } @@ -551,17 +616,15 @@ each(PG_FUNCTION_ARGS) { tuple = heap_formtuple(funcctx->attinmeta->tupdesc, dvalues, nulls); res = TupleGetDatum(funcctx->slot, tuple); - pfree( DatumGetPointer(dvalues[0]) ); - if ( nulls[1] != 'n' ) - pfree( DatumGetPointer(dvalues[1]) ); + pfree(DatumGetPointer(dvalues[0])); + if (nulls[1] != 'n') + pfree(DatumGetPointer(dvalues[1])); SRF_RETURN_NEXT(funcctx, PointerGetDatum(res)); } - - pfree( st->hs ); - pfree( st ); - - SRF_RETURN_DONE(funcctx); -} + pfree(st->hs); + pfree(st); + SRF_RETURN_DONE(funcctx); +} diff --git a/contrib/intarray/_int.h b/contrib/intarray/_int.h index f40dc06a92c..bf10f109220 100644 --- a/contrib/intarray/_int.h +++ b/contrib/intarray/_int.h @@ -154,17 +154,17 @@ typedef struct #define COMPUTESIZE(size) ( HDRSIZEQT + size * sizeof(ITEM) ) #define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT ) -#define END 0 -#define ERR 1 -#define VAL 2 -#define OPR 3 -#define OPEN 4 -#define CLOSE 5 +#define END 0 +#define ERR 1 +#define VAL 2 +#define OPR 3 +#define OPEN 4 +#define CLOSE 5 bool signconsistent(QUERYTYPE * query, BITVEC sign, bool calcnot); bool execconsistent(QUERYTYPE * query, ArrayType *array, bool calcnot); -bool ginconsistent(QUERYTYPE * query, bool *check); -int4 shorterquery(ITEM * q, int4 len); +bool ginconsistent(QUERYTYPE * query, bool *check); +int4 shorterquery(ITEM * q, int4 len); int compASC(const void *a, const void *b); diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c index 230c412a048..8517010e5ed 100644 --- a/contrib/intarray/_int_bool.c +++ b/contrib/intarray/_int_bool.c @@ -232,7 +232,7 @@ typedef struct * is there value 'val' in array or not ? */ static bool -checkcondition_arr(void *checkval, ITEM *item) +checkcondition_arr(void *checkval, ITEM * item) { int4 *StopLow = ((CHKVAL *) checkval)->arrb; int4 *StopHigh = ((CHKVAL *) checkval)->arre; @@ -254,7 +254,7 @@ checkcondition_arr(void *checkval, ITEM *item) } static bool -checkcondition_bit(void *checkval, ITEM *item) +checkcondition_bit(void *checkval, ITEM * item) { return GETBIT(checkval, HASHVAL(item->val)); } @@ -263,7 +263,7 @@ checkcondition_bit(void *checkval, ITEM *item) * check for boolean condition */ static bool -execute(ITEM * curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM *item)) +execute(ITEM * curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM * item)) { if (curitem->type == VAL) @@ -319,38 +319,42 @@ execconsistent(QUERYTYPE * query, ArrayType *array, bool calcnot) ); } -typedef struct { - ITEM *first; - bool *mapped_check; -} GinChkVal; +typedef struct +{ + ITEM *first; + bool *mapped_check; +} GinChkVal; static bool -checkcondition_gin(void *checkval, ITEM *item) { - GinChkVal *gcv = (GinChkVal*)checkval; +checkcondition_gin(void *checkval, ITEM * item) +{ + GinChkVal *gcv = (GinChkVal *) checkval; - return gcv->mapped_check[ item - gcv->first ]; + return gcv->mapped_check[item - gcv->first]; } bool -ginconsistent(QUERYTYPE * query, bool *check) { - GinChkVal gcv; - ITEM *items = GETQUERY(query); - int i, j=0; +ginconsistent(QUERYTYPE * query, bool *check) +{ + GinChkVal gcv; + ITEM *items = GETQUERY(query); + int i, + j = 0; - if ( query->size < 0 ) + if (query->size < 0) return FALSE; gcv.first = items; - gcv.mapped_check = (bool*)palloc( sizeof(bool)*query->size ); - for(i=0; i<query->size; i++) - if ( items[i].type == VAL ) - gcv.mapped_check[ i ] = check[ j++ ]; - - return execute( - GETQUERY(query) + query->size - 1, - (void *) &gcv, true, - checkcondition_gin - ); + gcv.mapped_check = (bool *) palloc(sizeof(bool) * query->size); + for (i = 0; i < query->size; i++) + if (items[i].type == VAL) + gcv.mapped_check[i] = check[j++]; + + return execute( + GETQUERY(query) + query->size - 1, + (void *) &gcv, true, + checkcondition_gin + ); } /* diff --git a/contrib/intarray/_int_gin.c b/contrib/intarray/_int_gin.c index 2a2830e578d..7bb9599b335 100644 --- a/contrib/intarray/_int_gin.c +++ b/contrib/intarray/_int_gin.c @@ -1,102 +1,118 @@ #include "_int.h" PG_FUNCTION_INFO_V1(ginint4_queryextract); -Datum ginint4_queryextract(PG_FUNCTION_ARGS); +Datum ginint4_queryextract(PG_FUNCTION_ARGS); Datum -ginint4_queryextract(PG_FUNCTION_ARGS) { - uint32 *nentries = (uint32*)PG_GETARG_POINTER(1); - StrategyNumber strategy = PG_GETARG_UINT16(2); - Datum *res = NULL; - +ginint4_queryextract(PG_FUNCTION_ARGS) +{ + uint32 *nentries = (uint32 *) PG_GETARG_POINTER(1); + StrategyNumber strategy = PG_GETARG_UINT16(2); + Datum *res = NULL; + *nentries = 0; - if ( strategy == BooleanSearchStrategy ) { - QUERYTYPE *query = (QUERYTYPE*)PG_DETOAST_DATUM_COPY(PG_GETARG_POINTER(0)); - ITEM *items = GETQUERY(query); - int i; + if (strategy == BooleanSearchStrategy) + { + QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM_COPY(PG_GETARG_POINTER(0)); + ITEM *items = GETQUERY(query); + int i; if (query->size == 0) PG_RETURN_POINTER(NULL); - if ( shorterquery(items, query->size) == 0 ) - elog(ERROR,"Query requires full scan, GIN doesn't support it"); + if (shorterquery(items, query->size) == 0) + elog(ERROR, "Query requires full scan, GIN doesn't support it"); - pfree( query ); + pfree(query); - query = (QUERYTYPE*)PG_DETOAST_DATUM(PG_GETARG_POINTER(0)); + query = (QUERYTYPE *) PG_DETOAST_DATUM(PG_GETARG_POINTER(0)); items = GETQUERY(query); - res = (Datum*)palloc(sizeof(Datum) * query->size); + res = (Datum *) palloc(sizeof(Datum) * query->size); *nentries = 0; - for(i=0;i<query->size;i++) - if ( items[i].type == VAL ) { - res[*nentries] = Int32GetDatum( items[i].val ); + for (i = 0; i < query->size; i++) + if (items[i].type == VAL) + { + res[*nentries] = Int32GetDatum(items[i].val); (*nentries)++; } - } else { - ArrayType *query = PG_GETARG_ARRAYTYPE_P(0); - int4 *arr; - uint32 i; + } + else + { + ArrayType *query = PG_GETARG_ARRAYTYPE_P(0); + int4 *arr; + uint32 i; CHECKARRVALID(query); - *nentries=ARRNELEMS(query); - if ( *nentries > 0 ) { - res = (Datum*)palloc(sizeof(Datum) * (*nentries)); - - arr=ARRPTR(query); - for(i=0;i<*nentries;i++) - res[i] = Int32GetDatum( arr[i] ); + *nentries = ARRNELEMS(query); + if (*nentries > 0) + { + res = (Datum *) palloc(sizeof(Datum) * (*nentries)); + + arr = ARRPTR(query); + for (i = 0; i < *nentries; i++) + res[i] = Int32GetDatum(arr[i]); } } - PG_RETURN_POINTER( res ); + PG_RETURN_POINTER(res); } PG_FUNCTION_INFO_V1(ginint4_consistent); -Datum ginint4_consistent(PG_FUNCTION_ARGS); +Datum ginint4_consistent(PG_FUNCTION_ARGS); Datum -ginint4_consistent(PG_FUNCTION_ARGS) { - bool *check = (bool*)PG_GETARG_POINTER(0); - StrategyNumber strategy = PG_GETARG_UINT16(1); - int res=FALSE; - - /* we can do not check array carefully, it's done by previous ginarrayextract call */ - - switch( strategy ) { - case RTOverlapStrategyNumber: - case RTContainedByStrategyNumber: - case RTOldContainedByStrategyNumber: - /* at least one element in check[] is true, so result = true */ - - res = TRUE; - break; - case RTSameStrategyNumber: - case RTContainsStrategyNumber: - case RTOldContainsStrategyNumber: - res = TRUE; - do { - ArrayType *query = PG_GETARG_ARRAYTYPE_P(2); - int i, nentries=ARRNELEMS(query); - - for(i=0;i<nentries;i++) - if ( !check[i] ) { - res = FALSE; - break; - } - } while(0); - break; - case BooleanSearchStrategy: - do { - QUERYTYPE *query = (QUERYTYPE*)PG_DETOAST_DATUM(PG_GETARG_POINTER(2)); - res = ginconsistent( query, check ); - } while(0); +ginint4_consistent(PG_FUNCTION_ARGS) +{ + bool *check = (bool *) PG_GETARG_POINTER(0); + StrategyNumber strategy = PG_GETARG_UINT16(1); + int res = FALSE; + + /* + * we can do not check array carefully, it's done by previous + * ginarrayextract call + */ + + switch (strategy) + { + case RTOverlapStrategyNumber: + case RTContainedByStrategyNumber: + case RTOldContainedByStrategyNumber: + /* at least one element in check[] is true, so result = true */ + + res = TRUE; + break; + case RTSameStrategyNumber: + case RTContainsStrategyNumber: + case RTOldContainsStrategyNumber: + res = TRUE; + do + { + ArrayType *query = PG_GETARG_ARRAYTYPE_P(2); + int i, + nentries = ARRNELEMS(query); + + for (i = 0; i < nentries; i++) + if (!check[i]) + { + res = FALSE; + break; + } + } while (0); break; - default: - elog(ERROR, "ginint4_consistent: unknown strategy number: %d", strategy); - } + case BooleanSearchStrategy: + do + { + QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM(PG_GETARG_POINTER(2)); + + res = ginconsistent(query, check); + } while (0); + break; + default: + elog(ERROR, "ginint4_consistent: unknown strategy number: %d", strategy); + } - PG_RETURN_BOOL(res); + PG_RETURN_BOOL(res); } diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c index 71c9ad0cec5..56eb0c08c2e 100644 --- a/contrib/intarray/_int_gist.c +++ b/contrib/intarray/_int_gist.c @@ -36,19 +36,21 @@ g_int_consistent(PG_FUNCTION_ARGS) StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); bool retval; - if (strategy == BooleanSearchStrategy) { + if (strategy == BooleanSearchStrategy) + { retval = execconsistent((QUERYTYPE *) query, - (ArrayType *) DatumGetPointer(entry->key), - GIST_LEAF(entry)); + (ArrayType *) DatumGetPointer(entry->key), + GIST_LEAF(entry)); - pfree( query ); + pfree(query); PG_RETURN_BOOL(retval); } /* sort query for fast search, key is already sorted */ CHECKARRVALID(query); - if (ARRISVOID(query)) { - pfree( query ); + if (ARRISVOID(query)) + { + pfree(query); PG_RETURN_BOOL(false); } PREPAREARR(query); @@ -88,7 +90,7 @@ g_int_consistent(PG_FUNCTION_ARGS) default: retval = FALSE; } - pfree( query ); + pfree(query); PG_RETURN_BOOL(retval); } @@ -156,7 +158,7 @@ g_int_compress(PG_FUNCTION_ARGS) retval = palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(r), - entry->rel, entry->page, entry->offset, FALSE); + entry->rel, entry->page, entry->offset, FALSE); PG_RETURN_POINTER(retval); } @@ -203,7 +205,7 @@ g_int_compress(PG_FUNCTION_ARGS) r = resize_intArrayType(r, len); retval = palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(r), - entry->rel, entry->page, entry->offset, FALSE); + entry->rel, entry->page, entry->offset, FALSE); PG_RETURN_POINTER(retval); } else @@ -240,7 +242,7 @@ g_int_decompress(PG_FUNCTION_ARGS) { 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); } @@ -331,7 +333,7 @@ typedef struct { OffsetNumber pos; float cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) diff --git a/contrib/intarray/_int_tool.c b/contrib/intarray/_int_tool.c index 82ce4b7ac56..2ad0ef0cc04 100644 --- a/contrib/intarray/_int_tool.c +++ b/contrib/intarray/_int_tool.c @@ -89,22 +89,27 @@ inner_int_union(ArrayType *a, ArrayType *b) if (!r) { - int na = ARRNELEMS(a), - nb = ARRNELEMS(b); - int *da = ARRPTR(a), - *db = ARRPTR(b); - int i,j, *dr; + int na = ARRNELEMS(a), + nb = ARRNELEMS(b); + int *da = ARRPTR(a), + *db = ARRPTR(b); + int i, + j, + *dr; r = new_intArrayType(na + nb); dr = ARRPTR(r); /* union */ i = j = 0; - while (i < na && j < nb) { - if (da[i] == db[j]) { + while (i < na && j < nb) + { + if (da[i] == db[j]) + { *dr++ = da[i++]; j++; - } else if (da[i] < db[j]) + } + else if (da[i] < db[j]) *dr++ = da[i++]; else *dr++ = db[j++]; @@ -115,7 +120,7 @@ inner_int_union(ArrayType *a, ArrayType *b) while (j < nb) *dr++ = db[j++]; - r = resize_intArrayType(r, dr-ARRPTR(r)); + r = resize_intArrayType(r, dr - ARRPTR(r)); } if (ARRNELEMS(r) > 1) diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c index b25814c7ce7..cb80d8f6f24 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -214,7 +214,7 @@ sizebitvec(BITVECP sign) i; LOOPBYTE( - size += number_of_ones[(unsigned char) sign[i]]; + size += number_of_ones[(unsigned char) sign[i]]; ); return size; } @@ -227,8 +227,8 @@ hemdistsign(BITVECP a, BITVECP b) dist = 0; LOOPBYTE( - diff = (unsigned char) (a[i] ^ b[i]); - dist += number_of_ones[diff]; + diff = (unsigned char) (a[i] ^ b[i]); + dist += number_of_ones[diff]; ); return dist; } @@ -318,7 +318,7 @@ typedef struct { OffsetNumber pos; int4 cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) @@ -506,16 +506,17 @@ g_intbig_consistent(PG_FUNCTION_ARGS) if (strategy == BooleanSearchStrategy) { - retval =signconsistent((QUERYTYPE *) query, - GETSIGN(DatumGetPointer(entry->key)), - false); - PG_FREE_IF_COPY( query, 1 ); + retval = signconsistent((QUERYTYPE *) query, + GETSIGN(DatumGetPointer(entry->key)), + false); + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(retval); } CHECKARRVALID(query); - if (ARRISVOID(query)) { - PG_FREE_IF_COPY( query, 1 ); + if (ARRISVOID(query)) + { + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(FALSE); } @@ -602,6 +603,6 @@ g_intbig_consistent(PG_FUNCTION_ARGS) default: retval = FALSE; } - PG_FREE_IF_COPY( query, 1 ); + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(retval); } diff --git a/contrib/isn/EAN13.h b/contrib/isn/EAN13.h index 43886c2d684..87b611a5424 100644 --- a/contrib/isn/EAN13.h +++ b/contrib/isn/EAN13.h @@ -1,4 +1,4 @@ -/* +/* * EAN13.h * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * @@ -6,142 +6,143 @@ * http://www.gs1.org/productssolutions/idkeys/support/prefix_list.html * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/EAN13.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/EAN13.h,v 1.2 2006/10/04 00:29:45 momjian Exp $ * */ /* where the digit set begins, and how many of them are in the table */ const unsigned EAN13_index[10][2] = { - {0, 6}, - {6, 1}, - {7, 1}, - {8, 5}, - {13, 20}, - {33, 15}, - {48, 19}, - {67, 23}, - {90, 17}, - {107, 12}, + {0, 6}, + {6, 1}, + {7, 1}, + {8, 5}, + {13, 20}, + {33, 15}, + {48, 19}, + {67, 23}, + {90, 17}, + {107, 12}, }; const char *EAN13_range[][2] = { - {"000", "019"}, /* GS1 US */ - {"020", "029"}, /* Restricted distribution (MO defined) */ - {"030", "039"}, /* GS1 US */ - {"040", "049"}, /* Restricted distribution (MO defined) */ - {"050", "059"}, /* Coupons */ - {"060", "099"}, /* GS1 US */ - {"100", "139"}, /* GS1 US */ - {"200", "299"}, /* Restricted distribution (MO defined) */ - {"300", "379"}, /* GS1 France */ - {"380", "380"}, /* GS1 Bulgaria */ - {"383", "383"}, /* GS1 Slovenija */ - {"385", "385"}, /* GS1 Croatia */ - {"387", "387"}, /* GS1 BIH (Bosnia-Herzegovina) */ - {"400", "440"}, /* GS1 Germany */ - {"450", "459"}, /* GS1 Japan */ - {"460", "469"}, /* GS1 Russia */ - {"470", "470"}, /* GS1 Kyrgyzstan */ - {"471", "471"}, /* GS1 Taiwan */ - {"474", "474"}, /* GS1 Estonia */ - {"475", "475"}, /* GS1 Latvia */ - {"476", "476"}, /* GS1 Azerbaijan */ - {"477", "477"}, /* GS1 Lithuania */ - {"478", "478"}, /* GS1 Uzbekistan */ - {"479", "479"}, /* GS1 Sri Lanka */ - {"480", "480"}, /* GS1 Philippines */ - {"481", "481"}, /* GS1 Belarus */ - {"482", "482"}, /* GS1 Ukraine */ - {"484", "484"}, /* GS1 Moldova */ - {"485", "485"}, /* GS1 Armenia */ - {"486", "486"}, /* GS1 Georgia */ - {"487", "487"}, /* GS1 Kazakstan */ - {"489", "489"}, /* GS1 Hong Kong */ - {"490", "499"}, /* GS1 Japan */ - {"500", "509"}, /* GS1 UK */ - {"520", "520"}, /* GS1 Greece */ - {"528", "528"}, /* GS1 Lebanon */ - {"529", "529"}, /* GS1 Cyprus */ - {"530", "530"}, /* GS1 Albania */ - {"531", "531"}, /* GS1 MAC (FYR Macedonia) */ - {"535", "535"}, /* GS1 Malta */ - {"539", "539"}, /* GS1 Ireland */ - {"540", "549"}, /* GS1 Belgium & Luxembourg */ - {"560", "560"}, /* GS1 Portugal */ - {"569", "569"}, /* GS1 Iceland */ - {"570", "579"}, /* GS1 Denmark */ - {"590", "590"}, /* GS1 Poland */ - {"594", "594"}, /* GS1 Romania */ - {"599", "599"}, /* GS1 Hungary */ - {"600", "601"}, /* GS1 South Africa */ - {"603", "603"}, /* GS1 Ghana */ - {"608", "608"}, /* GS1 Bahrain */ - {"609", "609"}, /* GS1 Mauritius */ - {"611", "611"}, /* GS1 Morocco */ - {"613", "613"}, /* GS1 Algeria */ - {"616", "616"}, /* GS1 Kenya */ - {"618", "618"}, /* GS1 Ivory Coast */ - {"619", "619"}, /* GS1 Tunisia */ - {"621", "621"}, /* GS1 Syria */ - {"622", "622"}, /* GS1 Egypt */ - {"624", "624"}, /* GS1 Libya */ - {"625", "625"}, /* GS1 Jordan */ - {"626", "626"}, /* GS1 Iran */ - {"627", "627"}, /* GS1 Kuwait */ - {"628", "628"}, /* GS1 Saudi Arabia */ - {"629", "629"}, /* GS1 Emirates */ - {"640", "649"}, /* GS1 Finland */ - {"690", "695"}, /* GS1 China */ - {"700", "709"}, /* GS1 Norway */ - {"729", "729"}, /* GS1 Israel */ - {"730", "739"}, /* GS1 Sweden */ - {"740", "740"}, /* GS1 Guatemala */ - {"741", "741"}, /* GS1 El Salvador */ - {"742", "742"}, /* GS1 Honduras */ - {"743", "743"}, /* GS1 Nicaragua */ - {"744", "744"}, /* GS1 Costa Rica */ - {"745", "745"}, /* GS1 Panama */ - {"746", "746"}, /* GS1 Republica Dominicana */ - {"750", "750"}, /* GS1 Mexico */ - {"754", "755"}, /* GS1 Canada */ - {"759", "759"}, /* GS1 Venezuela */ - {"760", "769"}, /* GS1 Schweiz, Suisse, Svizzera */ - {"770", "770"}, /* GS1 Colombia */ - {"773", "773"}, /* GS1 Uruguay */ - {"775", "775"}, /* GS1 Peru */ - {"777", "777"}, /* GS1 Bolivia */ - {"779", "779"}, /* GS1 Argentina */ - {"780", "780"}, /* GS1 Chile */ - {"784", "784"}, /* GS1 Paraguay */ - {"786", "786"}, /* GS1 Ecuador */ - {"789", "790"}, /* GS1 Brasil */ - {"800", "839"}, /* GS1 Italy */ - {"840", "849"}, /* GS1 Spain */ - {"850", "850"}, /* GS1 Cuba */ - {"858", "858"}, /* GS1 Slovakia */ - {"859", "859"}, /* GS1 Czech */ - {"860", "860"}, /* GS1 YU (Serbia & Montenegro) */ - {"865", "865"}, /* GS1 Mongolia */ - {"867", "867"}, /* GS1 North Korea */ - {"869", "869"}, /* GS1 Turkey */ - {"870", "879"}, /* GS1 Netherlands */ - {"880", "880"}, /* GS1 South Korea */ - {"884", "884"}, /* GS1 Cambodia */ - {"885", "885"}, /* GS1 Thailand */ - {"888", "888"}, /* GS1 Singapore */ - {"890", "890"}, /* GS1 India */ - {"893", "893"}, /* GS1 Vietnam */ - {"899", "899"}, /* GS1 Indonesia */ - {"900", "919"}, /* GS1 Austria */ - {"930", "939"}, /* GS1 Australia */ - {"940", "949"}, /* GS1 New Zealand */ - {"950", "950"}, /* GS1 Head Office */ - {"955", "955"}, /* GS1 Malaysia */ - {"958", "958"}, /* GS1 Macau */ - {"977", "977"}, /* Serial publications (ISSN) */ - {"978", "978"}, /* Bookland (ISBN) */ - {"979", "979"}, /* International Standard Music Number (ISMN) and ISBN contingent */ - {"980", "980"}, /* Refund receipts */ - {"981", "982"}, /* Common Currency Coupons */ - {"990", "999"}, /* Coupons */ + {"000", "019"}, /* GS1 US */ + {"020", "029"}, /* Restricted distribution (MO defined) */ + {"030", "039"}, /* GS1 US */ + {"040", "049"}, /* Restricted distribution (MO defined) */ + {"050", "059"}, /* Coupons */ + {"060", "099"}, /* GS1 US */ + {"100", "139"}, /* GS1 US */ + {"200", "299"}, /* Restricted distribution (MO defined) */ + {"300", "379"}, /* GS1 France */ + {"380", "380"}, /* GS1 Bulgaria */ + {"383", "383"}, /* GS1 Slovenija */ + {"385", "385"}, /* GS1 Croatia */ + {"387", "387"}, /* GS1 BIH (Bosnia-Herzegovina) */ + {"400", "440"}, /* GS1 Germany */ + {"450", "459"}, /* GS1 Japan */ + {"460", "469"}, /* GS1 Russia */ + {"470", "470"}, /* GS1 Kyrgyzstan */ + {"471", "471"}, /* GS1 Taiwan */ + {"474", "474"}, /* GS1 Estonia */ + {"475", "475"}, /* GS1 Latvia */ + {"476", "476"}, /* GS1 Azerbaijan */ + {"477", "477"}, /* GS1 Lithuania */ + {"478", "478"}, /* GS1 Uzbekistan */ + {"479", "479"}, /* GS1 Sri Lanka */ + {"480", "480"}, /* GS1 Philippines */ + {"481", "481"}, /* GS1 Belarus */ + {"482", "482"}, /* GS1 Ukraine */ + {"484", "484"}, /* GS1 Moldova */ + {"485", "485"}, /* GS1 Armenia */ + {"486", "486"}, /* GS1 Georgia */ + {"487", "487"}, /* GS1 Kazakstan */ + {"489", "489"}, /* GS1 Hong Kong */ + {"490", "499"}, /* GS1 Japan */ + {"500", "509"}, /* GS1 UK */ + {"520", "520"}, /* GS1 Greece */ + {"528", "528"}, /* GS1 Lebanon */ + {"529", "529"}, /* GS1 Cyprus */ + {"530", "530"}, /* GS1 Albania */ + {"531", "531"}, /* GS1 MAC (FYR Macedonia) */ + {"535", "535"}, /* GS1 Malta */ + {"539", "539"}, /* GS1 Ireland */ + {"540", "549"}, /* GS1 Belgium & Luxembourg */ + {"560", "560"}, /* GS1 Portugal */ + {"569", "569"}, /* GS1 Iceland */ + {"570", "579"}, /* GS1 Denmark */ + {"590", "590"}, /* GS1 Poland */ + {"594", "594"}, /* GS1 Romania */ + {"599", "599"}, /* GS1 Hungary */ + {"600", "601"}, /* GS1 South Africa */ + {"603", "603"}, /* GS1 Ghana */ + {"608", "608"}, /* GS1 Bahrain */ + {"609", "609"}, /* GS1 Mauritius */ + {"611", "611"}, /* GS1 Morocco */ + {"613", "613"}, /* GS1 Algeria */ + {"616", "616"}, /* GS1 Kenya */ + {"618", "618"}, /* GS1 Ivory Coast */ + {"619", "619"}, /* GS1 Tunisia */ + {"621", "621"}, /* GS1 Syria */ + {"622", "622"}, /* GS1 Egypt */ + {"624", "624"}, /* GS1 Libya */ + {"625", "625"}, /* GS1 Jordan */ + {"626", "626"}, /* GS1 Iran */ + {"627", "627"}, /* GS1 Kuwait */ + {"628", "628"}, /* GS1 Saudi Arabia */ + {"629", "629"}, /* GS1 Emirates */ + {"640", "649"}, /* GS1 Finland */ + {"690", "695"}, /* GS1 China */ + {"700", "709"}, /* GS1 Norway */ + {"729", "729"}, /* GS1 Israel */ + {"730", "739"}, /* GS1 Sweden */ + {"740", "740"}, /* GS1 Guatemala */ + {"741", "741"}, /* GS1 El Salvador */ + {"742", "742"}, /* GS1 Honduras */ + {"743", "743"}, /* GS1 Nicaragua */ + {"744", "744"}, /* GS1 Costa Rica */ + {"745", "745"}, /* GS1 Panama */ + {"746", "746"}, /* GS1 Republica Dominicana */ + {"750", "750"}, /* GS1 Mexico */ + {"754", "755"}, /* GS1 Canada */ + {"759", "759"}, /* GS1 Venezuela */ + {"760", "769"}, /* GS1 Schweiz, Suisse, Svizzera */ + {"770", "770"}, /* GS1 Colombia */ + {"773", "773"}, /* GS1 Uruguay */ + {"775", "775"}, /* GS1 Peru */ + {"777", "777"}, /* GS1 Bolivia */ + {"779", "779"}, /* GS1 Argentina */ + {"780", "780"}, /* GS1 Chile */ + {"784", "784"}, /* GS1 Paraguay */ + {"786", "786"}, /* GS1 Ecuador */ + {"789", "790"}, /* GS1 Brasil */ + {"800", "839"}, /* GS1 Italy */ + {"840", "849"}, /* GS1 Spain */ + {"850", "850"}, /* GS1 Cuba */ + {"858", "858"}, /* GS1 Slovakia */ + {"859", "859"}, /* GS1 Czech */ + {"860", "860"}, /* GS1 YU (Serbia & Montenegro) */ + {"865", "865"}, /* GS1 Mongolia */ + {"867", "867"}, /* GS1 North Korea */ + {"869", "869"}, /* GS1 Turkey */ + {"870", "879"}, /* GS1 Netherlands */ + {"880", "880"}, /* GS1 South Korea */ + {"884", "884"}, /* GS1 Cambodia */ + {"885", "885"}, /* GS1 Thailand */ + {"888", "888"}, /* GS1 Singapore */ + {"890", "890"}, /* GS1 India */ + {"893", "893"}, /* GS1 Vietnam */ + {"899", "899"}, /* GS1 Indonesia */ + {"900", "919"}, /* GS1 Austria */ + {"930", "939"}, /* GS1 Australia */ + {"940", "949"}, /* GS1 New Zealand */ + {"950", "950"}, /* GS1 Head Office */ + {"955", "955"}, /* GS1 Malaysia */ + {"958", "958"}, /* GS1 Macau */ + {"977", "977"}, /* Serial publications (ISSN) */ + {"978", "978"}, /* Bookland (ISBN) */ + {"979", "979"}, /* International Standard Music Number (ISMN) + * and ISBN contingent */ + {"980", "980"}, /* Refund receipts */ + {"981", "982"}, /* Common Currency Coupons */ + {"990", "999"}, /* Coupons */ {NULL, NULL} }; diff --git a/contrib/isn/ISBN.h b/contrib/isn/ISBN.h index 0b23a95ccfb..26c84afe801 100644 --- a/contrib/isn/ISBN.h +++ b/contrib/isn/ISBN.h @@ -1,4 +1,4 @@ -/* +/* * ISBN.h * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * @@ -7,39 +7,39 @@ * http://www.isbn.org/ * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/ISBN.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/ISBN.h,v 1.2 2006/10/04 00:29:45 momjian Exp $ * * 0-393-04002-X => 039304002(X) <=> 039304002 <=> (978)039304002 <=> 978039304002(9) <=> 978-0-393-04002-9 * * - * ISBN 0 3 9 3 0 4 0 0 2 - * Weight 10 9 8 7 6 5 4 3 2 - * Product 0 + 27 + 72 + 21 + 0 + 20 + 0 + 0 + 4 = 144 - * 144 / 11 = 13 remainder 1 - * Check digit 11 - 1 = 10 = X + * ISBN 0 3 9 3 0 4 0 0 2 + * Weight 10 9 8 7 6 5 4 3 2 + * Product 0 + 27 + 72 + 21 + 0 + 20 + 0 + 0 + 4 = 144 + * 144 / 11 = 13 remainder 1 + * Check digit 11 - 1 = 10 = X * => 0-393-04002-X * - * ISBN 9 7 8 0 3 9 3 0 4 0 0 2 - * Weight 1 3 1 3 1 3 1 3 1 3 1 3 - * Product 9 + 21 + 8 + 0 + 3 + 27 + 3 + 0 + 4 + 0 + 0 + 6 = 81 - * 81 / 10 = 8 remainder 1 - * Check digit 10 - 1 = 9 + * ISBN 9 7 8 0 3 9 3 0 4 0 0 2 + * Weight 1 3 1 3 1 3 1 3 1 3 1 3 + * Product 9 + 21 + 8 + 0 + 3 + 27 + 3 + 0 + 4 + 0 + 0 + 6 = 81 + * 81 / 10 = 8 remainder 1 + * Check digit 10 - 1 = 9 * => 978-0-393-04002-9 * */ /* where the digit set begins, and how many of them are in the table */ const unsigned ISBN_index[10][2] = { - {0, 6}, - {6, 6}, - {12, 8}, - {20, 10}, - {30, 6}, - {36, 12}, - {48, 0}, - {48, 5}, - {53, 59}, - {112, 573}, + {0, 6}, + {6, 6}, + {12, 8}, + {20, 10}, + {30, 6}, + {36, 12}, + {48, 0}, + {48, 5}, + {53, 59}, + {112, 573}, }; const char *ISBN_range[][2] = { diff --git a/contrib/isn/ISMN.h b/contrib/isn/ISMN.h index 0451d1942c7..1d7b2af8fd7 100644 --- a/contrib/isn/ISMN.h +++ b/contrib/isn/ISMN.h @@ -1,4 +1,4 @@ -/* +/* * ISMN.h * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * @@ -6,23 +6,23 @@ * http://www.ismn-international.org * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/ISMN.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/ISMN.h,v 1.2 2006/10/04 00:29:45 momjian Exp $ * * M-3452-4680-5 <=> (0)-3452-4680-5 <=> 0345246805 <=> 9790345246805 <=> 979-0-3452-4680-5 * - * (M counts as 3) - * ISMN M 3 4 5 2 4 6 8 0 - * Weight 3 1 3 1 3 1 3 1 3 - * Product 9 + 3 + 12 + 5 + 6 + 4 + 18 + 8 + 0 = 65 - * 65 / 10 = 6 remainder 5 - * Check digit 10 - 5 = 5 + * (M counts as 3) + * ISMN M 3 4 5 2 4 6 8 0 + * Weight 3 1 3 1 3 1 3 1 3 + * Product 9 + 3 + 12 + 5 + 6 + 4 + 18 + 8 + 0 = 65 + * 65 / 10 = 6 remainder 5 + * Check digit 10 - 5 = 5 * => M-3452-4680-5 * - * ISMN 9 7 9 0 3 4 5 2 4 6 8 0 - * Weight 1 3 1 3 1 3 1 3 1 3 1 3 - * Product 9 + 21 + 9 + 0 + 3 + 12 + 5 + 6 + 4 + 18 + 8 + 0 = 95 - * 95 / 10 = 9 remainder 5 - * Check digit 10 - 5 = 5 + * ISMN 9 7 9 0 3 4 5 2 4 6 8 0 + * Weight 1 3 1 3 1 3 1 3 1 3 1 3 + * Product 9 + 21 + 9 + 0 + 3 + 12 + 5 + 6 + 4 + 18 + 8 + 0 = 95 + * 95 / 10 = 9 remainder 5 + * Check digit 10 - 5 = 5 * => 979-0-3452-4680-5 * * Since mod10(9*1 + 7*3 + 9*1 + 0*3) = mod10(M*3) = mod10(3*3) = 9; the check digit remains the same. @@ -31,16 +31,16 @@ /* where the digit set begins, and how many of them are in the table */ const unsigned ISMN_index[10][2] = { - {0, 5}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, - {5, 0}, + {0, 5}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, + {5, 0}, }; const char *ISMN_range[][2] = { {"0-000", "0-099"}, diff --git a/contrib/isn/ISSN.h b/contrib/isn/ISSN.h index aeafb0c3c7d..063a5d97f13 100644 --- a/contrib/isn/ISSN.h +++ b/contrib/isn/ISSN.h @@ -1,4 +1,4 @@ -/* +/* * ISSN.h * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * @@ -6,25 +6,25 @@ * http://www.issn.org/ * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/ISSN.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/ISSN.h,v 1.2 2006/10/04 00:29:45 momjian Exp $ * * 1144-875X <=> 1144875(X) <=> 1144875 <=> (977)1144875 <=> 9771144875(00) <=> 977114487500(7) <=> 977-1144-875-00-7 * - * - * ISSN 1 1 4 4 8 7 5 - * Weight 8 7 6 5 4 3 2 - * Product 8 + 7 + 24 + 20 + 32 + 21 + 10 = 122 - * 122 / 11 = 11 remainder 1 - * Check digit 11 - 1 = 10 = X + * + * ISSN 1 1 4 4 8 7 5 + * Weight 8 7 6 5 4 3 2 + * Product 8 + 7 + 24 + 20 + 32 + 21 + 10 = 122 + * 122 / 11 = 11 remainder 1 + * Check digit 11 - 1 = 10 = X * => 1144-875X - * - * ISSN 9 7 7 1 1 4 4 8 7 5 0 0 - * Weight 1 3 1 3 1 3 1 3 1 3 1 3 - * Product 9 + 21 + 7 + 3 + 1 + 12 + 4 + 24 + 7 + 15 + 0 + 0 = 103 - * 103 / 10 = 10 remainder 3 - * Check digit 10 - 3 = 7 + * + * ISSN 9 7 7 1 1 4 4 8 7 5 0 0 + * Weight 1 3 1 3 1 3 1 3 1 3 1 3 + * Product 9 + 21 + 7 + 3 + 1 + 12 + 4 + 24 + 7 + 15 + 0 + 0 = 103 + * 103 / 10 = 10 remainder 3 + * Check digit 10 - 3 = 7 * => 977-1144875-00-7 ?? <- suplemental number (number of the week, month, etc.) - * ^^ 00 for non-daily publications (01=Monday, 02=Tuesday, ...) + * ^^ 00 for non-daily publications (01=Monday, 02=Tuesday, ...) * * The hyphenation is always in after the four digits of the ISSN code. * @@ -32,16 +32,16 @@ /* where the digit set begins, and how many of them are in the table */ const unsigned ISSN_index[10][2] = { - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, - {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, }; const char *ISSN_range[][2] = { {"0000-000", "9999-999"}, diff --git a/contrib/isn/UPC.h b/contrib/isn/UPC.h index 2491fa3ee22..2b58a6b5660 100644 --- a/contrib/isn/UPC.h +++ b/contrib/isn/UPC.h @@ -1,27 +1,27 @@ -/* +/* * ISSN.h * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * * No information available for UPC prefixes - * + * * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/UPC.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/UPC.h,v 1.2 2006/10/04 00:29:45 momjian Exp $ * */ /* where the digit set begins, and how many of them are in the table */ const unsigned UPC_index[10][2] = { - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, }; const char *UPC_range[][2] = { {NULL, NULL} diff --git a/contrib/isn/isn.c b/contrib/isn/isn.c index 53e23228c92..cd4fd6c84ae 100644 --- a/contrib/isn/isn.c +++ b/contrib/isn/isn.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.3 2006/09/22 21:39:57 tgl Exp $ + * $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.4 2006/10/04 00:29:45 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -29,9 +29,12 @@ PG_MODULE_MAGIC; #define MAXEAN13LEN 18 -enum isn_type { INVALID, ANY, EAN13, ISBN, ISMN, ISSN, UPC }; +enum isn_type +{ + INVALID, ANY, EAN13, ISBN, ISMN, ISSN, UPC +}; -static const char *isn_names[] = { "EAN13/UPC/ISxN", "EAN13/UPC/ISxN", "EAN13", "ISBN", "ISMN", "ISSN", "UPC" }; +static const char *isn_names[] = {"EAN13/UPC/ISxN", "EAN13/UPC/ISxN", "EAN13", "ISBN", "ISMN", "ISSN", "UPC"}; static bool g_weak = false; static bool g_initialized = false; @@ -46,8 +49,8 @@ static bool g_initialized = false; ** Routines for EAN13/UPC/ISxNs. ** ** Note: - ** In this code, a normalized string is one that is known to be a valid - ** ISxN number containing only digits and hyphens and with enough space + ** In this code, a normalized string is one that is known to be a valid + ** ISxN number containing only digits and hyphens and with enough space ** to hold the full 13 digits plus the maximum of four hyphens. ***********************************************************************/ @@ -60,14 +63,25 @@ static bool g_initialized = false; */ #ifdef ISN_DEBUG static -bool check_table(const char *(*TABLE)[2], const unsigned TABLE_index[10][2]) +bool +check_table(const char *(*TABLE)[2], const unsigned TABLE_index[10][2]) { - const char *aux1, *aux2; - int a, b, x=0, y=-1, i=0, j, cnt=0, init=0; - - if(TABLE == NULL || TABLE_index == NULL) return true; - - while(TABLE[i][0] && TABLE[i][1]) { + const char *aux1, + *aux2; + int a, + b, + x = 0, + y = -1, + i = 0, + j, + cnt = 0, + init = 0; + + if (TABLE == NULL || TABLE_index == NULL) + return true; + + while (TABLE[i][0] && TABLE[i][1]) + { aux1 = TABLE[i][0]; aux2 = TABLE[i][1]; @@ -78,30 +92,37 @@ bool check_table(const char *(*TABLE)[2], const unsigned TABLE_index[10][2]) b = *aux2 - '0'; /* must always have the same format and length: */ - while(*aux1 && *aux2) { + while (*aux1 && *aux2) + { if (!(isdigit((unsigned char) *aux1) && isdigit((unsigned char) *aux2)) && - (*aux1 != *aux2 || *aux1 != '-')) + (*aux1 != *aux2 || *aux1 != '-')) goto invalidtable; aux1++; aux2++; } - if(*aux1!=*aux2) goto invalidtable; + if (*aux1 != *aux2) + goto invalidtable; /* found a new range */ - if(a>y) { + if (a > y) + { /* check current range in the index: */ - for(j=x;j<=y;j++) { - if(TABLE_index[j][0] != init) goto invalidindex; - if(TABLE_index[j][1] != i-init) goto invalidindex; + for (j = x; j <= y; j++) + { + if (TABLE_index[j][0] != init) + goto invalidindex; + if (TABLE_index[j][1] != i - init) + goto invalidindex; } init = i; x = a; - } + } /* Always get the new limit */ y = b; - if(y<x) goto invalidtable; + if (y < x) + goto invalidtable; i++; } @@ -116,18 +137,22 @@ invalidindex: elog(DEBUG1, "index %d is invalid", j); return false; } -#endif /* ISN_DEBUG */ +#endif /* ISN_DEBUG */ /*---------------------------------------------------------- * Formatting and conversion routines. *---------------------------------------------------------*/ static -unsigned dehyphenate(char *bufO, char *bufI) +unsigned +dehyphenate(char *bufO, char *bufI) { - unsigned ret = 0; - while(*bufI) { - if(isdigit((unsigned char) *bufI)) { + unsigned ret = 0; + + while (*bufI) + { + if (isdigit((unsigned char) *bufI)) + { *bufO++ = *bufI; ret++; } @@ -138,29 +163,40 @@ unsigned dehyphenate(char *bufO, char *bufI) } /* - * hyphenate --- Try to hyphenate, in-place, the string starting at bufI - * into bufO using the given hyphenation range TABLE. - * Assumes the input string to be used is of only digits. + * hyphenate --- Try to hyphenate, in-place, the string starting at bufI + * into bufO using the given hyphenation range TABLE. + * Assumes the input string to be used is of only digits. * * Returns the number of characters acctually hyphenated. */ static -unsigned hyphenate(char *bufO, char *bufI, const char *(*TABLE)[2], const unsigned TABLE_index[10][2]) +unsigned +hyphenate(char *bufO, char *bufI, const char *(*TABLE)[2], const unsigned TABLE_index[10][2]) { - unsigned ret = 0; - const char *ean_aux1, *ean_aux2, *ean_p; - char *firstdig, *aux1, *aux2; - unsigned search, upper, lower, step; - bool ean_in1, ean_in2; + unsigned ret = 0; + const char *ean_aux1, + *ean_aux2, + *ean_p; + char *firstdig, + *aux1, + *aux2; + unsigned search, + upper, + lower, + step; + bool ean_in1, + ean_in2; /* just compress the string if no further hyphenation is required */ - if(TABLE == NULL || TABLE_index == NULL) { - while(*bufI) { + if (TABLE == NULL || TABLE_index == NULL) + { + while (*bufI) + { *bufO++ = *bufI++; ret++; } *bufO = '\0'; - return (ret+1); + return (ret + 1); } /* add remaining hyphenations */ @@ -171,26 +207,41 @@ unsigned hyphenate(char *bufO, char *bufI, const char *(*TABLE)[2], const unsign lower--; step = (upper - lower) / 2; - if(step == 0) return 0; + if (step == 0) + return 0; search = lower + step; firstdig = bufI; ean_in1 = ean_in2 = false; ean_aux1 = TABLE[search][0]; ean_aux2 = TABLE[search][1]; - do { - if((ean_in1 || *firstdig>=*ean_aux1) && (ean_in2 || *firstdig<=*ean_aux2)) { - if(*firstdig > *ean_aux1) ean_in1 = true; - if(*firstdig < *ean_aux2) ean_in2 = true; - if(ean_in1 && ean_in2) break; + do + { + if ((ean_in1 || *firstdig >= *ean_aux1) && (ean_in2 || *firstdig <= *ean_aux2)) + { + if (*firstdig > *ean_aux1) + ean_in1 = true; + if (*firstdig < *ean_aux2) + ean_in2 = true; + if (ean_in1 && ean_in2) + break; firstdig++, ean_aux1++, ean_aux2++; - if(!(*ean_aux1 && *ean_aux2 && *firstdig)) break; - if(!isdigit((unsigned char) *ean_aux1)) ean_aux1++, ean_aux2++; - } else { - /* check in what direction we should go and move the pointer accordingly */ - if(*firstdig < *ean_aux1 && !ean_in1) upper = search; - else lower = search; + if (!(*ean_aux1 && *ean_aux2 && *firstdig)) + break; + if (!isdigit((unsigned char) *ean_aux1)) + ean_aux1++, ean_aux2++; + } + else + { + /* + * check in what direction we should go and move the pointer + * accordingly + */ + if (*firstdig < *ean_aux1 && !ean_in1) + upper = search; + else + lower = search; step = (upper - lower) / 2; search = lower + step; @@ -201,150 +252,189 @@ unsigned hyphenate(char *bufO, char *bufI, const char *(*TABLE)[2], const unsign ean_aux1 = TABLE[search][0]; ean_aux2 = TABLE[search][1]; } - } while(step); - - if(step) { + } while (step); + + if (step) + { aux1 = bufO; aux2 = bufI; ean_p = TABLE[search][0]; - while(*ean_p && *aux2) { - if(*ean_p++!='-') *aux1++ = *aux2++; - else *aux1++ = '-'; + while (*ean_p && *aux2) + { + if (*ean_p++ != '-') + *aux1++ = *aux2++; + else + *aux1++ = '-'; ret++; } - *aux1++='-'; - *aux1 = *aux2; /* add a lookahead char */ - return (ret+1); + *aux1++ = '-'; + *aux1 = *aux2; /* add a lookahead char */ + return (ret + 1); } return ret; } /* - * weight_checkdig -- Receives a buffer with a normalized ISxN string number, - * and the length to weight. + * weight_checkdig -- Receives a buffer with a normalized ISxN string number, + * and the length to weight. * * Returns the weight of the number (the check digit value, 0-10) */ static -unsigned weight_checkdig(char *isn, unsigned size) +unsigned +weight_checkdig(char *isn, unsigned size) { - unsigned weight = 0; - while(*isn && size>1) { - if(isdigit((unsigned char) *isn)) { + unsigned weight = 0; + + while (*isn && size > 1) + { + if (isdigit((unsigned char) *isn)) + { weight += size-- * (*isn - '0'); } isn++; } weight = weight % 11; - if(weight != 0) weight = 11 - weight; + if (weight != 0) + weight = 11 - weight; return weight; } /* - * checkdig --- Receives a buffer with a normalized ISxN string number, - * and the length to check. + * checkdig --- Receives a buffer with a normalized ISxN string number, + * and the length to check. * * Returns the check digit value (0-9) */ static -unsigned checkdig(char *num, unsigned size) +unsigned +checkdig(char *num, unsigned size) { - unsigned check=0, check3=0; - unsigned pos = 0; - if(*num == 'M') { /* ISMN start with 'M' */ + unsigned check = 0, + check3 = 0; + unsigned pos = 0; + + if (*num == 'M') + { /* ISMN start with 'M' */ check3 = 3; pos = 1; } - while(*num && size>1) { - if(isdigit((unsigned char) *num)) { - if(pos++%2) check3 += *num - '0'; - else check += *num - '0'; + while (*num && size > 1) + { + if (isdigit((unsigned char) *num)) + { + if (pos++ % 2) + check3 += *num - '0'; + else + check += *num - '0'; size--; } num++; } - check = (check + 3*check3) % 10; - if(check != 0) check = 10 - check; + check = (check + 3 * check3) % 10; + if (check != 0) + check = 10 - check; return check; } /* * ean2isn --- Try to convert an ean13 number to a UPC/ISxN number. - * This doesn't verify for a valid check digit. + * This doesn't verify for a valid check digit. * * If errorOK is false, ereport a useful error message if the ean13 is bad. * If errorOK is true, just return "false" for bad input. */ static -bool ean2isn(ean13 ean, bool errorOK, ean13 *result, enum isn_type accept) +bool +ean2isn(ean13 ean, bool errorOK, ean13 * result, enum isn_type accept) { enum isn_type type = INVALID; - char buf[MAXEAN13LEN + 1]; - char *firstdig, *aux; - unsigned digval; - unsigned search; - ean13 ret = ean; - + char buf[MAXEAN13LEN + 1]; + char *firstdig, + *aux; + unsigned digval; + unsigned search; + ean13 ret = ean; + ean >>= 1; /* verify it's in the EAN13 range */ - if(ean > UINT64CONST(9999999999999)) + if (ean > UINT64CONST(9999999999999)) goto eantoobig; /* convert the number */ search = 0; firstdig = aux = buf + 13; - *aux = '\0'; /* terminate string; aux points to last digit */ - do { - digval = (unsigned)(ean % 10); /* get the decimal value */ - ean /= 10; /* get next digit */ - *--aux = (char)(digval + '0'); /* convert to ascii and store */ - } while(ean && search++<12); - while(search++<12) *--aux = '0'; /* fill the remaining EAN13 with '0' */ - + *aux = '\0'; /* terminate string; aux points to last digit */ + do + { + digval = (unsigned) (ean % 10); /* get the decimal value */ + ean /= 10; /* get next digit */ + *--aux = (char) (digval + '0'); /* convert to ascii and store */ + } while (ean && search++ < 12); + while (search++ < 12) + *--aux = '0'; /* fill the remaining EAN13 with '0' */ + /* find out the data type: */ - if(!strncmp("978", buf, 3)) { /* ISBN */ + if (!strncmp("978", buf, 3)) + { /* ISBN */ type = ISBN; - } else if(!strncmp("977", buf, 3)) { /* ISSN */ + } + else if (!strncmp("977", buf, 3)) + { /* ISSN */ type = ISSN; - } else if(!strncmp("9790", buf, 4)) { /* ISMN */ + } + else if (!strncmp("9790", buf, 4)) + { /* ISMN */ type = ISMN; - } else if(!strncmp("979", buf, 3)) { /* ISBN-13 */ + } + else if (!strncmp("979", buf, 3)) + { /* ISBN-13 */ type = ISBN; - } else if(*buf == '0') { /* UPC */ + } + else if (*buf == '0') + { /* UPC */ type = UPC; - } else { + } + else + { type = EAN13; } - if(accept != ANY && accept != EAN13 && accept != type) goto eanwrongtype; + if (accept != ANY && accept != EAN13 && accept != type) + goto eanwrongtype; *result = ret; return true; - + eanwrongtype: - if(!errorOK) { - if(type!=EAN13) { + if (!errorOK) + { + if (type != EAN13) + { ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("cannot cast EAN13(%s) to %s for number: \"%s\"", - isn_names[type], isn_names[accept], buf))); - } else { + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("cannot cast EAN13(%s) to %s for number: \"%s\"", + isn_names[type], isn_names[accept], buf))); + } + else + { ereport(ERROR, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("cannot cast %s to %s for number: \"%s\"", - isn_names[type], isn_names[accept], buf))); + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("cannot cast %s to %s for number: \"%s\"", + isn_names[type], isn_names[accept], buf))); } } return false; eantoobig: - if(!errorOK) { - char eanbuf[64]; + if (!errorOK) + { + char eanbuf[64]; /* - * Format the number separately to keep the machine-dependent - * format code out of the translatable message text + * Format the number separately to keep the machine-dependent format + * code out of the translatable message text */ snprintf(eanbuf, sizeof(eanbuf), EAN13_FORMAT, ean); ereport(ERROR, @@ -356,144 +446,176 @@ eantoobig: } /* - * ean2UPC/ISxN --- Convert in-place a normalized EAN13 string to the corresponding - * UPC/ISxN string number. Assumes the input string is normalized. + * ean2UPC/ISxN --- Convert in-place a normalized EAN13 string to the corresponding + * UPC/ISxN string number. Assumes the input string is normalized. */ static inline -void ean2ISBN(char *isn) +void +ean2ISBN(char *isn) { - char *aux; - unsigned check; + char *aux; + unsigned check; + /* the number should come in this format: 978-0-000-00000-0 */ /* Strip the first part and calculate the new check digit */ - hyphenate(isn, isn+4, NULL, NULL); + hyphenate(isn, isn + 4, NULL, NULL); check = weight_checkdig(isn, 10); aux = strchr(isn, '\0'); - while(!isdigit((unsigned char) *--aux)); - if(check == 10) *aux = 'X'; - else *aux = check + '0'; + while (!isdigit((unsigned char) *--aux)); + if (check == 10) + *aux = 'X'; + else + *aux = check + '0'; } static inline -void ean2ISMN(char *isn) +void +ean2ISMN(char *isn) { /* the number should come in this format: 979-0-000-00000-0 */ /* Just strip the first part and change the first digit ('0') to 'M' */ - hyphenate(isn, isn+4, NULL, NULL); + hyphenate(isn, isn + 4, NULL, NULL); isn[0] = 'M'; } static inline -void ean2ISSN(char *isn) +void +ean2ISSN(char *isn) { - unsigned check; + unsigned check; + /* the number should come in this format: 977-0000-000-00-0 */ /* Strip the first part, crop, and calculate the new check digit */ - hyphenate(isn, isn+4, NULL, NULL); + hyphenate(isn, isn + 4, NULL, NULL); check = weight_checkdig(isn, 8); - if(check == 10) isn[8] = 'X'; - else isn[8] = check + '0'; + if (check == 10) + isn[8] = 'X'; + else + isn[8] = check + '0'; isn[9] = '\0'; } static inline -void ean2UPC(char *isn) +void +ean2UPC(char *isn) { /* the number should come in this format: 000-000000000-0 */ /* Strip the first part, crop, and dehyphenate */ - dehyphenate(isn, isn+1); + dehyphenate(isn, isn + 1); isn[12] = '\0'; } /* * ean2* --- Converts a string of digits into an ean13 number. - * Assumes the input string is a string with only digits - * on it, and that it's within the range of ean13. + * Assumes the input string is a string with only digits + * on it, and that it's within the range of ean13. * * Returns the ean13 value of the string. */ static -ean13 str2ean(const char *num) +ean13 +str2ean(const char *num) { - ean13 ean = 0; /* current ean */ - while(*num) { - if(isdigit((unsigned char) *num)) ean = 10 * ean + (*num - '0'); + ean13 ean = 0; /* current ean */ + + while (*num) + { + if (isdigit((unsigned char) *num)) + ean = 10 * ean + (*num - '0'); num++; } - return (ean<<1); /* also give room to a flag */ + return (ean << 1); /* also give room to a flag */ } /* * ean2string --- Try to convert an ean13 number to an hyphenated string. - * Assumes there's enough space in result to hold - * the string (maximum MAXEAN13LEN+1 bytes) - * This doesn't verify for a valid check digit. + * Assumes there's enough space in result to hold + * the string (maximum MAXEAN13LEN+1 bytes) + * This doesn't verify for a valid check digit. * * If shortType is true, the returned string is in the old ISxN short format. * If errorOK is false, ereport a useful error message if the string is bad. * If errorOK is true, just return "false" for bad input. */ static -bool ean2string(ean13 ean, bool errorOK, char *result, bool shortType) +bool +ean2string(ean13 ean, bool errorOK, char *result, bool shortType) { const char *(*TABLE)[2]; const unsigned (*TABLE_index)[2]; enum isn_type type = INVALID; - char *firstdig, *aux; - unsigned digval; - unsigned search; - char valid = '\0'; /* was the number initially written with a valid check digit? */ + char *firstdig, + *aux; + unsigned digval; + unsigned search; + char valid = '\0'; /* was the number initially written with a + * valid check digit? */ TABLE_index = ISBN_index; - if((ean & 1)!=0) valid = '!'; + if ((ean & 1) != 0) + valid = '!'; ean >>= 1; /* verify it's in the EAN13 range */ - if(ean > UINT64CONST(9999999999999)) + if (ean > UINT64CONST(9999999999999)) goto eantoobig; /* convert the number */ search = 0; firstdig = aux = result + MAXEAN13LEN; - *aux = '\0'; /* terminate string; aux points to last digit */ - *--aux = valid; /* append '!' for numbers with invalid but corrected check digit */ - do { - digval = (unsigned)(ean % 10); /* get the decimal value */ - ean /= 10; /* get next digit */ - *--aux = (char)(digval + '0'); /* convert to ascii and store */ - if(search == 0) *--aux = '-'; /* the check digit is always there */ - } while(ean && search++<13); - while(search++<13) *--aux = '0'; /* fill the remaining EAN13 with '0' */ + *aux = '\0'; /* terminate string; aux points to last digit */ + *--aux = valid; /* append '!' for numbers with invalid but + * corrected check digit */ + do + { + digval = (unsigned) (ean % 10); /* get the decimal value */ + ean /= 10; /* get next digit */ + *--aux = (char) (digval + '0'); /* convert to ascii and store */ + if (search == 0) + *--aux = '-'; /* the check digit is always there */ + } while (ean && search++ < 13); + while (search++ < 13) + *--aux = '0'; /* fill the remaining EAN13 with '0' */ /* The string should be in this form: ???DDDDDDDDDDDD-D" */ - search = hyphenate(result, result+3, EAN13_range, EAN13_index); - + search = hyphenate(result, result + 3, EAN13_range, EAN13_index); + /* verify it's a logically valid EAN13 */ - if(search == 0) { - search = hyphenate(result, result+3, NULL, NULL); + if (search == 0) + { + search = hyphenate(result, result + 3, NULL, NULL); goto okay; } /* find out what type of hyphenation is needed: */ - if(!strncmp("978-", result, search)) { /* ISBN */ + if (!strncmp("978-", result, search)) + { /* ISBN */ /* The string should be in this form: 978-??000000000-0" */ type = ISBN; TABLE = ISBN_range; TABLE_index = ISBN_index; - } else if(!strncmp("977-", result, search)) { /* ISSN */ + } + else if (!strncmp("977-", result, search)) + { /* ISSN */ /* The string should be in this form: 977-??000000000-0" */ type = ISSN; TABLE = ISSN_range; TABLE_index = ISSN_index; - } else if(!strncmp("979-0", result, search+1)) { /* ISMN */ + } + else if (!strncmp("979-0", result, search + 1)) + { /* ISMN */ /* The string should be in this form: 979-0?000000000-0" */ type = ISMN; TABLE = ISMN_range; TABLE_index = ISMN_index; - } else if(*result == '0') { /* UPC */ + } + else if (*result == '0') + { /* UPC */ /* The string should be in this form: 000-00000000000-0" */ type = UPC; TABLE = UPC_range; TABLE_index = UPC_index; - } else { + } + else + { type = EAN13; TABLE = NULL; TABLE_index = NULL; @@ -501,18 +623,20 @@ bool ean2string(ean13 ean, bool errorOK, char *result, bool shortType) /* verify it's a logically valid EAN13/UPC/ISxN */ digval = search; - search = hyphenate(result+digval, result+digval+2, TABLE, TABLE_index); + search = hyphenate(result + digval, result + digval + 2, TABLE, TABLE_index); /* verify it's a valid EAN13 */ - if(search == 0) { - search = hyphenate(result+digval, result+digval+2, NULL, NULL); + if (search == 0) + { + search = hyphenate(result + digval, result + digval + 2, NULL, NULL); goto okay; } okay: /* convert to the old short type: */ - if(shortType) - switch(type) { + if (shortType) + switch (type) + { case ISBN: ean2ISBN(result); break; @@ -531,13 +655,13 @@ okay: return true; eantoobig: - if(!errorOK) + if (!errorOK) { - char eanbuf[64]; + char eanbuf[64]; /* - * Format the number separately to keep the machine-dependent - * format code out of the translatable message text + * Format the number separately to keep the machine-dependent format + * code out of the translatable message text */ snprintf(eanbuf, sizeof(eanbuf), EAN13_FORMAT, ean); ereport(ERROR, @@ -558,157 +682,222 @@ eantoobig: * (even if the check digit is valid) */ static -bool string2ean(const char *str, bool errorOK, ean13 *result, - enum isn_type accept) +bool +string2ean(const char *str, bool errorOK, ean13 * result, + enum isn_type accept) { - bool digit, last; - char buf[17] = " "; - char *aux1 = buf + 3; /* leave space for the first part, in case it's needed */ + bool digit, + last; + char buf[17] = " "; + char *aux1 = buf + 3; /* leave space for the first part, in case + * it's needed */ const char *aux2 = str; enum isn_type type = INVALID; - unsigned check = 0, rcheck = (unsigned)-1; - unsigned length = 0; - bool magic = false, valid = true; + unsigned check = 0, + rcheck = (unsigned) -1; + unsigned length = 0; + bool magic = false, + valid = true; /* recognize and validate the number: */ - while(*aux2 && length <= 13) { - last = (*(aux2+1) == '!' || *(aux2+1) == '\0'); /* is the last character */ - digit = (isdigit((unsigned char) *aux2)!=0); /* is current character a digit? */ - if(*aux2=='?' && last) /* automagically calculate check digit if it's '?' */ + while (*aux2 && length <= 13) + { + last = (*(aux2 + 1) == '!' || *(aux2 + 1) == '\0'); /* is the last character */ + digit = (isdigit((unsigned char) *aux2) != 0); /* is current character + * a digit? */ + if (*aux2 == '?' && last) /* automagically calculate check digit + * if it's '?' */ magic = digit = true; - if(length == 0 && (*aux2=='M' || *aux2=='m')) { + if (length == 0 && (*aux2 == 'M' || *aux2 == 'm')) + { /* only ISMN can be here */ - if(type != INVALID) goto eaninvalid; + if (type != INVALID) + goto eaninvalid; type = ISMN; *aux1++ = 'M'; length++; - } else if(length == 7 && (digit || *aux2=='X' || *aux2=='x') && last) { + } + else if (length == 7 && (digit || *aux2 == 'X' || *aux2 == 'x') && last) + { /* only ISSN can be here */ - if(type != INVALID) goto eaninvalid; + if (type != INVALID) + goto eaninvalid; type = ISSN; *aux1++ = toupper((unsigned char) *aux2); length++; - } else if(length == 9 && (digit || *aux2=='X' || *aux2=='x') && last) { + } + else if (length == 9 && (digit || *aux2 == 'X' || *aux2 == 'x') && last) + { /* only ISBN and ISMN can be here */ - if(type != INVALID && type != ISMN) goto eaninvalid; - if(type == INVALID) type = ISBN; /* ISMN must start with 'M' */ + if (type != INVALID && type != ISMN) + goto eaninvalid; + if (type == INVALID) + type = ISBN; /* ISMN must start with 'M' */ *aux1++ = toupper((unsigned char) *aux2); length++; - } else if(length == 11 && digit && last) { + } + else if (length == 11 && digit && last) + { /* only UPC can be here */ - if(type != INVALID) goto eaninvalid; + if (type != INVALID) + goto eaninvalid; type = UPC; *aux1++ = *aux2; length++; - } else if(*aux2 == '-' || *aux2 == ' ') { + } + else if (*aux2 == '-' || *aux2 == ' ') + { /* skip, we could validate but I think it's worthless */ - } else if(*aux2 == '!' && *(aux2+1) == '\0') { + } + else if (*aux2 == '!' && *(aux2 + 1) == '\0') + { /* the invalid check digit sufix was found, set it */ - if(!magic) valid = false; + if (!magic) + valid = false; magic = true; - } else if(!digit) { + } + else if (!digit) + { goto eaninvalid; - } else { + } + else + { *aux1++ = *aux2; - if(++length > 13) goto eantoobig; + if (++length > 13) + goto eantoobig; } aux2++; } - *aux1 = '\0'; /* terminate the string */ + *aux1 = '\0'; /* terminate the string */ /* find the current check digit value */ - if(length == 13) { + if (length == 13) + { /* only EAN13 can be here */ - if(type != INVALID) goto eaninvalid; + if (type != INVALID) + goto eaninvalid; type = EAN13; - check = buf[15]-'0'; - } else if(length == 12) { + check = buf[15] - '0'; + } + else if (length == 12) + { /* only UPC can be here */ - if(type != UPC) goto eaninvalid; - check = buf[14]-'0'; - } else if(length == 10) { - if(type != ISBN && type != ISMN) goto eaninvalid; - if(buf[12] == 'X') check = 10; - else check = buf[12]-'0'; - } else if(length == 8) { - if(type != INVALID && type != ISSN) goto eaninvalid; + if (type != UPC) + goto eaninvalid; + check = buf[14] - '0'; + } + else if (length == 10) + { + if (type != ISBN && type != ISMN) + goto eaninvalid; + if (buf[12] == 'X') + check = 10; + else + check = buf[12] - '0'; + } + else if (length == 8) + { + if (type != INVALID && type != ISSN) + goto eaninvalid; type = ISSN; - if(buf[10] == 'X') check = 10; - else check = buf[10]-'0'; - } else goto eaninvalid; - - if(type == INVALID) goto eaninvalid; - - /* obtain the real check digit value, validate, and convert to ean13: */ - if(accept == EAN13 && type != accept) goto eanwrongtype; - if(accept != ANY && type != EAN13 && type != accept) goto eanwrongtype; - switch(type) { + if (buf[10] == 'X') + check = 10; + else + check = buf[10] - '0'; + } + else + goto eaninvalid; + + if (type == INVALID) + goto eaninvalid; + + /* obtain the real check digit value, validate, and convert to ean13: */ + if (accept == EAN13 && type != accept) + goto eanwrongtype; + if (accept != ANY && type != EAN13 && type != accept) + goto eanwrongtype; + switch (type) + { case EAN13: - valid = (valid && ((rcheck=checkdig(buf+3, 13)) == check || magic)); + valid = (valid && ((rcheck = checkdig(buf + 3, 13)) == check || magic)); /* now get the subtype of EAN13: */ - if(buf[3] == '0') type = UPC; - else if(!strncmp("977", buf+3, 3)) type = ISSN; - else if(!strncmp("978", buf+3, 3)) type = ISBN; - else if(!strncmp("9790", buf+3, 4)) type = ISMN; - else if(!strncmp("979", buf+3, 3)) type = ISBN; - if(accept != EAN13 && accept != ANY && type != accept) goto eanwrongtype; + if (buf[3] == '0') + type = UPC; + else if (!strncmp("977", buf + 3, 3)) + type = ISSN; + else if (!strncmp("978", buf + 3, 3)) + type = ISBN; + else if (!strncmp("9790", buf + 3, 4)) + type = ISMN; + else if (!strncmp("979", buf + 3, 3)) + type = ISBN; + if (accept != EAN13 && accept != ANY && type != accept) + goto eanwrongtype; break; case ISMN: - strncpy(buf, "9790", 4); /* this isn't for sure yet, for now ISMN it's only 9790 */ - valid = (valid && ((rcheck=checkdig(buf+3, 10)) == check || magic)); + strncpy(buf, "9790", 4); /* this isn't for sure yet, for now + * ISMN it's only 9790 */ + valid = (valid && ((rcheck = checkdig(buf + 3, 10)) == check || magic)); break; case ISBN: strncpy(buf, "978", 3); - valid = (valid && ((rcheck=weight_checkdig(buf+3, 10)) == check || magic)); + valid = (valid && ((rcheck = weight_checkdig(buf + 3, 10)) == check || magic)); break; case ISSN: - strncpy(buf+10, "00", 2); /* append 00 as the normal issue publication code */ + strncpy(buf + 10, "00", 2); /* append 00 as the normal issue + * publication code */ strncpy(buf, "977", 3); - valid = (valid && ((rcheck=weight_checkdig(buf+3, 8)) == check || magic)); + valid = (valid && ((rcheck = weight_checkdig(buf + 3, 8)) == check || magic)); break; case UPC: buf[2] = '0'; - valid = (valid && ((rcheck=checkdig(buf+2, 13)) == check || magic)); + valid = (valid && ((rcheck = checkdig(buf + 2, 13)) == check || magic)); default: break; } - /* fix the check digit: */ - for(aux1 = buf; *aux1 && *aux1 <= ' '; aux1++); + /* fix the check digit: */ + for (aux1 = buf; *aux1 && *aux1 <= ' '; aux1++); aux1[12] = checkdig(aux1, 13) + '0'; aux1[13] = '\0'; - - if(!valid && !magic) goto eanbadcheck; + + if (!valid && !magic) + goto eanbadcheck; *result = str2ean(aux1); - *result |= valid?0:1; + *result |= valid ? 0 : 1; return true; -eanbadcheck: - if(g_weak) { /* weak input mode is activated: */ - /* set the "invalid-check-digit-on-input" flag */ +eanbadcheck: + if (g_weak) + { /* weak input mode is activated: */ + /* set the "invalid-check-digit-on-input" flag */ *result = str2ean(aux1); *result |= 1; - return true; + return true; } - if(!errorOK) { - if(rcheck == (unsigned)-1) { - ereport(ERROR, + if (!errorOK) + { + if (rcheck == (unsigned) -1) + { + ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid %s number: \"%s\"", + errmsg("invalid %s number: \"%s\"", isn_names[accept], str))); - } else { - ereport(ERROR, + } + else + { + ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("invalid check digit for %s number: \"%s\", should be %c", - isn_names[accept], str, (rcheck==10)?('X'):(rcheck+'0')))); - } + errmsg("invalid check digit for %s number: \"%s\", should be %c", + isn_names[accept], str, (rcheck == 10) ? ('X') : (rcheck + '0')))); } - return false; + } + return false; eaninvalid: - if(!errorOK) + if (!errorOK) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for %s number: \"%s\"", @@ -716,7 +905,7 @@ eaninvalid: return false; eanwrongtype: - if(!errorOK) + if (!errorOK) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("cannot cast %s to %s for number: \"%s\"", @@ -724,11 +913,11 @@ eanwrongtype: return false; eantoobig: - if(!errorOK) + if (!errorOK) ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("value \"%s\" is out of range for %s type", - str, isn_names[accept]))); + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("value \"%s\" is out of range for %s type", + str, isn_names[accept]))); return false; } @@ -736,18 +925,19 @@ eantoobig: * Exported routines. *---------------------------------------------------------*/ -void initialize(void) +void +initialize(void) { #ifdef ISN_DEBUG - if(!check_table(EAN13, EAN13_index)) + if (!check_table(EAN13, EAN13_index)) elog(LOG, "EAN13 failed check"); - if(!check_table(ISBN, ISBN_index)) + if (!check_table(ISBN, ISBN_index)) elog(LOG, "ISBN failed check"); - if(!check_table(ISMN, ISMN_index)) + if (!check_table(ISMN, ISMN_index)) elog(LOG, "ISMN failed check"); - if(!check_table(ISSN, ISSN_index)) + if (!check_table(ISSN, ISSN_index)) elog(LOG, "ISSN failed check"); - if(!check_table(UPC, UPC_index)) + if (!check_table(UPC, UPC_index)) elog(LOG, "UPC failed check"); #endif g_initialized = true; @@ -791,7 +981,7 @@ PG_FUNCTION_INFO_V1(ean13_in); Datum ean13_in(PG_FUNCTION_ARGS) { - const char *str = PG_GETARG_CSTRING(0); + const char *str = PG_GETARG_CSTRING(0); ean13 result; (void) string2ean(str, false, &result, EAN13); @@ -804,7 +994,7 @@ PG_FUNCTION_INFO_V1(isbn_in); Datum isbn_in(PG_FUNCTION_ARGS) { - const char *str = PG_GETARG_CSTRING(0); + const char *str = PG_GETARG_CSTRING(0); ean13 result; (void) string2ean(str, false, &result, ISBN); @@ -817,7 +1007,7 @@ PG_FUNCTION_INFO_V1(ismn_in); Datum ismn_in(PG_FUNCTION_ARGS) { - const char *str = PG_GETARG_CSTRING(0); + const char *str = PG_GETARG_CSTRING(0); ean13 result; (void) string2ean(str, false, &result, ISMN); @@ -830,7 +1020,7 @@ PG_FUNCTION_INFO_V1(issn_in); Datum issn_in(PG_FUNCTION_ARGS) { - const char *str = PG_GETARG_CSTRING(0); + const char *str = PG_GETARG_CSTRING(0); ean13 result; (void) string2ean(str, false, &result, ISSN); @@ -843,7 +1033,7 @@ PG_FUNCTION_INFO_V1(upc_in); Datum upc_in(PG_FUNCTION_ARGS) { - const char *str = PG_GETARG_CSTRING(0); + const char *str = PG_GETARG_CSTRING(0); ean13 result; (void) string2ean(str, false, &result, UPC); @@ -861,7 +1051,7 @@ ean13_cast_to_text(PG_FUNCTION_ARGS) (void) ean2string(val, false, buf, false); - PG_RETURN_TEXT_P(GET_TEXT(buf)); + PG_RETURN_TEXT_P(GET_TEXT(buf)); } PG_FUNCTION_INFO_V1(isn_cast_to_text); @@ -873,7 +1063,7 @@ isn_cast_to_text(PG_FUNCTION_ARGS) (void) ean2string(val, false, buf, true); - PG_RETURN_TEXT_P(GET_TEXT(buf)); + PG_RETURN_TEXT_P(GET_TEXT(buf)); } PG_FUNCTION_INFO_V1(isbn_cast_from_ean13); @@ -929,7 +1119,7 @@ PG_FUNCTION_INFO_V1(ean13_cast_from_text); Datum ean13_cast_from_text(PG_FUNCTION_ARGS) { - const char *str = GET_STR(PG_GETARG_TEXT_P(0)); + const char *str = GET_STR(PG_GETARG_TEXT_P(0)); ean13 result; (void) string2ean(str, false, &result, EAN13); @@ -940,7 +1130,7 @@ PG_FUNCTION_INFO_V1(isbn_cast_from_text); Datum isbn_cast_from_text(PG_FUNCTION_ARGS) { - const char *str = GET_STR(PG_GETARG_TEXT_P(0)); + const char *str = GET_STR(PG_GETARG_TEXT_P(0)); ean13 result; (void) string2ean(str, false, &result, ISBN); @@ -951,7 +1141,7 @@ PG_FUNCTION_INFO_V1(ismn_cast_from_text); Datum ismn_cast_from_text(PG_FUNCTION_ARGS) { - const char *str = GET_STR(PG_GETARG_TEXT_P(0)); + const char *str = GET_STR(PG_GETARG_TEXT_P(0)); ean13 result; (void) string2ean(str, false, &result, ISMN); @@ -962,7 +1152,7 @@ PG_FUNCTION_INFO_V1(issn_cast_from_text); Datum issn_cast_from_text(PG_FUNCTION_ARGS) { - const char *str = GET_STR(PG_GETARG_TEXT_P(0)); + const char *str = GET_STR(PG_GETARG_TEXT_P(0)); ean13 result; (void) string2ean(str, false, &result, ISSN); @@ -973,7 +1163,7 @@ PG_FUNCTION_INFO_V1(upc_cast_from_text); Datum upc_cast_from_text(PG_FUNCTION_ARGS) { - const char *str = GET_STR(PG_GETARG_TEXT_P(0)); + const char *str = GET_STR(PG_GETARG_TEXT_P(0)); ean13 result; (void) string2ean(str, false, &result, UPC); @@ -986,7 +1176,8 @@ PG_FUNCTION_INFO_V1(is_valid); Datum is_valid(PG_FUNCTION_ARGS) { - ean13 val = PG_GETARG_EAN13(0); + ean13 val = PG_GETARG_EAN13(0); + PG_RETURN_BOOL((val & 1) == 0); } @@ -996,13 +1187,14 @@ PG_FUNCTION_INFO_V1(make_valid); Datum make_valid(PG_FUNCTION_ARGS) { - ean13 val = PG_GETARG_EAN13(0); + ean13 val = PG_GETARG_EAN13(0); + val &= ~((ean13) 1); PG_RETURN_EAN13(val); } #ifdef ISN_WEAK_MODE -/* this function temporarily sets weak input flag +/* this function temporarily sets weak input flag * (to lose the strictness of check digit acceptance) * It's a helper function, not intended to be used!! */ @@ -1021,7 +1213,7 @@ accept_weak_input(PG_FUNCTION_ARGS) /* function has no effect */ PG_RETURN_BOOL(false); } -#endif /* ISN_WEAK_MODE */ +#endif /* ISN_WEAK_MODE */ PG_FUNCTION_INFO_V1(weak_input_status); Datum diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c index 30bf2e02964..0bac6475478 100644 --- a/contrib/ltree/_ltree_gist.c +++ b/contrib/ltree/_ltree_gist.c @@ -219,7 +219,7 @@ sizebitvec(BITVECP sign) i; ALOOPBYTE( - size += number_of_ones[(unsigned char) sign[i]]; + size += number_of_ones[(unsigned char) sign[i]]; ); return size; } @@ -232,8 +232,8 @@ hemdistsign(BITVECP a, BITVECP b) dist = 0; ALOOPBYTE( - diff = (unsigned char) (a[i] ^ b[i]); - dist += number_of_ones[diff]; + diff = (unsigned char) (a[i] ^ b[i]); + dist += number_of_ones[diff]; ); return dist; } @@ -270,7 +270,7 @@ typedef struct { OffsetNumber pos; int4 cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) @@ -580,6 +580,6 @@ _ltree_consistent(PG_FUNCTION_ARGS) /* internal error */ elog(ERROR, "unrecognized StrategyNumber: %d", strategy); } - PG_FREE_IF_COPY(query,1); + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(res); } diff --git a/contrib/ltree/lquery_op.c b/contrib/ltree/lquery_op.c index 07269ceaee6..8522c5e0538 100644 --- a/contrib/ltree/lquery_op.c +++ b/contrib/ltree/lquery_op.c @@ -1,7 +1,7 @@ /* * op function for ltree and lquery * Teodor Sigaev <[email protected]> - * $PostgreSQL: pgsql/contrib/ltree/lquery_op.c,v 1.10 2006/03/11 04:38:29 momjian Exp $ + * $PostgreSQL: pgsql/contrib/ltree/lquery_op.c,v 1.11 2006/10/04 00:29:45 momjian Exp $ */ #include "ltree.h" @@ -46,7 +46,7 @@ getlexeme(char *start, char *end, int *len) } bool -compare_subnode(ltree_level * t, char *qn, int len, int (*cmpptr) (const char *, const char *, size_t), bool anyend) + compare_subnode(ltree_level * t, char *qn, int len, int (*cmpptr) (const char *, const char *, size_t), bool anyend) { char *endt = t->name + t->len; char *endq = qn + len; diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index b9058d5edff..1ff5707fb13 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.16 2006/07/11 16:00:44 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.17 2006/10/04 00:29:45 momjian Exp $ */ #ifndef __LTREE_H__ #define __LTREE_H__ @@ -163,7 +163,7 @@ bool compare_subnode(ltree_level * t, char *q, int len, ltree *lca_inner(ltree ** a, int len); #define PG_GETARG_LTREE(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x)))) -#define PG_GETARG_LTREE_COPY(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x)))) +#define PG_GETARG_LTREE_COPY(x) ((ltree*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x)))) #define PG_GETARG_LQUERY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x)))) #define PG_GETARG_LQUERY_COPY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x)))) #define PG_GETARG_LTXTQUERY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x)))) diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 5cfddd76340..0239c5fe991 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -1,7 +1,7 @@ /* * GiST support for ltree * Teodor Sigaev <[email protected]> - * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.18 2006/08/08 15:45:18 teodor Exp $ + * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.19 2006/10/04 00:29:45 momjian Exp $ */ #include "ltree.h" @@ -457,8 +457,10 @@ gist_isparent(ltree_gist * key, ltree * query) } static ltree * -copy_ltree( ltree *src ) { - ltree *dst = (ltree*)palloc(src->len); +copy_ltree(ltree * src) +{ + ltree *dst = (ltree *) palloc(src->len); + memcpy(dst, src, src->len); return dst; } @@ -466,9 +468,9 @@ copy_ltree( ltree *src ) { static bool gist_ischild(ltree_gist * key, ltree * query) { - ltree *left = copy_ltree(LTG_GETLNODE(key)); - ltree *right = copy_ltree(LTG_GETRNODE(key)); - bool res = true; + ltree *left = copy_ltree(LTG_GETLNODE(key)); + ltree *right = copy_ltree(LTG_GETRNODE(key)); + bool res = true; if (left->numlevel > query->numlevel) left->numlevel = query->numlevel; @@ -711,6 +713,6 @@ ltree_consistent(PG_FUNCTION_ARGS) elog(ERROR, "unrecognized StrategyNumber: %d", strategy); } - PG_FREE_IF_COPY(query,1); + PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(res); } diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index f4348e0161f..9b8a360ca89 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -1,7 +1,7 @@ /* * op function for ltree * Teodor Sigaev <[email protected]> - * $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.13 2006/09/20 19:50:21 tgl Exp $ + * $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.14 2006/10/04 00:29:45 momjian Exp $ */ #include "ltree.h" @@ -620,8 +620,8 @@ ltreeparentsel(PG_FUNCTION_ARGS) /* * If the histogram is large enough, see what fraction of it the * constant is "<@" to, and assume that's representative of the - * non-MCV population. Otherwise use the default selectivity for - * the non-MCV population. + * non-MCV population. Otherwise use the default selectivity for the + * non-MCV population. */ selec = histogram_selectivity(&vardata, &contproc, constval, varonleft, diff --git a/contrib/pg_buffercache/pg_buffercache_pages.c b/contrib/pg_buffercache/pg_buffercache_pages.c index 2d7392884eb..3c8af235d10 100644 --- a/contrib/pg_buffercache/pg_buffercache_pages.c +++ b/contrib/pg_buffercache/pg_buffercache_pages.c @@ -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.8 2006/07/23 03:07:57 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.9 2006/10/04 00:29:45 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -74,7 +74,7 @@ pg_buffercache_pages(PG_FUNCTION_ARGS) if (SRF_IS_FIRSTCALL()) { - int i; + int i; volatile BufferDesc *bufHdr; funcctx = SRF_FIRSTCALL_INIT(); @@ -123,9 +123,9 @@ pg_buffercache_pages(PG_FUNCTION_ARGS) MemoryContextSwitchTo(oldcontext); /* - * To get a consistent picture of the buffer state, we must lock - * all partitions of the buffer map. Needless to say, this is - * horrible for concurrency... + * To get a consistent picture of the buffer state, we must lock all + * partitions of the buffer map. Needless to say, this is horrible + * for concurrency... */ for (i = 0; i < NUM_BUFFER_PARTITIONS; i++) LWLockAcquire(FirstBufMappingLock + i, LW_SHARED); diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c index 9ce8422157f..5486a98d486 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.c +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -3,7 +3,7 @@ * pg_freespacemap.c * display some contents of the free space relation and page maps. * - * $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.7 2006/09/21 20:31:21 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.8 2006/10/04 00:29:45 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -14,13 +14,13 @@ #include "storage/freespace.h" -#define NUM_FREESPACE_PAGES_ELEM 5 -#define NUM_FREESPACE_RELATIONS_ELEM 7 +#define NUM_FREESPACE_PAGES_ELEM 5 +#define NUM_FREESPACE_RELATIONS_ELEM 7 #if defined(WIN32) || defined(__CYGWIN__) /* Need DLLIMPORT for some things that are not so marked in main headers */ -extern DLLIMPORT int MaxFSMPages; -extern DLLIMPORT int MaxFSMRelations; +extern DLLIMPORT int MaxFSMPages; +extern DLLIMPORT int MaxFSMRelations; extern DLLIMPORT volatile uint32 InterruptHoldoffCount; #endif @@ -35,12 +35,12 @@ Datum pg_freespacemap_relations(PG_FUNCTION_ARGS); */ typedef struct { - Oid reltablespace; - Oid reldatabase; - Oid relfilenode; - BlockNumber relblocknumber; - Size bytes; - bool isindex; + Oid reltablespace; + Oid reldatabase; + Oid relfilenode; + BlockNumber relblocknumber; + Size bytes; + bool isindex; } FreeSpacePagesRec; @@ -49,14 +49,14 @@ typedef struct */ typedef struct { - Oid reltablespace; - Oid reldatabase; - Oid relfilenode; - Size avgrequest; - BlockNumber interestingpages; - int storedpages; - int nextpage; - bool isindex; + Oid reltablespace; + Oid reldatabase; + Oid relfilenode; + Size avgrequest; + BlockNumber interestingpages; + int storedpages; + int nextpage; + bool isindex; } FreeSpaceRelationsRec; @@ -66,8 +66,8 @@ typedef struct */ typedef struct { - TupleDesc tupdesc; - FreeSpacePagesRec *record; + TupleDesc tupdesc; + FreeSpacePagesRec *record; } FreeSpacePagesContext; @@ -76,8 +76,8 @@ typedef struct */ typedef struct { - TupleDesc tupdesc; - FreeSpaceRelationsRec *record; + TupleDesc tupdesc; + FreeSpaceRelationsRec *record; } FreeSpaceRelationsContext; @@ -89,21 +89,21 @@ PG_FUNCTION_INFO_V1(pg_freespacemap_pages); Datum pg_freespacemap_pages(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - Datum result; - MemoryContext oldcontext; - FreeSpacePagesContext *fctx; /* User function context. */ - TupleDesc tupledesc; - HeapTuple tuple; - FSMHeader *FreeSpaceMap; /* FSM main structure. */ - FSMRelation *fsmrel; /* Individual relation. */ + FuncCallContext *funcctx; + Datum result; + MemoryContext oldcontext; + FreeSpacePagesContext *fctx; /* User function context. */ + TupleDesc tupledesc; + HeapTuple tuple; + FSMHeader *FreeSpaceMap; /* FSM main structure. */ + FSMRelation *fsmrel; /* Individual relation. */ if (SRF_IS_FIRSTCALL()) { - int i; - int numPages; /* Max possible no. of pages in map. */ - int nPages; /* Mapped pages for a relation. */ - + int i; + int numPages; /* Max possible no. of pages in map. */ + int nPages; /* Mapped pages for a relation. */ + /* * Get the free space map data structure. */ @@ -138,8 +138,8 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS) fctx->tupdesc = BlessTupleDesc(tupledesc); /* - * Allocate numPages worth of FreeSpacePagesRec records, this is - * an upper bound. + * Allocate numPages worth of FreeSpacePagesRec records, this is an + * upper bound. */ fctx->record = (FreeSpacePagesRec *) palloc(sizeof(FreeSpacePagesRec) * numPages); @@ -147,16 +147,16 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS) MemoryContextSwitchTo(oldcontext); /* - * Lock free space map and scan though all the relations. - * For each relation, gets all its mapped pages. + * Lock free space map and scan though all the relations. For each + * relation, gets all its mapped pages. */ LWLockAcquire(FreeSpaceLock, LW_EXCLUSIVE); i = 0; - for (fsmrel = FreeSpaceMap->usageList; fsmrel; fsmrel = fsmrel->nextUsage) + for (fsmrel = FreeSpaceMap->usageList; fsmrel; fsmrel = fsmrel->nextUsage) { - if (fsmrel->isIndex) + if (fsmrel->isIndex) { /* Index relation. */ IndexFSMPageData *page; @@ -169,9 +169,9 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS) fctx->record[i].reltablespace = fsmrel->key.spcNode; fctx->record[i].reldatabase = fsmrel->key.dbNode; fctx->record[i].relfilenode = fsmrel->key.relNode; - fctx->record[i].relblocknumber = IndexFSMPageGetPageNum(page); - fctx->record[i].bytes = 0; - fctx->record[i].isindex = true; + fctx->record[i].relblocknumber = IndexFSMPageGetPageNum(page); + fctx->record[i].bytes = 0; + fctx->record[i].isindex = true; page++; i++; @@ -191,9 +191,9 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS) fctx->record[i].reldatabase = fsmrel->key.dbNode; fctx->record[i].relfilenode = fsmrel->key.relNode; fctx->record[i].relblocknumber = FSMPageGetPageNum(page); - fctx->record[i].bytes = FSMPageGetSpace(page); - fctx->record[i].isindex = false; - + fctx->record[i].bytes = FSMPageGetSpace(page); + fctx->record[i].isindex = false; + page++; i++; } @@ -216,7 +216,7 @@ pg_freespacemap_pages(PG_FUNCTION_ARGS) if (funcctx->call_cntr < funcctx->max_calls) { int i = funcctx->call_cntr; - FreeSpacePagesRec *record = &fctx->record[i]; + FreeSpacePagesRec *record = &fctx->record[i]; Datum values[NUM_FREESPACE_PAGES_ELEM]; bool nulls[NUM_FREESPACE_PAGES_ELEM]; @@ -261,20 +261,20 @@ PG_FUNCTION_INFO_V1(pg_freespacemap_relations); Datum pg_freespacemap_relations(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - Datum result; - MemoryContext oldcontext; - FreeSpaceRelationsContext *fctx; /* User function context. */ - TupleDesc tupledesc; - HeapTuple tuple; - FSMHeader *FreeSpaceMap; /* FSM main structure. */ - FSMRelation *fsmrel; /* Individual relation. */ + FuncCallContext *funcctx; + Datum result; + MemoryContext oldcontext; + FreeSpaceRelationsContext *fctx; /* User function context. */ + TupleDesc tupledesc; + HeapTuple tuple; + FSMHeader *FreeSpaceMap; /* FSM main structure. */ + FSMRelation *fsmrel; /* Individual relation. */ if (SRF_IS_FIRSTCALL()) { - int i; - int numRelations; /* Max no. of Relations in map. */ - + int i; + int numRelations; /* Max no. of Relations in map. */ + /* * Get the free space map data structure. */ @@ -313,8 +313,8 @@ pg_freespacemap_relations(PG_FUNCTION_ARGS) fctx->tupdesc = BlessTupleDesc(tupledesc); /* - * Allocate numRelations worth of FreeSpaceRelationsRec records, - * this is also an upper bound. + * Allocate numRelations worth of FreeSpaceRelationsRec records, this + * is also an upper bound. */ fctx->record = (FreeSpaceRelationsRec *) palloc(sizeof(FreeSpaceRelationsRec) * numRelations); @@ -328,12 +328,12 @@ pg_freespacemap_relations(PG_FUNCTION_ARGS) i = 0; - for (fsmrel = FreeSpaceMap->usageList; fsmrel; fsmrel = fsmrel->nextUsage) + for (fsmrel = FreeSpaceMap->usageList; fsmrel; fsmrel = fsmrel->nextUsage) { fctx->record[i].reltablespace = fsmrel->key.spcNode; fctx->record[i].reldatabase = fsmrel->key.dbNode; fctx->record[i].relfilenode = fsmrel->key.relNode; - fctx->record[i].avgrequest = (int64)fsmrel->avgRequest; + fctx->record[i].avgrequest = (int64) fsmrel->avgRequest; fctx->record[i].interestingpages = fsmrel->interestingPages; fctx->record[i].storedpages = fsmrel->storedPages; fctx->record[i].nextpage = fsmrel->nextPage; @@ -358,7 +358,7 @@ pg_freespacemap_relations(PG_FUNCTION_ARGS) if (funcctx->call_cntr < funcctx->max_calls) { int i = funcctx->call_cntr; - FreeSpaceRelationsRec *record = &fctx->record[i]; + FreeSpaceRelationsRec *record = &fctx->record[i]; Datum values[NUM_FREESPACE_RELATIONS_ELEM]; bool nulls[NUM_FREESPACE_RELATIONS_ELEM]; @@ -368,6 +368,7 @@ pg_freespacemap_relations(PG_FUNCTION_ARGS) nulls[1] = false; values[2] = ObjectIdGetDatum(record->relfilenode); nulls[2] = false; + /* * avgrequest isn't meaningful for an index */ diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c index bfb92336d7d..41a827ae0c3 100644 --- a/contrib/pg_trgm/trgm_gist.c +++ b/contrib/pg_trgm/trgm_gist.c @@ -307,7 +307,7 @@ sizebitvec(BITVECP sign) i; LOOPBYTE( - size += number_of_ones[(unsigned char) sign[i]]; + size += number_of_ones[(unsigned char) sign[i]]; ); return size; } @@ -320,8 +320,8 @@ hemdistsign(BITVECP a, BITVECP b) dist = 0; LOOPBYTE( - diff = (unsigned char) (a[i] ^ b[i]); - dist += number_of_ones[diff]; + diff = (unsigned char) (a[i] ^ b[i]); + dist += number_of_ones[diff]; ); return dist; } @@ -393,7 +393,7 @@ typedef struct { OffsetNumber pos; int4 cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index 702bee80ba2..447e8487b0a 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.55 2006/09/16 13:31:40 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.56 2006/10/04 00:29:45 momjian Exp $ * * pgbench: a simple benchmark program for PostgreSQL * written by Tatsuo Ishii @@ -136,7 +136,7 @@ int num_files; /* its number */ static char *tpc_b = { "\\set nbranches :scale\n" "\\set ntellers 10 * :scale\n" - "\\set naccounts 100000 * :scale\n" + "\\set naccounts 100000 * :scale\n" "\\setrandom aid 1 :naccounts\n" "\\setrandom bid 1 :nbranches\n" "\\setrandom tid 1 :ntellers\n" @@ -154,7 +154,7 @@ static char *tpc_b = { static char *simple_update = { "\\set nbranches :scale\n" "\\set ntellers 10 * :scale\n" - "\\set naccounts 100000 * :scale\n" + "\\set naccounts 100000 * :scale\n" "\\setrandom aid 1 :naccounts\n" "\\setrandom bid 1 :nbranches\n" "\\setrandom tid 1 :ntellers\n" @@ -168,7 +168,7 @@ static char *simple_update = { /* -S case */ static char *select_only = { - "\\set naccounts 100000 * :scale\n" + "\\set naccounts 100000 * :scale\n" "\\setrandom aid 1 :naccounts\n" "SELECT abalance FROM accounts WHERE aid = :aid;\n" }; @@ -338,7 +338,7 @@ putVariable(CState * st, char *name, char *value) } else { - char *val; + char *val; if ((val = strdup(value)) == NULL) return false; @@ -1009,14 +1009,16 @@ process_file(char *filename) while (isspace((unsigned char) buf[i])) i++; - if (buf[i] != '\0' && strncmp(&buf[i], "--", 2) != 0) { + if (buf[i] != '\0' && strncmp(&buf[i], "--", 2) != 0) + { commands = process_commands(&buf[i]); if (commands == NULL) { fclose(fd); return false; } - } else + } + else continue; my_commands[lineno] = commands; @@ -1530,7 +1532,7 @@ main(int argc, char **argv) if (state[i].ecnt > prev_ecnt && commands[state[i].state]->type == META_COMMAND) { fprintf(stderr, "Client %d aborted in state %d. Execution meta-command failed.\n", i, state[i].state); - remains--; /* I've aborted */ + remains--; /* I've aborted */ PQfinish(state[i].con); state[i].con = NULL; } @@ -1610,7 +1612,7 @@ main(int argc, char **argv) if (state[i].ecnt > prev_ecnt && commands[state[i].state]->type == META_COMMAND) { fprintf(stderr, "Client %d aborted in state %d. Execution meta-command failed.\n", i, state[i].state); - remains--; /* I've aborted */ + remains--; /* I've aborted */ PQfinish(state[i].con); state[i].con = NULL; } diff --git a/contrib/pgcrypto/crypt-gensalt.c b/contrib/pgcrypto/crypt-gensalt.c index 30a35b1796b..c3ec01b9002 100644 --- a/contrib/pgcrypto/crypt-gensalt.c +++ b/contrib/pgcrypto/crypt-gensalt.c @@ -2,7 +2,7 @@ * Written by Solar Designer and placed in the public domain. * See crypt_blowfish.c for more information. * - * $PostgreSQL: pgsql/contrib/pgcrypto/crypt-gensalt.c,v 1.9 2006/07/13 04:15:24 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/crypt-gensalt.c,v 1.10 2006/10/04 00:29:46 momjian Exp $ * * This file contains salt generation functions for the traditional and * other common crypt(3) algorithms, except for bcrypt which is defined @@ -64,9 +64,9 @@ _crypt_gensalt_extended_rn(unsigned long count, output[2] = _crypt_itoa64[(count >> 6) & 0x3f]; output[3] = _crypt_itoa64[(count >> 12) & 0x3f]; output[4] = _crypt_itoa64[(count >> 18) & 0x3f]; - value = (unsigned long)(unsigned char) input[0] | - ((unsigned long)(unsigned char) input[1] << 8) | - ((unsigned long)(unsigned char) input[2] << 16); + value = (unsigned long) (unsigned char) input[0] | + ((unsigned long) (unsigned char) input[1] << 8) | + ((unsigned long) (unsigned char) input[2] << 16); output[5] = _crypt_itoa64[value & 0x3f]; output[6] = _crypt_itoa64[(value >> 6) & 0x3f]; output[7] = _crypt_itoa64[(value >> 12) & 0x3f]; @@ -92,9 +92,9 @@ _crypt_gensalt_md5_rn(unsigned long count, output[0] = '$'; output[1] = '1'; output[2] = '$'; - value = (unsigned long)(unsigned char) input[0] | - ((unsigned long)(unsigned char) input[1] << 8) | - ((unsigned long)(unsigned char) input[2] << 16); + value = (unsigned long) (unsigned char) input[0] | + ((unsigned long) (unsigned char) input[1] << 8) | + ((unsigned long) (unsigned char) input[2] << 16); output[3] = _crypt_itoa64[value & 0x3f]; output[4] = _crypt_itoa64[(value >> 6) & 0x3f]; output[5] = _crypt_itoa64[(value >> 12) & 0x3f]; @@ -103,9 +103,9 @@ _crypt_gensalt_md5_rn(unsigned long count, if (size >= 6 && output_size >= 3 + 4 + 4 + 1) { - value = (unsigned long)(unsigned char) input[3] | - ((unsigned long)(unsigned char) input[4] << 8) | - ((unsigned long)(unsigned char) input[5] << 16); + value = (unsigned long) (unsigned char) input[3] | + ((unsigned long) (unsigned char) input[4] << 8) | + ((unsigned long) (unsigned char) input[5] << 16); output[7] = _crypt_itoa64[value & 0x3f]; output[8] = _crypt_itoa64[(value >> 6) & 0x3f]; output[9] = _crypt_itoa64[(value >> 12) & 0x3f]; diff --git a/contrib/pgcrypto/crypt-md5.c b/contrib/pgcrypto/crypt-md5.c index 556a0e9e8e8..c05e334a998 100644 --- a/contrib/pgcrypto/crypt-md5.c +++ b/contrib/pgcrypto/crypt-md5.c @@ -8,7 +8,7 @@ * * $FreeBSD: src/lib/libcrypt/crypt-md5.c,v 1.5 1999/12/17 20:21:45 peter Exp $ * - * $PostgreSQL: pgsql/contrib/pgcrypto/crypt-md5.c,v 1.7 2006/07/13 04:15:24 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/crypt-md5.c,v 1.8 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -24,7 +24,7 @@ static const char _crypt_a64[] = static void _crypt_to64(char *s, unsigned long v, int n) { - while (--n >= 0) + while (--n >= 0) { *s++ = _crypt_a64[v & 0x3f]; v >>= 6; diff --git a/contrib/pgcrypto/fortuna.c b/contrib/pgcrypto/fortuna.c index cd08fd2bc68..5a2596fe786 100644 --- a/contrib/pgcrypto/fortuna.c +++ b/contrib/pgcrypto/fortuna.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/fortuna.c,v 1.7 2006/07/13 04:15:24 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/fortuna.c,v 1.8 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -365,8 +365,8 @@ rekey(FState * st) static void startup_tricks(FState * st) { - int i; - uint8 buf[BLOCK]; + int i; + uint8 buf[BLOCK]; /* Use next block as counter. */ encrypt_counter(st, st->counter); diff --git a/contrib/pgcrypto/imath.c b/contrib/pgcrypto/imath.c index 6375fd7a889..197e24f74b7 100644 --- a/contrib/pgcrypto/imath.c +++ b/contrib/pgcrypto/imath.c @@ -1,9 +1,9 @@ /* imath version 1.3 */ /* - Name: imath.c - Purpose: Arbitrary precision integer arithmetic routines. - Author: M. J. Fromberger <http://www.dartmouth.edu/~sting/> - Info: Id: imath.c 21 2006-04-02 18:58:36Z sting + Name: imath.c + Purpose: Arbitrary precision integer arithmetic routines. + Author: M. J. Fromberger <http://www.dartmouth.edu/~sting/> + Info: Id: imath.c 21 2006-04-02 18:58:36Z sting Copyright (C) 2002 Michael J. Fromberger, All Rights Reserved. @@ -21,13 +21,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.c,v 1.5 2006/09/22 21:39:57 tgl Exp $ */ +/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.c,v 1.6 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" #include "px.h" @@ -40,36 +40,36 @@ /* {{{ Constants */ -const mp_result MP_OK = 0; /* no error, all is well */ -const mp_result MP_FALSE = 0; /* boolean false */ -const mp_result MP_TRUE = -1; /* boolean true */ -const mp_result MP_MEMORY = -2; /* out of memory */ -const mp_result MP_RANGE = -3; /* argument out of range */ -const mp_result MP_UNDEF = -4; /* result undefined */ -const mp_result MP_TRUNC = -5; /* output truncated */ +const mp_result MP_OK = 0; /* no error, all is well */ +const mp_result MP_FALSE = 0; /* boolean false */ +const mp_result MP_TRUE = -1; /* boolean true */ +const mp_result MP_MEMORY = -2; /* out of memory */ +const mp_result MP_RANGE = -3; /* argument out of range */ +const mp_result MP_UNDEF = -4; /* result undefined */ +const mp_result MP_TRUNC = -5; /* output truncated */ const mp_result MP_BADARG = -6; /* invalid null argument */ -const mp_sign MP_NEG = 1; /* value is strictly negative */ -const mp_sign MP_ZPOS = 0; /* value is non-negative */ +const mp_sign MP_NEG = 1; /* value is strictly negative */ +const mp_sign MP_ZPOS = 0; /* value is non-negative */ static const char *s_unknown_err = "unknown result code"; static const char *s_error_msg[] = { - "error code 0", - "boolean true", - "out of memory", - "argument out of range", - "result undefined", - "output truncated", - "invalid null argument", - NULL + "error code 0", + "boolean true", + "out of memory", + "argument out of range", + "result undefined", + "output truncated", + "invalid null argument", + NULL }; /* }}} */ /* Optional library flags */ -#define MP_CAP_DIGITS 1 /* flag bit to capitalize letter digits */ +#define MP_CAP_DIGITS 1 /* flag bit to capitalize letter digits */ -/* Argument checking macros +/* Argument checking macros Use CHECK() where a return value is required; NRCHECK() elsewhere */ #define CHECK(TEST) assert(TEST) #define NRCHECK(TEST) assert(TEST) @@ -83,23 +83,23 @@ static const char *s_error_msg[] = { can compute log_i(n) = lg(n) * log_i(2). */ static const double s_log2[] = { - 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* 0 1 2 3 */ - 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ - 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ - 0.278942946, 0.270238154, 0.262649535, 0.255958025, /* 12 13 14 15 */ - 0.250000000, 0.244650542, 0.239812467, 0.235408913, /* 16 17 18 19 */ - 0.231378213, 0.227670249, 0.224243824, 0.221064729, /* 20 21 22 23 */ - 0.218104292, 0.215338279, 0.212746054, 0.210309918, /* 24 25 26 27 */ - 0.208014598, 0.205846832, 0.203795047, 0.201849087, /* 28 29 30 31 */ - 0.200000000, 0.198239863, 0.196561632, 0.194959022, /* 32 33 34 35 */ - 0.193426404, 0.191958720, 0.190551412, 0.189200360, /* 36 37 38 39 */ - 0.187901825, 0.186652411, 0.185449023, 0.184288833, /* 40 41 42 43 */ - 0.183169251, 0.182087900, 0.181042597, 0.180031327, /* 44 45 46 47 */ - 0.179052232, 0.178103594, 0.177183820, 0.176291434, /* 48 49 50 51 */ - 0.175425064, 0.174583430, 0.173765343, 0.172969690, /* 52 53 54 55 */ - 0.172195434, 0.171441601, 0.170707280, 0.169991616, /* 56 57 58 59 */ - 0.169293808, 0.168613099, 0.167948779, 0.167300179, /* 60 61 62 63 */ - 0.166666667 + 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* 0 1 2 3 */ + 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ + 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ + 0.278942946, 0.270238154, 0.262649535, 0.255958025, /* 12 13 14 15 */ + 0.250000000, 0.244650542, 0.239812467, 0.235408913, /* 16 17 18 19 */ + 0.231378213, 0.227670249, 0.224243824, 0.221064729, /* 20 21 22 23 */ + 0.218104292, 0.215338279, 0.212746054, 0.210309918, /* 24 25 26 27 */ + 0.208014598, 0.205846832, 0.203795047, 0.201849087, /* 28 29 30 31 */ + 0.200000000, 0.198239863, 0.196561632, 0.194959022, /* 32 33 34 35 */ + 0.193426404, 0.191958720, 0.190551412, 0.189200360, /* 36 37 38 39 */ + 0.187901825, 0.186652411, 0.185449023, 0.184288833, /* 40 41 42 43 */ + 0.183169251, 0.182087900, 0.181042597, 0.180031327, /* 44 45 46 47 */ + 0.179052232, 0.178103594, 0.177183820, 0.176291434, /* 48 49 50 51 */ + 0.175425064, 0.174583430, 0.173765343, 0.172969690, /* 52 53 54 55 */ + 0.172195434, 0.171441601, 0.170707280, 0.169991616, /* 56 57 58 59 */ + 0.169293808, 0.168613099, 0.167948779, 0.167300179, /* 60 61 62 63 */ + 0.166666667 }; /* }}} */ @@ -156,9 +156,9 @@ MP_USED(Z)=o_;CLAMP(Z);}while(0) do{mp_size ua_=MP_USED(X),o_=ua_+ua_;ZERO(MP_DIGITS(Z),o_);\ (void) s_ksqr(MP_DIGITS(X),MP_DIGITS(Z),ua_);MP_USED(Z)=o_;CLAMP(Z);}while(0) -#define UPPER_HALF(W) ((mp_word)((W) >> MP_DIGIT_BIT)) -#define LOWER_HALF(W) ((mp_digit)(W)) -#define HIGH_BIT_SET(W) ((W) >> (MP_WORD_BIT - 1)) +#define UPPER_HALF(W) ((mp_word)((W) >> MP_DIGIT_BIT)) +#define LOWER_HALF(W) ((mp_digit)(W)) +#define HIGH_BIT_SET(W) ((W) >> (MP_WORD_BIT - 1)) #define ADD_WILL_OVERFLOW(W, V) ((MP_WORD_MAX - (V)) < (W)) /* }}} */ @@ -175,6 +175,7 @@ static mp_word mp_flags = MP_CAP_DIGITS; /* Allocate a buffer of (at least) num digits, or return NULL if that couldn't be done. */ static mp_digit *s_alloc(mp_size num); + #if TRACEABLE_FREE static void s_free(void *ptr); #else @@ -183,97 +184,97 @@ static void s_free(void *ptr); /* Insure that z has at least min digits allocated, resizing if necessary. Returns true if successful, false if out of memory. */ -static int s_pad(mp_int z, mp_size min); +static int s_pad(mp_int z, mp_size min); /* Normalize by removing leading zeroes (except when z = 0) */ #if TRACEABLE_CLAMP -static void s_clamp(mp_int z); +static void s_clamp(mp_int z); #endif /* Fill in a "fake" mp_int on the stack with a given value */ -static void s_fake(mp_int z, int value, mp_digit vbuf[]); +static void s_fake(mp_int z, int value, mp_digit vbuf[]); /* Compare two runs of digits of given length, returns <0, 0, >0 */ -static int s_cdig(mp_digit *da, mp_digit *db, mp_size len); +static int s_cdig(mp_digit * da, mp_digit * db, mp_size len); /* Pack the unsigned digits of v into array t */ -static int s_vpack(int v, mp_digit t[]); +static int s_vpack(int v, mp_digit t[]); /* Compare magnitudes of a and b, returns <0, 0, >0 */ -static int s_ucmp(mp_int a, mp_int b); +static int s_ucmp(mp_int a, mp_int b); /* Compare magnitudes of a and v, returns <0, 0, >0 */ -static int s_vcmp(mp_int a, int v); +static int s_vcmp(mp_int a, int v); /* Unsigned magnitude addition; assumes dc is big enough. Carry out is returned (no memory allocated). */ -static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b); +static mp_digit s_uadd(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b); -/* Unsigned magnitude subtraction. Assumes dc is big enough. */ -static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b); +/* Unsigned magnitude subtraction. Assumes dc is big enough. */ +static void s_usub(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b); /* Unsigned recursive multiplication. Assumes dc is big enough. */ -static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b); +static int s_kmul(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b); /* Unsigned magnitude multiplication. Assumes dc is big enough. */ -static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b); +static void s_umul(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b); /* Unsigned recursive squaring. Assumes dc is big enough. */ -static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a); +static int s_ksqr(mp_digit * da, mp_digit * dc, mp_size size_a); /* Unsigned magnitude squaring. Assumes dc is big enough. */ -static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a); +static void s_usqr(mp_digit * da, mp_digit * dc, mp_size size_a); /* Single digit addition. Assumes a is big enough. */ -static void s_dadd(mp_int a, mp_digit b); +static void s_dadd(mp_int a, mp_digit b); /* Single digit multiplication. Assumes a is big enough. */ -static void s_dmul(mp_int a, mp_digit b); +static void s_dmul(mp_int a, mp_digit b); /* Single digit multiplication on buffers; assumes dc is big enough. */ -static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, - mp_size size_a); +static void s_dbmul(mp_digit * da, mp_digit b, mp_digit * dc, + mp_size size_a); -/* Single digit division. Replaces a with the quotient, +/* Single digit division. Replaces a with the quotient, returns the remainder. */ -static mp_digit s_ddiv(mp_int a, mp_digit b); +static mp_digit s_ddiv(mp_int a, mp_digit b); /* Quick division by a power of 2, replaces z (no allocation) */ -static void s_qdiv(mp_int z, mp_size p2); +static void s_qdiv(mp_int z, mp_size p2); /* Quick remainder by a power of 2, replaces z (no allocation) */ -static void s_qmod(mp_int z, mp_size p2); +static void s_qmod(mp_int z, mp_size p2); -/* Quick multiplication by a power of 2, replaces z. +/* Quick multiplication by a power of 2, replaces z. Allocates if necessary; returns false in case this fails. */ -static int s_qmul(mp_int z, mp_size p2); +static int s_qmul(mp_int z, mp_size p2); /* Quick subtraction from a power of 2, replaces z. Allocates if necessary; returns false in case this fails. */ -static int s_qsub(mp_int z, mp_size p2); +static int s_qsub(mp_int z, mp_size p2); /* Return maximum k such that 2^k divides z. */ -static int s_dp2k(mp_int z); +static int s_dp2k(mp_int z); /* Return k >= 0 such that z = 2^k, or -1 if there is no such k. */ -static int s_isp2(mp_int z); +static int s_isp2(mp_int z); /* Set z to 2^k. May allocate; returns false in case this fails. */ -static int s_2expt(mp_int z, int k); +static int s_2expt(mp_int z, int k); /* Normalize a and b for division, returns normalization constant */ -static int s_norm(mp_int a, mp_int b); +static int s_norm(mp_int a, mp_int b); /* Compute constant mu for Barrett reduction, given modulus m, result replaces z, m is untouched. */ static mp_result s_brmu(mp_int z, mp_int m); /* Reduce a modulo m, using Barrett's algorithm. */ -static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2); +static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2); /* Modular exponentiation, using Barrett reduction */ static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c); @@ -284,22 +285,22 @@ static mp_result s_udiv(mp_int a, mp_int b); /* Compute the number of digits in radix r required to represent the given value. Does not account for sign flags, terminators, etc. */ -static int s_outlen(mp_int z, mp_size r); +static int s_outlen(mp_int z, mp_size r); /* Guess how many digits of precision will be needed to represent a radix r value of the specified number of digits. Returns a value guaranteed to be no smaller than the actual number required. */ -static mp_size s_inlen(int len, mp_size r); +static mp_size s_inlen(int len, mp_size r); -/* Convert a character to a digit value in radix r, or +/* Convert a character to a digit value in radix r, or -1 if out of range */ -static int s_ch2val(char c, int r); +static int s_ch2val(char c, int r); /* Convert a digit value to a character */ -static char s_val2ch(int v, int caps); +static char s_val2ch(int v, int caps); /* Take 2's complement of a buffer in place */ -static void s_2comp(unsigned char *buf, int len); +static void s_2comp(unsigned char *buf, int len); /* Convert a value to binary, ignoring sign. On input, *limpos is the bound on how many bytes should be written to buf; on output, *limpos @@ -308,698 +309,804 @@ static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad); #if 0 /* Dump a representation of the mp_int to standard output */ -void s_print(char *tag, mp_int z); -void s_print_buf(char *tag, mp_digit *buf, mp_size num); +void s_print(char *tag, mp_int z); +void s_print_buf(char *tag, mp_digit * buf, mp_size num); #endif /* {{{ get_default_precision() */ -mp_size mp_get_default_precision(void) -{ - return default_precision; +mp_size +mp_get_default_precision(void) +{ + return default_precision; } /* }}} */ /* {{{ mp_set_default_precision(s) */ -void mp_set_default_precision(mp_size s) -{ - NRCHECK(s > 0); +void +mp_set_default_precision(mp_size s) +{ + NRCHECK(s > 0); - default_precision = (mp_size) ROUND_PREC(s); + default_precision = (mp_size) ROUND_PREC(s); } /* }}} */ /* {{{ mp_get_multiply_threshold() */ -mp_size mp_get_multiply_threshold(void) +mp_size +mp_get_multiply_threshold(void) { - return multiply_threshold; + return multiply_threshold; } /* }}} */ /* {{{ mp_set_multiply_threshold(s) */ -void mp_set_multiply_threshold(mp_size s) +void +mp_set_multiply_threshold(mp_size s) { - multiply_threshold = s; + multiply_threshold = s; } /* }}} */ /* {{{ mp_int_init(z) */ -mp_result mp_int_init(mp_int z) +mp_result +mp_int_init(mp_int z) { - return mp_int_init_size(z, default_precision); + return mp_int_init_size(z, default_precision); } /* }}} */ /* {{{ mp_int_alloc() */ -mp_int mp_int_alloc(void) +mp_int +mp_int_alloc(void) { - mp_int out = px_alloc(sizeof(mpz_t)); + mp_int out = px_alloc(sizeof(mpz_t)); - assert(out != NULL); - out->digits = NULL; - out->used = 0; - out->alloc = 0; - out->sign = 0; + assert(out != NULL); + out->digits = NULL; + out->used = 0; + out->alloc = 0; + out->sign = 0; - return out; + return out; } /* }}} */ /* {{{ mp_int_init_size(z, prec) */ -mp_result mp_int_init_size(mp_int z, mp_size prec) +mp_result +mp_int_init_size(mp_int z, mp_size prec) { - CHECK(z != NULL); + CHECK(z != NULL); + + prec = (mp_size) ROUND_PREC(prec); + prec = MAX(prec, default_precision); - prec = (mp_size) ROUND_PREC(prec); - prec = MAX(prec, default_precision); + if ((MP_DIGITS(z) = s_alloc(prec)) == NULL) + return MP_MEMORY; - if((MP_DIGITS(z) = s_alloc(prec)) == NULL) - return MP_MEMORY; + z->digits[0] = 0; + MP_USED(z) = 1; + MP_ALLOC(z) = prec; + MP_SIGN(z) = MP_ZPOS; - z->digits[0] = 0; - MP_USED(z) = 1; - MP_ALLOC(z) = prec; - MP_SIGN(z) = MP_ZPOS; - - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_init_copy(z, old) */ -mp_result mp_int_init_copy(mp_int z, mp_int old) +mp_result +mp_int_init_copy(mp_int z, mp_int old) { - mp_result res; - mp_size uold, target; + mp_result res; + mp_size uold, + target; - CHECK(z != NULL && old != NULL); + CHECK(z != NULL && old != NULL); - uold = MP_USED(old); - target = MAX(uold, default_precision); + uold = MP_USED(old); + target = MAX(uold, default_precision); - if((res = mp_int_init_size(z, target)) != MP_OK) - return res; + if ((res = mp_int_init_size(z, target)) != MP_OK) + return res; - MP_USED(z) = uold; - MP_SIGN(z) = MP_SIGN(old); - COPY(MP_DIGITS(old), MP_DIGITS(z), uold); + MP_USED(z) = uold; + MP_SIGN(z) = MP_SIGN(old); + COPY(MP_DIGITS(old), MP_DIGITS(z), uold); - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_init_value(z, value) */ -mp_result mp_int_init_value(mp_int z, int value) +mp_result +mp_int_init_value(mp_int z, int value) { - mp_result res; + mp_result res; - CHECK(z != NULL); + CHECK(z != NULL); - if((res = mp_int_init(z)) != MP_OK) - return res; + if ((res = mp_int_init(z)) != MP_OK) + return res; - return mp_int_set_value(z, value); + return mp_int_set_value(z, value); } /* }}} */ /* {{{ mp_int_set_value(z, value) */ -mp_result mp_int_set_value(mp_int z, int value) +mp_result +mp_int_set_value(mp_int z, int value) { - mp_size ndig; + mp_size ndig; - CHECK(z != NULL); + CHECK(z != NULL); - /* How many digits to copy */ - ndig = (mp_size) MP_VALUE_DIGITS(value); + /* How many digits to copy */ + ndig = (mp_size) MP_VALUE_DIGITS(value); - if(!s_pad(z, ndig)) - return MP_MEMORY; + if (!s_pad(z, ndig)) + return MP_MEMORY; - MP_USED(z) = (mp_size)s_vpack(value, MP_DIGITS(z)); - MP_SIGN(z) = (value < 0) ? MP_NEG : MP_ZPOS; + MP_USED(z) = (mp_size) s_vpack(value, MP_DIGITS(z)); + MP_SIGN(z) = (value < 0) ? MP_NEG : MP_ZPOS; - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_clear(z) */ -void mp_int_clear(mp_int z) +void +mp_int_clear(mp_int z) { - if(z == NULL) - return; + if (z == NULL) + return; - if(MP_DIGITS(z) != NULL) { - s_free(MP_DIGITS(z)); - MP_DIGITS(z) = NULL; - } + if (MP_DIGITS(z) != NULL) + { + s_free(MP_DIGITS(z)); + MP_DIGITS(z) = NULL; + } } /* }}} */ /* {{{ mp_int_free(z) */ -void mp_int_free(mp_int z) +void +mp_int_free(mp_int z) { - NRCHECK(z != NULL); + NRCHECK(z != NULL); - if(z->digits != NULL) - mp_int_clear(z); + if (z->digits != NULL) + mp_int_clear(z); - px_free(z); + px_free(z); } /* }}} */ /* {{{ mp_int_copy(a, c) */ -mp_result mp_int_copy(mp_int a, mp_int c) +mp_result +mp_int_copy(mp_int a, mp_int c) { - CHECK(a != NULL && c != NULL); + CHECK(a != NULL && c != NULL); - if(a != c) { - mp_size ua = MP_USED(a); - mp_digit *da, *dc; + if (a != c) + { + mp_size ua = MP_USED(a); + mp_digit *da, + *dc; - if(!s_pad(c, ua)) - return MP_MEMORY; + if (!s_pad(c, ua)) + return MP_MEMORY; - da = MP_DIGITS(a); dc = MP_DIGITS(c); - COPY(da, dc, ua); + da = MP_DIGITS(a); + dc = MP_DIGITS(c); + COPY(da, dc, ua); - MP_USED(c) = ua; - MP_SIGN(c) = MP_SIGN(a); - } + MP_USED(c) = ua; + MP_SIGN(c) = MP_SIGN(a); + } - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_swap(a, c) */ -void mp_int_swap(mp_int a, mp_int c) +void +mp_int_swap(mp_int a, mp_int c) { - if(a != c) { - mpz_t tmp = *a; + if (a != c) + { + mpz_t tmp = *a; - *a = *c; - *c = tmp; - } + *a = *c; + *c = tmp; + } } /* }}} */ /* {{{ mp_int_zero(z) */ -void mp_int_zero(mp_int z) +void +mp_int_zero(mp_int z) { - NRCHECK(z != NULL); + NRCHECK(z != NULL); - z->digits[0] = 0; - MP_USED(z) = 1; - MP_SIGN(z) = MP_ZPOS; + z->digits[0] = 0; + MP_USED(z) = 1; + MP_SIGN(z) = MP_ZPOS; } /* }}} */ /* {{{ mp_int_abs(a, c) */ -mp_result mp_int_abs(mp_int a, mp_int c) +mp_result +mp_int_abs(mp_int a, mp_int c) { - mp_result res; + mp_result res; - CHECK(a != NULL && c != NULL); + CHECK(a != NULL && c != NULL); - if((res = mp_int_copy(a, c)) != MP_OK) - return res; + if ((res = mp_int_copy(a, c)) != MP_OK) + return res; - MP_SIGN(c) = MP_ZPOS; - return MP_OK; + MP_SIGN(c) = MP_ZPOS; + return MP_OK; } /* }}} */ /* {{{ mp_int_neg(a, c) */ -mp_result mp_int_neg(mp_int a, mp_int c) +mp_result +mp_int_neg(mp_int a, mp_int c) { - mp_result res; + mp_result res; - CHECK(a != NULL && c != NULL); + CHECK(a != NULL && c != NULL); - if((res = mp_int_copy(a, c)) != MP_OK) - return res; + if ((res = mp_int_copy(a, c)) != MP_OK) + return res; - if(CMPZ(c) != 0) - MP_SIGN(c) = 1 - MP_SIGN(a); + if (CMPZ(c) != 0) + MP_SIGN(c) = 1 - MP_SIGN(a); - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_add(a, b, c) */ -mp_result mp_int_add(mp_int a, mp_int b, mp_int c) -{ - mp_size ua, ub, uc, max; - - CHECK(a != NULL && b != NULL && c != NULL); - - ua = MP_USED(a); ub = MP_USED(b); uc = MP_USED(c); - max = MAX(ua, ub); - - if(MP_SIGN(a) == MP_SIGN(b)) { - /* Same sign -- add magnitudes, preserve sign of addends */ - mp_digit carry; +mp_result +mp_int_add(mp_int a, mp_int b, mp_int c) +{ + mp_size ua, + ub, + uc, + max; - if(!s_pad(c, max)) - return MP_MEMORY; + CHECK(a != NULL && b != NULL && c != NULL); - carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); - uc = max; + ua = MP_USED(a); + ub = MP_USED(b); + uc = MP_USED(c); + max = MAX(ua, ub); - if(carry) { - if(!s_pad(c, max + 1)) - return MP_MEMORY; + if (MP_SIGN(a) == MP_SIGN(b)) + { + /* Same sign -- add magnitudes, preserve sign of addends */ + mp_digit carry; - c->digits[max] = carry; - ++uc; - } + if (!s_pad(c, max)) + return MP_MEMORY; - MP_USED(c) = uc; - MP_SIGN(c) = MP_SIGN(a); + carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); + uc = max; - } - else { - /* Different signs -- subtract magnitudes, preserve sign of greater */ - mp_int x, y; - int cmp = s_ucmp(a, b); /* magnitude comparision, sign ignored */ + if (carry) + { + if (!s_pad(c, max + 1)) + return MP_MEMORY; - /* Set x to max(a, b), y to min(a, b) to simplify later code */ - if(cmp >= 0) { - x = a; y = b; - } - else { - x = b; y = a; - } + c->digits[max] = carry; + ++uc; + } - if(!s_pad(c, MP_USED(x))) - return MP_MEMORY; + MP_USED(c) = uc; + MP_SIGN(c) = MP_SIGN(a); - /* Subtract smaller from larger */ - s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); - MP_USED(c) = MP_USED(x); - CLAMP(c); - - /* Give result the sign of the larger */ - MP_SIGN(c) = MP_SIGN(x); - } + } + else + { + /* Different signs -- subtract magnitudes, preserve sign of greater */ + mp_int x, + y; + int cmp = s_ucmp(a, b); /* magnitude comparision, sign ignored */ + + /* Set x to max(a, b), y to min(a, b) to simplify later code */ + if (cmp >= 0) + { + x = a; + y = b; + } + else + { + x = b; + y = a; + } + + if (!s_pad(c, MP_USED(x))) + return MP_MEMORY; + + /* Subtract smaller from larger */ + s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); + MP_USED(c) = MP_USED(x); + CLAMP(c); + + /* Give result the sign of the larger */ + MP_SIGN(c) = MP_SIGN(x); + } - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_add_value(a, value, c) */ -mp_result mp_int_add_value(mp_int a, int value, mp_int c) +mp_result +mp_int_add_value(mp_int a, int value, mp_int c) { - mpz_t vtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mpz_t vtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; - s_fake(&vtmp, value, vbuf); + s_fake(&vtmp, value, vbuf); - return mp_int_add(a, &vtmp, c); + return mp_int_add(a, &vtmp, c); } /* }}} */ /* {{{ mp_int_sub(a, b, c) */ -mp_result mp_int_sub(mp_int a, mp_int b, mp_int c) +mp_result +mp_int_sub(mp_int a, mp_int b, mp_int c) { - mp_size ua, ub, uc, max; + mp_size ua, + ub, + uc, + max; - CHECK(a != NULL && b != NULL && c != NULL); + CHECK(a != NULL && b != NULL && c != NULL); - ua = MP_USED(a); ub = MP_USED(b); uc = MP_USED(c); - max = MAX(ua, ub); + ua = MP_USED(a); + ub = MP_USED(b); + uc = MP_USED(c); + max = MAX(ua, ub); - if(MP_SIGN(a) != MP_SIGN(b)) { - /* Different signs -- add magnitudes and keep sign of a */ - mp_digit carry; + if (MP_SIGN(a) != MP_SIGN(b)) + { + /* Different signs -- add magnitudes and keep sign of a */ + mp_digit carry; - if(!s_pad(c, max)) - return MP_MEMORY; + if (!s_pad(c, max)) + return MP_MEMORY; - carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); - uc = max; + carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); + uc = max; - if(carry) { - if(!s_pad(c, max + 1)) - return MP_MEMORY; + if (carry) + { + if (!s_pad(c, max + 1)) + return MP_MEMORY; - c->digits[max] = carry; - ++uc; - } + c->digits[max] = carry; + ++uc; + } - MP_USED(c) = uc; - MP_SIGN(c) = MP_SIGN(a); + MP_USED(c) = uc; + MP_SIGN(c) = MP_SIGN(a); - } - else { - /* Same signs -- subtract magnitudes */ - mp_int x, y; - mp_sign osign; - int cmp = s_ucmp(a, b); + } + else + { + /* Same signs -- subtract magnitudes */ + mp_int x, + y; + mp_sign osign; + int cmp = s_ucmp(a, b); + + if (!s_pad(c, max)) + return MP_MEMORY; + + if (cmp >= 0) + { + x = a; + y = b; + osign = MP_ZPOS; + } + else + { + x = b; + y = a; + osign = MP_NEG; + } + + if (MP_SIGN(a) == MP_NEG && cmp != 0) + osign = 1 - osign; + + s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); + MP_USED(c) = MP_USED(x); + CLAMP(c); + + MP_SIGN(c) = osign; + } - if(!s_pad(c, max)) - return MP_MEMORY; + return MP_OK; +} - if(cmp >= 0) { - x = a; y = b; osign = MP_ZPOS; - } - else { - x = b; y = a; osign = MP_NEG; - } +/* }}} */ - if(MP_SIGN(a) == MP_NEG && cmp != 0) - osign = 1 - osign; +/* {{{ mp_int_sub_value(a, value, c) */ - s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); - MP_USED(c) = MP_USED(x); - CLAMP(c); +mp_result +mp_int_sub_value(mp_int a, int value, mp_int c) +{ + mpz_t vtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; - MP_SIGN(c) = osign; - } + s_fake(&vtmp, value, vbuf); - return MP_OK; + return mp_int_sub(a, &vtmp, c); } /* }}} */ -/* {{{ mp_int_sub_value(a, value, c) */ +/* {{{ mp_int_mul(a, b, c) */ -mp_result mp_int_sub_value(mp_int a, int value, mp_int c) +mp_result +mp_int_mul(mp_int a, mp_int b, mp_int c) { - mpz_t vtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mp_digit *out; + mp_size osize, + ua, + ub, + p = 0; + mp_sign osign; - s_fake(&vtmp, value, vbuf); + CHECK(a != NULL && b != NULL && c != NULL); - return mp_int_sub(a, &vtmp, c); -} + /* If either input is zero, we can shortcut multiplication */ + if (mp_int_compare_zero(a) == 0 || mp_int_compare_zero(b) == 0) + { + mp_int_zero(c); + return MP_OK; + } -/* }}} */ + /* Output is positive if inputs have same sign, otherwise negative */ + osign = (MP_SIGN(a) == MP_SIGN(b)) ? MP_ZPOS : MP_NEG; -/* {{{ mp_int_mul(a, b, c) */ + /* + * If the output is not equal to any of the inputs, we'll write the + * results there directly; otherwise, allocate a temporary space. + */ + ua = MP_USED(a); + ub = MP_USED(b); + osize = ua + ub; + + if (c == a || c == b) + { + p = ROUND_PREC(osize); + p = MAX(p, default_precision); + + if ((out = s_alloc(p)) == NULL) + return MP_MEMORY; + } + else + { + if (!s_pad(c, osize)) + return MP_MEMORY; -mp_result mp_int_mul(mp_int a, mp_int b, mp_int c) -{ - mp_digit *out; - mp_size osize, ua, ub, p = 0; - mp_sign osign; - - CHECK(a != NULL && b != NULL && c != NULL); - - /* If either input is zero, we can shortcut multiplication */ - if(mp_int_compare_zero(a) == 0 || mp_int_compare_zero(b) == 0) { - mp_int_zero(c); - return MP_OK; - } - - /* Output is positive if inputs have same sign, otherwise negative */ - osign = (MP_SIGN(a) == MP_SIGN(b)) ? MP_ZPOS : MP_NEG; - - /* If the output is not equal to any of the inputs, we'll write the - results there directly; otherwise, allocate a temporary space. */ - ua = MP_USED(a); ub = MP_USED(b); - osize = ua + ub; - - if(c == a || c == b) { - p = ROUND_PREC(osize); - p = MAX(p, default_precision); - - if((out = s_alloc(p)) == NULL) - return MP_MEMORY; - } - else { - if(!s_pad(c, osize)) - return MP_MEMORY; - - out = MP_DIGITS(c); - } - ZERO(out, osize); - - if(!s_kmul(MP_DIGITS(a), MP_DIGITS(b), out, ua, ub)) - return MP_MEMORY; - - /* If we allocated a new buffer, get rid of whatever memory c was - already using, and fix up its fields to reflect that. - */ - if(out != MP_DIGITS(c)) { - s_free(MP_DIGITS(c)); - MP_DIGITS(c) = out; - MP_ALLOC(c) = p; - } - - MP_USED(c) = osize; /* might not be true, but we'll fix it ... */ - CLAMP(c); /* ... right here */ - MP_SIGN(c) = osign; - - return MP_OK; + out = MP_DIGITS(c); + } + ZERO(out, osize); + + if (!s_kmul(MP_DIGITS(a), MP_DIGITS(b), out, ua, ub)) + return MP_MEMORY; + + /* + * If we allocated a new buffer, get rid of whatever memory c was already + * using, and fix up its fields to reflect that. + */ + if (out != MP_DIGITS(c)) + { + s_free(MP_DIGITS(c)); + MP_DIGITS(c) = out; + MP_ALLOC(c) = p; + } + + MP_USED(c) = osize; /* might not be true, but we'll fix it ... */ + CLAMP(c); /* ... right here */ + MP_SIGN(c) = osign; + + return MP_OK; } /* }}} */ /* {{{ mp_int_mul_value(a, value, c) */ -mp_result mp_int_mul_value(mp_int a, int value, mp_int c) +mp_result +mp_int_mul_value(mp_int a, int value, mp_int c) { - mpz_t vtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mpz_t vtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; - s_fake(&vtmp, value, vbuf); + s_fake(&vtmp, value, vbuf); - return mp_int_mul(a, &vtmp, c); + return mp_int_mul(a, &vtmp, c); } /* }}} */ /* {{{ mp_int_mul_pow2(a, p2, c) */ -mp_result mp_int_mul_pow2(mp_int a, int p2, mp_int c) +mp_result +mp_int_mul_pow2(mp_int a, int p2, mp_int c) { - mp_result res; - CHECK(a != NULL && c != NULL && p2 >= 0); + mp_result res; - if((res = mp_int_copy(a, c)) != MP_OK) - return res; + CHECK(a != NULL && c != NULL && p2 >= 0); - if(s_qmul(c, (mp_size) p2)) - return MP_OK; - else - return MP_MEMORY; + if ((res = mp_int_copy(a, c)) != MP_OK) + return res; + + if (s_qmul(c, (mp_size) p2)) + return MP_OK; + else + return MP_MEMORY; } /* }}} */ /* {{{ mp_int_sqr(a, c) */ -mp_result mp_int_sqr(mp_int a, mp_int c) -{ - mp_digit *out; - mp_size osize, p = 0; +mp_result +mp_int_sqr(mp_int a, mp_int c) +{ + mp_digit *out; + mp_size osize, + p = 0; - CHECK(a != NULL && c != NULL); + CHECK(a != NULL && c != NULL); - /* Get a temporary buffer big enough to hold the result */ - osize = (mp_size) 2 * MP_USED(a); - if(a == c) { - p = ROUND_PREC(osize); - p = MAX(p, default_precision); + /* Get a temporary buffer big enough to hold the result */ + osize = (mp_size) 2 *MP_USED(a); - if((out = s_alloc(p)) == NULL) - return MP_MEMORY; - } - else { - if(!s_pad(c, osize)) - return MP_MEMORY; + if (a == c) + { + p = ROUND_PREC(osize); + p = MAX(p, default_precision); - out = MP_DIGITS(c); - } - ZERO(out, osize); + if ((out = s_alloc(p)) == NULL) + return MP_MEMORY; + } + else + { + if (!s_pad(c, osize)) + return MP_MEMORY; - s_ksqr(MP_DIGITS(a), out, MP_USED(a)); + out = MP_DIGITS(c); + } + ZERO(out, osize); + + s_ksqr(MP_DIGITS(a), out, MP_USED(a)); + + /* + * Get rid of whatever memory c was already using, and fix up its fields + * to reflect the new digit array it's using + */ + if (out != MP_DIGITS(c)) + { + s_free(MP_DIGITS(c)); + MP_DIGITS(c) = out; + MP_ALLOC(c) = p; + } - /* Get rid of whatever memory c was already using, and fix up its - fields to reflect the new digit array it's using - */ - if(out != MP_DIGITS(c)) { - s_free(MP_DIGITS(c)); - MP_DIGITS(c) = out; - MP_ALLOC(c) = p; - } + MP_USED(c) = osize; /* might not be true, but we'll fix it ... */ + CLAMP(c); /* ... right here */ + MP_SIGN(c) = MP_ZPOS; - MP_USED(c) = osize; /* might not be true, but we'll fix it ... */ - CLAMP(c); /* ... right here */ - MP_SIGN(c) = MP_ZPOS; - - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_div(a, b, q, r) */ -mp_result mp_int_div(mp_int a, mp_int b, mp_int q, mp_int r) -{ - int cmp, last = 0, lg; - mp_result res = MP_OK; - mpz_t temp[2]; - mp_int qout, rout; - mp_sign sa = MP_SIGN(a), sb = MP_SIGN(b); - - CHECK(a != NULL && b != NULL && q != r); - - if(CMPZ(b) == 0) - return MP_UNDEF; - else if((cmp = s_ucmp(a, b)) < 0) { - /* If |a| < |b|, no division is required: - q = 0, r = a - */ - if(r && (res = mp_int_copy(a, r)) != MP_OK) - return res; - - if(q) - mp_int_zero(q); - - return MP_OK; - } - else if(cmp == 0) { - /* If |a| = |b|, no division is required: - q = 1 or -1, r = 0 - */ - if(r) - mp_int_zero(r); - - if(q) { - mp_int_zero(q); - q->digits[0] = 1; - - if(sa != sb) - MP_SIGN(q) = MP_NEG; - } - - return MP_OK; - } - - /* When |a| > |b|, real division is required. We need someplace to - store quotient and remainder, but q and r are allowed to be NULL - or to overlap with the inputs. - */ - if((lg = s_isp2(b)) < 0) { - if(q && b != q && (res = mp_int_copy(a, q)) == MP_OK) { - qout = q; - } - else { - qout = TEMP(last); - SETUP(mp_int_init_copy(TEMP(last), a), last); - } - - if(r && a != r && (res = mp_int_copy(b, r)) == MP_OK) { - rout = r; - } - else { - rout = TEMP(last); - SETUP(mp_int_init_copy(TEMP(last), b), last); - } - - if((res = s_udiv(qout, rout)) != MP_OK) goto CLEANUP; - } - else { - if(q && (res = mp_int_copy(a, q)) != MP_OK) goto CLEANUP; - if(r && (res = mp_int_copy(a, r)) != MP_OK) goto CLEANUP; - - if(q) s_qdiv(q, (mp_size) lg); qout = q; - if(r) s_qmod(r, (mp_size) lg); rout = r; - } - - /* Recompute signs for output */ - if(rout) { - MP_SIGN(rout) = sa; - if(CMPZ(rout) == 0) - MP_SIGN(rout) = MP_ZPOS; - } - if(qout) { - MP_SIGN(qout) = (sa == sb) ? MP_ZPOS : MP_NEG; - if(CMPZ(qout) == 0) - MP_SIGN(qout) = MP_ZPOS; - } - - if(q && (res = mp_int_copy(qout, q)) != MP_OK) goto CLEANUP; - if(r && (res = mp_int_copy(rout, r)) != MP_OK) goto CLEANUP; - - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); - - return res; +mp_result +mp_int_div(mp_int a, mp_int b, mp_int q, mp_int r) +{ + int cmp, + last = 0, + lg; + mp_result res = MP_OK; + mpz_t temp[2]; + mp_int qout, + rout; + mp_sign sa = MP_SIGN(a), + sb = MP_SIGN(b); + + CHECK(a != NULL && b != NULL && q != r); + + if (CMPZ(b) == 0) + return MP_UNDEF; + else if ((cmp = s_ucmp(a, b)) < 0) + { + /* + * If |a| < |b|, no division is required: q = 0, r = a + */ + if (r && (res = mp_int_copy(a, r)) != MP_OK) + return res; + + if (q) + mp_int_zero(q); + + return MP_OK; + } + else if (cmp == 0) + { + /* + * If |a| = |b|, no division is required: q = 1 or -1, r = 0 + */ + if (r) + mp_int_zero(r); + + if (q) + { + mp_int_zero(q); + q->digits[0] = 1; + + if (sa != sb) + MP_SIGN(q) = MP_NEG; + } + + return MP_OK; + } + + /* + * When |a| > |b|, real division is required. We need someplace to store + * quotient and remainder, but q and r are allowed to be NULL or to + * overlap with the inputs. + */ + if ((lg = s_isp2(b)) < 0) + { + if (q && b != q && (res = mp_int_copy(a, q)) == MP_OK) + { + qout = q; + } + else + { + qout = TEMP(last); + SETUP(mp_int_init_copy(TEMP(last), a), last); + } + + if (r && a != r && (res = mp_int_copy(b, r)) == MP_OK) + { + rout = r; + } + else + { + rout = TEMP(last); + SETUP(mp_int_init_copy(TEMP(last), b), last); + } + + if ((res = s_udiv(qout, rout)) != MP_OK) + goto CLEANUP; + } + else + { + if (q && (res = mp_int_copy(a, q)) != MP_OK) + goto CLEANUP; + if (r && (res = mp_int_copy(a, r)) != MP_OK) + goto CLEANUP; + + if (q) + s_qdiv(q, (mp_size) lg); + qout = q; + if (r) + s_qmod(r, (mp_size) lg); + rout = r; + } + + /* Recompute signs for output */ + if (rout) + { + MP_SIGN(rout) = sa; + if (CMPZ(rout) == 0) + MP_SIGN(rout) = MP_ZPOS; + } + if (qout) + { + MP_SIGN(qout) = (sa == sb) ? MP_ZPOS : MP_NEG; + if (CMPZ(qout) == 0) + MP_SIGN(qout) = MP_ZPOS; + } + + if (q && (res = mp_int_copy(qout, q)) != MP_OK) + goto CLEANUP; + if (r && (res = mp_int_copy(rout, r)) != MP_OK) + goto CLEANUP; + +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); + + return res; } /* }}} */ /* {{{ mp_int_mod(a, m, c) */ -mp_result mp_int_mod(mp_int a, mp_int m, mp_int c) +mp_result +mp_int_mod(mp_int a, mp_int m, mp_int c) { - mp_result res; - mpz_t tmp; - mp_int out; + mp_result res; + mpz_t tmp; + mp_int out; - if(m == c) { - if((res = mp_int_init(&tmp)) != MP_OK) - return res; + if (m == c) + { + if ((res = mp_int_init(&tmp)) != MP_OK) + return res; - out = &tmp; - } - else { - out = c; - } + out = &tmp; + } + else + { + out = c; + } - if((res = mp_int_div(a, m, NULL, out)) != MP_OK) - goto CLEANUP; + if ((res = mp_int_div(a, m, NULL, out)) != MP_OK) + goto CLEANUP; - if(CMPZ(out) < 0) - res = mp_int_add(out, m, c); - else - res = mp_int_copy(out, c); + if (CMPZ(out) < 0) + res = mp_int_add(out, m, c); + else + res = mp_int_copy(out, c); - CLEANUP: - if(out != c) - mp_int_clear(&tmp); +CLEANUP: + if (out != c) + mp_int_clear(&tmp); - return res; + return res; } /* }}} */ @@ -1007,379 +1114,416 @@ mp_result mp_int_mod(mp_int a, mp_int m, mp_int c) /* {{{ mp_int_div_value(a, value, q, r) */ -mp_result mp_int_div_value(mp_int a, int value, mp_int q, int *r) +mp_result +mp_int_div_value(mp_int a, int value, mp_int q, int *r) { - mpz_t vtmp, rtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; - mp_result res; + mpz_t vtmp, + rtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mp_result res; - if((res = mp_int_init(&rtmp)) != MP_OK) return res; - s_fake(&vtmp, value, vbuf); + if ((res = mp_int_init(&rtmp)) != MP_OK) + return res; + s_fake(&vtmp, value, vbuf); - if((res = mp_int_div(a, &vtmp, q, &rtmp)) != MP_OK) - goto CLEANUP; + if ((res = mp_int_div(a, &vtmp, q, &rtmp)) != MP_OK) + goto CLEANUP; - if(r) - (void) mp_int_to_int(&rtmp, r); /* can't fail */ + if (r) + (void) mp_int_to_int(&rtmp, r); /* can't fail */ - CLEANUP: - mp_int_clear(&rtmp); - return res; +CLEANUP: + mp_int_clear(&rtmp); + return res; } /* }}} */ /* {{{ mp_int_div_pow2(a, p2, q, r) */ -mp_result mp_int_div_pow2(mp_int a, int p2, mp_int q, mp_int r) +mp_result +mp_int_div_pow2(mp_int a, int p2, mp_int q, mp_int r) { - mp_result res = MP_OK; + mp_result res = MP_OK; + + CHECK(a != NULL && p2 >= 0 && q != r); - CHECK(a != NULL && p2 >= 0 && q != r); + if (q != NULL && (res = mp_int_copy(a, q)) == MP_OK) + s_qdiv(q, (mp_size) p2); - if(q != NULL && (res = mp_int_copy(a, q)) == MP_OK) - s_qdiv(q, (mp_size) p2); - - if(res == MP_OK && r != NULL && (res = mp_int_copy(a, r)) == MP_OK) - s_qmod(r, (mp_size) p2); + if (res == MP_OK && r != NULL && (res = mp_int_copy(a, r)) == MP_OK) + s_qmod(r, (mp_size) p2); - return res; + return res; } /* }}} */ /* {{{ mp_int_expt(a, b, c) */ -mp_result mp_int_expt(mp_int a, int b, mp_int c) +mp_result +mp_int_expt(mp_int a, int b, mp_int c) { - mpz_t t; - mp_result res; - unsigned int v = abs(b); - - CHECK(b >= 0 && c != NULL); + mpz_t t; + mp_result res; + unsigned int v = abs(b); - if((res = mp_int_init_copy(&t, a)) != MP_OK) - return res; + CHECK(b >= 0 && c != NULL); - (void) mp_int_set_value(c, 1); - while(v != 0) { - if(v & 1) { - if((res = mp_int_mul(c, &t, c)) != MP_OK) - goto CLEANUP; - } + if ((res = mp_int_init_copy(&t, a)) != MP_OK) + return res; - v >>= 1; - if(v == 0) break; + (void) mp_int_set_value(c, 1); + while (v != 0) + { + if (v & 1) + { + if ((res = mp_int_mul(c, &t, c)) != MP_OK) + goto CLEANUP; + } - if((res = mp_int_sqr(&t, &t)) != MP_OK) - goto CLEANUP; - } - - CLEANUP: - mp_int_clear(&t); - return res; + v >>= 1; + if (v == 0) + break; + + if ((res = mp_int_sqr(&t, &t)) != MP_OK) + goto CLEANUP; + } + +CLEANUP: + mp_int_clear(&t); + return res; } /* }}} */ /* {{{ mp_int_expt_value(a, b, c) */ -mp_result mp_int_expt_value(int a, int b, mp_int c) +mp_result +mp_int_expt_value(int a, int b, mp_int c) { - mpz_t t; - mp_result res; - unsigned int v = abs(b); - - CHECK(b >= 0 && c != NULL); + mpz_t t; + mp_result res; + unsigned int v = abs(b); + + CHECK(b >= 0 && c != NULL); - if((res = mp_int_init_value(&t, a)) != MP_OK) - return res; + if ((res = mp_int_init_value(&t, a)) != MP_OK) + return res; - (void) mp_int_set_value(c, 1); - while(v != 0) { - if(v & 1) { - if((res = mp_int_mul(c, &t, c)) != MP_OK) - goto CLEANUP; - } + (void) mp_int_set_value(c, 1); + while (v != 0) + { + if (v & 1) + { + if ((res = mp_int_mul(c, &t, c)) != MP_OK) + goto CLEANUP; + } - v >>= 1; - if(v == 0) break; + v >>= 1; + if (v == 0) + break; - if((res = mp_int_sqr(&t, &t)) != MP_OK) - goto CLEANUP; - } - - CLEANUP: - mp_int_clear(&t); - return res; + if ((res = mp_int_sqr(&t, &t)) != MP_OK) + goto CLEANUP; + } + +CLEANUP: + mp_int_clear(&t); + return res; } /* }}} */ /* {{{ mp_int_compare(a, b) */ -int mp_int_compare(mp_int a, mp_int b) -{ - mp_sign sa; +int +mp_int_compare(mp_int a, mp_int b) +{ + mp_sign sa; - CHECK(a != NULL && b != NULL); + CHECK(a != NULL && b != NULL); - sa = MP_SIGN(a); - if(sa == MP_SIGN(b)) { - int cmp = s_ucmp(a, b); + sa = MP_SIGN(a); + if (sa == MP_SIGN(b)) + { + int cmp = s_ucmp(a, b); - /* If they're both zero or positive, the normal comparison - applies; if both negative, the sense is reversed. */ - if(sa == MP_ZPOS) - return cmp; - else - return -cmp; + /* + * If they're both zero or positive, the normal comparison applies; if + * both negative, the sense is reversed. + */ + if (sa == MP_ZPOS) + return cmp; + else + return -cmp; - } - else { - if(sa == MP_ZPOS) - return 1; - else - return -1; - } + } + else + { + if (sa == MP_ZPOS) + return 1; + else + return -1; + } } /* }}} */ /* {{{ mp_int_compare_unsigned(a, b) */ -int mp_int_compare_unsigned(mp_int a, mp_int b) -{ - NRCHECK(a != NULL && b != NULL); +int +mp_int_compare_unsigned(mp_int a, mp_int b) +{ + NRCHECK(a != NULL && b != NULL); - return s_ucmp(a, b); + return s_ucmp(a, b); } /* }}} */ /* {{{ mp_int_compare_zero(z) */ -int mp_int_compare_zero(mp_int z) -{ - NRCHECK(z != NULL); +int +mp_int_compare_zero(mp_int z) +{ + NRCHECK(z != NULL); - if(MP_USED(z) == 1 && z->digits[0] == 0) - return 0; - else if(MP_SIGN(z) == MP_ZPOS) - return 1; - else - return -1; + if (MP_USED(z) == 1 && z->digits[0] == 0) + return 0; + else if (MP_SIGN(z) == MP_ZPOS) + return 1; + else + return -1; } /* }}} */ /* {{{ mp_int_compare_value(z, value) */ -int mp_int_compare_value(mp_int z, int value) +int +mp_int_compare_value(mp_int z, int value) { - mp_sign vsign = (value < 0) ? MP_NEG : MP_ZPOS; - int cmp; + mp_sign vsign = (value < 0) ? MP_NEG : MP_ZPOS; + int cmp; - CHECK(z != NULL); + CHECK(z != NULL); - if(vsign == MP_SIGN(z)) { - cmp = s_vcmp(z, value); + if (vsign == MP_SIGN(z)) + { + cmp = s_vcmp(z, value); - if(vsign == MP_ZPOS) - return cmp; - else - return -cmp; - } - else { - if(value < 0) - return 1; - else - return -1; - } + if (vsign == MP_ZPOS) + return cmp; + else + return -cmp; + } + else + { + if (value < 0) + return 1; + else + return -1; + } } /* }}} */ /* {{{ mp_int_exptmod(a, b, m, c) */ -mp_result mp_int_exptmod(mp_int a, mp_int b, mp_int m, mp_int c) -{ - mp_result res; - mp_size um; - mpz_t temp[3]; - mp_int s; - int last = 0; +mp_result +mp_int_exptmod(mp_int a, mp_int b, mp_int m, mp_int c) +{ + mp_result res; + mp_size um; + mpz_t temp[3]; + mp_int s; + int last = 0; - CHECK(a != NULL && b != NULL && c != NULL && m != NULL); + CHECK(a != NULL && b != NULL && c != NULL && m != NULL); - /* Zero moduli and negative exponents are not considered. */ - if(CMPZ(m) == 0) - return MP_UNDEF; - if(CMPZ(b) < 0) - return MP_RANGE; + /* Zero moduli and negative exponents are not considered. */ + if (CMPZ(m) == 0) + return MP_UNDEF; + if (CMPZ(b) < 0) + return MP_RANGE; - um = MP_USED(m); - SETUP(mp_int_init_size(TEMP(0), 2 * um), last); - SETUP(mp_int_init_size(TEMP(1), 2 * um), last); + um = MP_USED(m); + SETUP(mp_int_init_size(TEMP(0), 2 * um), last); + SETUP(mp_int_init_size(TEMP(1), 2 * um), last); - if(c == b || c == m) { - SETUP(mp_int_init_size(TEMP(2), 2 * um), last); - s = TEMP(2); - } - else { - s = c; - } - - if((res = mp_int_mod(a, m, TEMP(0))) != MP_OK) goto CLEANUP; + if (c == b || c == m) + { + SETUP(mp_int_init_size(TEMP(2), 2 * um), last); + s = TEMP(2); + } + else + { + s = c; + } - if((res = s_brmu(TEMP(1), m)) != MP_OK) goto CLEANUP; + if ((res = mp_int_mod(a, m, TEMP(0))) != MP_OK) + goto CLEANUP; - if((res = s_embar(TEMP(0), b, m, TEMP(1), s)) != MP_OK) - goto CLEANUP; + if ((res = s_brmu(TEMP(1), m)) != MP_OK) + goto CLEANUP; - res = mp_int_copy(s, c); + if ((res = s_embar(TEMP(0), b, m, TEMP(1), s)) != MP_OK) + goto CLEANUP; - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); + res = mp_int_copy(s, c); - return res; +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); + + return res; } /* }}} */ /* {{{ mp_int_exptmod_evalue(a, value, m, c) */ -mp_result mp_int_exptmod_evalue(mp_int a, int value, mp_int m, mp_int c) +mp_result +mp_int_exptmod_evalue(mp_int a, int value, mp_int m, mp_int c) { - mpz_t vtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mpz_t vtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; - s_fake(&vtmp, value, vbuf); + s_fake(&vtmp, value, vbuf); - return mp_int_exptmod(a, &vtmp, m, c); + return mp_int_exptmod(a, &vtmp, m, c); } /* }}} */ /* {{{ mp_int_exptmod_bvalue(v, b, m, c) */ -mp_result mp_int_exptmod_bvalue(int value, mp_int b, - mp_int m, mp_int c) +mp_result +mp_int_exptmod_bvalue(int value, mp_int b, + mp_int m, mp_int c) { - mpz_t vtmp; - mp_digit vbuf[MP_VALUE_DIGITS(value)]; + mpz_t vtmp; + mp_digit vbuf[MP_VALUE_DIGITS(value)]; - s_fake(&vtmp, value, vbuf); + s_fake(&vtmp, value, vbuf); - return mp_int_exptmod(&vtmp, b, m, c); + return mp_int_exptmod(&vtmp, b, m, c); } /* }}} */ /* {{{ mp_int_exptmod_known(a, b, m, mu, c) */ -mp_result mp_int_exptmod_known(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) +mp_result +mp_int_exptmod_known(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) { - mp_result res; - mp_size um; - mpz_t temp[2]; - mp_int s; - int last = 0; + mp_result res; + mp_size um; + mpz_t temp[2]; + mp_int s; + int last = 0; + + CHECK(a && b && m && c); - CHECK(a && b && m && c); + /* Zero moduli and negative exponents are not considered. */ + if (CMPZ(m) == 0) + return MP_UNDEF; + if (CMPZ(b) < 0) + return MP_RANGE; - /* Zero moduli and negative exponents are not considered. */ - if(CMPZ(m) == 0) - return MP_UNDEF; - if(CMPZ(b) < 0) - return MP_RANGE; + um = MP_USED(m); + SETUP(mp_int_init_size(TEMP(0), 2 * um), last); - um = MP_USED(m); - SETUP(mp_int_init_size(TEMP(0), 2 * um), last); + if (c == b || c == m) + { + SETUP(mp_int_init_size(TEMP(1), 2 * um), last); + s = TEMP(1); + } + else + { + s = c; + } - if(c == b || c == m) { - SETUP(mp_int_init_size(TEMP(1), 2 * um), last); - s = TEMP(1); - } - else { - s = c; - } - - if((res = mp_int_mod(a, m, TEMP(0))) != MP_OK) goto CLEANUP; + if ((res = mp_int_mod(a, m, TEMP(0))) != MP_OK) + goto CLEANUP; - if((res = s_embar(TEMP(0), b, m, mu, s)) != MP_OK) - goto CLEANUP; + if ((res = s_embar(TEMP(0), b, m, mu, s)) != MP_OK) + goto CLEANUP; - res = mp_int_copy(s, c); + res = mp_int_copy(s, c); - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); - return res; + return res; } /* }}} */ /* {{{ mp_int_redux_const(m, c) */ -mp_result mp_int_redux_const(mp_int m, mp_int c) +mp_result +mp_int_redux_const(mp_int m, mp_int c) { - CHECK(m != NULL && c != NULL && m != c); + CHECK(m != NULL && c != NULL && m != c); - return s_brmu(c, m); + return s_brmu(c, m); } /* }}} */ /* {{{ mp_int_invmod(a, m, c) */ -mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c) +mp_result +mp_int_invmod(mp_int a, mp_int m, mp_int c) { - mp_result res; - mp_sign sa; - int last = 0; - mpz_t temp[2]; + mp_result res; + mp_sign sa; + int last = 0; + mpz_t temp[2]; - CHECK(a != NULL && m != NULL && c != NULL); + CHECK(a != NULL && m != NULL && c != NULL); - if(CMPZ(a) == 0 || CMPZ(m) <= 0) - return MP_RANGE; + if (CMPZ(a) == 0 || CMPZ(m) <= 0) + return MP_RANGE; - sa = MP_SIGN(a); /* need this for the result later */ + sa = MP_SIGN(a); /* need this for the result later */ - for(last = 0; last < 2; ++last) - if((res = mp_int_init(TEMP(last))) != MP_OK) - goto CLEANUP; + for (last = 0; last < 2; ++last) + if ((res = mp_int_init(TEMP(last))) != MP_OK) + goto CLEANUP; - if((res = mp_int_egcd(a, m, TEMP(0), TEMP(1), NULL)) != MP_OK) - goto CLEANUP; + if ((res = mp_int_egcd(a, m, TEMP(0), TEMP(1), NULL)) != MP_OK) + goto CLEANUP; - if(mp_int_compare_value(TEMP(0), 1) != 0) { - res = MP_UNDEF; - goto CLEANUP; - } + if (mp_int_compare_value(TEMP(0), 1) != 0) + { + res = MP_UNDEF; + goto CLEANUP; + } - /* It is first necessary to constrain the value to the proper range */ - if((res = mp_int_mod(TEMP(1), m, TEMP(1))) != MP_OK) - goto CLEANUP; + /* It is first necessary to constrain the value to the proper range */ + if ((res = mp_int_mod(TEMP(1), m, TEMP(1))) != MP_OK) + goto CLEANUP; - /* Now, if 'a' was originally negative, the value we have is - actually the magnitude of the negative representative; to get the - positive value we have to subtract from the modulus. Otherwise, - the value is okay as it stands. - */ - if(sa == MP_NEG) - res = mp_int_sub(m, TEMP(1), c); - else - res = mp_int_copy(TEMP(1), c); + /* + * Now, if 'a' was originally negative, the value we have is actually the + * magnitude of the negative representative; to get the positive value we + * have to subtract from the modulus. Otherwise, the value is okay as it + * stands. + */ + if (sa == MP_NEG) + res = mp_int_sub(m, TEMP(1), c); + else + res = mp_int_copy(TEMP(1), c); - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); - return res; + return res; } /* }}} */ @@ -1387,79 +1531,91 @@ mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c) /* {{{ mp_int_gcd(a, b, c) */ /* Binary GCD algorithm due to Josef Stein, 1961 */ -mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c) -{ - int ca, cb, k = 0; - mpz_t u, v, t; - mp_result res; - - CHECK(a != NULL && b != NULL && c != NULL); - - ca = CMPZ(a); - cb = CMPZ(b); - if(ca == 0 && cb == 0) - return MP_UNDEF; - else if(ca == 0) - return mp_int_abs(b, c); - else if(cb == 0) - return mp_int_abs(a, c); - - if((res = mp_int_init(&t)) != MP_OK) - return res; - if((res = mp_int_init_copy(&u, a)) != MP_OK) - goto U; - if((res = mp_int_init_copy(&v, b)) != MP_OK) - goto V; - - MP_SIGN(&u) = MP_ZPOS; MP_SIGN(&v) = MP_ZPOS; - - { /* Divide out common factors of 2 from u and v */ - int div2_u = s_dp2k(&u), div2_v = s_dp2k(&v); - - k = MIN(div2_u, div2_v); - s_qdiv(&u, (mp_size) k); - s_qdiv(&v, (mp_size) k); - } - - if(mp_int_is_odd(&u)) { - if((res = mp_int_neg(&v, &t)) != MP_OK) - goto CLEANUP; - } - else { - if((res = mp_int_copy(&u, &t)) != MP_OK) - goto CLEANUP; - } - - for(;;) { - s_qdiv(&t, s_dp2k(&t)); - - if(CMPZ(&t) > 0) { - if((res = mp_int_copy(&t, &u)) != MP_OK) - goto CLEANUP; - } - else { - if((res = mp_int_neg(&t, &v)) != MP_OK) - goto CLEANUP; - } - - if((res = mp_int_sub(&u, &v, &t)) != MP_OK) - goto CLEANUP; - - if(CMPZ(&t) == 0) - break; - } - - if((res = mp_int_abs(&u, c)) != MP_OK) - goto CLEANUP; - if(!s_qmul(c, (mp_size) k)) - res = MP_MEMORY; - - CLEANUP: - mp_int_clear(&v); - V: mp_int_clear(&u); - U: mp_int_clear(&t); - - return res; +mp_result +mp_int_gcd(mp_int a, mp_int b, mp_int c) +{ + int ca, + cb, + k = 0; + mpz_t u, + v, + t; + mp_result res; + + CHECK(a != NULL && b != NULL && c != NULL); + + ca = CMPZ(a); + cb = CMPZ(b); + if (ca == 0 && cb == 0) + return MP_UNDEF; + else if (ca == 0) + return mp_int_abs(b, c); + else if (cb == 0) + return mp_int_abs(a, c); + + if ((res = mp_int_init(&t)) != MP_OK) + return res; + if ((res = mp_int_init_copy(&u, a)) != MP_OK) + goto U; + if ((res = mp_int_init_copy(&v, b)) != MP_OK) + goto V; + + MP_SIGN(&u) = MP_ZPOS; + MP_SIGN(&v) = MP_ZPOS; + + { /* Divide out common factors of 2 from u and v */ + int div2_u = s_dp2k(&u), + div2_v = s_dp2k(&v); + + k = MIN(div2_u, div2_v); + s_qdiv(&u, (mp_size) k); + s_qdiv(&v, (mp_size) k); + } + + if (mp_int_is_odd(&u)) + { + if ((res = mp_int_neg(&v, &t)) != MP_OK) + goto CLEANUP; + } + else + { + if ((res = mp_int_copy(&u, &t)) != MP_OK) + goto CLEANUP; + } + + for (;;) + { + s_qdiv(&t, s_dp2k(&t)); + + if (CMPZ(&t) > 0) + { + if ((res = mp_int_copy(&t, &u)) != MP_OK) + goto CLEANUP; + } + else + { + if ((res = mp_int_neg(&t, &v)) != MP_OK) + goto CLEANUP; + } + + if ((res = mp_int_sub(&u, &v, &t)) != MP_OK) + goto CLEANUP; + + if (CMPZ(&t) == 0) + break; + } + + if ((res = mp_int_abs(&u, c)) != MP_OK) + goto CLEANUP; + if (!s_qmul(c, (mp_size) k)) + res = MP_MEMORY; + +CLEANUP: + mp_int_clear(&v); +V: mp_int_clear(&u); +U: mp_int_clear(&t); + + return res; } /* }}} */ @@ -1470,308 +1626,361 @@ mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c) of the elementary matrix operations as we go, so we can get values x and y satisfying c = ax + by. */ -mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c, - mp_int x, mp_int y) -{ - int k, last = 0, ca, cb; - mpz_t temp[8]; - mp_result res; - - CHECK(a != NULL && b != NULL && c != NULL && - (x != NULL || y != NULL)); - - ca = CMPZ(a); - cb = CMPZ(b); - if(ca == 0 && cb == 0) - return MP_UNDEF; - else if(ca == 0) { - if((res = mp_int_abs(b, c)) != MP_OK) return res; - mp_int_zero(x); (void) mp_int_set_value(y, 1); return MP_OK; - } - else if(cb == 0) { - if((res = mp_int_abs(a, c)) != MP_OK) return res; - (void) mp_int_set_value(x, 1); mp_int_zero(y); return MP_OK; - } - - /* Initialize temporaries: - A:0, B:1, C:2, D:3, u:4, v:5, ou:6, ov:7 */ - for(last = 0; last < 4; ++last) { - if((res = mp_int_init(TEMP(last))) != MP_OK) - goto CLEANUP; - } - TEMP(0)->digits[0] = 1; - TEMP(3)->digits[0] = 1; - - SETUP(mp_int_init_copy(TEMP(4), a), last); - SETUP(mp_int_init_copy(TEMP(5), b), last); - - /* We will work with absolute values here */ - MP_SIGN(TEMP(4)) = MP_ZPOS; - MP_SIGN(TEMP(5)) = MP_ZPOS; - - { /* Divide out common factors of 2 from u and v */ - int div2_u = s_dp2k(TEMP(4)), div2_v = s_dp2k(TEMP(5)); - - k = MIN(div2_u, div2_v); - s_qdiv(TEMP(4), k); - s_qdiv(TEMP(5), k); - } - - SETUP(mp_int_init_copy(TEMP(6), TEMP(4)), last); - SETUP(mp_int_init_copy(TEMP(7), TEMP(5)), last); - - for(;;) { - while(mp_int_is_even(TEMP(4))) { - s_qdiv(TEMP(4), 1); - - if(mp_int_is_odd(TEMP(0)) || mp_int_is_odd(TEMP(1))) { - if((res = mp_int_add(TEMP(0), TEMP(7), TEMP(0))) != MP_OK) - goto CLEANUP; - if((res = mp_int_sub(TEMP(1), TEMP(6), TEMP(1))) != MP_OK) - goto CLEANUP; - } - - s_qdiv(TEMP(0), 1); - s_qdiv(TEMP(1), 1); - } - - while(mp_int_is_even(TEMP(5))) { - s_qdiv(TEMP(5), 1); - - if(mp_int_is_odd(TEMP(2)) || mp_int_is_odd(TEMP(3))) { - if((res = mp_int_add(TEMP(2), TEMP(7), TEMP(2))) != MP_OK) - goto CLEANUP; - if((res = mp_int_sub(TEMP(3), TEMP(6), TEMP(3))) != MP_OK) - goto CLEANUP; - } - - s_qdiv(TEMP(2), 1); - s_qdiv(TEMP(3), 1); - } - - if(mp_int_compare(TEMP(4), TEMP(5)) >= 0) { - if((res = mp_int_sub(TEMP(4), TEMP(5), TEMP(4))) != MP_OK) goto CLEANUP; - if((res = mp_int_sub(TEMP(0), TEMP(2), TEMP(0))) != MP_OK) goto CLEANUP; - if((res = mp_int_sub(TEMP(1), TEMP(3), TEMP(1))) != MP_OK) goto CLEANUP; - } - else { - if((res = mp_int_sub(TEMP(5), TEMP(4), TEMP(5))) != MP_OK) goto CLEANUP; - if((res = mp_int_sub(TEMP(2), TEMP(0), TEMP(2))) != MP_OK) goto CLEANUP; - if((res = mp_int_sub(TEMP(3), TEMP(1), TEMP(3))) != MP_OK) goto CLEANUP; - } - - if(CMPZ(TEMP(4)) == 0) { - if(x && (res = mp_int_copy(TEMP(2), x)) != MP_OK) goto CLEANUP; - if(y && (res = mp_int_copy(TEMP(3), y)) != MP_OK) goto CLEANUP; - if(c) { - if(!s_qmul(TEMP(5), k)) { - res = MP_MEMORY; - goto CLEANUP; - } - - res = mp_int_copy(TEMP(5), c); - } - - break; - } - } - - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); - - return res; +mp_result +mp_int_egcd(mp_int a, mp_int b, mp_int c, + mp_int x, mp_int y) +{ + int k, + last = 0, + ca, + cb; + mpz_t temp[8]; + mp_result res; + + CHECK(a != NULL && b != NULL && c != NULL && + (x != NULL || y != NULL)); + + ca = CMPZ(a); + cb = CMPZ(b); + if (ca == 0 && cb == 0) + return MP_UNDEF; + else if (ca == 0) + { + if ((res = mp_int_abs(b, c)) != MP_OK) + return res; + mp_int_zero(x); + (void) mp_int_set_value(y, 1); + return MP_OK; + } + else if (cb == 0) + { + if ((res = mp_int_abs(a, c)) != MP_OK) + return res; + (void) mp_int_set_value(x, 1); + mp_int_zero(y); + return MP_OK; + } + + /* + * Initialize temporaries: A:0, B:1, C:2, D:3, u:4, v:5, ou:6, ov:7 + */ + for (last = 0; last < 4; ++last) + { + if ((res = mp_int_init(TEMP(last))) != MP_OK) + goto CLEANUP; + } + TEMP(0)->digits[0] = 1; + TEMP(3)->digits[0] = 1; + + SETUP(mp_int_init_copy(TEMP(4), a), last); + SETUP(mp_int_init_copy(TEMP(5), b), last); + + /* We will work with absolute values here */ + MP_SIGN(TEMP(4)) = MP_ZPOS; + MP_SIGN(TEMP(5)) = MP_ZPOS; + + { /* Divide out common factors of 2 from u and v */ + int div2_u = s_dp2k(TEMP(4)), + div2_v = s_dp2k(TEMP(5)); + + k = MIN(div2_u, div2_v); + s_qdiv(TEMP(4), k); + s_qdiv(TEMP(5), k); + } + + SETUP(mp_int_init_copy(TEMP(6), TEMP(4)), last); + SETUP(mp_int_init_copy(TEMP(7), TEMP(5)), last); + + for (;;) + { + while (mp_int_is_even(TEMP(4))) + { + s_qdiv(TEMP(4), 1); + + if (mp_int_is_odd(TEMP(0)) || mp_int_is_odd(TEMP(1))) + { + if ((res = mp_int_add(TEMP(0), TEMP(7), TEMP(0))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(1), TEMP(6), TEMP(1))) != MP_OK) + goto CLEANUP; + } + + s_qdiv(TEMP(0), 1); + s_qdiv(TEMP(1), 1); + } + + while (mp_int_is_even(TEMP(5))) + { + s_qdiv(TEMP(5), 1); + + if (mp_int_is_odd(TEMP(2)) || mp_int_is_odd(TEMP(3))) + { + if ((res = mp_int_add(TEMP(2), TEMP(7), TEMP(2))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(3), TEMP(6), TEMP(3))) != MP_OK) + goto CLEANUP; + } + + s_qdiv(TEMP(2), 1); + s_qdiv(TEMP(3), 1); + } + + if (mp_int_compare(TEMP(4), TEMP(5)) >= 0) + { + if ((res = mp_int_sub(TEMP(4), TEMP(5), TEMP(4))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(0), TEMP(2), TEMP(0))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(1), TEMP(3), TEMP(1))) != MP_OK) + goto CLEANUP; + } + else + { + if ((res = mp_int_sub(TEMP(5), TEMP(4), TEMP(5))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(2), TEMP(0), TEMP(2))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_sub(TEMP(3), TEMP(1), TEMP(3))) != MP_OK) + goto CLEANUP; + } + + if (CMPZ(TEMP(4)) == 0) + { + if (x && (res = mp_int_copy(TEMP(2), x)) != MP_OK) + goto CLEANUP; + if (y && (res = mp_int_copy(TEMP(3), y)) != MP_OK) + goto CLEANUP; + if (c) + { + if (!s_qmul(TEMP(5), k)) + { + res = MP_MEMORY; + goto CLEANUP; + } + + res = mp_int_copy(TEMP(5), c); + } + + break; + } + } + +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); + + return res; } /* }}} */ /* {{{ mp_int_divisible_value(a, v) */ -int mp_int_divisible_value(mp_int a, int v) +int +mp_int_divisible_value(mp_int a, int v) { - int rem = 0; + int rem = 0; - if(mp_int_div_value(a, v, NULL, &rem) != MP_OK) - return 0; + if (mp_int_div_value(a, v, NULL, &rem) != MP_OK) + return 0; - return rem == 0; + return rem == 0; } /* }}} */ /* {{{ mp_int_is_pow2(z) */ -int mp_int_is_pow2(mp_int z) +int +mp_int_is_pow2(mp_int z) { - CHECK(z != NULL); + CHECK(z != NULL); - return s_isp2(z); + return s_isp2(z); } /* }}} */ /* {{{ mp_int_sqrt(a, c) */ -mp_result mp_int_sqrt(mp_int a, mp_int c) +mp_result +mp_int_sqrt(mp_int a, mp_int c) { - mp_result res = MP_OK; - mpz_t temp[2]; - int last = 0; + mp_result res = MP_OK; + mpz_t temp[2]; + int last = 0; - CHECK(a != NULL && c != NULL); + CHECK(a != NULL && c != NULL); - /* The square root of a negative value does not exist in the integers. */ - if(MP_SIGN(a) == MP_NEG) - return MP_UNDEF; + /* The square root of a negative value does not exist in the integers. */ + if (MP_SIGN(a) == MP_NEG) + return MP_UNDEF; - SETUP(mp_int_init_copy(TEMP(last), a), last); - SETUP(mp_int_init(TEMP(last)), last); + SETUP(mp_int_init_copy(TEMP(last), a), last); + SETUP(mp_int_init(TEMP(last)), last); - for(;;) { - if((res = mp_int_sqr(TEMP(0), TEMP(1))) != MP_OK) - goto CLEANUP; + for (;;) + { + if ((res = mp_int_sqr(TEMP(0), TEMP(1))) != MP_OK) + goto CLEANUP; - if(mp_int_compare_unsigned(a, TEMP(1)) == 0) break; + if (mp_int_compare_unsigned(a, TEMP(1)) == 0) + break; - if((res = mp_int_copy(a, TEMP(1))) != MP_OK) - goto CLEANUP; - if((res = mp_int_div(TEMP(1), TEMP(0), TEMP(1), NULL)) != MP_OK) - goto CLEANUP; - if((res = mp_int_add(TEMP(0), TEMP(1), TEMP(1))) != MP_OK) - goto CLEANUP; - if((res = mp_int_div_pow2(TEMP(1), 1, TEMP(1), NULL)) != MP_OK) - goto CLEANUP; + if ((res = mp_int_copy(a, TEMP(1))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_div(TEMP(1), TEMP(0), TEMP(1), NULL)) != MP_OK) + goto CLEANUP; + if ((res = mp_int_add(TEMP(0), TEMP(1), TEMP(1))) != MP_OK) + goto CLEANUP; + if ((res = mp_int_div_pow2(TEMP(1), 1, TEMP(1), NULL)) != MP_OK) + goto CLEANUP; - if(mp_int_compare_unsigned(TEMP(0), TEMP(1)) == 0) break; - if((res = mp_int_sub_value(TEMP(0), 1, TEMP(0))) != MP_OK) goto CLEANUP; - if(mp_int_compare_unsigned(TEMP(0), TEMP(1)) == 0) break; + if (mp_int_compare_unsigned(TEMP(0), TEMP(1)) == 0) + break; + if ((res = mp_int_sub_value(TEMP(0), 1, TEMP(0))) != MP_OK) + goto CLEANUP; + if (mp_int_compare_unsigned(TEMP(0), TEMP(1)) == 0) + break; - if((res = mp_int_copy(TEMP(1), TEMP(0))) != MP_OK) goto CLEANUP; - } - - res = mp_int_copy(TEMP(0), c); + if ((res = mp_int_copy(TEMP(1), TEMP(0))) != MP_OK) + goto CLEANUP; + } - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); - - return res; + res = mp_int_copy(TEMP(0), c); + +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); + + return res; } /* }}} */ /* {{{ mp_int_to_int(z, out) */ -mp_result mp_int_to_int(mp_int z, int *out) +mp_result +mp_int_to_int(mp_int z, int *out) { - unsigned int uv = 0; - mp_size uz; - mp_digit *dz; - mp_sign sz; + unsigned int uv = 0; + mp_size uz; + mp_digit *dz; + mp_sign sz; - CHECK(z != NULL); + CHECK(z != NULL); - /* Make sure the value is representable as an int */ - sz = MP_SIGN(z); - if((sz == MP_ZPOS && mp_int_compare_value(z, INT_MAX) > 0) || - mp_int_compare_value(z, INT_MIN) < 0) - return MP_RANGE; - - uz = MP_USED(z); - dz = MP_DIGITS(z) + uz - 1; - - while(uz > 0) { - uv <<= MP_DIGIT_BIT/2; - uv = (uv << (MP_DIGIT_BIT/2)) | *dz--; - --uz; - } + /* Make sure the value is representable as an int */ + sz = MP_SIGN(z); + if ((sz == MP_ZPOS && mp_int_compare_value(z, INT_MAX) > 0) || + mp_int_compare_value(z, INT_MIN) < 0) + return MP_RANGE; - if(out) - *out = (sz == MP_NEG) ? -(int)uv : (int)uv; + uz = MP_USED(z); + dz = MP_DIGITS(z) + uz - 1; - return MP_OK; + while (uz > 0) + { + uv <<= MP_DIGIT_BIT / 2; + uv = (uv << (MP_DIGIT_BIT / 2)) | *dz--; + --uz; + } + + if (out) + *out = (sz == MP_NEG) ? -(int) uv : (int) uv; + + return MP_OK; } /* }}} */ /* {{{ mp_int_to_string(z, radix, str, limit) */ -mp_result mp_int_to_string(mp_int z, mp_size radix, - char *str, int limit) +mp_result +mp_int_to_string(mp_int z, mp_size radix, + char *str, int limit) { - mp_result res; - int cmp = 0; - - CHECK(z != NULL && str != NULL && limit >= 2); - - if(radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) - return MP_RANGE; - - if(CMPZ(z) == 0) { - *str++ = s_val2ch(0, mp_flags & MP_CAP_DIGITS); - } - else { - mpz_t tmp; - char *h, *t; - - if((res = mp_int_init_copy(&tmp, z)) != MP_OK) - return res; - - if(MP_SIGN(z) == MP_NEG) { - *str++ = '-'; - --limit; - } - h = str; + mp_result res; + int cmp = 0; - /* Generate digits in reverse order until finished or limit reached */ - for(/* */; limit > 0; --limit) { - mp_digit d; + CHECK(z != NULL && str != NULL && limit >= 2); - if((cmp = CMPZ(&tmp)) == 0) - break; + if (radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) + return MP_RANGE; - d = s_ddiv(&tmp, (mp_digit)radix); - *str++ = s_val2ch(d, mp_flags & MP_CAP_DIGITS); - } - t = str - 1; - - /* Put digits back in correct output order */ - while(h < t) { - char tc = *h; - *h++ = *t; - *t-- = tc; - } - - mp_int_clear(&tmp); - } + if (CMPZ(z) == 0) + { + *str++ = s_val2ch(0, mp_flags & MP_CAP_DIGITS); + } + else + { + mpz_t tmp; + char *h, + *t; + + if ((res = mp_int_init_copy(&tmp, z)) != MP_OK) + return res; + + if (MP_SIGN(z) == MP_NEG) + { + *str++ = '-'; + --limit; + } + h = str; + + /* Generate digits in reverse order until finished or limit reached */ + for ( /* */ ; limit > 0; --limit) + { + mp_digit d; + + if ((cmp = CMPZ(&tmp)) == 0) + break; + + d = s_ddiv(&tmp, (mp_digit) radix); + *str++ = s_val2ch(d, mp_flags & MP_CAP_DIGITS); + } + t = str - 1; + + /* Put digits back in correct output order */ + while (h < t) + { + char tc = *h; + + *h++ = *t; + *t-- = tc; + } + + mp_int_clear(&tmp); + } - *str = '\0'; - if(cmp == 0) - return MP_OK; - else - return MP_TRUNC; + *str = '\0'; + if (cmp == 0) + return MP_OK; + else + return MP_TRUNC; } /* }}} */ /* {{{ mp_int_string_len(z, radix) */ -mp_result mp_int_string_len(mp_int z, mp_size radix) -{ - int len; +mp_result +mp_int_string_len(mp_int z, mp_size radix) +{ + int len; - CHECK(z != NULL); + CHECK(z != NULL); - if(radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) - return MP_RANGE; + if (radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) + return MP_RANGE; - len = s_outlen(z, radix) + 1; /* for terminator */ + len = s_outlen(z, radix) + 1; /* for terminator */ - /* Allow for sign marker on negatives */ - if(MP_SIGN(z) == MP_NEG) - len += 1; + /* Allow for sign marker on negatives */ + if (MP_SIGN(z) == MP_NEG) + len += 1; - return len; + return len; } /* }}} */ @@ -1779,9 +1988,10 @@ mp_result mp_int_string_len(mp_int z, mp_size radix) /* {{{ mp_int_read_string(z, radix, *str) */ /* Read zero-terminated string into z */ -mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str) +mp_result +mp_int_read_string(mp_int z, mp_size radix, const char *str) { - return mp_int_read_cstring(z, radix, str, NULL); + return mp_int_read_cstring(z, radix, str, NULL); } @@ -1789,281 +1999,308 @@ mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str) /* {{{ mp_int_read_cstring(z, radix, *str, **end) */ -mp_result mp_int_read_cstring(mp_int z, mp_size radix, const char *str, char **end) -{ - int ch; +mp_result +mp_int_read_cstring(mp_int z, mp_size radix, const char *str, char **end) +{ + int ch; - CHECK(z != NULL && str != NULL); + CHECK(z != NULL && str != NULL); - if(radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) - return MP_RANGE; + if (radix < MP_MIN_RADIX || radix > MP_MAX_RADIX) + return MP_RANGE; - /* Skip leading whitespace */ - while(isspace((unsigned char) *str)) - ++str; + /* Skip leading whitespace */ + while (isspace((unsigned char) *str)) + ++str; - /* Handle leading sign tag (+/-, positive default) */ - switch(*str) { - case '-': - MP_SIGN(z) = MP_NEG; - ++str; - break; - case '+': - ++str; /* fallthrough */ - default: - MP_SIGN(z) = MP_ZPOS; - break; - } + /* Handle leading sign tag (+/-, positive default) */ + switch (*str) + { + case '-': + MP_SIGN(z) = MP_NEG; + ++str; + break; + case '+': + ++str; /* fallthrough */ + default: + MP_SIGN(z) = MP_ZPOS; + break; + } + + /* Skip leading zeroes */ + while ((ch = s_ch2val(*str, radix)) == 0) + ++str; - /* Skip leading zeroes */ - while((ch = s_ch2val(*str, radix)) == 0) - ++str; + /* Make sure there is enough space for the value */ + if (!s_pad(z, s_inlen(strlen(str), radix))) + return MP_MEMORY; - /* Make sure there is enough space for the value */ - if(!s_pad(z, s_inlen(strlen(str), radix))) - return MP_MEMORY; + MP_USED(z) = 1; + z->digits[0] = 0; + + while (*str != '\0' && ((ch = s_ch2val(*str, radix)) >= 0)) + { + s_dmul(z, (mp_digit) radix); + s_dadd(z, (mp_digit) ch); + ++str; + } - MP_USED(z) = 1; z->digits[0] = 0; + CLAMP(z); - while(*str != '\0' && ((ch = s_ch2val(*str, radix)) >= 0)) { - s_dmul(z, (mp_digit)radix); - s_dadd(z, (mp_digit)ch); - ++str; - } - - CLAMP(z); + /* Override sign for zero, even if negative specified. */ + if (CMPZ(z) == 0) + MP_SIGN(z) = MP_ZPOS; - /* Override sign for zero, even if negative specified. */ - if(CMPZ(z) == 0) - MP_SIGN(z) = MP_ZPOS; - - if(end != NULL) - *end = (char *)str; + if (end != NULL) + *end = (char *) str; - /* Return a truncation error if the string has unprocessed - characters remaining, so the caller can tell if the whole string - was done */ - if(*str != '\0') - return MP_TRUNC; - else - return MP_OK; + /* + * Return a truncation error if the string has unprocessed characters + * remaining, so the caller can tell if the whole string was done + */ + if (*str != '\0') + return MP_TRUNC; + else + return MP_OK; } /* }}} */ /* {{{ mp_int_count_bits(z) */ -mp_result mp_int_count_bits(mp_int z) +mp_result +mp_int_count_bits(mp_int z) { - mp_size nbits = 0, uz; - mp_digit d; + mp_size nbits = 0, + uz; + mp_digit d; - CHECK(z != NULL); + CHECK(z != NULL); - uz = MP_USED(z); - if(uz == 1 && z->digits[0] == 0) - return 1; + uz = MP_USED(z); + if (uz == 1 && z->digits[0] == 0) + return 1; - --uz; - nbits = uz * MP_DIGIT_BIT; - d = z->digits[uz]; + --uz; + nbits = uz * MP_DIGIT_BIT; + d = z->digits[uz]; - while(d != 0) { - d >>= 1; - ++nbits; - } + while (d != 0) + { + d >>= 1; + ++nbits; + } - return nbits; + return nbits; } /* }}} */ /* {{{ mp_int_to_binary(z, buf, limit) */ -mp_result mp_int_to_binary(mp_int z, unsigned char *buf, int limit) +mp_result +mp_int_to_binary(mp_int z, unsigned char *buf, int limit) { - static const int PAD_FOR_2C = 1; + static const int PAD_FOR_2C = 1; + + mp_result res; + int limpos = limit; - mp_result res; - int limpos = limit; + CHECK(z != NULL && buf != NULL); - CHECK(z != NULL && buf != NULL); - - res = s_tobin(z, buf, &limpos, PAD_FOR_2C); + res = s_tobin(z, buf, &limpos, PAD_FOR_2C); - if(MP_SIGN(z) == MP_NEG) - s_2comp(buf, limpos); + if (MP_SIGN(z) == MP_NEG) + s_2comp(buf, limpos); - return res; + return res; } /* }}} */ /* {{{ mp_int_read_binary(z, buf, len) */ -mp_result mp_int_read_binary(mp_int z, unsigned char *buf, int len) +mp_result +mp_int_read_binary(mp_int z, unsigned char *buf, int len) { - mp_size need, i; - unsigned char *tmp; - mp_digit *dz; + mp_size need, + i; + unsigned char *tmp; + mp_digit *dz; + + CHECK(z != NULL && buf != NULL && len > 0); - CHECK(z != NULL && buf != NULL && len > 0); + /* Figure out how many digits are needed to represent this value */ + need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; + if (!s_pad(z, need)) + return MP_MEMORY; - /* Figure out how many digits are needed to represent this value */ - need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; - if(!s_pad(z, need)) - return MP_MEMORY; + mp_int_zero(z); - mp_int_zero(z); + /* + * If the high-order bit is set, take the 2's complement before reading + * the value (it will be restored afterward) + */ + if (buf[0] >> (CHAR_BIT - 1)) + { + MP_SIGN(z) = MP_NEG; + s_2comp(buf, len); + } - /* If the high-order bit is set, take the 2's complement before - reading the value (it will be restored afterward) */ - if(buf[0] >> (CHAR_BIT - 1)) { - MP_SIGN(z) = MP_NEG; - s_2comp(buf, len); - } - - dz = MP_DIGITS(z); - for(tmp = buf, i = len; i > 0; --i, ++tmp) { - s_qmul(z, (mp_size) CHAR_BIT); - *dz |= *tmp; - } + dz = MP_DIGITS(z); + for (tmp = buf, i = len; i > 0; --i, ++tmp) + { + s_qmul(z, (mp_size) CHAR_BIT); + *dz |= *tmp; + } - /* Restore 2's complement if we took it before */ - if(MP_SIGN(z) == MP_NEG) - s_2comp(buf, len); + /* Restore 2's complement if we took it before */ + if (MP_SIGN(z) == MP_NEG) + s_2comp(buf, len); - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_binary_len(z) */ -mp_result mp_int_binary_len(mp_int z) +mp_result +mp_int_binary_len(mp_int z) { - mp_result res = mp_int_count_bits(z); - int bytes = mp_int_unsigned_len(z); + mp_result res = mp_int_count_bits(z); + int bytes = mp_int_unsigned_len(z); - if(res <= 0) - return res; + if (res <= 0) + return res; - bytes = (res + (CHAR_BIT - 1)) / CHAR_BIT; + bytes = (res + (CHAR_BIT - 1)) / CHAR_BIT; - /* If the highest-order bit falls exactly on a byte boundary, we - need to pad with an extra byte so that the sign will be read - correctly when reading it back in. */ - if(bytes * CHAR_BIT == res) - ++bytes; + /* + * If the highest-order bit falls exactly on a byte boundary, we need to + * pad with an extra byte so that the sign will be read correctly when + * reading it back in. + */ + if (bytes * CHAR_BIT == res) + ++bytes; - return bytes; + return bytes; } /* }}} */ /* {{{ mp_int_to_unsigned(z, buf, limit) */ -mp_result mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit) +mp_result +mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit) { - static const int NO_PADDING = 0; + static const int NO_PADDING = 0; - CHECK(z != NULL && buf != NULL); + CHECK(z != NULL && buf != NULL); - return s_tobin(z, buf, &limit, NO_PADDING); + return s_tobin(z, buf, &limit, NO_PADDING); } /* }}} */ /* {{{ mp_int_read_unsigned(z, buf, len) */ -mp_result mp_int_read_unsigned(mp_int z, unsigned char *buf, int len) +mp_result +mp_int_read_unsigned(mp_int z, unsigned char *buf, int len) { - mp_size need, i; - unsigned char *tmp; - mp_digit *dz; + mp_size need, + i; + unsigned char *tmp; + mp_digit *dz; - CHECK(z != NULL && buf != NULL && len > 0); + CHECK(z != NULL && buf != NULL && len > 0); - /* Figure out how many digits are needed to represent this value */ - need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; - if(!s_pad(z, need)) - return MP_MEMORY; + /* Figure out how many digits are needed to represent this value */ + need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; + if (!s_pad(z, need)) + return MP_MEMORY; - mp_int_zero(z); + mp_int_zero(z); - dz = MP_DIGITS(z); - for(tmp = buf, i = len; i > 0; --i, ++tmp) { - (void) s_qmul(z, CHAR_BIT); - *dz |= *tmp; - } + dz = MP_DIGITS(z); + for (tmp = buf, i = len; i > 0; --i, ++tmp) + { + (void) s_qmul(z, CHAR_BIT); + *dz |= *tmp; + } - return MP_OK; + return MP_OK; } /* }}} */ /* {{{ mp_int_unsigned_len(z) */ -mp_result mp_int_unsigned_len(mp_int z) +mp_result +mp_int_unsigned_len(mp_int z) { - mp_result res = mp_int_count_bits(z); - int bytes; + mp_result res = mp_int_count_bits(z); + int bytes; - if(res <= 0) - return res; + if (res <= 0) + return res; - bytes = (res + (CHAR_BIT - 1)) / CHAR_BIT; + bytes = (res + (CHAR_BIT - 1)) / CHAR_BIT; - return bytes; + return bytes; } /* }}} */ /* {{{ mp_error_string(res) */ -const char *mp_error_string(mp_result res) +const char * +mp_error_string(mp_result res) { - int ix; - if(res > 0) - return s_unknown_err; + int ix; + + if (res > 0) + return s_unknown_err; - res = -res; - for(ix = 0; ix < res && s_error_msg[ix] != NULL; ++ix) - ; + res = -res; + for (ix = 0; ix < res && s_error_msg[ix] != NULL; ++ix) + ; - if(s_error_msg[ix] != NULL) - return s_error_msg[ix]; - else - return s_unknown_err; + if (s_error_msg[ix] != NULL) + return s_error_msg[ix]; + else + return s_unknown_err; } /* }}} */ /*------------------------------------------------------------------------*/ -/* Private functions for internal use. These make assumptions. */ +/* Private functions for internal use. These make assumptions. */ /* {{{ s_alloc(num) */ -static mp_digit *s_alloc(mp_size num) +static mp_digit * +s_alloc(mp_size num) { - mp_digit *out = px_alloc(num * sizeof(mp_digit)); + mp_digit *out = px_alloc(num * sizeof(mp_digit)); - assert(out != NULL); /* for debugging */ + assert(out != NULL); /* for debugging */ - return out; + return out; } /* }}} */ /* {{{ s_realloc(old, num) */ -static mp_digit *s_realloc(mp_digit *old, mp_size num) +static mp_digit * +s_realloc(mp_digit * old, mp_size num) { - mp_digit *new = px_realloc(old, num * sizeof(mp_digit)); + mp_digit *new = px_realloc(old, num * sizeof(mp_digit)); - assert(new != NULL); /* for debugging */ + assert(new != NULL); /* for debugging */ - return new; + return new; } /* }}} */ @@ -2071,9 +2308,10 @@ static mp_digit *s_realloc(mp_digit *old, mp_size num) /* {{{ s_free(ptr) */ #if TRACEABLE_FREE -static void s_free(void *ptr) +static void +s_free(void *ptr) { - px_free(ptr); + px_free(ptr); } #endif @@ -2081,20 +2319,22 @@ static void s_free(void *ptr) /* {{{ s_pad(z, min) */ -static int s_pad(mp_int z, mp_size min) +static int +s_pad(mp_int z, mp_size min) { - if(MP_ALLOC(z) < min) { - mp_size nsize = ROUND_PREC(min); - mp_digit *tmp = s_realloc(MP_DIGITS(z), nsize); + if (MP_ALLOC(z) < min) + { + mp_size nsize = ROUND_PREC(min); + mp_digit *tmp = s_realloc(MP_DIGITS(z), nsize); - if(tmp == NULL) - return 0; + if (tmp == NULL) + return 0; - MP_DIGITS(z) = tmp; - MP_ALLOC(z) = nsize; - } + MP_DIGITS(z) = tmp; + MP_ALLOC(z) = nsize; + } - return 1; + return 1; } /* }}} */ @@ -2102,15 +2342,16 @@ static int s_pad(mp_int z, mp_size min) /* {{{ s_clamp(z) */ #if TRACEABLE_CLAMP -static void s_clamp(mp_int z) +static void +s_clamp(mp_int z) { - mp_size uz = MP_USED(z); - mp_digit *zd = MP_DIGITS(z) + uz - 1; + mp_size uz = MP_USED(z); + mp_digit *zd = MP_DIGITS(z) + uz - 1; - while(uz > 1 && (*zd-- == 0)) - --uz; + while (uz > 1 && (*zd-- == 0)) + --uz; - MP_USED(z) = uz; + MP_USED(z) = uz; } #endif @@ -2118,614 +2359,711 @@ static void s_clamp(mp_int z) /* {{{ s_fake(z, value, vbuf) */ -static void s_fake(mp_int z, int value, mp_digit vbuf[]) +static void +s_fake(mp_int z, int value, mp_digit vbuf[]) { - mp_size uv = (mp_size)s_vpack(value, vbuf); + mp_size uv = (mp_size) s_vpack(value, vbuf); - z->used = uv; - z->alloc = MP_VALUE_DIGITS(value); - z->sign = (value < 0) ? MP_NEG : MP_ZPOS; - z->digits = vbuf; + z->used = uv; + z->alloc = MP_VALUE_DIGITS(value); + z->sign = (value < 0) ? MP_NEG : MP_ZPOS; + z->digits = vbuf; } /* }}} */ /* {{{ s_cdig(da, db, len) */ -static int s_cdig(mp_digit *da, mp_digit *db, mp_size len) +static int +s_cdig(mp_digit * da, mp_digit * db, mp_size len) { - mp_digit *dat = da + len - 1, *dbt = db + len - 1; + mp_digit *dat = da + len - 1, + *dbt = db + len - 1; - for(/* */; len != 0; --len, --dat, --dbt) { - if(*dat > *dbt) - return 1; - else if(*dat < *dbt) - return -1; - } + for ( /* */ ; len != 0; --len, --dat, --dbt) + { + if (*dat > *dbt) + return 1; + else if (*dat < *dbt) + return -1; + } - return 0; + return 0; } /* }}} */ /* {{{ s_vpack(v, t[]) */ -static int s_vpack(int v, mp_digit t[]) -{ - unsigned int uv = (unsigned int)((v < 0) ? -v : v); - int ndig = 0; - - if(uv == 0) - t[ndig++] = 0; - else { - while(uv != 0) { - t[ndig++] = (mp_digit) uv; - uv >>= MP_DIGIT_BIT/2; - uv >>= MP_DIGIT_BIT/2; - } - } +static int +s_vpack(int v, mp_digit t[]) +{ + unsigned int uv = (unsigned int) ((v < 0) ? -v : v); + int ndig = 0; + + if (uv == 0) + t[ndig++] = 0; + else + { + while (uv != 0) + { + t[ndig++] = (mp_digit) uv; + uv >>= MP_DIGIT_BIT / 2; + uv >>= MP_DIGIT_BIT / 2; + } + } - return ndig; + return ndig; } /* }}} */ /* {{{ s_ucmp(a, b) */ -static int s_ucmp(mp_int a, mp_int b) +static int +s_ucmp(mp_int a, mp_int b) { - mp_size ua = MP_USED(a), ub = MP_USED(b); - - if(ua > ub) - return 1; - else if(ub > ua) - return -1; - else - return s_cdig(MP_DIGITS(a), MP_DIGITS(b), ua); + mp_size ua = MP_USED(a), + ub = MP_USED(b); + + if (ua > ub) + return 1; + else if (ub > ua) + return -1; + else + return s_cdig(MP_DIGITS(a), MP_DIGITS(b), ua); } /* }}} */ /* {{{ s_vcmp(a, v) */ -static int s_vcmp(mp_int a, int v) +static int +s_vcmp(mp_int a, int v) { - mp_digit vdig[MP_VALUE_DIGITS(v)]; - int ndig = 0; - mp_size ua = MP_USED(a); + mp_digit vdig[MP_VALUE_DIGITS(v)]; + int ndig = 0; + mp_size ua = MP_USED(a); - ndig = s_vpack(v, vdig); + ndig = s_vpack(v, vdig); - if(ua > ndig) - return 1; - else if(ua < ndig) - return -1; - else - return s_cdig(MP_DIGITS(a), vdig, ndig); + if (ua > ndig) + return 1; + else if (ua < ndig) + return -1; + else + return s_cdig(MP_DIGITS(a), vdig, ndig); } /* }}} */ /* {{{ s_uadd(da, db, dc, size_a, size_b) */ -static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b) +static mp_digit +s_uadd(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b) { - mp_size pos; - mp_word w = 0; + mp_size pos; + mp_word w = 0; - /* Insure that da is the longer of the two to simplify later code */ - if(size_b > size_a) { - SWAP(mp_digit *, da, db); - SWAP(mp_size, size_a, size_b); - } + /* Insure that da is the longer of the two to simplify later code */ + if (size_b > size_a) + { + SWAP(mp_digit *, da, db); + SWAP(mp_size, size_a, size_b); + } - /* Add corresponding digits until the shorter number runs out */ - for(pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) { - w = w + (mp_word)*da + (mp_word)*db; - *dc = LOWER_HALF(w); - w = UPPER_HALF(w); - } + /* Add corresponding digits until the shorter number runs out */ + for (pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) + { + w = w + (mp_word) * da + (mp_word) * db; + *dc = LOWER_HALF(w); + w = UPPER_HALF(w); + } - /* Propagate carries as far as necessary */ - for(/* */; pos < size_a; ++pos, ++da, ++dc) { - w = w + *da; + /* Propagate carries as far as necessary */ + for ( /* */ ; pos < size_a; ++pos, ++da, ++dc) + { + w = w + *da; - *dc = LOWER_HALF(w); - w = UPPER_HALF(w); - } + *dc = LOWER_HALF(w); + w = UPPER_HALF(w); + } - /* Return carry out */ - return (mp_digit)w; + /* Return carry out */ + return (mp_digit) w; } /* }}} */ /* {{{ s_usub(da, db, dc, size_a, size_b) */ -static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b) +static void +s_usub(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b) { - mp_size pos; - mp_word w = 0; + mp_size pos; + mp_word w = 0; - /* We assume that |a| >= |b| so this should definitely hold */ - assert(size_a >= size_b); + /* We assume that |a| >= |b| so this should definitely hold */ + assert(size_a >= size_b); - /* Subtract corresponding digits and propagate borrow */ - for(pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) { - w = ((mp_word)MP_DIGIT_MAX + 1 + /* MP_RADIX */ - (mp_word)*da) - w - (mp_word)*db; + /* Subtract corresponding digits and propagate borrow */ + for (pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) + { + w = ((mp_word) MP_DIGIT_MAX + 1 + /* MP_RADIX */ + (mp_word) * da) - w - (mp_word) * db; - *dc = LOWER_HALF(w); - w = (UPPER_HALF(w) == 0); - } + *dc = LOWER_HALF(w); + w = (UPPER_HALF(w) == 0); + } - /* Finish the subtraction for remaining upper digits of da */ - for(/* */; pos < size_a; ++pos, ++da, ++dc) { - w = ((mp_word)MP_DIGIT_MAX + 1 + /* MP_RADIX */ - (mp_word)*da) - w; + /* Finish the subtraction for remaining upper digits of da */ + for ( /* */ ; pos < size_a; ++pos, ++da, ++dc) + { + w = ((mp_word) MP_DIGIT_MAX + 1 + /* MP_RADIX */ + (mp_word) * da) - w; - *dc = LOWER_HALF(w); - w = (UPPER_HALF(w) == 0); - } + *dc = LOWER_HALF(w); + w = (UPPER_HALF(w) == 0); + } - /* If there is a borrow out at the end, it violates the precondition */ - assert(w == 0); + /* If there is a borrow out at the end, it violates the precondition */ + assert(w == 0); } /* }}} */ /* {{{ s_kmul(da, db, dc, size_a, size_b) */ -static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b) +static int +s_kmul(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b) { - mp_size bot_size; - - /* Make sure b is the smaller of the two input values */ - if(size_b > size_a) { - SWAP(mp_digit *, da, db); - SWAP(mp_size, size_a, size_b); - } - - /* Insure that the bottom is the larger half in an odd-length split; - the code below relies on this being true. - */ - bot_size = (size_a + 1) / 2; - - /* If the values are big enough to bother with recursion, use the - Karatsuba algorithm to compute the product; otherwise use the - normal multiplication algorithm - */ - if(multiply_threshold && - size_a >= multiply_threshold && - size_b > bot_size) { - - mp_digit *t1, *t2, *t3, carry; - - mp_digit *a_top = da + bot_size; - mp_digit *b_top = db + bot_size; - - mp_size at_size = size_a - bot_size; - mp_size bt_size = size_b - bot_size; - mp_size buf_size = 2 * bot_size; - - /* Do a single allocation for all three temporary buffers needed; - each buffer must be big enough to hold the product of two - bottom halves, and one buffer needs space for the completed - product; twice the space is plenty. - */ - if((t1 = s_alloc(4 * buf_size)) == NULL) return 0; - t2 = t1 + buf_size; - t3 = t2 + buf_size; - ZERO(t1, 4 * buf_size); + mp_size bot_size; - /* t1 and t2 are initially used as temporaries to compute the inner product - (a1 + a0)(b1 + b0) = a1b1 + a1b0 + a0b1 + a0b0 - */ - carry = s_uadd(da, a_top, t1, bot_size, at_size); /* t1 = a1 + a0 */ - t1[bot_size] = carry; - - carry = s_uadd(db, b_top, t2, bot_size, bt_size); /* t2 = b1 + b0 */ - t2[bot_size] = carry; - - (void) s_kmul(t1, t2, t3, bot_size + 1, bot_size + 1); /* t3 = t1 * t2 */ - - /* Now we'll get t1 = a0b0 and t2 = a1b1, and subtract them out so that - we're left with only the pieces we want: t3 = a1b0 + a0b1 - */ - ZERO(t1, bot_size + 1); - ZERO(t2, bot_size + 1); - (void) s_kmul(da, db, t1, bot_size, bot_size); /* t1 = a0 * b0 */ - (void) s_kmul(a_top, b_top, t2, at_size, bt_size); /* t2 = a1 * b1 */ - - /* Subtract out t1 and t2 to get the inner product */ - s_usub(t3, t1, t3, buf_size + 2, buf_size); - s_usub(t3, t2, t3, buf_size + 2, buf_size); - - /* Assemble the output value */ - COPY(t1, dc, buf_size); - (void) s_uadd(t3, dc + bot_size, dc + bot_size, - buf_size + 1, buf_size + 1); + /* Make sure b is the smaller of the two input values */ + if (size_b > size_a) + { + SWAP(mp_digit *, da, db); + SWAP(mp_size, size_a, size_b); + } - (void) s_uadd(t2, dc + 2*bot_size, dc + 2*bot_size, - buf_size, buf_size); - - s_free(t1); /* note t2 and t3 are just internal pointers to t1 */ - } - else { - s_umul(da, db, dc, size_a, size_b); - } + /* + * Insure that the bottom is the larger half in an odd-length split; the + * code below relies on this being true. + */ + bot_size = (size_a + 1) / 2; + + /* + * If the values are big enough to bother with recursion, use the + * Karatsuba algorithm to compute the product; otherwise use the normal + * multiplication algorithm + */ + if (multiply_threshold && + size_a >= multiply_threshold && + size_b > bot_size) + { + + mp_digit *t1, + *t2, + *t3, + carry; + + mp_digit *a_top = da + bot_size; + mp_digit *b_top = db + bot_size; + + mp_size at_size = size_a - bot_size; + mp_size bt_size = size_b - bot_size; + mp_size buf_size = 2 * bot_size; + + /* + * Do a single allocation for all three temporary buffers needed; each + * buffer must be big enough to hold the product of two bottom halves, + * and one buffer needs space for the completed product; twice the + * space is plenty. + */ + if ((t1 = s_alloc(4 * buf_size)) == NULL) + return 0; + t2 = t1 + buf_size; + t3 = t2 + buf_size; + ZERO(t1, 4 * buf_size); + + /* + * t1 and t2 are initially used as temporaries to compute the inner + * product (a1 + a0)(b1 + b0) = a1b1 + a1b0 + a0b1 + a0b0 + */ + carry = s_uadd(da, a_top, t1, bot_size, at_size); /* t1 = a1 + a0 */ + t1[bot_size] = carry; + + carry = s_uadd(db, b_top, t2, bot_size, bt_size); /* t2 = b1 + b0 */ + t2[bot_size] = carry; + + (void) s_kmul(t1, t2, t3, bot_size + 1, bot_size + 1); /* t3 = t1 * t2 */ + + /* + * Now we'll get t1 = a0b0 and t2 = a1b1, and subtract them out so + * that we're left with only the pieces we want: t3 = a1b0 + a0b1 + */ + ZERO(t1, bot_size + 1); + ZERO(t2, bot_size + 1); + (void) s_kmul(da, db, t1, bot_size, bot_size); /* t1 = a0 * b0 */ + (void) s_kmul(a_top, b_top, t2, at_size, bt_size); /* t2 = a1 * b1 */ + + /* Subtract out t1 and t2 to get the inner product */ + s_usub(t3, t1, t3, buf_size + 2, buf_size); + s_usub(t3, t2, t3, buf_size + 2, buf_size); + + /* Assemble the output value */ + COPY(t1, dc, buf_size); + (void) s_uadd(t3, dc + bot_size, dc + bot_size, + buf_size + 1, buf_size + 1); + + (void) s_uadd(t2, dc + 2 * bot_size, dc + 2 * bot_size, + buf_size, buf_size); + + s_free(t1); /* note t2 and t3 are just internal pointers + * to t1 */ + } + else + { + s_umul(da, db, dc, size_a, size_b); + } - return 1; + return 1; } /* }}} */ /* {{{ s_umul(da, db, dc, size_a, size_b) */ -static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, - mp_size size_a, mp_size size_b) +static void +s_umul(mp_digit * da, mp_digit * db, mp_digit * dc, + mp_size size_a, mp_size size_b) { - mp_size a, b; - mp_word w; + mp_size a, + b; + mp_word w; - for(a = 0; a < size_a; ++a, ++dc, ++da) { - mp_digit *dct = dc; - mp_digit *dbt = db; + for (a = 0; a < size_a; ++a, ++dc, ++da) + { + mp_digit *dct = dc; + mp_digit *dbt = db; - if(*da == 0) - continue; + if (*da == 0) + continue; - w = 0; - for(b = 0; b < size_b; ++b, ++dbt, ++dct) { - w = (mp_word)*da * (mp_word)*dbt + w + (mp_word)*dct; + w = 0; + for (b = 0; b < size_b; ++b, ++dbt, ++dct) + { + w = (mp_word) * da * (mp_word) * dbt + w + (mp_word) * dct; - *dct = LOWER_HALF(w); - w = UPPER_HALF(w); - } + *dct = LOWER_HALF(w); + w = UPPER_HALF(w); + } - *dct = (mp_digit)w; - } + *dct = (mp_digit) w; + } } /* }}} */ /* {{{ s_ksqr(da, dc, size_a) */ -static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a) -{ - if(multiply_threshold && size_a > multiply_threshold) { - mp_size bot_size = (size_a + 1) / 2; - mp_digit *a_top = da + bot_size; - mp_digit *t1, *t2, *t3; - mp_size at_size = size_a - bot_size; - mp_size buf_size = 2 * bot_size; - - if((t1 = s_alloc(4 * buf_size)) == NULL) return 0; - t2 = t1 + buf_size; - t3 = t2 + buf_size; - ZERO(t1, 4 * buf_size); - - (void) s_ksqr(da, t1, bot_size); /* t1 = a0 ^ 2 */ - (void) s_ksqr(a_top, t2, at_size); /* t2 = a1 ^ 2 */ - - (void) s_kmul(da, a_top, t3, bot_size, at_size); /* t3 = a0 * a1 */ - - /* Quick multiply t3 by 2, shifting left (can't overflow) */ - { - int i, top = bot_size + at_size; - mp_word w, save = 0; +static int +s_ksqr(mp_digit * da, mp_digit * dc, mp_size size_a) +{ + if (multiply_threshold && size_a > multiply_threshold) + { + mp_size bot_size = (size_a + 1) / 2; + mp_digit *a_top = da + bot_size; + mp_digit *t1, + *t2, + *t3; + mp_size at_size = size_a - bot_size; + mp_size buf_size = 2 * bot_size; + + if ((t1 = s_alloc(4 * buf_size)) == NULL) + return 0; + t2 = t1 + buf_size; + t3 = t2 + buf_size; + ZERO(t1, 4 * buf_size); + + (void) s_ksqr(da, t1, bot_size); /* t1 = a0 ^ 2 */ + (void) s_ksqr(a_top, t2, at_size); /* t2 = a1 ^ 2 */ + + (void) s_kmul(da, a_top, t3, bot_size, at_size); /* t3 = a0 * a1 */ + + /* Quick multiply t3 by 2, shifting left (can't overflow) */ + { + int i, + top = bot_size + at_size; + mp_word w, + save = 0; + + for (i = 0; i < top; ++i) + { + w = t3[i]; + w = (w << 1) | save; + t3[i] = LOWER_HALF(w); + save = UPPER_HALF(w); + } + t3[i] = LOWER_HALF(save); + } + + /* Assemble the output value */ + COPY(t1, dc, 2 * bot_size); + (void) s_uadd(t3, dc + bot_size, dc + bot_size, + buf_size + 1, buf_size + 1); + + (void) s_uadd(t2, dc + 2 * bot_size, dc + 2 * bot_size, + buf_size, buf_size); + + px_free(t1); /* note that t2 and t2 are internal pointers + * only */ - for(i = 0; i < top; ++i) { - w = t3[i]; - w = (w << 1) | save; - t3[i] = LOWER_HALF(w); - save = UPPER_HALF(w); - } - t3[i] = LOWER_HALF(save); - } - - /* Assemble the output value */ - COPY(t1, dc, 2 * bot_size); - (void) s_uadd(t3, dc + bot_size, dc + bot_size, - buf_size + 1, buf_size + 1); - - (void) s_uadd(t2, dc + 2*bot_size, dc + 2*bot_size, - buf_size, buf_size); - - px_free(t1); /* note that t2 and t2 are internal pointers only */ - - } - else { - s_usqr(da, dc, size_a); - } + } + else + { + s_usqr(da, dc, size_a); + } - return 1; + return 1; } /* }}} */ /* {{{ s_usqr(da, dc, size_a) */ -static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a) -{ - mp_size i, j; - mp_word w; - - for(i = 0; i < size_a; ++i, dc += 2, ++da) { - mp_digit *dct = dc, *dat = da; - - if(*da == 0) - continue; - - /* Take care of the first digit, no rollover */ - w = (mp_word)*dat * (mp_word)*dat + (mp_word)*dct; - *dct = LOWER_HALF(w); - w = UPPER_HALF(w); - ++dat; ++dct; - - for(j = i + 1; j < size_a; ++j, ++dat, ++dct) { - mp_word t = (mp_word)*da * (mp_word)*dat; - mp_word u = w + (mp_word)*dct, ov = 0; - - /* Check if doubling t will overflow a word */ - if(HIGH_BIT_SET(t)) - ov = 1; - - w = t + t; - - /* Check if adding u to w will overflow a word */ - if(ADD_WILL_OVERFLOW(w, u)) - ov = 1; - - w += u; - - *dct = LOWER_HALF(w); - w = UPPER_HALF(w); - if(ov) { - w += MP_DIGIT_MAX; /* MP_RADIX */ - ++w; - } - } - - w = w + *dct; - *dct = (mp_digit)w; - while((w = UPPER_HALF(w)) != 0) { - ++dct; w = w + *dct; - *dct = LOWER_HALF(w); - } - - assert(w == 0); - } +static void +s_usqr(mp_digit * da, mp_digit * dc, mp_size size_a) +{ + mp_size i, + j; + mp_word w; + + for (i = 0; i < size_a; ++i, dc += 2, ++da) + { + mp_digit *dct = dc, + *dat = da; + + if (*da == 0) + continue; + + /* Take care of the first digit, no rollover */ + w = (mp_word) * dat * (mp_word) * dat + (mp_word) * dct; + *dct = LOWER_HALF(w); + w = UPPER_HALF(w); + ++dat; + ++dct; + + for (j = i + 1; j < size_a; ++j, ++dat, ++dct) + { + mp_word t = (mp_word) * da * (mp_word) * dat; + mp_word u = w + (mp_word) * dct, + ov = 0; + + /* Check if doubling t will overflow a word */ + if (HIGH_BIT_SET(t)) + ov = 1; + + w = t + t; + + /* Check if adding u to w will overflow a word */ + if (ADD_WILL_OVERFLOW(w, u)) + ov = 1; + + w += u; + + *dct = LOWER_HALF(w); + w = UPPER_HALF(w); + if (ov) + { + w += MP_DIGIT_MAX; /* MP_RADIX */ + ++w; + } + } + + w = w + *dct; + *dct = (mp_digit) w; + while ((w = UPPER_HALF(w)) != 0) + { + ++dct; + w = w + *dct; + *dct = LOWER_HALF(w); + } + + assert(w == 0); + } } /* }}} */ /* {{{ s_dadd(a, b) */ -static void s_dadd(mp_int a, mp_digit b) +static void +s_dadd(mp_int a, mp_digit b) { - mp_word w = 0; - mp_digit *da = MP_DIGITS(a); - mp_size ua = MP_USED(a); + mp_word w = 0; + mp_digit *da = MP_DIGITS(a); + mp_size ua = MP_USED(a); - w = (mp_word)*da + b; - *da++ = LOWER_HALF(w); - w = UPPER_HALF(w); + w = (mp_word) * da + b; + *da++ = LOWER_HALF(w); + w = UPPER_HALF(w); - for(ua -= 1; ua > 0; --ua, ++da) { - w = (mp_word)*da + w; + for (ua -= 1; ua > 0; --ua, ++da) + { + w = (mp_word) * da + w; - *da = LOWER_HALF(w); - w = UPPER_HALF(w); - } + *da = LOWER_HALF(w); + w = UPPER_HALF(w); + } - if(w) { - *da = (mp_digit)w; - MP_USED(a) += 1; - } + if (w) + { + *da = (mp_digit) w; + MP_USED(a) += 1; + } } /* }}} */ /* {{{ s_dmul(a, b) */ -static void s_dmul(mp_int a, mp_digit b) +static void +s_dmul(mp_int a, mp_digit b) { - mp_word w = 0; - mp_digit *da = MP_DIGITS(a); - mp_size ua = MP_USED(a); + mp_word w = 0; + mp_digit *da = MP_DIGITS(a); + mp_size ua = MP_USED(a); - while(ua > 0) { - w = (mp_word)*da * b + w; - *da++ = LOWER_HALF(w); - w = UPPER_HALF(w); - --ua; - } + while (ua > 0) + { + w = (mp_word) * da * b + w; + *da++ = LOWER_HALF(w); + w = UPPER_HALF(w); + --ua; + } - if(w) { - *da = (mp_digit)w; - MP_USED(a) += 1; - } + if (w) + { + *da = (mp_digit) w; + MP_USED(a) += 1; + } } /* }}} */ /* {{{ s_dbmul(da, b, dc, size_a) */ -static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, mp_size size_a) +static void +s_dbmul(mp_digit * da, mp_digit b, mp_digit * dc, mp_size size_a) { - mp_word w = 0; + mp_word w = 0; - while(size_a > 0) { - w = (mp_word)*da++ * (mp_word)b + w; + while (size_a > 0) + { + w = (mp_word) * da++ * (mp_word) b + w; - *dc++ = LOWER_HALF(w); - w = UPPER_HALF(w); - --size_a; - } + *dc++ = LOWER_HALF(w); + w = UPPER_HALF(w); + --size_a; + } - if(w) - *dc = LOWER_HALF(w); + if (w) + *dc = LOWER_HALF(w); } /* }}} */ /* {{{ s_ddiv(da, d, dc, size_a) */ -static mp_digit s_ddiv(mp_int a, mp_digit b) -{ - mp_word w = 0, qdigit; - mp_size ua = MP_USED(a); - mp_digit *da = MP_DIGITS(a) + ua - 1; - - for(/* */; ua > 0; --ua, --da) { - w = (w << MP_DIGIT_BIT) | *da; - - if(w >= b) { - qdigit = w / b; - w = w % b; - } - else { - qdigit = 0; - } - - *da = (mp_digit)qdigit; - } +static mp_digit +s_ddiv(mp_int a, mp_digit b) +{ + mp_word w = 0, + qdigit; + mp_size ua = MP_USED(a); + mp_digit *da = MP_DIGITS(a) + ua - 1; + + for ( /* */ ; ua > 0; --ua, --da) + { + w = (w << MP_DIGIT_BIT) | *da; + + if (w >= b) + { + qdigit = w / b; + w = w % b; + } + else + { + qdigit = 0; + } + + *da = (mp_digit) qdigit; + } - CLAMP(a); - return (mp_digit)w; + CLAMP(a); + return (mp_digit) w; } /* }}} */ /* {{{ s_qdiv(z, p2) */ -static void s_qdiv(mp_int z, mp_size p2) +static void +s_qdiv(mp_int z, mp_size p2) { - mp_size ndig = p2 / MP_DIGIT_BIT, nbits = p2 % MP_DIGIT_BIT; - mp_size uz = MP_USED(z); + mp_size ndig = p2 / MP_DIGIT_BIT, + nbits = p2 % MP_DIGIT_BIT; + mp_size uz = MP_USED(z); - if(ndig) { - mp_size mark; - mp_digit *to, *from; + if (ndig) + { + mp_size mark; + mp_digit *to, + *from; - if(ndig >= uz) { - mp_int_zero(z); - return; - } + if (ndig >= uz) + { + mp_int_zero(z); + return; + } - to = MP_DIGITS(z); from = to + ndig; + to = MP_DIGITS(z); + from = to + ndig; - for(mark = ndig; mark < uz; ++mark) - *to++ = *from++; + for (mark = ndig; mark < uz; ++mark) + *to++ = *from++; - MP_USED(z) = uz - ndig; - } + MP_USED(z) = uz - ndig; + } - if(nbits) { - mp_digit d = 0, *dz, save; - mp_size up = MP_DIGIT_BIT - nbits; + if (nbits) + { + mp_digit d = 0, + *dz, + save; + mp_size up = MP_DIGIT_BIT - nbits; - uz = MP_USED(z); - dz = MP_DIGITS(z) + uz - 1; + uz = MP_USED(z); + dz = MP_DIGITS(z) + uz - 1; - for(/* */; uz > 0; --uz, --dz) { - save = *dz; + for ( /* */ ; uz > 0; --uz, --dz) + { + save = *dz; - *dz = (*dz >> nbits) | (d << up); - d = save; - } + *dz = (*dz >> nbits) | (d << up); + d = save; + } - CLAMP(z); - } + CLAMP(z); + } - if(MP_USED(z) == 1 && z->digits[0] == 0) - MP_SIGN(z) = MP_ZPOS; + if (MP_USED(z) == 1 && z->digits[0] == 0) + MP_SIGN(z) = MP_ZPOS; } /* }}} */ /* {{{ s_qmod(z, p2) */ -static void s_qmod(mp_int z, mp_size p2) +static void +s_qmod(mp_int z, mp_size p2) { - mp_size start = p2 / MP_DIGIT_BIT + 1, rest = p2 % MP_DIGIT_BIT; - mp_size uz = MP_USED(z); - mp_digit mask = (1 << rest) - 1; + mp_size start = p2 / MP_DIGIT_BIT + 1, + rest = p2 % MP_DIGIT_BIT; + mp_size uz = MP_USED(z); + mp_digit mask = (1 << rest) - 1; - if(start <= uz) { - MP_USED(z) = start; - z->digits[start - 1] &= mask; - CLAMP(z); - } + if (start <= uz) + { + MP_USED(z) = start; + z->digits[start - 1] &= mask; + CLAMP(z); + } } /* }}} */ /* {{{ s_qmul(z, p2) */ -static int s_qmul(mp_int z, mp_size p2) -{ - mp_size uz, need, rest, extra, i; - mp_digit *from, *to, d; - - if(p2 == 0) - return 1; - - uz = MP_USED(z); - need = p2 / MP_DIGIT_BIT; rest = p2 % MP_DIGIT_BIT; - - /* Figure out if we need an extra digit at the top end; this occurs - if the topmost `rest' bits of the high-order digit of z are not - zero, meaning they will be shifted off the end if not preserved */ - extra = 0; - if(rest != 0) { - mp_digit *dz = MP_DIGITS(z) + uz - 1; - - if((*dz >> (MP_DIGIT_BIT - rest)) != 0) - extra = 1; - } - - if(!s_pad(z, uz + need + extra)) - return 0; +static int +s_qmul(mp_int z, mp_size p2) +{ + mp_size uz, + need, + rest, + extra, + i; + mp_digit *from, + *to, + d; + + if (p2 == 0) + return 1; + + uz = MP_USED(z); + need = p2 / MP_DIGIT_BIT; + rest = p2 % MP_DIGIT_BIT; + + /* + * Figure out if we need an extra digit at the top end; this occurs if the + * topmost `rest' bits of the high-order digit of z are not zero, meaning + * they will be shifted off the end if not preserved + */ + extra = 0; + if (rest != 0) + { + mp_digit *dz = MP_DIGITS(z) + uz - 1; + + if ((*dz >> (MP_DIGIT_BIT - rest)) != 0) + extra = 1; + } - /* If we need to shift by whole digits, do that in one pass, then - to back and shift by partial digits. - */ - if(need > 0) { - from = MP_DIGITS(z) + uz - 1; - to = from + need; + if (!s_pad(z, uz + need + extra)) + return 0; - for(i = 0; i < uz; ++i) - *to-- = *from--; + /* + * If we need to shift by whole digits, do that in one pass, then to back + * and shift by partial digits. + */ + if (need > 0) + { + from = MP_DIGITS(z) + uz - 1; + to = from + need; - ZERO(MP_DIGITS(z), need); - uz += need; - } + for (i = 0; i < uz; ++i) + *to-- = *from--; - if(rest) { - d = 0; - for(i = need, from = MP_DIGITS(z) + need; i < uz; ++i, ++from) { - mp_digit save = *from; - - *from = (*from << rest) | (d >> (MP_DIGIT_BIT - rest)); - d = save; - } + ZERO(MP_DIGITS(z), need); + uz += need; + } - d >>= (MP_DIGIT_BIT - rest); - if(d != 0) { - *from = d; - uz += extra; - } - } + if (rest) + { + d = 0; + for (i = need, from = MP_DIGITS(z) + need; i < uz; ++i, ++from) + { + mp_digit save = *from; + + *from = (*from << rest) | (d >> (MP_DIGIT_BIT - rest)); + d = save; + } + + d >>= (MP_DIGIT_BIT - rest); + if (d != 0) + { + *from = d; + uz += extra; + } + } - MP_USED(z) = uz; - CLAMP(z); + MP_USED(z) = uz; + CLAMP(z); - return 1; + return 1; } /* }}} */ @@ -2733,190 +3071,218 @@ static int s_qmul(mp_int z, mp_size p2) /* {{{ s_qsub(z, p2) */ /* Subtract |z| from 2^p2, assuming 2^p2 > |z|, and set z to be positive */ -static int s_qsub(mp_int z, mp_size p2) +static int +s_qsub(mp_int z, mp_size p2) { - mp_digit hi = (1 << (p2 % MP_DIGIT_BIT)), *zp; - mp_size tdig = (p2 / MP_DIGIT_BIT), pos; - mp_word w = 0; + mp_digit hi = (1 << (p2 % MP_DIGIT_BIT)), + *zp; + mp_size tdig = (p2 / MP_DIGIT_BIT), + pos; + mp_word w = 0; - if(!s_pad(z, tdig + 1)) - return 0; + if (!s_pad(z, tdig + 1)) + return 0; - for(pos = 0, zp = MP_DIGITS(z); pos < tdig; ++pos, ++zp) { - w = ((mp_word) MP_DIGIT_MAX + 1) - w - (mp_word)*zp; + for (pos = 0, zp = MP_DIGITS(z); pos < tdig; ++pos, ++zp) + { + w = ((mp_word) MP_DIGIT_MAX + 1) - w - (mp_word) * zp; - *zp = LOWER_HALF(w); - w = UPPER_HALF(w) ? 0 : 1; - } + *zp = LOWER_HALF(w); + w = UPPER_HALF(w) ? 0 : 1; + } + + w = ((mp_word) MP_DIGIT_MAX + 1 + hi) - w - (mp_word) * zp; + *zp = LOWER_HALF(w); - w = ((mp_word) MP_DIGIT_MAX + 1 + hi) - w - (mp_word)*zp; - *zp = LOWER_HALF(w); + assert(UPPER_HALF(w) != 0); /* no borrow out should be possible */ - assert(UPPER_HALF(w) != 0); /* no borrow out should be possible */ - - MP_SIGN(z) = MP_ZPOS; - CLAMP(z); + MP_SIGN(z) = MP_ZPOS; + CLAMP(z); - return 1; + return 1; } /* }}} */ /* {{{ s_dp2k(z) */ -static int s_dp2k(mp_int z) +static int +s_dp2k(mp_int z) { - int k = 0; - mp_digit *dp = MP_DIGITS(z), d; + int k = 0; + mp_digit *dp = MP_DIGITS(z), + d; - if(MP_USED(z) == 1 && *dp == 0) - return 1; + if (MP_USED(z) == 1 && *dp == 0) + return 1; - while(*dp == 0) { - k += MP_DIGIT_BIT; - ++dp; - } - - d = *dp; - while((d & 1) == 0) { - d >>= 1; - ++k; - } + while (*dp == 0) + { + k += MP_DIGIT_BIT; + ++dp; + } - return k; + d = *dp; + while ((d & 1) == 0) + { + d >>= 1; + ++k; + } + + return k; } /* }}} */ /* {{{ s_isp2(z) */ -static int s_isp2(mp_int z) +static int +s_isp2(mp_int z) { - mp_size uz = MP_USED(z), k = 0; - mp_digit *dz = MP_DIGITS(z), d; + mp_size uz = MP_USED(z), + k = 0; + mp_digit *dz = MP_DIGITS(z), + d; - while(uz > 1) { - if(*dz++ != 0) - return -1; - k += MP_DIGIT_BIT; - --uz; - } + while (uz > 1) + { + if (*dz++ != 0) + return -1; + k += MP_DIGIT_BIT; + --uz; + } - d = *dz; - while(d > 1) { - if(d & 1) - return -1; - ++k; d >>= 1; - } + d = *dz; + while (d > 1) + { + if (d & 1) + return -1; + ++k; + d >>= 1; + } - return (int) k; + return (int) k; } /* }}} */ /* {{{ s_2expt(z, k) */ -static int s_2expt(mp_int z, int k) +static int +s_2expt(mp_int z, int k) { - mp_size ndig, rest; - mp_digit *dz; + mp_size ndig, + rest; + mp_digit *dz; - ndig = (k + MP_DIGIT_BIT) / MP_DIGIT_BIT; - rest = k % MP_DIGIT_BIT; + ndig = (k + MP_DIGIT_BIT) / MP_DIGIT_BIT; + rest = k % MP_DIGIT_BIT; - if(!s_pad(z, ndig)) - return 0; + if (!s_pad(z, ndig)) + return 0; - dz = MP_DIGITS(z); - ZERO(dz, ndig); - *(dz + ndig - 1) = (1 << rest); - MP_USED(z) = ndig; + dz = MP_DIGITS(z); + ZERO(dz, ndig); + *(dz + ndig - 1) = (1 << rest); + MP_USED(z) = ndig; - return 1; + return 1; } /* }}} */ /* {{{ s_norm(a, b) */ -static int s_norm(mp_int a, mp_int b) +static int +s_norm(mp_int a, mp_int b) { - mp_digit d = b->digits[MP_USED(b) - 1]; - int k = 0; + mp_digit d = b->digits[MP_USED(b) - 1]; + int k = 0; - while(d < (mp_digit) (1 << (MP_DIGIT_BIT - 1))) { /* d < (MP_RADIX / 2) */ - d <<= 1; - ++k; - } + while (d < (mp_digit) (1 << (MP_DIGIT_BIT - 1))) + { /* d < (MP_RADIX / 2) */ + d <<= 1; + ++k; + } - /* These multiplications can't fail */ - if(k != 0) { - (void) s_qmul(a, (mp_size) k); - (void) s_qmul(b, (mp_size) k); - } + /* These multiplications can't fail */ + if (k != 0) + { + (void) s_qmul(a, (mp_size) k); + (void) s_qmul(b, (mp_size) k); + } - return k; + return k; } /* }}} */ /* {{{ s_brmu(z, m) */ -static mp_result s_brmu(mp_int z, mp_int m) +static mp_result +s_brmu(mp_int z, mp_int m) { - mp_size um = MP_USED(m) * 2; + mp_size um = MP_USED(m) * 2; - if(!s_pad(z, um)) - return MP_MEMORY; + if (!s_pad(z, um)) + return MP_MEMORY; - s_2expt(z, MP_DIGIT_BIT * um); - return mp_int_div(z, m, z, NULL); + s_2expt(z, MP_DIGIT_BIT * um); + return mp_int_div(z, m, z, NULL); } /* }}} */ /* {{{ s_reduce(x, m, mu, q1, q2) */ -static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2) +static int +s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2) { - mp_size um = MP_USED(m), umb_p1, umb_m1; + mp_size um = MP_USED(m), + umb_p1, + umb_m1; - umb_p1 = (um + 1) * MP_DIGIT_BIT; - umb_m1 = (um - 1) * MP_DIGIT_BIT; + umb_p1 = (um + 1) * MP_DIGIT_BIT; + umb_m1 = (um - 1) * MP_DIGIT_BIT; - if(mp_int_copy(x, q1) != MP_OK) - return 0; + if (mp_int_copy(x, q1) != MP_OK) + return 0; - /* Compute q2 = floor((floor(x / b^(k-1)) * mu) / b^(k+1)) */ - s_qdiv(q1, umb_m1); - UMUL(q1, mu, q2); - s_qdiv(q2, umb_p1); + /* Compute q2 = floor((floor(x / b^(k-1)) * mu) / b^(k+1)) */ + s_qdiv(q1, umb_m1); + UMUL(q1, mu, q2); + s_qdiv(q2, umb_p1); - /* Set x = x mod b^(k+1) */ - s_qmod(x, umb_p1); + /* Set x = x mod b^(k+1) */ + s_qmod(x, umb_p1); - /* Now, q is a guess for the quotient a / m. - Compute x - q * m mod b^(k+1), replacing x. This may be off - by a factor of 2m, but no more than that. - */ - UMUL(q2, m, q1); - s_qmod(q1, umb_p1); - (void) mp_int_sub(x, q1, x); /* can't fail */ + /* + * Now, q is a guess for the quotient a / m. Compute x - q * m mod + * b^(k+1), replacing x. This may be off by a factor of 2m, but no more + * than that. + */ + UMUL(q2, m, q1); + s_qmod(q1, umb_p1); + (void) mp_int_sub(x, q1, x); /* can't fail */ - /* The result may be < 0; if it is, add b^(k+1) to pin it in the - proper range. */ - if((CMPZ(x) < 0) && !s_qsub(x, umb_p1)) - return 0; + /* + * The result may be < 0; if it is, add b^(k+1) to pin it in the proper + * range. + */ + if ((CMPZ(x) < 0) && !s_qsub(x, umb_p1)) + return 0; - /* If x > m, we need to back it off until it is in range. - This will be required at most twice. */ - if(mp_int_compare(x, m) >= 0) - (void) mp_int_sub(x, m, x); - if(mp_int_compare(x, m) >= 0) - (void) mp_int_sub(x, m, x); + /* + * If x > m, we need to back it off until it is in range. This will be + * required at most twice. + */ + if (mp_int_compare(x, m) >= 0) + (void) mp_int_sub(x, m, x); + if (mp_int_compare(x, m) >= 0) + (void) mp_int_sub(x, m, x); - /* At this point, x has been properly reduced. */ - return 1; + /* At this point, x has been properly reduced. */ + return 1; } /* }}} */ @@ -2925,75 +3291,95 @@ static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2) /* Perform modular exponentiation using Barrett's method, where mu is the reduction constant for m. Assumes a < m, b > 0. */ -static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) -{ - mp_digit *db, *dbt, umu, d; - mpz_t temp[3]; - mp_result res; - int last = 0; - - umu = MP_USED(mu); db = MP_DIGITS(b); dbt = db + MP_USED(b) - 1; - - while(last < 3) - SETUP(mp_int_init_size(TEMP(last), 2 * umu), last); - - (void) mp_int_set_value(c, 1); - - /* Take care of low-order digits */ - while(db < dbt) { - int i; - - for(d = *db, i = MP_DIGIT_BIT; i > 0; --i, d >>= 1) { - if(d & 1) { - /* The use of a second temporary avoids allocation */ - UMUL(c, a, TEMP(0)); - if(!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { - res = MP_MEMORY; goto CLEANUP; +static mp_result +s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) +{ + mp_digit *db, + *dbt, + umu, + d; + mpz_t temp[3]; + mp_result res; + int last = 0; + + umu = MP_USED(mu); + db = MP_DIGITS(b); + dbt = db + MP_USED(b) - 1; + + while (last < 3) + SETUP(mp_int_init_size(TEMP(last), 2 * umu), last); + + (void) mp_int_set_value(c, 1); + + /* Take care of low-order digits */ + while (db < dbt) + { + int i; + + for (d = *db, i = MP_DIGIT_BIT; i > 0; --i, d >>= 1) + { + if (d & 1) + { + /* The use of a second temporary avoids allocation */ + UMUL(c, a, TEMP(0)); + if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) + { + res = MP_MEMORY; + goto CLEANUP; + } + mp_int_copy(TEMP(0), c); + } + + + USQR(a, TEMP(0)); + assert(MP_SIGN(TEMP(0)) == MP_ZPOS); + if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) + { + res = MP_MEMORY; + goto CLEANUP; + } + assert(MP_SIGN(TEMP(0)) == MP_ZPOS); + mp_int_copy(TEMP(0), a); + + + } + + ++db; } - mp_int_copy(TEMP(0), c); - } - - - USQR(a, TEMP(0)); - assert(MP_SIGN(TEMP(0)) == MP_ZPOS); - if(!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { - res = MP_MEMORY; goto CLEANUP; - } - assert(MP_SIGN(TEMP(0)) == MP_ZPOS); - mp_int_copy(TEMP(0), a); + /* Take care of highest-order digit */ + d = *dbt; + for (;;) + { + if (d & 1) + { + UMUL(c, a, TEMP(0)); + if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) + { + res = MP_MEMORY; + goto CLEANUP; + } + mp_int_copy(TEMP(0), c); + } + + d >>= 1; + if (!d) + break; + + USQR(a, TEMP(0)); + if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) + { + res = MP_MEMORY; + goto CLEANUP; + } + (void) mp_int_copy(TEMP(0), a); + } - } - - ++db; - } - - /* Take care of highest-order digit */ - d = *dbt; - for(;;) { - if(d & 1) { - UMUL(c, a, TEMP(0)); - if(!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { - res = MP_MEMORY; goto CLEANUP; - } - mp_int_copy(TEMP(0), c); - } - - d >>= 1; - if(!d) break; - - USQR(a, TEMP(0)); - if(!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { - res = MP_MEMORY; goto CLEANUP; - } - (void) mp_int_copy(TEMP(0), a); - } +CLEANUP: + while (--last >= 0) + mp_int_clear(TEMP(last)); - CLEANUP: - while(--last >= 0) - mp_int_clear(TEMP(last)); - - return res; + return res; } /* }}} */ @@ -3003,92 +3389,109 @@ static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) /* Precondition: a >= b and b > 0 Postcondition: a' = a / b, b' = a % b */ -static mp_result s_udiv(mp_int a, mp_int b) -{ - mpz_t q, r, t; - mp_size ua, ub, qpos = 0; - mp_digit *da, btop; - mp_result res = MP_OK; - int k, skip = 0; - - /* Force signs to positive */ - MP_SIGN(a) = MP_ZPOS; - MP_SIGN(b) = MP_ZPOS; - - /* Normalize, per Knuth */ - k = s_norm(a, b); - - ua = MP_USED(a); ub = MP_USED(b); btop = b->digits[ub - 1]; - if((res = mp_int_init_size(&q, ua)) != MP_OK) return res; - if((res = mp_int_init_size(&t, ua + 1)) != MP_OK) goto CLEANUP; - - da = MP_DIGITS(a); - r.digits = da + ua - 1; /* The contents of r are shared with a */ - r.used = 1; - r.sign = MP_ZPOS; - r.alloc = MP_ALLOC(a); - ZERO(t.digits, t.alloc); - - /* Solve for quotient digits, store in q.digits in reverse order */ - while(r.digits >= da) { - assert(qpos <= q.alloc); - - if(s_ucmp(b, &r) > 0) { - r.digits -= 1; - r.used += 1; - - if(++skip > 1) - q.digits[qpos++] = 0; - - CLAMP(&r); - } - else { - mp_word pfx = r.digits[r.used - 1]; - mp_word qdigit; - - if(r.used > 1 && (pfx < btop || r.digits[r.used - 2] == 0)) { - pfx <<= MP_DIGIT_BIT / 2; - pfx <<= MP_DIGIT_BIT / 2; - pfx |= r.digits[r.used - 2]; - } - - qdigit = pfx / btop; - if(qdigit > MP_DIGIT_MAX) - qdigit = 1; - - s_dbmul(MP_DIGITS(b), (mp_digit) qdigit, t.digits, ub); - t.used = ub + 1; CLAMP(&t); - while(s_ucmp(&t, &r) > 0) { - --qdigit; - (void) mp_int_sub(&t, b, &t); /* cannot fail */ - } - - s_usub(r.digits, t.digits, r.digits, r.used, t.used); - CLAMP(&r); - - q.digits[qpos++] = (mp_digit) qdigit; - ZERO(t.digits, t.used); - skip = 0; - } - } - - /* Put quotient digits in the correct order, and discard extra zeroes */ - q.used = qpos; - REV(mp_digit, q.digits, qpos); - CLAMP(&q); - - /* Denormalize the remainder */ - CLAMP(a); - if(k != 0) - s_qdiv(a, k); - - mp_int_copy(a, b); /* ok: 0 <= r < b */ - mp_int_copy(&q, a); /* ok: q <= a */ - - mp_int_clear(&t); - CLEANUP: - mp_int_clear(&q); - return res; +static mp_result +s_udiv(mp_int a, mp_int b) +{ + mpz_t q, + r, + t; + mp_size ua, + ub, + qpos = 0; + mp_digit *da, + btop; + mp_result res = MP_OK; + int k, + skip = 0; + + /* Force signs to positive */ + MP_SIGN(a) = MP_ZPOS; + MP_SIGN(b) = MP_ZPOS; + + /* Normalize, per Knuth */ + k = s_norm(a, b); + + ua = MP_USED(a); + ub = MP_USED(b); + btop = b->digits[ub - 1]; + if ((res = mp_int_init_size(&q, ua)) != MP_OK) + return res; + if ((res = mp_int_init_size(&t, ua + 1)) != MP_OK) + goto CLEANUP; + + da = MP_DIGITS(a); + r.digits = da + ua - 1; /* The contents of r are shared with a */ + r.used = 1; + r.sign = MP_ZPOS; + r.alloc = MP_ALLOC(a); + ZERO(t.digits, t.alloc); + + /* Solve for quotient digits, store in q.digits in reverse order */ + while (r.digits >= da) + { + assert(qpos <= q.alloc); + + if (s_ucmp(b, &r) > 0) + { + r.digits -= 1; + r.used += 1; + + if (++skip > 1) + q.digits[qpos++] = 0; + + CLAMP(&r); + } + else + { + mp_word pfx = r.digits[r.used - 1]; + mp_word qdigit; + + if (r.used > 1 && (pfx < btop || r.digits[r.used - 2] == 0)) + { + pfx <<= MP_DIGIT_BIT / 2; + pfx <<= MP_DIGIT_BIT / 2; + pfx |= r.digits[r.used - 2]; + } + + qdigit = pfx / btop; + if (qdigit > MP_DIGIT_MAX) + qdigit = 1; + + s_dbmul(MP_DIGITS(b), (mp_digit) qdigit, t.digits, ub); + t.used = ub + 1; + CLAMP(&t); + while (s_ucmp(&t, &r) > 0) + { + --qdigit; + (void) mp_int_sub(&t, b, &t); /* cannot fail */ + } + + s_usub(r.digits, t.digits, r.digits, r.used, t.used); + CLAMP(&r); + + q.digits[qpos++] = (mp_digit) qdigit; + ZERO(t.digits, t.used); + skip = 0; + } + } + + /* Put quotient digits in the correct order, and discard extra zeroes */ + q.used = qpos; + REV(mp_digit, q.digits, qpos); + CLAMP(&q); + + /* Denormalize the remainder */ + CLAMP(a); + if (k != 0) + s_qdiv(a, k); + + mp_int_copy(a, b); /* ok: 0 <= r < b */ + mp_int_copy(&q, a); /* ok: q <= a */ + + mp_int_clear(&t); +CLEANUP: + mp_int_clear(&q); + return res; } /* }}} */ @@ -3096,133 +3499,147 @@ static mp_result s_udiv(mp_int a, mp_int b) /* {{{ s_outlen(z, r) */ /* Precondition: 2 <= r < 64 */ -static int s_outlen(mp_int z, mp_size r) +static int +s_outlen(mp_int z, mp_size r) { - mp_result bits; - double raw; + mp_result bits; + double raw; - bits = mp_int_count_bits(z); - raw = (double)bits * s_log2[r]; + bits = mp_int_count_bits(z); + raw = (double) bits *s_log2[r]; - return (int)(raw + 0.999999); + return (int) (raw + 0.999999); } /* }}} */ /* {{{ s_inlen(len, r) */ -static mp_size s_inlen(int len, mp_size r) +static mp_size +s_inlen(int len, mp_size r) { - double raw = (double)len / s_log2[r]; - mp_size bits = (mp_size)(raw + 0.5); + double raw = (double) len / s_log2[r]; + mp_size bits = (mp_size) (raw + 0.5); - return (mp_size)((bits + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT); + return (mp_size) ((bits + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT); } /* }}} */ /* {{{ s_ch2val(c, r) */ -static int s_ch2val(char c, int r) +static int +s_ch2val(char c, int r) { - int out; + int out; - if(isdigit((unsigned char)c)) - out = c - '0'; - else if(r > 10 && isalpha((unsigned char) c)) - out = toupper((unsigned char) c) - 'A' + 10; - else - return -1; + if (isdigit((unsigned char) c)) + out = c - '0'; + else if (r > 10 && isalpha((unsigned char) c)) + out = toupper((unsigned char) c) - 'A' + 10; + else + return -1; - return (out >= r) ? -1 : out; + return (out >= r) ? -1 : out; } /* }}} */ /* {{{ s_val2ch(v, caps) */ -static char s_val2ch(int v, int caps) +static char +s_val2ch(int v, int caps) { - assert(v >= 0); + assert(v >= 0); - if(v < 10) - return v + '0'; - else { - char out = (v - 10) + 'a'; + if (v < 10) + return v + '0'; + else + { + char out = (v - 10) + 'a'; - if(caps) - return toupper((unsigned char) out); - else - return out; - } + if (caps) + return toupper((unsigned char) out); + else + return out; + } } /* }}} */ /* {{{ s_2comp(buf, len) */ -static void s_2comp(unsigned char *buf, int len) +static void +s_2comp(unsigned char *buf, int len) { - int i; - unsigned short s = 1; + int i; + unsigned short s = 1; - for(i = len - 1; i >= 0; --i) { - unsigned char c = ~buf[i]; + for (i = len - 1; i >= 0; --i) + { + unsigned char c = ~buf[i]; - s = c + s; - c = s & UCHAR_MAX; - s >>= CHAR_BIT; + s = c + s; + c = s & UCHAR_MAX; + s >>= CHAR_BIT; - buf[i] = c; - } + buf[i] = c; + } - /* last carry out is ignored */ + /* last carry out is ignored */ } /* }}} */ /* {{{ s_tobin(z, buf, *limpos) */ -static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad) +static mp_result +s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad) { - mp_size uz; - mp_digit *dz; - int pos = 0, limit = *limpos; + mp_size uz; + mp_digit *dz; + int pos = 0, + limit = *limpos; - uz = MP_USED(z); dz = MP_DIGITS(z); - while(uz > 0 && pos < limit) { - mp_digit d = *dz++; - int i; + uz = MP_USED(z); + dz = MP_DIGITS(z); + while (uz > 0 && pos < limit) + { + mp_digit d = *dz++; + int i; - for(i = sizeof(mp_digit); i > 0 && pos < limit; --i) { - buf[pos++] = (unsigned char)d; - d >>= CHAR_BIT; + for (i = sizeof(mp_digit); i > 0 && pos < limit; --i) + { + buf[pos++] = (unsigned char) d; + d >>= CHAR_BIT; - /* Don't write leading zeroes */ - if(d == 0 && uz == 1) - i = 0; /* exit loop without signaling truncation */ - } + /* Don't write leading zeroes */ + if (d == 0 && uz == 1) + i = 0; /* exit loop without signaling truncation */ + } - /* Detect truncation (loop exited with pos >= limit) */ - if(i > 0) break; + /* Detect truncation (loop exited with pos >= limit) */ + if (i > 0) + break; - --uz; - } + --uz; + } - if(pad != 0 && (buf[pos - 1] >> (CHAR_BIT - 1))) { - if(pos < limit) - buf[pos++] = 0; - else - uz = 1; - } + if (pad != 0 && (buf[pos - 1] >> (CHAR_BIT - 1))) + { + if (pos < limit) + buf[pos++] = 0; + else + uz = 1; + } - /* Digits are in reverse order, fix that */ - REV(unsigned char, buf, pos); + /* Digits are in reverse order, fix that */ + REV(unsigned char, buf, pos); - /* Return the number of bytes actually written */ - *limpos = pos; + /* Return the number of bytes actually written */ + *limpos = pos; - return (uz == 0) ? MP_OK : MP_TRUNC; + return (uz == 0) ? MP_OK : MP_TRUNC; } /* }}} */ @@ -3230,30 +3647,32 @@ static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad) /* {{{ s_print(tag, z) */ #if 0 -void s_print(char *tag, mp_int z) +void +s_print(char *tag, mp_int z) { - int i; + int i; - fprintf(stderr, "%s: %c ", tag, - (MP_SIGN(z) == MP_NEG) ? '-' : '+'); + fprintf(stderr, "%s: %c ", tag, + (MP_SIGN(z) == MP_NEG) ? '-' : '+'); - for(i = MP_USED(z) - 1; i >= 0; --i) - fprintf(stderr, "%0*X", (int)(MP_DIGIT_BIT / 4), z->digits[i]); + for (i = MP_USED(z) - 1; i >= 0; --i) + fprintf(stderr, "%0*X", (int) (MP_DIGIT_BIT / 4), z->digits[i]); - fputc('\n', stderr); + fputc('\n', stderr); } -void s_print_buf(char *tag, mp_digit *buf, mp_size num) +void +s_print_buf(char *tag, mp_digit * buf, mp_size num) { - int i; + int i; - fprintf(stderr, "%s: ", tag); + fprintf(stderr, "%s: ", tag); - for(i = num - 1; i >= 0; --i) - fprintf(stderr, "%0*X", (int)(MP_DIGIT_BIT / 4), buf[i]); + for (i = num - 1; i >= 0; --i) + fprintf(stderr, "%0*X", (int) (MP_DIGIT_BIT / 4), buf[i]); - fputc('\n', stderr); + fputc('\n', stderr); } #endif diff --git a/contrib/pgcrypto/imath.h b/contrib/pgcrypto/imath.h index 67adb3bf452..f730b320506 100644 --- a/contrib/pgcrypto/imath.h +++ b/contrib/pgcrypto/imath.h @@ -1,8 +1,8 @@ /* - Name: imath.h - Purpose: Arbitrary precision integer arithmetic routines. - Author: M. J. Fromberger <http://www.dartmouth.edu/~sting/> - Info: Id: imath.h 21 2006-04-02 18:58:36Z sting + Name: imath.h + Purpose: Arbitrary precision integer arithmetic routines. + Author: M. J. Fromberger <http://www.dartmouth.edu/~sting/> + Info: Id: imath.h 21 2006-04-02 18:58:36Z sting Copyright (C) 2002 Michael J. Fromberger, All Rights Reserved. @@ -20,13 +20,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.h,v 1.4 2006/07/19 17:05:50 neilc Exp $ */ +/* $PostgreSQL: pgsql/contrib/pgcrypto/imath.h,v 1.5 2006/10/04 00:29:46 momjian Exp $ */ #ifndef IMATH_H_ #define IMATH_H_ @@ -36,32 +36,36 @@ #include <limits.h> -typedef unsigned char mp_sign; -typedef unsigned int mp_size; -typedef int mp_result; +typedef unsigned char mp_sign; +typedef unsigned int mp_size; +typedef int mp_result; + #ifdef USE_LONG_LONG -typedef uint32 mp_digit; -typedef uint64 mp_word; -#define MP_DIGIT_MAX 0xFFFFFFFFULL -#define MP_WORD_MAX 0xFFFFFFFFFFFFFFFFULL +typedef uint32 mp_digit; +typedef uint64 mp_word; + +#define MP_DIGIT_MAX 0xFFFFFFFFULL +#define MP_WORD_MAX 0xFFFFFFFFFFFFFFFFULL #else -typedef uint16 mp_digit; -typedef uint32 mp_word; -#define MP_DIGIT_MAX 0xFFFFUL -#define MP_WORD_MAX 0xFFFFFFFFUL +typedef uint16 mp_digit; +typedef uint32 mp_word; + +#define MP_DIGIT_MAX 0xFFFFUL +#define MP_WORD_MAX 0xFFFFFFFFUL #endif -typedef struct mpz { - mp_digit *digits; - mp_size alloc; - mp_size used; - mp_sign sign; -} mpz_t, *mp_int; +typedef struct mpz +{ + mp_digit *digits; + mp_size alloc; + mp_size used; + mp_sign sign; +} mpz_t, *mp_int; #define MP_DIGITS(Z) ((Z)->digits) #define MP_ALLOC(Z) ((Z)->alloc) -#define MP_USED(Z) ((Z)->used) -#define MP_SIGN(Z) ((Z)->sign) +#define MP_USED(Z) ((Z)->used) +#define MP_SIGN(Z) ((Z)->sign) extern const mp_result MP_OK; extern const mp_result MP_FALSE; @@ -72,131 +76,140 @@ extern const mp_result MP_UNDEF; extern const mp_result MP_TRUNC; extern const mp_result MP_BADARG; -#define MP_DIGIT_BIT (sizeof(mp_digit) * CHAR_BIT) -#define MP_WORD_BIT (sizeof(mp_word) * CHAR_BIT) +#define MP_DIGIT_BIT (sizeof(mp_digit) * CHAR_BIT) +#define MP_WORD_BIT (sizeof(mp_word) * CHAR_BIT) -#define MP_MIN_RADIX 2 -#define MP_MAX_RADIX 36 +#define MP_MIN_RADIX 2 +#define MP_MAX_RADIX 36 -extern const mp_sign MP_NEG; -extern const mp_sign MP_ZPOS; +extern const mp_sign MP_NEG; +extern const mp_sign MP_ZPOS; #define mp_int_is_odd(Z) ((Z)->digits[0] & 1) #define mp_int_is_even(Z) !((Z)->digits[0] & 1) -mp_size mp_get_default_precision(void); -void mp_set_default_precision(mp_size s); -mp_size mp_get_multiply_threshold(void); -void mp_set_multiply_threshold(mp_size s); - -mp_result mp_int_init(mp_int z); -mp_int mp_int_alloc(void); -mp_result mp_int_init_size(mp_int z, mp_size prec); -mp_result mp_int_init_copy(mp_int z, mp_int old); -mp_result mp_int_init_value(mp_int z, int value); -mp_result mp_int_set_value(mp_int z, int value); -void mp_int_clear(mp_int z); -void mp_int_free(mp_int z); - -mp_result mp_int_copy(mp_int a, mp_int c); /* c = a */ -void mp_int_swap(mp_int a, mp_int c); /* swap a, c */ -void mp_int_zero(mp_int z); /* z = 0 */ -mp_result mp_int_abs(mp_int a, mp_int c); /* c = |a| */ -mp_result mp_int_neg(mp_int a, mp_int c); /* c = -a */ -mp_result mp_int_add(mp_int a, mp_int b, mp_int c); /* c = a + b */ -mp_result mp_int_add_value(mp_int a, int value, mp_int c); -mp_result mp_int_sub(mp_int a, mp_int b, mp_int c); /* c = a - b */ -mp_result mp_int_sub_value(mp_int a, int value, mp_int c); -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 q, mp_int r); /* r = a % b */ -mp_result 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 */ - mp_int q, mp_int r); /* r = q % 2^p2 */ -mp_result mp_int_mod(mp_int a, mp_int m, mp_int c); /* c = a % m */ +mp_size mp_get_default_precision(void); +void mp_set_default_precision(mp_size s); +mp_size mp_get_multiply_threshold(void); +void mp_set_multiply_threshold(mp_size s); + +mp_result mp_int_init(mp_int z); +mp_int mp_int_alloc(void); +mp_result mp_int_init_size(mp_int z, mp_size prec); +mp_result mp_int_init_copy(mp_int z, mp_int old); +mp_result mp_int_init_value(mp_int z, int value); +mp_result mp_int_set_value(mp_int z, int value); +void mp_int_clear(mp_int z); +void mp_int_free(mp_int z); + +mp_result mp_int_copy(mp_int a, mp_int c); /* c = a */ +void mp_int_swap(mp_int a, mp_int c); /* swap a, c */ +void mp_int_zero(mp_int z); /* z = 0 */ +mp_result mp_int_abs(mp_int a, mp_int c); /* c = |a| */ +mp_result mp_int_neg(mp_int a, mp_int c); /* c = -a */ +mp_result mp_int_add(mp_int a, mp_int b, mp_int c); /* c = a + b */ +mp_result mp_int_add_value(mp_int a, int value, mp_int c); +mp_result mp_int_sub(mp_int a, mp_int b, mp_int c); /* c = a - b */ +mp_result mp_int_sub_value(mp_int a, int value, mp_int c); +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 q, mp_int r); /* r = a % b */ +mp_result +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 */ + mp_int q, mp_int r); /* r = q % 2^p2 */ +mp_result mp_int_mod(mp_int a, mp_int m, mp_int c); /* c = a % m */ + #define mp_int_mod_value(A, V, R) mp_int_div_value((A), (V), 0, (R)) -mp_result mp_int_expt(mp_int a, int b, mp_int c); /* c = a^b */ -mp_result mp_int_expt_value(int a, int b, mp_int c); /* c = a^b */ +mp_result mp_int_expt(mp_int a, int b, mp_int c); /* c = a^b */ +mp_result mp_int_expt_value(int a, int b, mp_int c); /* c = a^b */ -int mp_int_compare(mp_int a, mp_int b); /* a <=> b */ -int mp_int_compare_unsigned(mp_int a, mp_int b); /* |a| <=> |b| */ -int mp_int_compare_zero(mp_int z); /* a <=> 0 */ -int mp_int_compare_value(mp_int z, int value); /* a <=> v */ +int mp_int_compare(mp_int a, mp_int b); /* a <=> b */ +int mp_int_compare_unsigned(mp_int a, mp_int b); /* |a| <=> |b| */ +int mp_int_compare_zero(mp_int z); /* a <=> 0 */ +int mp_int_compare_value(mp_int z, int value); /* a <=> v */ /* Returns true if v|a, false otherwise (including errors) */ -int mp_int_divisible_value(mp_int a, int v); +int mp_int_divisible_value(mp_int a, int v); /* Returns k >= 0 such that z = 2^k, if one exists; otherwise < 0 */ -int mp_int_is_pow2(mp_int z); +int mp_int_is_pow2(mp_int z); -mp_result mp_int_exptmod(mp_int a, mp_int b, mp_int m, - mp_int c); /* c = a^b (mod m) */ -mp_result mp_int_exptmod_evalue(mp_int a, int value, - mp_int m, mp_int c); /* c = a^v (mod m) */ -mp_result mp_int_exptmod_bvalue(int value, mp_int b, - mp_int m, mp_int c); /* c = v^b (mod m) */ -mp_result mp_int_exptmod_known(mp_int a, mp_int b, - mp_int m, mp_int mu, - mp_int c); /* c = a^b (mod m) */ -mp_result mp_int_redux_const(mp_int m, mp_int c); +mp_result +mp_int_exptmod(mp_int a, mp_int b, mp_int m, + mp_int c); /* c = a^b (mod m) */ +mp_result +mp_int_exptmod_evalue(mp_int a, int value, + mp_int m, mp_int c); /* c = a^v (mod m) */ +mp_result +mp_int_exptmod_bvalue(int value, mp_int b, + mp_int m, mp_int c); /* c = v^b (mod m) */ +mp_result +mp_int_exptmod_known(mp_int a, mp_int b, + mp_int m, mp_int mu, + mp_int c); /* c = a^b (mod m) */ +mp_result mp_int_redux_const(mp_int m, mp_int c); -mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c); /* c = 1/a (mod m) */ +mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c); /* c = 1/a (mod m) */ -mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c); /* c = gcd(a, b) */ +mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c); /* c = gcd(a, b) */ -mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c, /* c = gcd(a, b) */ - mp_int x, mp_int y); /* c = ax + by */ +mp_result +mp_int_egcd(mp_int a, mp_int b, mp_int c, /* c = gcd(a, b) */ + mp_int x, mp_int y); /* c = ax + by */ -mp_result mp_int_sqrt(mp_int a, mp_int c); /* c = floor(sqrt(q)) */ +mp_result mp_int_sqrt(mp_int a, mp_int c); /* c = floor(sqrt(q)) */ /* Convert to an int, if representable (returns MP_RANGE if not). */ -mp_result mp_int_to_int(mp_int z, int *out); +mp_result mp_int_to_int(mp_int z, int *out); /* Convert to nul-terminated string with the specified radix, writing at most limit characters including the nul terminator */ -mp_result mp_int_to_string(mp_int z, mp_size radix, - char *str, int limit); +mp_result mp_int_to_string(mp_int z, mp_size radix, + char *str, int limit); -/* Return the number of characters required to represent +/* Return the number of characters required to represent z in the given radix. May over-estimate. */ -mp_result mp_int_string_len(mp_int z, mp_size radix); +mp_result mp_int_string_len(mp_int z, mp_size radix); /* Read zero-terminated string into z */ -mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str); -mp_result mp_int_read_cstring(mp_int z, mp_size radix, const char *str, - char **end); +mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str); +mp_result mp_int_read_cstring(mp_int z, mp_size radix, const char *str, + char **end); /* Return the number of significant bits in z */ -mp_result mp_int_count_bits(mp_int z); +mp_result mp_int_count_bits(mp_int z); /* Convert z to two's complement binary, writing at most limit bytes */ -mp_result mp_int_to_binary(mp_int z, unsigned char *buf, int limit); +mp_result mp_int_to_binary(mp_int z, unsigned char *buf, int limit); /* Read a two's complement binary value into z from the given buffer */ -mp_result mp_int_read_binary(mp_int z, unsigned char *buf, int len); +mp_result mp_int_read_binary(mp_int z, unsigned char *buf, int len); /* Return the number of bytes required to represent z in binary. */ -mp_result mp_int_binary_len(mp_int z); +mp_result mp_int_binary_len(mp_int z); /* Convert z to unsigned binary, writing at most limit bytes */ -mp_result mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit); +mp_result mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit); /* Read an unsigned binary value into z from the given buffer */ -mp_result mp_int_read_unsigned(mp_int z, unsigned char *buf, int len); +mp_result mp_int_read_unsigned(mp_int z, unsigned char *buf, int len); /* Return the number of bytes required to represent z as unsigned output */ -mp_result mp_int_unsigned_len(mp_int z); +mp_result mp_int_unsigned_len(mp_int z); /* Return a statically allocated string describing error code res */ const char *mp_error_string(mp_result res); #if 0 -void s_print(char *tag, mp_int z); -void s_print_buf(char *tag, mp_digit *buf, mp_size num); +void s_print(char *tag, mp_int z); +void s_print_buf(char *tag, mp_digit * buf, mp_size num); #endif -#endif /* end IMATH_H_ */ +#endif /* end IMATH_H_ */ diff --git a/contrib/pgcrypto/internal-sha2.c b/contrib/pgcrypto/internal-sha2.c index 6e1d97c4e31..d5530c39ed9 100644 --- a/contrib/pgcrypto/internal-sha2.c +++ b/contrib/pgcrypto/internal-sha2.c @@ -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-sha2.c,v 1.1 2006/07/13 04:15:24 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/internal-sha2.c,v 1.2 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -36,10 +36,10 @@ #include "px.h" #include "sha2.h" -void init_sha224(PX_MD * h); -void init_sha256(PX_MD * h); -void init_sha384(PX_MD * h); -void init_sha512(PX_MD * h); +void init_sha224(PX_MD * h); +void init_sha256(PX_MD * h); +void init_sha384(PX_MD * h); +void init_sha512(PX_MD * h); /* SHA224 */ @@ -314,4 +314,3 @@ init_sha512(PX_MD * md) md->reset(md); } - diff --git a/contrib/pgcrypto/internal.c b/contrib/pgcrypto/internal.c index 4b90399cdd6..c0d8846a3c8 100644 --- a/contrib/pgcrypto/internal.c +++ b/contrib/pgcrypto/internal.c @@ -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.24 2006/07/13 04:15:24 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/internal.c,v 1.25 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -78,10 +78,10 @@ static void init_md5(PX_MD * h); static void init_sha1(PX_MD * h); -void init_sha224(PX_MD * h); -void init_sha256(PX_MD * h); -void init_sha384(PX_MD * h); -void init_sha512(PX_MD * h); +void init_sha224(PX_MD * h); +void init_sha256(PX_MD * h); +void init_sha384(PX_MD * h); +void init_sha512(PX_MD * h); struct int_digest { diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index 2ad5a63ebff..7b159c4d568 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -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.29 2006/09/05 23:02:28 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.30 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -58,7 +58,6 @@ */ #include <openssl/aes.h> - #else /* old OPENSSL */ /* @@ -121,29 +120,32 @@ * Emulate newer digest API. */ -static void EVP_MD_CTX_init(EVP_MD_CTX *ctx) +static void +EVP_MD_CTX_init(EVP_MD_CTX *ctx) { memset(ctx, 0, sizeof(*ctx)); } -static int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) +static int +EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) { memset(ctx, 0, sizeof(*ctx)); return 1; } -static int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, void *engine) +static int +EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, void *engine) { EVP_DigestInit(ctx, md); return 1; } -static int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *res, unsigned int *len) +static int +EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *res, unsigned int *len) { EVP_DigestFinal(ctx, res, len); return 1; } - #endif /* old OpenSSL */ /* @@ -154,11 +156,12 @@ static int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *res, unsigned int #include "sha2.c" #include "internal-sha2.c" -typedef void (*init_f)(PX_MD *md); +typedef void (*init_f) (PX_MD * md); -static int compat_find_digest(const char *name, PX_MD **res) +static int +compat_find_digest(const char *name, PX_MD ** res) { - init_f init = NULL; + init_f init = NULL; if (pg_strcasecmp(name, "sha224") == 0) init = init_sha224; @@ -175,7 +178,6 @@ static int compat_find_digest(const char *name, PX_MD **res) init(*res); return 0; } - #else #define compat_find_digest(name, res) (PXE_NO_HASH) #endif @@ -184,29 +186,32 @@ static int compat_find_digest(const char *name, PX_MD **res) * Hashes */ -typedef struct OSSLDigest { +typedef struct OSSLDigest +{ const EVP_MD *algo; - EVP_MD_CTX ctx; -} OSSLDigest; + EVP_MD_CTX ctx; +} OSSLDigest; static unsigned digest_result_size(PX_MD * h) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; + return EVP_MD_CTX_size(&digest->ctx); } static unsigned digest_block_size(PX_MD * h) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; + return EVP_MD_CTX_block_size(&digest->ctx); } static void digest_reset(PX_MD * h) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; EVP_DigestInit_ex(&digest->ctx, digest->algo, NULL); } @@ -214,7 +219,7 @@ digest_reset(PX_MD * h) static void digest_update(PX_MD * h, const uint8 *data, unsigned dlen) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; EVP_DigestUpdate(&digest->ctx, data, dlen); } @@ -222,7 +227,7 @@ digest_update(PX_MD * h, const uint8 *data, unsigned dlen) static void digest_finish(PX_MD * h, uint8 *dst) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; EVP_DigestFinal_ex(&digest->ctx, dst, NULL); } @@ -230,7 +235,7 @@ digest_finish(PX_MD * h, uint8 *dst) static void digest_free(PX_MD * h) { - OSSLDigest *digest = (OSSLDigest *)h->p.ptr; + OSSLDigest *digest = (OSSLDigest *) h->p.ptr; EVP_MD_CTX_cleanup(&digest->ctx); @@ -560,7 +565,7 @@ ossl_des3_ecb_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) - DES_ecb3_encrypt((void *)(data + i * bs), (void *)(res + i * bs), + DES_ecb3_encrypt((void *) (data + i * bs), (void *) (res + i * bs), &od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3, 1); return 0; } @@ -574,7 +579,7 @@ ossl_des3_ecb_decrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, ossldata *od = c->ptr; for (i = 0; i < dlen / bs; i++) - DES_ecb3_encrypt((void *)(data + i * bs), (void *)(res + i * bs), + DES_ecb3_encrypt((void *) (data + i * bs), (void *) (res + i * bs), &od->u.des3.k1, &od->u.des3.k2, &od->u.des3.k3, 0); return 0; } diff --git a/contrib/pgcrypto/pgcrypto.c b/contrib/pgcrypto/pgcrypto.c index 083b31d4c2e..31c3a59ee5a 100644 --- a/contrib/pgcrypto/pgcrypto.c +++ b/contrib/pgcrypto/pgcrypto.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/pgcrypto.c,v 1.23 2006/09/05 21:26:48 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/pgcrypto.c,v 1.24 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -491,9 +491,9 @@ PG_FUNCTION_INFO_V1(pg_random_bytes); Datum pg_random_bytes(PG_FUNCTION_ARGS) { - int err; - int len = PG_GETARG_INT32(0); - bytea *res; + int err; + int len = PG_GETARG_INT32(0); + bytea *res; if (len < 1 || len > 1024) ereport(ERROR, @@ -504,7 +504,7 @@ pg_random_bytes(PG_FUNCTION_ARGS) VARATT_SIZEP(res) = VARHDRSZ + len; /* generate result */ - err = px_get_random_bytes((uint8*)VARDATA(res), len); + err = px_get_random_bytes((uint8 *) VARDATA(res), len); if (err < 0) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), diff --git a/contrib/pgcrypto/pgp-mpi-internal.c b/contrib/pgcrypto/pgp-mpi-internal.c index 4f2e5ec9626..d2b5d0c8de7 100644 --- a/contrib/pgcrypto/pgp-mpi-internal.c +++ b/contrib/pgcrypto/pgp-mpi-internal.c @@ -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-mpi-internal.c,v 1.6 2006/07/13 04:52:51 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-mpi-internal.c,v 1.7 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -36,14 +36,17 @@ #include "mbuf.h" #include "pgp.h" -static mpz_t *mp_new() +static mpz_t * +mp_new() { - mpz_t *mp = mp_int_alloc(); + mpz_t *mp = mp_int_alloc(); + mp_int_init_size(mp, 256); return mp; } -static void mp_clear_free(mpz_t *a) +static void +mp_clear_free(mpz_t * a) { if (!a) return; @@ -52,25 +55,29 @@ static void mp_clear_free(mpz_t *a) } -static int mp_px_rand(uint32 bits, mpz_t *res) +static int +mp_px_rand(uint32 bits, mpz_t * res) { - int err; - unsigned bytes = (bits + 7) / 8; - int last_bits = bits & 7; - uint8 *buf; + int err; + unsigned bytes = (bits + 7) / 8; + int last_bits = bits & 7; + uint8 *buf; buf = px_alloc(bytes); err = px_get_random_bytes(buf, bytes); - if (err < 0) { + if (err < 0) + { px_free(buf); return err; } /* clear unnecessary bits and set last bit to one */ - if (last_bits) { + if (last_bits) + { buf[0] >>= 8 - last_bits; buf[0] |= 1 << (last_bits - 1); - } else + } + else buf[0] |= 1 << 7; mp_int_read_unsigned(res, buf, bytes); @@ -80,9 +87,11 @@ static int mp_px_rand(uint32 bits, mpz_t *res) return 0; } -static void mp_modmul(mpz_t *a, mpz_t *b, mpz_t *p, mpz_t *res) +static void +mp_modmul(mpz_t * a, mpz_t * b, mpz_t * p, mpz_t * res) { - mpz_t *tmp = mp_new(); + mpz_t *tmp = mp_new(); + mp_int_mul(a, b, tmp); mp_int_mod(tmp, p, res); mp_clear_free(tmp); @@ -92,6 +101,7 @@ static mpz_t * mpi_to_bn(PGP_MPI * n) { mpz_t *bn = mp_new(); + mp_int_read_unsigned(bn, n->data, n->bytes); if (!bn) @@ -107,11 +117,11 @@ mpi_to_bn(PGP_MPI * n) } static PGP_MPI * -bn_to_mpi(mpz_t *bn) +bn_to_mpi(mpz_t * bn) { int res; PGP_MPI *n; - int bytes; + int bytes; res = pgp_mpi_alloc(mp_int_count_bits(bn), &n); if (res < 0) diff --git a/contrib/pgcrypto/sha2.c b/contrib/pgcrypto/sha2.c index 98e1fc1964d..31623fb9a69 100644 --- a/contrib/pgcrypto/sha2.c +++ b/contrib/pgcrypto/sha2.c @@ -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.7 2006/07/13 04:15:25 neilc Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/sha2.c,v 1.8 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -534,7 +534,7 @@ SHA256_Update(SHA256_CTX * context, const uint8 *data, size_t len) } static void -SHA256_Last(SHA256_CTX *context) +SHA256_Last(SHA256_CTX * context) { unsigned int usedspace; @@ -1023,4 +1023,3 @@ SHA224_Final(uint8 digest[], SHA224_CTX * context) /* Clean up state data: */ memset(context, 0, sizeof(*context)); } - diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index 13d3f2164fc..002536b9201 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/contrib/pgrowlocks/pgrowlocks.c,v 1.4 2006/07/13 16:57:31 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pgrowlocks/pgrowlocks.c,v 1.5 2006/10/04 00:29:46 momjian Exp $ * * Copyright (c) 2005-2006 Tatsuo Ishii * @@ -63,11 +63,12 @@ extern Datum pgrowlocks(PG_FUNCTION_ARGS); */ #undef MAKERANGEVARFROMNAMELIST_HAS_TWO_ARGS -typedef struct { +typedef struct +{ Relation rel; HeapScanDesc scan; - int ncolumns; -} MyData; + int ncolumns; +} MyData; Datum pgrowlocks(PG_FUNCTION_ARGS) @@ -78,7 +79,7 @@ pgrowlocks(PG_FUNCTION_ARGS) TupleDesc tupdesc; AttInMetadata *attinmeta; Datum result; - MyData *mydata; + MyData *mydata; Relation rel; if (SRF_IS_FIRSTCALL()) @@ -96,8 +97,7 @@ pgrowlocks(PG_FUNCTION_ARGS) relname = PG_GETARG_TEXT_P(0); #ifdef MAKERANGEVARFROMNAMELIST_HAS_TWO_ARGS - relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname, "pgrowlocks")); - + relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname, "pgrowlocks")); #else relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); #endif @@ -114,7 +114,7 @@ pgrowlocks(PG_FUNCTION_ARGS) funcctx = SRF_PERCALL_SETUP(); attinmeta = funcctx->attinmeta; - mydata = (MyData *)funcctx->user_fctx; + mydata = (MyData *) funcctx->user_fctx; scan = mydata->scan; /* scan the relation */ @@ -124,16 +124,16 @@ pgrowlocks(PG_FUNCTION_ARGS) LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE); if (HeapTupleSatisfiesUpdate(tuple->t_data, GetCurrentCommandId(), scan->rs_cbuf) - == HeapTupleBeingUpdated) + == HeapTupleBeingUpdated) { - char **values; - int i; + char **values; + int i; values = (char **) palloc(mydata->ncolumns * sizeof(char *)); i = 0; - values[i++] = (char *)DirectFunctionCall1(tidout, PointerGetDatum(&tuple->t_self)); + values[i++] = (char *) DirectFunctionCall1(tidout, PointerGetDatum(&tuple->t_self)); #ifdef HEAP_XMAX_SHARED_LOCK if (tuple->t_data->t_infomask & HEAP_XMAX_SHARED_LOCK) @@ -143,15 +143,15 @@ pgrowlocks(PG_FUNCTION_ARGS) #else values[i++] = pstrdup("Exclusive"); #endif - values[i] = palloc(NCHARS*sizeof(char)); + values[i] = palloc(NCHARS * sizeof(char)); snprintf(values[i++], NCHARS, "%d", HeapTupleHeaderGetXmax(tuple->t_data)); #ifdef HEAP_XMAX_SHARED_LOCK if (tuple->t_data->t_infomask & HEAP_XMAX_IS_MULTI) { TransactionId *xids; - int nxids; - int j; - int isValidXid = 0; /* any valid xid ever exists? */ + int nxids; + int j; + int isValidXid = 0; /* any valid xid ever exists? */ values[i++] = pstrdup("true"); nxids = GetMultiXactIdMembers(HeapTupleHeaderGetXmax(tuple->t_data), &xids); @@ -160,45 +160,44 @@ pgrowlocks(PG_FUNCTION_ARGS) elog(ERROR, "GetMultiXactIdMembers returns error"); } - values[i] = palloc(NCHARS*nxids); - values[i+1] = palloc(NCHARS*nxids); + values[i] = palloc(NCHARS * nxids); + values[i + 1] = palloc(NCHARS * nxids); strcpy(values[i], "{"); - strcpy(values[i+1], "{"); + strcpy(values[i + 1], "{"); - for (j=0;j<nxids;j++) + for (j = 0; j < nxids; j++) { - char buf[NCHARS]; + char buf[NCHARS]; if (TransactionIdIsInProgress(xids[j])) { if (isValidXid) { strcat(values[i], ","); - strcat(values[i+1], ","); + strcat(values[i + 1], ","); } snprintf(buf, NCHARS, "%d", xids[j]); strcat(values[i], buf); snprintf(buf, NCHARS, "%d", BackendXidGetPid(xids[j])); - strcat(values[i+1], buf); + strcat(values[i + 1], buf); isValidXid = 1; } } strcat(values[i], "}"); - strcat(values[i+1], "}"); + strcat(values[i + 1], "}"); i++; } else { values[i++] = pstrdup("false"); - values[i] = palloc(NCHARS*sizeof(char)); + values[i] = palloc(NCHARS * sizeof(char)); snprintf(values[i++], NCHARS, "{%d}", HeapTupleHeaderGetXmax(tuple->t_data)); - values[i] = palloc(NCHARS*sizeof(char)); + values[i] = palloc(NCHARS * sizeof(char)); snprintf(values[i++], NCHARS, "{%d}", BackendXidGetPid(HeapTupleHeaderGetXmax(tuple->t_data))); } - #else values[i++] = pstrdup("false"); values[i++] = pstrdup("{}"); diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index 6ff6012073a..5bac70949d0 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.24 2006/09/04 02:03:04 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.25 2006/10/04 00:29:46 momjian Exp $ * * Copyright (c) 2001,2002 Tatsuo Ishii * @@ -51,36 +51,36 @@ extern Datum pgstattuplebyid(PG_FUNCTION_ARGS); */ typedef struct pgstattuple_type { - uint64 table_len; - uint64 tuple_count; - uint64 tuple_len; - uint64 dead_tuple_count; - uint64 dead_tuple_len; - uint64 free_space; /* free/reusable space in bytes */ -} pgstattuple_type; - -typedef void (*pgstat_page)(pgstattuple_type *, Relation, BlockNumber); - -static Datum build_pgstattuple_type(pgstattuple_type *stat, - FunctionCallInfo fcinfo); + uint64 table_len; + uint64 tuple_count; + uint64 tuple_len; + uint64 dead_tuple_count; + uint64 dead_tuple_len; + uint64 free_space; /* free/reusable space in bytes */ +} pgstattuple_type; + +typedef void (*pgstat_page) (pgstattuple_type *, Relation, BlockNumber); + +static Datum build_pgstattuple_type(pgstattuple_type * stat, + FunctionCallInfo fcinfo); static Datum pgstat_relation(Relation rel, FunctionCallInfo fcinfo); static Datum pgstat_heap(Relation rel, FunctionCallInfo fcinfo); -static void pgstat_btree_page(pgstattuple_type *stat, - Relation rel, BlockNumber blkno); -static void pgstat_hash_page(pgstattuple_type *stat, - Relation rel, BlockNumber blkno); -static void pgstat_gist_page(pgstattuple_type *stat, - Relation rel, BlockNumber blkno); +static void pgstat_btree_page(pgstattuple_type * stat, + Relation rel, BlockNumber blkno); +static void pgstat_hash_page(pgstattuple_type * stat, + Relation rel, BlockNumber blkno); +static void pgstat_gist_page(pgstattuple_type * stat, + Relation rel, BlockNumber blkno); static Datum pgstat_index(Relation rel, BlockNumber start, - pgstat_page pagefn, FunctionCallInfo fcinfo); -static void pgstat_index_page(pgstattuple_type *stat, Page page, - OffsetNumber minoff, OffsetNumber maxoff); + pgstat_page pagefn, FunctionCallInfo fcinfo); +static void pgstat_index_page(pgstattuple_type * stat, Page page, + OffsetNumber minoff, OffsetNumber maxoff); /* * build_pgstattuple_type -- build a pgstattuple_type tuple */ static Datum -build_pgstattuple_type(pgstattuple_type *stat, FunctionCallInfo fcinfo) +build_pgstattuple_type(pgstattuple_type * stat, FunctionCallInfo fcinfo) { #define NCOLUMNS 9 #define NCHARS 32 @@ -91,7 +91,7 @@ build_pgstattuple_type(pgstattuple_type *stat, FunctionCallInfo fcinfo) int i; double tuple_percent; double dead_tuple_percent; - double free_percent; /* free/reusable space in % */ + double free_percent; /* free/reusable space in % */ TupleDesc tupdesc; AttInMetadata *attinmeta; @@ -190,49 +190,49 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo) { const char *err; - switch(rel->rd_rel->relkind) + switch (rel->rd_rel->relkind) { - case RELKIND_RELATION: - case RELKIND_TOASTVALUE: - case RELKIND_UNCATALOGED: - case RELKIND_SEQUENCE: - return pgstat_heap(rel, fcinfo); - case RELKIND_INDEX: - switch(rel->rd_rel->relam) - { - case BTREE_AM_OID: - return pgstat_index(rel, BTREE_METAPAGE + 1, - pgstat_btree_page, fcinfo); - case HASH_AM_OID: - return pgstat_index(rel, HASH_METAPAGE + 1, - pgstat_hash_page, fcinfo); - case GIST_AM_OID: - return pgstat_index(rel, GIST_ROOT_BLKNO + 1, - pgstat_gist_page, fcinfo); - case GIN_AM_OID: - err = "gin index"; + case RELKIND_RELATION: + case RELKIND_TOASTVALUE: + case RELKIND_UNCATALOGED: + case RELKIND_SEQUENCE: + return pgstat_heap(rel, fcinfo); + case RELKIND_INDEX: + switch (rel->rd_rel->relam) + { + case BTREE_AM_OID: + return pgstat_index(rel, BTREE_METAPAGE + 1, + pgstat_btree_page, fcinfo); + case HASH_AM_OID: + return pgstat_index(rel, HASH_METAPAGE + 1, + pgstat_hash_page, fcinfo); + case GIST_AM_OID: + return pgstat_index(rel, GIST_ROOT_BLKNO + 1, + pgstat_gist_page, fcinfo); + case GIN_AM_OID: + err = "gin index"; + break; + default: + err = "unknown index"; + break; + } + break; + case RELKIND_VIEW: + err = "view"; + break; + case RELKIND_COMPOSITE_TYPE: + err = "composite type"; break; default: - err = "unknown index"; + err = "unknown"; break; - } - break; - case RELKIND_VIEW: - err = "view"; - break; - case RELKIND_COMPOSITE_TYPE: - err = "composite type"; - break; - default: - err = "unknown"; - break; } ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("\"%s\" (%s) is not supported", - RelationGetRelationName(rel), err))); - return 0; /* should not happen */ + RelationGetRelationName(rel), err))); + return 0; /* should not happen */ } /* @@ -241,13 +241,13 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo) static Datum pgstat_heap(Relation rel, FunctionCallInfo fcinfo) { - HeapScanDesc scan; - HeapTuple tuple; - BlockNumber nblocks; - BlockNumber block = 0; /* next block to count free space in */ - BlockNumber tupblock; - Buffer buffer; - pgstattuple_type stat = { 0 }; + HeapScanDesc scan; + HeapTuple tuple; + BlockNumber nblocks; + BlockNumber block = 0; /* next block to count free space in */ + BlockNumber tupblock; + Buffer buffer; + pgstattuple_type stat = {0}; scan = heap_beginscan(rel, SnapshotAny, 0, NULL); @@ -302,7 +302,7 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo) relation_close(rel, AccessShareLock); - stat.table_len = (uint64) nblocks * BLCKSZ; + stat.table_len = (uint64) nblocks *BLCKSZ; return build_pgstattuple_type(&stat, fcinfo); } @@ -311,10 +311,10 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo) * pgstat_btree_page -- check tuples in a btree page */ static void -pgstat_btree_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) +pgstat_btree_page(pgstattuple_type * stat, Relation rel, BlockNumber blkno) { - Buffer buf; - Page page; + Buffer buf; + Page page; buf = ReadBuffer(rel, blkno); LockBuffer(buf, BT_READ); @@ -328,7 +328,8 @@ pgstat_btree_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) } else { - BTPageOpaque opaque; + BTPageOpaque opaque; + opaque = (BTPageOpaque) PageGetSpecialPointer(page); if (opaque->btpo_flags & (BTP_DELETED | BTP_HALF_DEAD)) { @@ -338,7 +339,7 @@ pgstat_btree_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) else if (P_ISLEAF(opaque)) { pgstat_index_page(stat, page, P_FIRSTDATAKEY(opaque), - PageGetMaxOffsetNumber(page)); + PageGetMaxOffsetNumber(page)); } else { @@ -353,10 +354,10 @@ pgstat_btree_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) * pgstat_hash_page -- check tuples in a hash page */ static void -pgstat_hash_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) +pgstat_hash_page(pgstattuple_type * stat, Relation rel, BlockNumber blkno) { - Buffer buf; - Page page; + Buffer buf; + Page page; _hash_getlock(rel, blkno, HASH_SHARE); buf = _hash_getbuf(rel, blkno, HASH_READ); @@ -364,22 +365,23 @@ pgstat_hash_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) if (PageGetSpecialSize(page) == MAXALIGN(sizeof(HashPageOpaqueData))) { - HashPageOpaque opaque; + HashPageOpaque opaque; + opaque = (HashPageOpaque) PageGetSpecialPointer(page); switch (opaque->hasho_flag) { - case LH_UNUSED_PAGE: - stat->free_space += BLCKSZ; - break; - case LH_BUCKET_PAGE: - case LH_OVERFLOW_PAGE: - pgstat_index_page(stat, page, FirstOffsetNumber, - PageGetMaxOffsetNumber(page)); - break; - case LH_BITMAP_PAGE: - case LH_META_PAGE: - default: - break; + case LH_UNUSED_PAGE: + stat->free_space += BLCKSZ; + break; + case LH_BUCKET_PAGE: + case LH_OVERFLOW_PAGE: + pgstat_index_page(stat, page, FirstOffsetNumber, + PageGetMaxOffsetNumber(page)); + break; + case LH_BITMAP_PAGE: + case LH_META_PAGE: + default: + break; } } else @@ -395,10 +397,10 @@ pgstat_hash_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) * pgstat_gist_page -- check tuples in a gist page */ static void -pgstat_gist_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) +pgstat_gist_page(pgstattuple_type * stat, Relation rel, BlockNumber blkno) { - Buffer buf; - Page page; + Buffer buf; + Page page; buf = ReadBuffer(rel, blkno); LockBuffer(buf, GIST_SHARE); @@ -408,7 +410,7 @@ pgstat_gist_page(pgstattuple_type *stat, Relation rel, BlockNumber blkno) if (GistPageIsLeaf(page)) { pgstat_index_page(stat, page, FirstOffsetNumber, - PageGetMaxOffsetNumber(page)); + PageGetMaxOffsetNumber(page)); } else { @@ -427,7 +429,7 @@ pgstat_index(Relation rel, BlockNumber start, pgstat_page pagefn, { BlockNumber nblocks; BlockNumber blkno; - pgstattuple_type stat = { 0 }; + pgstattuple_type stat = {0}; blkno = start; for (;;) @@ -440,7 +442,8 @@ pgstat_index(Relation rel, BlockNumber start, pgstat_page pagefn, /* Quit if we've scanned the whole relation */ if (blkno >= nblocks) { - stat.table_len = (uint64) nblocks * BLCKSZ; + stat.table_len = (uint64) nblocks *BLCKSZ; + break; } @@ -457,16 +460,16 @@ pgstat_index(Relation rel, BlockNumber start, pgstat_page pagefn, * pgstat_index_page -- for generic index page */ static void -pgstat_index_page(pgstattuple_type *stat, Page page, - OffsetNumber minoff, OffsetNumber maxoff) +pgstat_index_page(pgstattuple_type * stat, Page page, + OffsetNumber minoff, OffsetNumber maxoff) { - OffsetNumber i; + OffsetNumber i; stat->free_space += PageGetFreeSpace(page); for (i = minoff; i <= maxoff; i = OffsetNumberNext(i)) { - ItemId itemid = PageGetItemId(page, i); + ItemId itemid = PageGetItemId(page, i); if (ItemIdDeleted(itemid)) { diff --git a/contrib/sslinfo/sslinfo.c b/contrib/sslinfo/sslinfo.c index afaa7079af2..16eea5eae33 100644 --- a/contrib/sslinfo/sslinfo.c +++ b/contrib/sslinfo/sslinfo.c @@ -4,7 +4,7 @@ * Written by Victor B. Wagner <[email protected]>, Cryptocom LTD * This file is distributed under BSD-style license. * - * $PostgreSQL: pgsql/contrib/sslinfo/sslinfo.c,v 1.4 2006/09/30 18:44:37 tgl Exp $ + * $PostgreSQL: pgsql/contrib/sslinfo/sslinfo.c,v 1.5 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -22,28 +22,29 @@ PG_MODULE_MAGIC; -Datum ssl_is_used(PG_FUNCTION_ARGS); -Datum ssl_client_cert_present(PG_FUNCTION_ARGS); -Datum ssl_client_serial(PG_FUNCTION_ARGS); -Datum ssl_client_dn_field(PG_FUNCTION_ARGS); -Datum ssl_issuer_field(PG_FUNCTION_ARGS); -Datum ssl_client_dn(PG_FUNCTION_ARGS); -Datum ssl_issuer_dn(PG_FUNCTION_ARGS); -Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName); -Datum X509_NAME_to_text(X509_NAME *name); -Datum ASN1_STRING_to_text(ASN1_STRING *str); +Datum ssl_is_used(PG_FUNCTION_ARGS); +Datum ssl_client_cert_present(PG_FUNCTION_ARGS); +Datum ssl_client_serial(PG_FUNCTION_ARGS); +Datum ssl_client_dn_field(PG_FUNCTION_ARGS); +Datum ssl_issuer_field(PG_FUNCTION_ARGS); +Datum ssl_client_dn(PG_FUNCTION_ARGS); +Datum ssl_issuer_dn(PG_FUNCTION_ARGS); +Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName); +Datum X509_NAME_to_text(X509_NAME *name); +Datum ASN1_STRING_to_text(ASN1_STRING *str); -/* +/* * Indicates whether current session uses SSL * * Function has no arguments. Returns bool. True if current session * is SSL session and false if it is local or non-ssl session. */ PG_FUNCTION_INFO_V1(ssl_is_used); -Datum ssl_is_used(PG_FUNCTION_ARGS) +Datum +ssl_is_used(PG_FUNCTION_ARGS) { - PG_RETURN_BOOL(MyProcPort->ssl !=NULL); + PG_RETURN_BOOL(MyProcPort->ssl != NULL); } @@ -54,7 +55,8 @@ Datum ssl_is_used(PG_FUNCTION_ARGS) * is SSL session and client certificate is verified, otherwise false. */ PG_FUNCTION_INFO_V1(ssl_client_cert_present); -Datum ssl_client_cert_present(PG_FUNCTION_ARGS) +Datum +ssl_client_cert_present(PG_FUNCTION_ARGS) { PG_RETURN_BOOL(MyProcPort->peer != NULL); } @@ -69,20 +71,22 @@ Datum ssl_client_cert_present(PG_FUNCTION_ARGS) * SSL connection is established without sending client certificate. */ PG_FUNCTION_INFO_V1(ssl_client_serial); -Datum ssl_client_serial(PG_FUNCTION_ARGS) +Datum +ssl_client_serial(PG_FUNCTION_ARGS) { - Datum result; - Port *port = MyProcPort; - X509 *peer = port->peer; + Datum result; + Port *port = MyProcPort; + X509 *peer = port->peer; ASN1_INTEGER *serial = NULL; - BIGNUM *b; - char *decimal; + BIGNUM *b; + char *decimal; if (!peer) PG_RETURN_NULL(); serial = X509_get_serialNumber(peer); b = ASN1_INTEGER_to_BN(serial, NULL); decimal = BN_bn2dec(b); + BN_free(b); result = DirectFunctionCall3(numeric_in, CStringGetDatum(decimal), @@ -100,23 +104,25 @@ Datum ssl_client_serial(PG_FUNCTION_ARGS) * current database encoding if possible. Any invalid characters are * replaced by question marks. * - * Parameter: str - OpenSSL ASN1_STRING structure. Memory managment + * Parameter: str - OpenSSL ASN1_STRING structure. Memory managment * of this structure is responsibility of caller. * * Returns Datum, which can be directly returned from a C language SQL * function. */ -Datum ASN1_STRING_to_text(ASN1_STRING *str) +Datum +ASN1_STRING_to_text(ASN1_STRING *str) { - BIO *membuf = NULL; - size_t size, outlen; - char *sp; - char *dp; - text *result; + BIO *membuf = NULL; + size_t size, + outlen; + char *sp; + char *dp; + text *result; membuf = BIO_new(BIO_s_mem()); (void) BIO_set_close(membuf, BIO_CLOSE); - ASN1_STRING_print_ex(membuf,str, + ASN1_STRING_print_ex(membuf, str, ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); @@ -124,7 +130,7 @@ Datum ASN1_STRING_to_text(ASN1_STRING *str) BIO_write(membuf, &outlen, 1); size = BIO_get_mem_data(membuf, &sp); dp = (char *) pg_do_encoding_conversion((unsigned char *) sp, - size-1, + size - 1, PG_UTF8, GetDatabaseEncoding()); outlen = strlen(dp); @@ -146,18 +152,21 @@ Datum ASN1_STRING_to_text(ASN1_STRING *str) * * Parameter: X509_NAME *name - either subject or issuer of certificate * Parameter: text fieldName - field name string like 'CN' or commonName - * to be looked up in the OpenSSL ASN1 OID database + * to be looked up in the OpenSSL ASN1 OID database * * Returns result of ASN1_STRING_to_text applied to appropriate * part of name */ -Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName) +Datum +X509_NAME_field_to_text(X509_NAME *name, text *fieldName) { - char *sp; - char *string_fieldname; - char *dp; - size_t name_len = VARSIZE(fieldName) - VARHDRSZ; - int nid, index, i; + char *sp; + char *string_fieldname; + char *dp; + size_t name_len = VARSIZE(fieldName) - VARHDRSZ; + int nid, + index, + i; ASN1_STRING *data; string_fieldname = palloc(name_len + 1); @@ -175,7 +184,7 @@ Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName) pfree(string_fieldname); index = X509_NAME_get_index_by_NID(name, nid, -1); if (index < 0) - return (Datum)0; + return (Datum) 0; data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, index)); return ASN1_STRING_to_text(data); } @@ -198,10 +207,11 @@ Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName) * there is no field with such name in the certificate. */ PG_FUNCTION_INFO_V1(ssl_client_dn_field); -Datum ssl_client_dn_field(PG_FUNCTION_ARGS) +Datum +ssl_client_dn_field(PG_FUNCTION_ARGS) { - text *fieldname = PG_GETARG_TEXT_P(0); - Datum result; + text *fieldname = PG_GETARG_TEXT_P(0); + Datum result; if (!(MyProcPort->peer)) PG_RETURN_NULL(); @@ -232,10 +242,11 @@ Datum ssl_client_dn_field(PG_FUNCTION_ARGS) * there is no field with such name in the certificate. */ PG_FUNCTION_INFO_V1(ssl_issuer_field); -Datum ssl_issuer_field(PG_FUNCTION_ARGS) +Datum +ssl_issuer_field(PG_FUNCTION_ARGS) { - text *fieldname = PG_GETARG_TEXT_P(0); - Datum result; + text *fieldname = PG_GETARG_TEXT_P(0); + Datum result; if (!(MyProcPort->peer)) PG_RETURN_NULL(); @@ -260,21 +271,25 @@ Datum ssl_issuer_field(PG_FUNCTION_ARGS) * Returns: text datum which contains string representation of * X509_NAME */ -Datum X509_NAME_to_text(X509_NAME *name) +Datum +X509_NAME_to_text(X509_NAME *name) { - BIO *membuf = BIO_new(BIO_s_mem()); - int i,nid,count = X509_NAME_entry_count(name); + BIO *membuf = BIO_new(BIO_s_mem()); + int i, + nid, + count = X509_NAME_entry_count(name); X509_NAME_ENTRY *e; ASN1_STRING *v; const char *field_name; - size_t size,outlen; - char *sp; - char *dp; - text *result; + size_t size, + outlen; + char *sp; + char *dp; + text *result; (void) BIO_set_close(membuf, BIO_CLOSE); - for (i=0; i<count; i++) + for (i = 0; i < count; i++) { e = X509_NAME_get_entry(name, i); nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e)); @@ -283,17 +298,17 @@ Datum X509_NAME_to_text(X509_NAME *name) if (!field_name) field_name = OBJ_nid2ln(nid); BIO_printf(membuf, "/%s=", field_name); - ASN1_STRING_print_ex(membuf,v, + ASN1_STRING_print_ex(membuf, v, ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); } - i=0; + i = 0; BIO_write(membuf, &i, 1); size = BIO_get_mem_data(membuf, &sp); dp = (char *) pg_do_encoding_conversion((unsigned char *) sp, - size-1, + size - 1, PG_UTF8, GetDatabaseEncoding()); BIO_free(membuf); @@ -301,8 +316,10 @@ Datum X509_NAME_to_text(X509_NAME *name) result = palloc(VARHDRSZ + outlen); memcpy(VARDATA(result), dp, outlen); - /* pg_do_encoding_conversion has annoying habit of returning - * source pointer */ + /* + * pg_do_encoding_conversion has annoying habit of returning source + * pointer + */ if (dp != sp) pfree(dp); VARATT_SIZEP(result) = outlen + VARHDRSZ; @@ -320,7 +337,8 @@ Datum X509_NAME_to_text(X509_NAME *name) * Returns text datum. */ PG_FUNCTION_INFO_V1(ssl_client_dn); -Datum ssl_client_dn(PG_FUNCTION_ARGS) +Datum +ssl_client_dn(PG_FUNCTION_ARGS) { if (!(MyProcPort->peer)) PG_RETURN_NULL(); @@ -338,7 +356,8 @@ Datum ssl_client_dn(PG_FUNCTION_ARGS) * Returns text datum. */ PG_FUNCTION_INFO_V1(ssl_issuer_dn); -Datum ssl_issuer_dn(PG_FUNCTION_ARGS) +Datum +ssl_issuer_dn(PG_FUNCTION_ARGS) { if (!(MyProcPort->peer)) PG_RETURN_NULL(); diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index 7ab363972e5..b63bd21cd7d 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -1259,7 +1259,7 @@ build_tuplestore_recursively(char *key_fld, int ret; int proc; int serial_column; - StringInfoData sql; + StringInfoData sql; char **values; char *current_key; char *current_key_parent; @@ -1357,9 +1357,9 @@ build_tuplestore_recursively(char *key_fld, SPITupleTable *tuptable = SPI_tuptable; TupleDesc spi_tupdesc = tuptable->tupdesc; int i; - StringInfoData branchstr; - StringInfoData chk_branchstr; - StringInfoData chk_current_key; + StringInfoData branchstr; + StringInfoData chk_branchstr; + StringInfoData chk_current_key; /* First time through, do a little more setup */ if (level == 0) diff --git a/contrib/tsearch2/common.c b/contrib/tsearch2/common.c index 61928213443..3ff3fad1bf2 100644 --- a/contrib/tsearch2/common.c +++ b/contrib/tsearch2/common.c @@ -164,16 +164,19 @@ get_oidnamespace(Oid funcoid) return nspoid; } - /* if path is relative, take it as relative to share dir */ + /* if path is relative, take it as relative to share dir */ char * -to_absfilename(char *filename) { - if (!is_absolute_path(filename)) { - char sharepath[MAXPGPATH]; - char *absfn; -#ifdef WIN32 - char delim = '\\'; +to_absfilename(char *filename) +{ + if (!is_absolute_path(filename)) + { + char sharepath[MAXPGPATH]; + char *absfn; + +#ifdef WIN32 + char delim = '\\'; #else - char delim = '/'; + char delim = '/'; #endif get_share_path(my_exec_path, sharepath); absfn = palloc(strlen(sharepath) + strlen(filename) + 2); diff --git a/contrib/tsearch2/common.h b/contrib/tsearch2/common.h index c33507e9ac7..ff6ebd6240f 100644 --- a/contrib/tsearch2/common.h +++ b/contrib/tsearch2/common.h @@ -14,7 +14,7 @@ text *mtextdup(text *in); int text_cmp(text *a, text *b); -char * to_absfilename(char *filename); +char *to_absfilename(char *filename); #define NEXTVAL(x) ( (text*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) ) #define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) diff --git a/contrib/tsearch2/dict.c b/contrib/tsearch2/dict.c index 2c37a2696b3..182f5c32910 100644 --- a/contrib/tsearch2/dict.c +++ b/contrib/tsearch2/dict.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/dict.c,v 1.12 2006/05/31 14:05:31 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/dict.c,v 1.13 2006/10/04 00:29:46 momjian Exp $ */ /* * interface functions to dictionary @@ -102,7 +102,8 @@ comparedict(const void *a, const void *b) } static void -insertdict(Oid id) { +insertdict(Oid id) +{ DictInfo newdict; if (DList.len == DList.reallen) @@ -143,7 +144,7 @@ finddict(Oid id) return DList.last_dict; } - /* insert new dictionary */ + /* insert new dictionary */ insertdict(id); return finddict(id); /* qsort changed order!! */ ; } @@ -201,30 +202,31 @@ lexize(PG_FUNCTION_ARGS) *ptr; Datum *da; ArrayType *a; - DictSubState dstate = { false, false, NULL }; + DictSubState dstate = {false, false, NULL}; SET_FUNCOID(); dict = finddict(PG_GETARG_OID(0)); ptr = res = (TSLexeme *) DatumGetPointer( - FunctionCall4(&(dict->lexize_info), - PointerGetDatum(dict->dictionary), - PointerGetDatum(VARDATA(in)), - Int32GetDatum(VARSIZE(in) - VARHDRSZ), - PointerGetDatum(&dstate) + FunctionCall4(&(dict->lexize_info), + PointerGetDatum(dict->dictionary), + PointerGetDatum(VARDATA(in)), + Int32GetDatum(VARSIZE(in) - VARHDRSZ), + PointerGetDatum(&dstate) ) ); - if (dstate.getnext) { - dstate.isend = true; + if (dstate.getnext) + { + dstate.isend = true; ptr = res = (TSLexeme *) DatumGetPointer( - FunctionCall4(&(dict->lexize_info), + FunctionCall4(&(dict->lexize_info), PointerGetDatum(dict->dictionary), PointerGetDatum(VARDATA(in)), - Int32GetDatum(VARSIZE(in) - VARHDRSZ), - PointerGetDatum(&dstate) + Int32GetDatum(VARSIZE(in) - VARHDRSZ), + PointerGetDatum(&dstate) ) - ); + ); } PG_FREE_IF_COPY(in, 1); diff --git a/contrib/tsearch2/dict.h b/contrib/tsearch2/dict.h index a0e9fe6facb..78d5111f14f 100644 --- a/contrib/tsearch2/dict.h +++ b/contrib/tsearch2/dict.h @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/dict.h,v 1.7 2006/05/31 14:05:31 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/dict.h,v 1.8 2006/10/04 00:29:46 momjian Exp $ */ #ifndef __DICT_H__ #define __DICT_H__ @@ -30,11 +30,14 @@ DictInfo *finddict(Oid id); Oid name2id_dict(text *name); void reset_dict(void); -typedef struct { - bool isend; /* in: marks for lexize_info about text end is reached */ - bool getnext; /* out: dict wants next lexeme */ - void *private; /* internal dict state between calls with getnext == true */ -} DictSubState; +typedef struct +{ + bool isend; /* in: marks for lexize_info about text end is + * reached */ + bool getnext; /* out: dict wants next lexeme */ + void *private; /* internal dict state between calls with + * getnext == true */ +} DictSubState; /* simple parser of cfg string */ typedef struct @@ -51,13 +54,8 @@ typedef struct /* * number of variant of split word , for example Word 'fotballklubber' * (norwegian) has two varian to split: ( fotball, klubb ) and ( fot, - * ball, klubb ). So, dictionary should return: - * nvariant lexeme - * 1 fotball - * 1 klubb - * 2 fot - * 2 ball - * 2 klubb + * ball, klubb ). So, dictionary should return: nvariant lexeme 1 + * fotball 1 klubb 2 fot 2 ball 2 klubb */ uint16 nvariant; @@ -74,38 +72,43 @@ typedef struct * Lexize subsystem */ -typedef struct ParsedLex { - int type; - char *lemm; - int lenlemm; +typedef struct ParsedLex +{ + int type; + char *lemm; + int lenlemm; bool resfollow; - struct ParsedLex *next; -} ParsedLex; - -typedef struct ListParsedLex { - ParsedLex *head; - ParsedLex *tail; -} ListParsedLex; - -typedef struct { - TSCfgInfo *cfg; - Oid curDictId; - int posDict; - DictSubState dictState; - ParsedLex *curSub; - ListParsedLex towork; /* current list to work */ - ListParsedLex waste; /* list of lexemes that already lexized */ - - /* fields to store last variant to lexize (basically, thesaurus - or similar to, which wants several lexemes */ - - ParsedLex *lastRes; - TSLexeme *tmpRes; -} LexizeData; - - -void LexizeInit(LexizeData *ld, TSCfgInfo *cfg); -void LexizeAddLemm(LexizeData *ld, int type, char *lemm, int lenlemm); -TSLexeme* LexizeExec(LexizeData *ld, ParsedLex **correspondLexem); + struct ParsedLex *next; +} ParsedLex; + +typedef struct ListParsedLex +{ + ParsedLex *head; + ParsedLex *tail; +} ListParsedLex; + +typedef struct +{ + TSCfgInfo *cfg; + Oid curDictId; + int posDict; + DictSubState dictState; + ParsedLex *curSub; + ListParsedLex towork; /* current list to work */ + ListParsedLex waste; /* list of lexemes that already lexized */ + + /* + * fields to store last variant to lexize (basically, thesaurus or similar + * to, which wants several lexemes + */ + + ParsedLex *lastRes; + TSLexeme *tmpRes; +} LexizeData; + + +void LexizeInit(LexizeData * ld, TSCfgInfo * cfg); +void LexizeAddLemm(LexizeData * ld, int type, char *lemm, int lenlemm); +TSLexeme *LexizeExec(LexizeData * ld, ParsedLex ** correspondLexem); #endif diff --git a/contrib/tsearch2/dict_thesaurus.c b/contrib/tsearch2/dict_thesaurus.c index d5d837b2cce..12ab7f222a0 100644 --- a/contrib/tsearch2/dict_thesaurus.c +++ b/contrib/tsearch2/dict_thesaurus.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/dict_thesaurus.c,v 1.5 2006/06/06 16:25:55 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/dict_thesaurus.c,v 1.6 2006/10/04 00:29:46 momjian Exp $ */ /* * thesaurus @@ -16,41 +16,45 @@ /* * Temporay we use TSLexeme.flags for inner use... */ -#define DT_USEASIS 0x1000 +#define DT_USEASIS 0x1000 -typedef struct LexemeInfo { - uint16 idsubst; /* entry's number in DictThesaurus->subst */ - uint16 posinsubst; /* pos info in entry */ - uint16 tnvariant; /* total num lexemes in one variant */ +typedef struct LexemeInfo +{ + uint16 idsubst; /* entry's number in DictThesaurus->subst */ + uint16 posinsubst; /* pos info in entry */ + uint16 tnvariant; /* total num lexemes in one variant */ struct LexemeInfo *nextentry; struct LexemeInfo *nextvariant; -} LexemeInfo; +} LexemeInfo; -typedef struct { - char *lexeme; - LexemeInfo *entries; -} TheLexeme; +typedef struct +{ + char *lexeme; + LexemeInfo *entries; +} TheLexeme; -typedef struct { - uint16 lastlexeme; /* number lexemes to substitute */ - uint16 reslen; - TSLexeme *res; /* prepared substituted result */ -} TheSubstitute; +typedef struct +{ + uint16 lastlexeme; /* number lexemes to substitute */ + uint16 reslen; + TSLexeme *res; /* prepared substituted result */ +} TheSubstitute; typedef struct { - /* subdictionary to normalize lexemes */ + /* subdictionary to normalize lexemes */ DictInfo subdict; /* Array to search lexeme by exact match */ - TheLexeme *wrds; + TheLexeme *wrds; int nwrds; int ntwrds; - /* Storage of substituted result, n-th element is for - n-th expression */ - TheSubstitute *subst; - int nsubst; + /* + * Storage of substituted result, n-th element is for n-th expression + */ + TheSubstitute *subst; + int nsubst; } DictThesaurus; PG_FUNCTION_INFO_V1(thesaurus_init); @@ -66,184 +70,225 @@ freeDictThesaurus(DictThesaurus * d) } static void -newLexeme( DictThesaurus *d, char *b, char *e, uint16 idsubst, uint16 posinsubst ) { - TheLexeme *ptr; +newLexeme(DictThesaurus * d, char *b, char *e, uint16 idsubst, uint16 posinsubst) +{ + TheLexeme *ptr; - if ( d->nwrds >= d->ntwrds ) { - if ( d->ntwrds == 0 ) { + if (d->nwrds >= d->ntwrds) + { + if (d->ntwrds == 0) + { d->ntwrds = 16; - d->wrds = (TheLexeme*)malloc(sizeof(TheLexeme) * d->ntwrds); - } else { + d->wrds = (TheLexeme *) malloc(sizeof(TheLexeme) * d->ntwrds); + } + else + { d->ntwrds *= 2; - d->wrds = (TheLexeme*)realloc(d->wrds, sizeof(TheLexeme) * d->ntwrds); + d->wrds = (TheLexeme *) realloc(d->wrds, sizeof(TheLexeme) * d->ntwrds); } if (!d->wrds) - elog(ERROR,"Out of memory"); + elog(ERROR, "Out of memory"); } ptr = d->wrds + d->nwrds; d->nwrds++; - if ( (ptr->lexeme = malloc(e-b+1)) == NULL ) - elog(ERROR,"Out of memory"); + if ((ptr->lexeme = malloc(e - b + 1)) == NULL) + elog(ERROR, "Out of memory"); - memcpy(ptr->lexeme, b, e-b); - ptr->lexeme[e-b] = '\0'; + memcpy(ptr->lexeme, b, e - b); + ptr->lexeme[e - b] = '\0'; - if ( (ptr->entries = (LexemeInfo*)malloc( sizeof(LexemeInfo) ))==NULL ) - elog(ERROR,"Out of memory"); + if ((ptr->entries = (LexemeInfo *) malloc(sizeof(LexemeInfo))) == NULL) + elog(ERROR, "Out of memory"); - ptr->entries->nextentry=NULL; + ptr->entries->nextentry = NULL; ptr->entries->idsubst = idsubst; ptr->entries->posinsubst = posinsubst; } static void -addWrd( DictThesaurus *d, char *b, char *e, uint16 idsubst, uint16 nwrd, uint16 posinsubst, bool useasis ) { - static int nres=0; - static int ntres = 0; - TheSubstitute *ptr; +addWrd(DictThesaurus * d, char *b, char *e, uint16 idsubst, uint16 nwrd, uint16 posinsubst, bool useasis) +{ + static int nres = 0; + static int ntres = 0; + TheSubstitute *ptr; - if ( nwrd == 0 ) { + if (nwrd == 0) + { nres = ntres = 0; - if ( idsubst <= d->nsubst ) { - if ( d->nsubst == 0 ) { + if (idsubst <= d->nsubst) + { + if (d->nsubst == 0) + { d->nsubst = 16; - d->subst = (TheSubstitute*)malloc(sizeof(TheSubstitute) * d->nsubst); - } else { + d->subst = (TheSubstitute *) malloc(sizeof(TheSubstitute) * d->nsubst); + } + else + { d->nsubst *= 2; - d->subst = (TheSubstitute*)realloc(d->subst, sizeof(TheSubstitute) * d->nsubst); + d->subst = (TheSubstitute *) realloc(d->subst, sizeof(TheSubstitute) * d->nsubst); } if (!d->subst) - elog(ERROR,"Out of memory"); + elog(ERROR, "Out of memory"); } } ptr = d->subst + idsubst; - ptr->lastlexeme = posinsubst-1; + ptr->lastlexeme = posinsubst - 1; - if ( nres+1 >= ntres ) { - if ( ntres == 0 ) { + if (nres + 1 >= ntres) + { + if (ntres == 0) + { ntres = 2; - ptr->res = (TSLexeme*)malloc( sizeof(TSLexeme) * ntres ); - } else { + ptr->res = (TSLexeme *) malloc(sizeof(TSLexeme) * ntres); + } + else + { ntres *= 2; - ptr->res = (TSLexeme*)realloc( ptr->res, sizeof(TSLexeme) * ntres ); + ptr->res = (TSLexeme *) realloc(ptr->res, sizeof(TSLexeme) * ntres); } - if ( !ptr->res ) - elog(ERROR,"Out of memory"); + if (!ptr->res) + elog(ERROR, "Out of memory"); } - if ( (ptr->res[ nres ].lexeme = malloc(e-b+1))==0 ) - elog(ERROR,"Out of memory"); - memcpy(ptr->res[ nres ].lexeme, b, e-b); - ptr->res[ nres ].lexeme[e-b] = '\0'; + if ((ptr->res[nres].lexeme = malloc(e - b + 1)) == 0) + elog(ERROR, "Out of memory"); + memcpy(ptr->res[nres].lexeme, b, e - b); + ptr->res[nres].lexeme[e - b] = '\0'; - ptr->res[ nres ].nvariant = nwrd; - if ( useasis ) - ptr->res[ nres ].flags = DT_USEASIS; + ptr->res[nres].nvariant = nwrd; + if (useasis) + ptr->res[nres].flags = DT_USEASIS; else - ptr->res[ nres ].flags = 0; + ptr->res[nres].flags = 0; - ptr->res[ ++nres ].lexeme = NULL; + ptr->res[++nres].lexeme = NULL; } #define TR_WAITLEX 1 #define TR_INLEX 2 -#define TR_WAITSUBS 3 +#define TR_WAITSUBS 3 #define TR_INSUBS 4 static void -thesaurusRead( char *filename, DictThesaurus *d ) { - FILE *fh; - char str[BUFSIZ]; - int lineno=0; - uint16 idsubst = 0; - bool useasis=false; +thesaurusRead(char *filename, DictThesaurus * d) +{ + FILE *fh; + char str[BUFSIZ]; + int lineno = 0; + uint16 idsubst = 0; + bool useasis = false; fh = fopen(to_absfilename(filename), "r"); if (!fh) - elog(ERROR,"Thesaurus: can't open '%s' file", filename); + elog(ERROR, "Thesaurus: can't open '%s' file", filename); - while( fgets(str, sizeof(str), fh)) { - char *ptr = str; - int state = TR_WAITLEX; - char *beginwrd = NULL; - uint16 posinsubst=0; - uint16 nwrd=0; + while (fgets(str, sizeof(str), fh)) + { + char *ptr = str; + int state = TR_WAITLEX; + char *beginwrd = NULL; + uint16 posinsubst = 0; + uint16 nwrd = 0; lineno++; /* is it comment ? */ - while( t_isspace(ptr) ) + while (t_isspace(ptr)) ptr += pg_mblen(ptr); - if ( t_iseq(str, '#') || *str=='\0' || t_iseq(str, '\n') || t_iseq(str, '\r') ) + if (t_iseq(str, '#') || *str == '\0' || t_iseq(str, '\n') || t_iseq(str, '\r')) continue; pg_verifymbstr(ptr, strlen(ptr), false); - while(*ptr) { - if ( state == TR_WAITLEX ) { - if ( t_iseq(ptr, ':' ) ) { - if ( posinsubst == 0 ) { + while (*ptr) + { + if (state == TR_WAITLEX) + { + if (t_iseq(ptr, ':')) + { + if (posinsubst == 0) + { fclose(fh); elog(ERROR, "Thesaurus: Unexpected delimiter at %d line", lineno); } state = TR_WAITSUBS; - } else if ( !t_isspace(ptr) ) { + } + else if (!t_isspace(ptr)) + { beginwrd = ptr; state = TR_INLEX; } - } else if ( state == TR_INLEX ) { - if ( t_iseq(ptr, ':') ) { - newLexeme( d, beginwrd, ptr, idsubst, posinsubst++ ); + } + else if (state == TR_INLEX) + { + if (t_iseq(ptr, ':')) + { + newLexeme(d, beginwrd, ptr, idsubst, posinsubst++); state = TR_WAITSUBS; - } else if ( t_isspace(ptr) ) { - newLexeme( d, beginwrd, ptr, idsubst, posinsubst++ ); + } + else if (t_isspace(ptr)) + { + newLexeme(d, beginwrd, ptr, idsubst, posinsubst++); state = TR_WAITLEX; } - } else if ( state == TR_WAITSUBS ) { - if ( t_iseq(ptr, '*') ) { + } + else if (state == TR_WAITSUBS) + { + if (t_iseq(ptr, '*')) + { useasis = true; state = TR_INSUBS; beginwrd = ptr + pg_mblen(ptr); - } else if ( t_iseq(ptr, '\\') ) { + } + else if (t_iseq(ptr, '\\')) + { useasis = false; state = TR_INSUBS; beginwrd = ptr + pg_mblen(ptr); - } else if ( !t_isspace(ptr) ) { + } + else if (!t_isspace(ptr)) + { useasis = false; beginwrd = ptr; state = TR_INSUBS; } - } else if ( state == TR_INSUBS ) { - if ( t_isspace(ptr) ) { - if ( ptr == beginwrd ) + } + else if (state == TR_INSUBS) + { + if (t_isspace(ptr)) + { + if (ptr == beginwrd) elog(ERROR, "Thesaurus: Unexpected end of line or lexeme at %d line", lineno); - addWrd( d, beginwrd, ptr, idsubst, nwrd++, posinsubst, useasis ); + addWrd(d, beginwrd, ptr, idsubst, nwrd++, posinsubst, useasis); state = TR_WAITSUBS; } - } else - elog(ERROR,"Thesaurus: Unknown state: %d", state); - + } + else + elog(ERROR, "Thesaurus: Unknown state: %d", state); + ptr += pg_mblen(ptr); } - if ( state == TR_INSUBS ) { - if ( ptr == beginwrd ) + if (state == TR_INSUBS) + { + if (ptr == beginwrd) elog(ERROR, "Thesaurus: Unexpected end of line or lexeme at %d line", lineno); - addWrd( d, beginwrd, ptr, idsubst, nwrd++, posinsubst, useasis ); + addWrd(d, beginwrd, ptr, idsubst, nwrd++, posinsubst, useasis); } idsubst++; - if ( !(nwrd && posinsubst) ) { + if (!(nwrd && posinsubst)) + { fclose(fh); elog(ERROR, "Thesaurus: Unexpected end of line at %d line", lineno); } - + } d->nsubst = idsubst; @@ -251,135 +296,160 @@ thesaurusRead( char *filename, DictThesaurus *d ) { fclose(fh); } -static TheLexeme* -addCompiledLexeme(TheLexeme *newwrds, int *nnw, int *tnm, TSLexeme *lexeme, LexemeInfo* src, uint16 tnvariant) { +static TheLexeme * +addCompiledLexeme(TheLexeme * newwrds, int *nnw, int *tnm, TSLexeme * lexeme, LexemeInfo * src, uint16 tnvariant) +{ - if ( *nnw >= *tnm ) { + if (*nnw >= *tnm) + { *tnm *= 2; - newwrds = (TheLexeme*)realloc( newwrds, sizeof(TheLexeme) * *tnm); + newwrds = (TheLexeme *) realloc(newwrds, sizeof(TheLexeme) * *tnm); if (!newwrds) - elog(ERROR,"Out of memory"); + elog(ERROR, "Out of memory"); } - newwrds[ *nnw ].entries = (LexemeInfo*)malloc( sizeof(LexemeInfo) ); - if (!newwrds[ *nnw ].entries) - elog(ERROR,"Out of memory"); + newwrds[*nnw].entries = (LexemeInfo *) malloc(sizeof(LexemeInfo)); + if (!newwrds[*nnw].entries) + elog(ERROR, "Out of memory"); - if ( lexeme && lexeme->lexeme ) { - newwrds[ *nnw ].lexeme = strdup( lexeme->lexeme ); - if ( !newwrds[ *nnw ].lexeme ) - elog(ERROR,"Out of memory"); + if (lexeme && lexeme->lexeme) + { + newwrds[*nnw].lexeme = strdup(lexeme->lexeme); + if (!newwrds[*nnw].lexeme) + elog(ERROR, "Out of memory"); - newwrds[ *nnw ].entries->tnvariant = tnvariant; - } else { - newwrds[ *nnw ].lexeme = NULL; - newwrds[ *nnw ].entries->tnvariant = 1; + newwrds[*nnw].entries->tnvariant = tnvariant; + } + else + { + newwrds[*nnw].lexeme = NULL; + newwrds[*nnw].entries->tnvariant = 1; } - newwrds[ *nnw ].entries->idsubst = src->idsubst; - newwrds[ *nnw ].entries->posinsubst = src->posinsubst; + newwrds[*nnw].entries->idsubst = src->idsubst; + newwrds[*nnw].entries->posinsubst = src->posinsubst; - newwrds[ *nnw ].entries->nextentry = NULL; + newwrds[*nnw].entries->nextentry = NULL; (*nnw)++; return newwrds; } static int -cmpLexemeInfo(LexemeInfo *a, LexemeInfo *b) { - if ( a==NULL || b==NULL ) +cmpLexemeInfo(LexemeInfo * a, LexemeInfo * b) +{ + if (a == NULL || b == NULL) return 0; - if ( a->idsubst == b->idsubst ) { - if ( a->posinsubst == b->posinsubst ) { - if ( a->tnvariant == b->tnvariant ) - return 0; + if (a->idsubst == b->idsubst) + { + if (a->posinsubst == b->posinsubst) + { + if (a->tnvariant == b->tnvariant) + return 0; - return ( a->tnvariant > b->tnvariant ) ? 1 : -1; + return (a->tnvariant > b->tnvariant) ? 1 : -1; } - return ( a->posinsubst > b->posinsubst ) ? 1 : -1; + return (a->posinsubst > b->posinsubst) ? 1 : -1; } - return ( a->idsubst > b->idsubst ) ? 1 : -1; + return (a->idsubst > b->idsubst) ? 1 : -1; } static int -cmpLexeme(TheLexeme *a, TheLexeme* b) { - if ( a->lexeme == NULL ) { - if ( b->lexeme == NULL ) +cmpLexeme(TheLexeme * a, TheLexeme * b) +{ + if (a->lexeme == NULL) + { + if (b->lexeme == NULL) return 0; else return 1; - } else if ( b->lexeme == NULL ) + } + else if (b->lexeme == NULL) return -1; - return strcmp( a->lexeme, b->lexeme ); + return strcmp(a->lexeme, b->lexeme); } static int -cmpLexemeQ(const void *a, const void *b) { - return cmpLexeme( (TheLexeme*)a, (TheLexeme*)b ); +cmpLexemeQ(const void *a, const void *b) +{ + return cmpLexeme((TheLexeme *) a, (TheLexeme *) b); } -static int cmpTheLexeme(const void *a, const void *b) { - TheLexeme *la = (TheLexeme*)a; - TheLexeme *lb = (TheLexeme*)b; - int res; +static int +cmpTheLexeme(const void *a, const void *b) +{ + TheLexeme *la = (TheLexeme *) a; + TheLexeme *lb = (TheLexeme *) b; + int res; - if ( (res=cmpLexeme(la, lb)) != 0 ) + if ((res = cmpLexeme(la, lb)) != 0) return res; return -cmpLexemeInfo(la->entries, lb->entries); } static void -compileTheLexeme(DictThesaurus *d) { - int i,nnw=0, tnm=16; - TheLexeme *newwrds = (TheLexeme*)malloc(sizeof(TheLexeme)*tnm), *ptrwrds; - - if (!newwrds) - elog(ERROR,"Out of memory"); - - for(i=0;i<d->nwrds;i++) { - TSLexeme *ptr; - - ptr = (TSLexeme*) DatumGetPointer( - FunctionCall4( - &(d->subdict.lexize_info), - PointerGetDatum(d->subdict.dictionary), - PointerGetDatum(d->wrds[i].lexeme), - Int32GetDatum(strlen(d->wrds[i].lexeme)), - PointerGetDatum(NULL) - ) +compileTheLexeme(DictThesaurus * d) +{ + int i, + nnw = 0, + tnm = 16; + TheLexeme *newwrds = (TheLexeme *) malloc(sizeof(TheLexeme) * tnm), + *ptrwrds; + + if (!newwrds) + elog(ERROR, "Out of memory"); + + for (i = 0; i < d->nwrds; i++) + { + TSLexeme *ptr; + + ptr = (TSLexeme *) DatumGetPointer( + FunctionCall4( + &(d->subdict.lexize_info), + PointerGetDatum(d->subdict.dictionary), + PointerGetDatum(d->wrds[i].lexeme), + Int32GetDatum(strlen(d->wrds[i].lexeme)), + PointerGetDatum(NULL) + ) ); - if ( !(ptr && ptr->lexeme) ) { - if ( !ptr ) - elog(ERROR,"Thesaurus: word-sample '%s' isn't recognized by subdictionary (rule %d)", - d->wrds[i].lexeme, d->wrds[i].entries->idsubst+1 ); + if (!(ptr && ptr->lexeme)) + { + if (!ptr) + elog(ERROR, "Thesaurus: word-sample '%s' isn't recognized by subdictionary (rule %d)", + d->wrds[i].lexeme, d->wrds[i].entries->idsubst + 1); else - elog(NOTICE,"Thesaurus: word-sample '%s' is recognized as stop-word, assign any stop-word (rule %d)", - d->wrds[i].lexeme, d->wrds[i].entries->idsubst+1); + elog(NOTICE, "Thesaurus: word-sample '%s' is recognized as stop-word, assign any stop-word (rule %d)", + d->wrds[i].lexeme, d->wrds[i].entries->idsubst + 1); - newwrds = addCompiledLexeme( newwrds, &nnw, &tnm, NULL, d->wrds[i].entries, 0); - } else { - while( ptr->lexeme ) { - TSLexeme *remptr = ptr+1; - int tnvar = 1; - int curvar = ptr->nvariant; + newwrds = addCompiledLexeme(newwrds, &nnw, &tnm, NULL, d->wrds[i].entries, 0); + } + else + { + while (ptr->lexeme) + { + TSLexeme *remptr = ptr + 1; + int tnvar = 1; + int curvar = ptr->nvariant; /* compute n words in one variant */ - while( remptr->lexeme ) { - if ( remptr->nvariant != (remptr-1)->nvariant ) + while (remptr->lexeme) + { + if (remptr->nvariant != (remptr - 1)->nvariant) break; tnvar++; remptr++; } remptr = ptr; - while( remptr->lexeme && remptr->nvariant == curvar ) { - newwrds = addCompiledLexeme( newwrds, &nnw, &tnm, remptr, d->wrds[i].entries, tnvar); + while (remptr->lexeme && remptr->nvariant == curvar) + { + newwrds = addCompiledLexeme(newwrds, &nnw, &tnm, remptr, d->wrds[i].entries, tnvar); remptr++; } @@ -387,32 +457,39 @@ compileTheLexeme(DictThesaurus *d) { } } - free( d->wrds[i].lexeme ); - free( d->wrds[i].entries ); + free(d->wrds[i].lexeme); + free(d->wrds[i].entries); } - free( d->wrds ); + free(d->wrds); d->wrds = newwrds; d->nwrds = nnw; d->ntwrds = tnm; - if ( d->nwrds > 1 ) { - qsort( d->wrds, d->nwrds, sizeof(TheLexeme), cmpTheLexeme ); + if (d->nwrds > 1) + { + qsort(d->wrds, d->nwrds, sizeof(TheLexeme), cmpTheLexeme); /* uniq */ newwrds = d->wrds; ptrwrds = d->wrds + 1; - while( ptrwrds - d->wrds < d->nwrds ) { - if ( cmpLexeme( ptrwrds, newwrds ) == 0 ) { - if ( cmpLexemeInfo(ptrwrds->entries, newwrds->entries) ) { + while (ptrwrds - d->wrds < d->nwrds) + { + if (cmpLexeme(ptrwrds, newwrds) == 0) + { + if (cmpLexemeInfo(ptrwrds->entries, newwrds->entries)) + { ptrwrds->entries->nextentry = newwrds->entries; newwrds->entries = ptrwrds->entries; - } else - free( ptrwrds->entries ); + } + else + free(ptrwrds->entries); - if ( ptrwrds->lexeme ) - free( ptrwrds->lexeme ); - } else { + if (ptrwrds->lexeme) + free(ptrwrds->lexeme); + } + else + { newwrds++; *newwrds = *ptrwrds; } @@ -421,80 +498,97 @@ compileTheLexeme(DictThesaurus *d) { } d->nwrds = newwrds - d->wrds + 1; - d->wrds = (TheLexeme*)realloc( d->wrds, sizeof(TheLexeme) * d->nwrds ); + d->wrds = (TheLexeme *) realloc(d->wrds, sizeof(TheLexeme) * d->nwrds); } } static void -compileTheSubstitute(DictThesaurus *d) { - int i; - - for(i=0;i<d->nsubst;i++) { - TSLexeme *rem = d->subst[i].res, *outptr, *inptr; - int n=2; +compileTheSubstitute(DictThesaurus * d) +{ + int i; - outptr = d->subst[i].res = (TSLexeme*)malloc( sizeof(TSLexeme) * n ); - if ( d->subst[i].res == NULL ) - elog(ERROR,"Out of Memory"); + for (i = 0; i < d->nsubst; i++) + { + TSLexeme *rem = d->subst[i].res, + *outptr, + *inptr; + int n = 2; + + outptr = d->subst[i].res = (TSLexeme *) malloc(sizeof(TSLexeme) * n); + if (d->subst[i].res == NULL) + elog(ERROR, "Out of Memory"); outptr->lexeme = NULL; inptr = rem; - while( inptr && inptr->lexeme ) { - TSLexeme *lexized, tmplex[2]; + while (inptr && inptr->lexeme) + { + TSLexeme *lexized, + tmplex[2]; - if ( inptr->flags & DT_USEASIS ) { /* do not lexize */ + if (inptr->flags & DT_USEASIS) + { /* do not lexize */ tmplex[0] = *inptr; - tmplex[0].flags = 0; + tmplex[0].flags = 0; tmplex[1].lexeme = NULL; - lexized = tmplex; - } else { - lexized = (TSLexeme*) DatumGetPointer( - FunctionCall4( - &(d->subdict.lexize_info), - PointerGetDatum(d->subdict.dictionary), - PointerGetDatum(inptr->lexeme), - Int32GetDatum(strlen(inptr->lexeme)), - PointerGetDatum(NULL) - ) - ); + lexized = tmplex; + } + else + { + lexized = (TSLexeme *) DatumGetPointer( + FunctionCall4( + &(d->subdict.lexize_info), + PointerGetDatum(d->subdict.dictionary), + PointerGetDatum(inptr->lexeme), + Int32GetDatum(strlen(inptr->lexeme)), + PointerGetDatum(NULL) + ) + ); } - if ( lexized && lexized->lexeme ) { - int toset = (lexized->lexeme && outptr != d->subst[i].res ) ? (outptr - d->subst[i].res) : -1; + if (lexized && lexized->lexeme) + { + int toset = (lexized->lexeme && outptr != d->subst[i].res) ? (outptr - d->subst[i].res) : -1; + + while (lexized->lexeme) + { + if (outptr - d->subst[i].res + 1 >= n) + { + int diff = outptr - d->subst[i].res; - while( lexized->lexeme ) { - if ( outptr - d->subst[i].res + 1 >= n ) { - int diff = outptr - d->subst[i].res; n *= 2; - d->subst[i].res = (TSLexeme*)realloc( d->subst[i].res, sizeof(TSLexeme) * n ); - if ( d->subst[i].res == NULL ) - elog(ERROR,"Out of Memory"); + d->subst[i].res = (TSLexeme *) realloc(d->subst[i].res, sizeof(TSLexeme) * n); + if (d->subst[i].res == NULL) + elog(ERROR, "Out of Memory"); outptr = d->subst[i].res + diff; } *outptr = *lexized; - if ( (outptr->lexeme = strdup(lexized->lexeme)) == NULL ) - elog(ERROR,"Out of Memory"); + if ((outptr->lexeme = strdup(lexized->lexeme)) == NULL) + elog(ERROR, "Out of Memory"); outptr++; lexized++; } - if ( toset > 0) + if (toset > 0) d->subst[i].res[toset].flags |= TSL_ADDPOS; - } else if ( lexized ) { - elog(NOTICE,"Thesaurus: word '%s' in substition is a stop-word, ignored (rule %d)", inptr->lexeme, i+1); - } else { - elog(ERROR,"Thesaurus: word '%s' in substition isn't recognized (rule %d)", inptr->lexeme, i+1); + } + else if (lexized) + { + elog(NOTICE, "Thesaurus: word '%s' in substition is a stop-word, ignored (rule %d)", inptr->lexeme, i + 1); + } + else + { + elog(ERROR, "Thesaurus: word '%s' in substition isn't recognized (rule %d)", inptr->lexeme, i + 1); } - if ( inptr->lexeme ) - free( inptr->lexeme ); + if (inptr->lexeme) + free(inptr->lexeme); inptr++; } - if ( outptr == d->subst[i].res ) - elog(ERROR,"Thesaurus: all words in subsitution are stop word (rule %d)", i+1); + if (outptr == d->subst[i].res) + elog(ERROR, "Thesaurus: all words in subsitution are stop word (rule %d)", i + 1); d->subst[i].reslen = outptr - d->subst[i].res; @@ -508,8 +602,9 @@ thesaurus_init(PG_FUNCTION_ARGS) DictThesaurus *d; Map *cfg, *pcfg; - text *in, *subdictname=NULL; - bool fileloaded = false; + text *in, + *subdictname = NULL; + bool fileloaded = false; if (PG_ARGISNULL(0) || PG_GETARG_POINTER(0) == NULL) ereport(ERROR, @@ -539,7 +634,7 @@ thesaurus_init(PG_FUNCTION_ARGS) errmsg("Thesaurus file is already loaded"))); } fileloaded = true; - thesaurusRead( pcfg->value, d ); + thesaurusRead(pcfg->value, d); } else if (pg_strcasecmp("Dictionary", pcfg->key) == 0) { @@ -548,9 +643,9 @@ thesaurus_init(PG_FUNCTION_ARGS) freeDictThesaurus(d); ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("Thesaurus: SubDictionary is already defined"))); + errmsg("Thesaurus: SubDictionary is already defined"))); } - subdictname = char2text( pcfg->value ); + subdictname = char2text(pcfg->value); } else { @@ -571,53 +666,60 @@ thesaurus_init(PG_FUNCTION_ARGS) (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("Thesaurus file isn't defined"))); - if ( subdictname ) { - DictInfo *subdictptr; - /* - * we already in SPI, but name2id_dict()/finddict() - * invoke SPI_connect() + if (subdictname) + { + DictInfo *subdictptr; + + /* + * we already in SPI, but name2id_dict()/finddict() invoke + * SPI_connect() */ - SPI_push(); + SPI_push(); - subdictptr = finddict( name2id_dict( subdictname ) ); + subdictptr = finddict(name2id_dict(subdictname)); SPI_pop(); d->subdict = *subdictptr; - } else + } + else ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("Thesaurus: SubDictionary isn't defined"))); - compileTheLexeme( d ); + compileTheLexeme(d); compileTheSubstitute(d); PG_RETURN_POINTER(d); } -static LexemeInfo* -findTheLexeme(DictThesaurus *d, char * lexeme) { - TheLexeme key = { lexeme, NULL }, *res; +static LexemeInfo * +findTheLexeme(DictThesaurus * d, char *lexeme) +{ + TheLexeme key = {lexeme, NULL}, *res; - if ( d->nwrds == 0 ) + if (d->nwrds == 0) return NULL; res = bsearch(&key, d->wrds, d->nwrds, sizeof(TheLexeme), cmpLexemeQ); - if ( res == NULL ) + if (res == NULL) return NULL; return res->entries; } static bool -matchIdSubst(LexemeInfo *stored, uint16 idsubst) { - bool res = true; +matchIdSubst(LexemeInfo * stored, uint16 idsubst) +{ + bool res = true; - if (stored) { + if (stored) + { res = false; - for(; stored; stored=stored->nextvariant) - if ( stored->idsubst == idsubst ) { + for (; stored; stored = stored->nextvariant) + if (stored->idsubst == idsubst) + { res = true; break; } @@ -626,66 +728,76 @@ matchIdSubst(LexemeInfo *stored, uint16 idsubst) { return res; } -static LexemeInfo* -findVariant( LexemeInfo *in, LexemeInfo *stored, uint16 curpos, LexemeInfo **newin, int newn) { - for(;;) { - int i; +static LexemeInfo * +findVariant(LexemeInfo * in, LexemeInfo * stored, uint16 curpos, LexemeInfo ** newin, int newn) +{ + for (;;) + { + int i; LexemeInfo *ptr = newin[0]; - for(i=0; i<newn; i++) { - while(newin[i] && newin[i]->idsubst < ptr->idsubst) + for (i = 0; i < newn; i++) + { + while (newin[i] && newin[i]->idsubst < ptr->idsubst) newin[i] = newin[i]->nextentry; - if ( newin[i] == NULL ) + if (newin[i] == NULL) return in; - if ( newin[i]->idsubst > ptr->idsubst ) { + if (newin[i]->idsubst > ptr->idsubst) + { ptr = newin[i]; - i=-1; + i = -1; continue; } - while(newin[i]->idsubst == ptr->idsubst) { - if ( newin[i]->posinsubst == curpos && newin[i]->tnvariant == newn ) { + while (newin[i]->idsubst == ptr->idsubst) + { + if (newin[i]->posinsubst == curpos && newin[i]->tnvariant == newn) + { ptr = newin[i]; break; } newin[i] = newin[i]->nextentry; - if ( newin[i] == NULL ) + if (newin[i] == NULL) return in; } - if ( newin[i]->idsubst != ptr->idsubst ) { + if (newin[i]->idsubst != ptr->idsubst) + { ptr = newin[i]; - i=-1; + i = -1; continue; } } - if ( i==newn && matchIdSubst(stored, ptr->idsubst) && (in==NULL || !matchIdSubst(in, ptr->idsubst)) ) { /* found */ + if (i == newn && matchIdSubst(stored, ptr->idsubst) && (in == NULL || !matchIdSubst(in, ptr->idsubst))) + { /* found */ ptr->nextvariant = in; in = ptr; } /* step forward */ - for(i=0; i<newn; i++) + for (i = 0; i < newn; i++) newin[i] = newin[i]->nextentry; } return NULL; } -static TSLexeme* -copyTSLexeme( TheSubstitute *ts ) { - TSLexeme *res; - uint16 i; +static TSLexeme * +copyTSLexeme(TheSubstitute * ts) +{ + TSLexeme *res; + uint16 i; - res = (TSLexeme*)palloc( sizeof(TSLexeme) * (ts->reslen+1) ); - for(i=0;i<ts->reslen;i++) { + res = (TSLexeme *) palloc(sizeof(TSLexeme) * (ts->reslen + 1)); + for (i = 0; i < ts->reslen; i++) + { res[i] = ts->res[i]; - res[i].lexeme = pstrdup( ts->res[i].lexeme ); + res[i].lexeme = pstrdup(ts->res[i].lexeme); } res[ts->reslen].lexeme = NULL; @@ -693,15 +805,17 @@ copyTSLexeme( TheSubstitute *ts ) { return res; } -static TSLexeme* -checkMatch(DictThesaurus *d, LexemeInfo *info, uint16 curpos, bool *moreres) { +static TSLexeme * +checkMatch(DictThesaurus * d, LexemeInfo * info, uint16 curpos, bool *moreres) +{ *moreres = false; - while(info) { - Assert( info->idsubst < d->nsubst ); - if ( info->nextvariant ) + while (info) + { + Assert(info->idsubst < d->nsubst); + if (info->nextvariant) *moreres = true; - if ( d->subst[ info->idsubst ].lastlexeme == curpos ) - return copyTSLexeme( d->subst + info->idsubst ); + if (d->subst[info->idsubst].lastlexeme == curpos) + return copyTSLexeme(d->subst + info->idsubst); info = info->nextvariant; } @@ -712,79 +826,93 @@ Datum thesaurus_lexize(PG_FUNCTION_ARGS) { DictThesaurus *d = (DictThesaurus *) PG_GETARG_POINTER(0); - DictSubState *dstate = (DictSubState*)PG_GETARG_POINTER(3); - TSLexeme *res=NULL; - LexemeInfo *stored, *info = NULL; - uint16 curpos = 0; - bool moreres = false; + DictSubState *dstate = (DictSubState *) PG_GETARG_POINTER(3); + TSLexeme *res = NULL; + LexemeInfo *stored, + *info = NULL; + uint16 curpos = 0; + bool moreres = false; - if ( dstate == NULL || PG_NARGS() < 4 ) - elog(ERROR,"Forbidden call of thesaurus or nested call"); + if (dstate == NULL || PG_NARGS() < 4) + elog(ERROR, "Forbidden call of thesaurus or nested call"); - if ( dstate->isend ) + if (dstate->isend) PG_RETURN_POINTER(NULL); - stored = (LexemeInfo*) dstate->private; - - if (stored) - curpos = stored->posinsubst+1; - - res =(TSLexeme*) DatumGetPointer ( - FunctionCall4( - &(d->subdict.lexize_info), - PointerGetDatum(d->subdict.dictionary), - PG_GETARG_DATUM(1), - PG_GETARG_INT32(2), - PointerGetDatum(NULL) - ) - ); - - if ( res && res->lexeme ) { - TSLexeme *ptr = res , *basevar; + stored = (LexemeInfo *) dstate->private; + + if (stored) + curpos = stored->posinsubst + 1; + + res = (TSLexeme *) DatumGetPointer( + FunctionCall4( + &(d->subdict.lexize_info), + PointerGetDatum(d->subdict.dictionary), + PG_GETARG_DATUM(1), + PG_GETARG_INT32(2), + PointerGetDatum(NULL) + ) + ); + + if (res && res->lexeme) + { + TSLexeme *ptr = res, + *basevar; - while( ptr->lexeme ) { + while (ptr->lexeme) + { uint16 nv = ptr->nvariant; - uint16 i,nlex = 0; - LexemeInfo **infos; + uint16 i, + nlex = 0; + LexemeInfo **infos; basevar = ptr; - while( ptr->lexeme && nv == ptr->nvariant ) { + while (ptr->lexeme && nv == ptr->nvariant) + { nlex++; ptr++; } - infos = (LexemeInfo**)palloc(sizeof(LexemeInfo*)*nlex); - for(i=0;i<nlex;i++) - if ( (infos[i] = findTheLexeme(d, basevar[i].lexeme)) == NULL ) + infos = (LexemeInfo **) palloc(sizeof(LexemeInfo *) * nlex); + for (i = 0; i < nlex; i++) + if ((infos[i] = findTheLexeme(d, basevar[i].lexeme)) == NULL) break; - if ( i<nlex ) { + if (i < nlex) + { /* no chance to find */ - pfree( infos ); + pfree(infos); continue; } - info = findVariant( info, stored, curpos, infos, nlex); + info = findVariant(info, stored, curpos, infos, nlex); } - } else if ( res ) { /* stop-word */ - LexemeInfo *infos = findTheLexeme(d, NULL); - info = findVariant( NULL, stored, curpos, &infos, 1); - } else { - info = NULL; /* word isn't recognized */ } + else if (res) + { /* stop-word */ + LexemeInfo *infos = findTheLexeme(d, NULL); - dstate->private = (void*)info; + info = findVariant(NULL, stored, curpos, &infos, 1); + } + else + { + info = NULL; /* word isn't recognized */ + } + + dstate->private = (void *) info; - if ( !info ) { + if (!info) + { dstate->getnext = false; PG_RETURN_POINTER(NULL); } - - if ( (res=checkMatch(d, info, curpos,&moreres)) != NULL ) { + + if ((res = checkMatch(d, info, curpos, &moreres)) != NULL) + { dstate->getnext = moreres; PG_RETURN_POINTER(res); } dstate->getnext = true; - PG_RETURN_POINTER(NULL); + PG_RETURN_POINTER(NULL); } diff --git a/contrib/tsearch2/ginidx.c b/contrib/tsearch2/ginidx.c index 4ba3fc62a04..c1bb173e1ce 100644 --- a/contrib/tsearch2/ginidx.c +++ b/contrib/tsearch2/ginidx.c @@ -15,29 +15,32 @@ #include "query_cleanup.h" PG_FUNCTION_INFO_V1(gin_extract_tsvector); -Datum gin_extract_tsvector(PG_FUNCTION_ARGS); +Datum gin_extract_tsvector(PG_FUNCTION_ARGS); Datum -gin_extract_tsvector(PG_FUNCTION_ARGS) { - tsvector *vector = (tsvector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - uint32 *nentries = (uint32*)PG_GETARG_POINTER(1); - Datum *entries = NULL; +gin_extract_tsvector(PG_FUNCTION_ARGS) +{ + tsvector *vector = (tsvector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + uint32 *nentries = (uint32 *) PG_GETARG_POINTER(1); + Datum *entries = NULL; *nentries = 0; - if ( vector->size > 0 ) { - int i; - WordEntry *we = ARRPTR( vector ); + if (vector->size > 0) + { + int i; + WordEntry *we = ARRPTR(vector); - *nentries = (uint32)vector->size; - entries = (Datum*)palloc( sizeof(Datum) * vector->size ); + *nentries = (uint32) vector->size; + entries = (Datum *) palloc(sizeof(Datum) * vector->size); - for(i=0;i<vector->size;i++) { - text *txt = (text*)palloc( VARHDRSZ + we->len ); + for (i = 0; i < vector->size; i++) + { + text *txt = (text *) palloc(VARHDRSZ + we->len); - VARATT_SIZEP(txt) = VARHDRSZ + we->len; - memcpy( VARDATA(txt), STRPTR( vector ) + we->pos, we->len ); + VARATT_SIZEP(txt) = VARHDRSZ + we->len; + memcpy(VARDATA(txt), STRPTR(vector) + we->pos, we->len); - entries[i] = PointerGetDatum( txt ); + entries[i] = PointerGetDatum(txt); we++; } @@ -49,45 +52,50 @@ gin_extract_tsvector(PG_FUNCTION_ARGS) { PG_FUNCTION_INFO_V1(gin_extract_tsquery); -Datum gin_extract_tsquery(PG_FUNCTION_ARGS); +Datum gin_extract_tsquery(PG_FUNCTION_ARGS); Datum -gin_extract_tsquery(PG_FUNCTION_ARGS) { - QUERYTYPE *query = (QUERYTYPE*) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - uint32 *nentries = (uint32*)PG_GETARG_POINTER(1); - StrategyNumber strategy = DatumGetUInt16( PG_GETARG_DATUM(2) ); - Datum *entries = NULL; +gin_extract_tsquery(PG_FUNCTION_ARGS) +{ + QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + uint32 *nentries = (uint32 *) PG_GETARG_POINTER(1); + StrategyNumber strategy = DatumGetUInt16(PG_GETARG_DATUM(2)); + Datum *entries = NULL; *nentries = 0; - if ( query->size > 0 ) { - int4 i, j=0, len; - ITEM *item; + if (query->size > 0) + { + int4 i, + j = 0, + len; + ITEM *item; item = clean_NOT_v2(GETQUERY(query), &len); - if ( !item ) - elog(ERROR,"Query requires full scan, GIN doesn't support it"); + if (!item) + elog(ERROR, "Query requires full scan, GIN doesn't support it"); item = GETQUERY(query); - for(i=0; i<query->size; i++) - if ( item[i].type == VAL ) + for (i = 0; i < query->size; i++) + if (item[i].type == VAL) (*nentries)++; - entries = (Datum*)palloc( sizeof(Datum) * (*nentries) ); + entries = (Datum *) palloc(sizeof(Datum) * (*nentries)); - for(i=0; i<query->size; i++) - if ( item[i].type == VAL ) { - text *txt; + for (i = 0; i < query->size; i++) + if (item[i].type == VAL) + { + text *txt; - txt = (text*)palloc( VARHDRSZ + item[i].length ); + txt = (text *) palloc(VARHDRSZ + item[i].length); - VARATT_SIZEP(txt) = VARHDRSZ + item[i].length; - memcpy( VARDATA(txt), GETOPERAND( query ) + item[i].distance, item[i].length ); + VARATT_SIZEP(txt) = VARHDRSZ + item[i].length; + memcpy(VARDATA(txt), GETOPERAND(query) + item[i].distance, item[i].length); - entries[j++] = PointerGetDatum( txt ); + entries[j++] = PointerGetDatum(txt); - if ( strategy == 1 && item[i].weight != 0 ) - elog(ERROR,"With class of lexeme restrictions use @@@ operation"); + if (strategy == 1 && item[i].weight != 0) + elog(ERROR, "With class of lexeme restrictions use @@@ operation"); } } @@ -96,51 +104,54 @@ gin_extract_tsquery(PG_FUNCTION_ARGS) { PG_RETURN_POINTER(entries); } -typedef struct { - ITEM *frst; - bool *mapped_check; -} GinChkVal; +typedef struct +{ + ITEM *frst; + bool *mapped_check; +} GinChkVal; static bool -checkcondition_gin(void *checkval, ITEM * val) { - GinChkVal *gcv = (GinChkVal*)checkval; +checkcondition_gin(void *checkval, ITEM * val) +{ + GinChkVal *gcv = (GinChkVal *) checkval; - return gcv->mapped_check[ val - gcv->frst ]; + return gcv->mapped_check[val - gcv->frst]; } PG_FUNCTION_INFO_V1(gin_ts_consistent); -Datum gin_ts_consistent(PG_FUNCTION_ARGS); +Datum gin_ts_consistent(PG_FUNCTION_ARGS); Datum -gin_ts_consistent(PG_FUNCTION_ARGS) { - bool *check = (bool*)PG_GETARG_POINTER(0); - QUERYTYPE *query = (QUERYTYPE*) PG_DETOAST_DATUM(PG_GETARG_DATUM(2)); - bool res = FALSE; - - if ( query->size > 0 ) { - int4 i, j=0; - ITEM *item; +gin_ts_consistent(PG_FUNCTION_ARGS) +{ + bool *check = (bool *) PG_GETARG_POINTER(0); + QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM(PG_GETARG_DATUM(2)); + bool res = FALSE; + + if (query->size > 0) + { + int4 i, + j = 0; + ITEM *item; GinChkVal gcv; - gcv.frst = item = GETQUERY(query); - gcv.mapped_check= (bool*)palloc( sizeof(bool) * query->size ); + gcv.frst = item = GETQUERY(query); + gcv.mapped_check = (bool *) palloc(sizeof(bool) * query->size); - for(i=0; i<query->size; i++) - if ( item[i].type == VAL ) - gcv.mapped_check[ i ] = check[ j++ ]; + for (i = 0; i < query->size; i++) + if (item[i].type == VAL) + gcv.mapped_check[i] = check[j++]; res = TS_execute( - GETQUERY(query), - &gcv, - true, - checkcondition_gin - ); + GETQUERY(query), + &gcv, + true, + checkcondition_gin + ); } PG_FREE_IF_COPY(query, 2); PG_RETURN_BOOL(res); } - - diff --git a/contrib/tsearch2/gistidx.c b/contrib/tsearch2/gistidx.c index 5afb1a41b3b..a4d9b2312ed 100644 --- a/contrib/tsearch2/gistidx.c +++ b/contrib/tsearch2/gistidx.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.14 2006/06/28 12:00:06 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.15 2006/10/04 00:29:46 momjian Exp $ */ #include "postgres.h" @@ -447,7 +447,7 @@ sizebitvec(BITVECP sign) i; LOOPBYTE( - size += number_of_ones[(unsigned char) sign[i]]; + size += number_of_ones[(unsigned char) sign[i]]; ); return size; } @@ -460,8 +460,8 @@ hemdistsign(BITVECP a, BITVECP b) dist = 0; LOOPBYTE( - diff = (unsigned char) (a[i] ^ b[i]); - dist += number_of_ones[diff]; + diff = (unsigned char) (a[i] ^ b[i]); + dist += number_of_ones[diff]; ); return dist; } @@ -533,7 +533,7 @@ typedef struct { OffsetNumber pos; int4 cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) diff --git a/contrib/tsearch2/ispell/regis.c b/contrib/tsearch2/ispell/regis.c index 4be863431d1..904521e5078 100644 --- a/contrib/tsearch2/ispell/regis.c +++ b/contrib/tsearch2/ispell/regis.c @@ -9,7 +9,7 @@ RS_isRegis(const char *str) { if (t_isalpha(str) || t_iseq(str, '[') || - t_iseq(str,']') || + t_iseq(str, ']') || t_iseq(str, '^')) str += pg_mblen(str); else @@ -42,13 +42,13 @@ RS_compile(Regis * r, bool issuffix, char *str) { int len = strlen(str); int state = RS_IN_WAIT; - char *c = (char*)str; + char *c = (char *) str; RegisNode *ptr = NULL; memset(r, 0, sizeof(Regis)); r->issuffix = (issuffix) ? 1 : 0; - while(*c) + while (*c) { if (state == RS_IN_WAIT) { @@ -62,7 +62,7 @@ RS_compile(Regis * r, bool issuffix, char *str) ptr->type = RSF_ONEOF; ptr->len = pg_mblen(c); } - else if (t_iseq(c,'[')) + else if (t_iseq(c, '[')) { if (ptr) ptr = newRegisNode(ptr, len); @@ -72,11 +72,11 @@ RS_compile(Regis * r, bool issuffix, char *str) state = RS_IN_ONEOF; } else - ts_error(ERROR, "Error in regis: %s", str ); + ts_error(ERROR, "Error in regis: %s", str); } else if (state == RS_IN_ONEOF) { - if (t_iseq(c,'^')) + if (t_iseq(c, '^')) { ptr->type = RSF_NONEOF; state = RS_IN_NONEOF; @@ -94,10 +94,10 @@ RS_compile(Regis * r, bool issuffix, char *str) { if (t_isalpha(c)) { - COPYCHAR(ptr->data+ptr->len, c); - ptr->len+=pg_mblen(c); + COPYCHAR(ptr->data + ptr->len, c); + ptr->len += pg_mblen(c); } - else if (t_iseq(c,']')) + else if (t_iseq(c, ']')) state = RS_IN_WAIT; else ts_error(ERROR, "Error in regis: %s", str); @@ -133,28 +133,34 @@ RS_free(Regis * r) #ifdef TS_USE_WIDE static bool -mb_strchr(char *str, char *c) { - int clen = pg_mblen(c), plen,i; - char *ptr =str; - bool res=false; +mb_strchr(char *str, char *c) +{ + int clen = pg_mblen(c), + plen, + i; + char *ptr = str; + bool res = false; clen = pg_mblen(c); - while( *ptr && !res) { + while (*ptr && !res) + { plen = pg_mblen(ptr); - if ( plen == clen ) { - i=plen; + if (plen == clen) + { + i = plen; res = true; - while(i--) - if ( *(ptr+i) != *(c+i) ) { + while (i--) + if (*(ptr + i) != *(c + i)) + { res = false; - break; + break; } } - + ptr += plen; - } + } - return res; + return res; } #else #define mb_strchr(s,c) ( (strchr((s),*(c)) == NULL) ? false : true ) @@ -165,21 +171,23 @@ bool RS_execute(Regis * r, char *str) { RegisNode *ptr = r->node; - char *c = str; - int len=0; + char *c = str; + int len = 0; - while(*c) { + while (*c) + { len++; c += pg_mblen(c); - } + } if (len < r->nchar) return 0; c = str; - if (r->issuffix) { + if (r->issuffix) + { len -= r->nchar; - while(len-- > 0) + while (len-- > 0) c += pg_mblen(c); } @@ -189,18 +197,18 @@ RS_execute(Regis * r, char *str) switch (ptr->type) { case RSF_ONEOF: - if ( mb_strchr((char *) ptr->data, c) != true ) + if (mb_strchr((char *) ptr->data, c) != true) return false; break; case RSF_NONEOF: - if ( mb_strchr((char *) ptr->data, c) == true ) + if (mb_strchr((char *) ptr->data, c) == true) return false; break; default: ts_error(ERROR, "RS_execute: Unknown type node: %d\n", ptr->type); } ptr = ptr->next; - c+=pg_mblen(c); + c += pg_mblen(c); } return true; diff --git a/contrib/tsearch2/ispell/regis.h b/contrib/tsearch2/ispell/regis.h index 5bc337c9251..a0b840b0a0d 100644 --- a/contrib/tsearch2/ispell/regis.h +++ b/contrib/tsearch2/ispell/regis.h @@ -27,12 +27,12 @@ typedef struct Regis unused:15; } Regis; -bool RS_isRegis(const char *str); +bool RS_isRegis(const char *str); -void RS_compile(Regis * r, bool issuffix, char *str); +void RS_compile(Regis * r, bool issuffix, char *str); void RS_free(Regis * r); /*returns true if matches */ -bool RS_execute(Regis * r, char *str); +bool RS_execute(Regis * r, char *str); #endif diff --git a/contrib/tsearch2/ispell/spell.c b/contrib/tsearch2/ispell/spell.c index 4e199f4bc07..9e4d689cd41 100644 --- a/contrib/tsearch2/ispell/spell.c +++ b/contrib/tsearch2/ispell/spell.c @@ -41,16 +41,18 @@ strnduplicate(char *s, int len) } static char * -findchar(char *str, int c) { - while( *str ) { - if ( t_iseq(str, c) ) +findchar(char *str, int c) +{ + while (*str) + { + if (t_iseq(str, c)) return str; - str+=pg_mblen(str); + str += pg_mblen(str); } return NULL; } - + /* backward string compare for suffix tree operations */ static int @@ -126,16 +128,16 @@ NIAddSpell(IspellDict * Conf, const char *word, const char *flag) if (Conf->mspell) { Conf->mspell += 1024 * 20; - Conf->Spell = (SPELL **) repalloc(Conf->Spell, Conf->mspell * sizeof(SPELL*)); + Conf->Spell = (SPELL **) repalloc(Conf->Spell, Conf->mspell * sizeof(SPELL *)); } else { Conf->mspell = 1024 * 20; - Conf->Spell = (SPELL **) palloc(Conf->mspell * sizeof(SPELL*)); + Conf->Spell = (SPELL **) palloc(Conf->mspell * sizeof(SPELL *)); } } - Conf->Spell[Conf->nspell] = (SPELL*)palloc(SPELLHDRSZ + strlen(word) + 1); - strcpy( Conf->Spell[Conf->nspell]->word ,word ); + Conf->Spell[Conf->nspell] = (SPELL *) palloc(SPELLHDRSZ + strlen(word) + 1); + strcpy(Conf->Spell[Conf->nspell]->word, word); strncpy(Conf->Spell[Conf->nspell]->p.flag, flag, 16); Conf->nspell++; return (0); @@ -155,7 +157,7 @@ NIImportDictionary(IspellDict * Conf, const char *filename) char *s; const char *flag; - pg_verifymbstr( str, strlen(str), false); + pg_verifymbstr(str, strlen(str), false); flag = NULL; if ((s = findchar(str, '/'))) @@ -181,11 +183,12 @@ NIImportDictionary(IspellDict * Conf, const char *filename) s = str; while (*s) { - if (t_isspace(s)) { + if (t_isspace(s)) + { *s = '\0'; break; } - s+=pg_mblen(s); + s += pg_mblen(s); } lowerstr(str); @@ -268,12 +271,13 @@ NIAddAffix(IspellDict * Conf, int flag, char flagflags, const char *mask, const } else { - int masklen = strlen(mask); + int masklen = strlen(mask); + Conf->Affix[Conf->naffixes].issimple = 0; Conf->Affix[Conf->naffixes].isregis = 0; Conf->Affix[Conf->naffixes].mask = (char *) malloc(masklen + 2); - if (type == FF_SUFFIX) - sprintf(Conf->Affix[Conf->naffixes].mask, "%s$", mask); + if (type == FF_SUFFIX) + sprintf(Conf->Affix[Conf->naffixes].mask, "%s$", mask); else sprintf(Conf->Affix[Conf->naffixes].mask, "^%s", mask); } @@ -286,83 +290,121 @@ NIAddAffix(IspellDict * Conf, int flag, char flagflags, const char *mask, const Conf->Affix[Conf->naffixes].find = (find && *find) ? strdup(find) : VoidString; MEMOUT(Conf->Affix[Conf->naffixes].find); - if ( (Conf->Affix[Conf->naffixes].replen = strlen(repl)) > 0 ) { + if ((Conf->Affix[Conf->naffixes].replen = strlen(repl)) > 0) + { Conf->Affix[Conf->naffixes].repl = strdup(repl); MEMOUT(Conf->Affix[Conf->naffixes].repl); - } else - Conf->Affix[Conf->naffixes].repl = VoidString; + } + else + Conf->Affix[Conf->naffixes].repl = VoidString; Conf->naffixes++; return (0); } #define PAE_WAIT_MASK 0 -#define PAE_INMASK 1 -#define PAE_WAIT_FIND 2 -#define PAE_INFIND 3 -#define PAE_WAIT_REPL 4 -#define PAE_INREPL 5 +#define PAE_INMASK 1 +#define PAE_WAIT_FIND 2 +#define PAE_INFIND 3 +#define PAE_WAIT_REPL 4 +#define PAE_INREPL 5 static bool -parse_affentry( char *str, char *mask, char *find, char *repl, int line ) { - int state = PAE_WAIT_MASK; - char *pmask=mask, *pfind=find, *prepl=repl; +parse_affentry(char *str, char *mask, char *find, char *repl, int line) +{ + int state = PAE_WAIT_MASK; + char *pmask = mask, + *pfind = find, + *prepl = repl; *mask = *find = *repl = '\0'; - while(*str) { - if ( state == PAE_WAIT_MASK ) { - if ( t_iseq(str,'#') ) + while (*str) + { + if (state == PAE_WAIT_MASK) + { + if (t_iseq(str, '#')) return false; - else if (!t_isspace(str)) { + else if (!t_isspace(str)) + { COPYCHAR(pmask, str); pmask += pg_mblen(str); state = PAE_INMASK; } - } else if ( state == PAE_INMASK ) { - if ( t_iseq(str,'>') ) { - *pmask='\0'; + } + else if (state == PAE_INMASK) + { + if (t_iseq(str, '>')) + { + *pmask = '\0'; state = PAE_WAIT_FIND; - } else if (!t_isspace(str)) { + } + else if (!t_isspace(str)) + { COPYCHAR(pmask, str); pmask += pg_mblen(str); } - } else if ( state == PAE_WAIT_FIND ) { - if ( t_iseq(str,'-') ) { + } + else if (state == PAE_WAIT_FIND) + { + if (t_iseq(str, '-')) + { state = PAE_INFIND; - } else if (t_isalpha(str) || t_iseq(str,'\'') /* english 's */) { - COPYCHAR(prepl,str); + } + else if (t_isalpha(str) || t_iseq(str, '\'') /* english 's */ ) + { + COPYCHAR(prepl, str); prepl += pg_mblen(str); state = PAE_INREPL; - } else if (!t_isspace(str)) + } + else if (!t_isspace(str)) ts_error(ERROR, "Affix parse error at %d line", line); - } else if ( state == PAE_INFIND ) { - if ( t_iseq(str,',') ) { - *pfind='\0'; + } + else if (state == PAE_INFIND) + { + if (t_iseq(str, ',')) + { + *pfind = '\0'; state = PAE_WAIT_REPL; - } else if (t_isalpha(str)) { - COPYCHAR(pfind,str); + } + else if (t_isalpha(str)) + { + COPYCHAR(pfind, str); pfind += pg_mblen(str); - } else if (!t_isspace(str)) + } + else if (!t_isspace(str)) ts_error(ERROR, "Affix parse error at %d line", line); - } else if ( state == PAE_WAIT_REPL ) { - if ( t_iseq(str,'-') ) { - break; /* void repl */ - } else if ( t_isalpha(str) ) { - COPYCHAR(prepl,str); + } + else if (state == PAE_WAIT_REPL) + { + if (t_iseq(str, '-')) + { + break; /* void repl */ + } + else if (t_isalpha(str)) + { + COPYCHAR(prepl, str); prepl += pg_mblen(str); state = PAE_INREPL; - } else if (!t_isspace(str)) + } + else if (!t_isspace(str)) ts_error(ERROR, "Affix parse error at %d line", line); - } else if ( state == PAE_INREPL ) { - if ( t_iseq(str,'#') ) { + } + else if (state == PAE_INREPL) + { + if (t_iseq(str, '#')) + { *prepl = '\0'; break; - } else if ( t_isalpha(str) ) { - COPYCHAR(prepl,str); + } + else if (t_isalpha(str)) + { + COPYCHAR(prepl, str); prepl += pg_mblen(str); - } else if (!t_isspace(str)) + } + else if (!t_isspace(str)) ts_error(ERROR, "Affix parse error at %d line", line); - } else + } + else ts_error(ERROR, "Unknown state in parse_affentry: %d", state); str += pg_mblen(str); @@ -370,8 +412,8 @@ parse_affentry( char *str, char *mask, char *find, char *repl, int line ) { *pmask = *pfind = *prepl = '\0'; - return ( *mask && ( *find || *repl) ) ? true : false; -} + return (*mask && (*find || *repl)) ? true : false; +} int NIImportAffixes(IspellDict * Conf, const char *filename) @@ -387,8 +429,8 @@ NIImportAffixes(IspellDict * Conf, const char *filename) int flag = 0; char flagflags = 0; FILE *affix; - int line=0; - int oldformat = 0; + int line = 0; + int oldformat = 0; if (!(affix = fopen(filename, "r"))) return (1); @@ -397,18 +439,20 @@ NIImportAffixes(IspellDict * Conf, const char *filename) while (fgets(str, sizeof(str), affix)) { line++; - pg_verifymbstr( str, strlen(str), false); - memcpy(tmpstr, str, 32); /* compoundwords... */ - tmpstr[32]='\0'; + pg_verifymbstr(str, strlen(str), false); + memcpy(tmpstr, str, 32); /* compoundwords... */ + tmpstr[32] = '\0'; lowerstr(tmpstr); if (STRNCMP(tmpstr, "compoundwords") == 0) { s = findchar(str, 'l'); if (s) { - while (*s && !t_isspace(s)) s++; - while (*s && t_isspace(s)) s++; - if ( *s && pg_mblen(s) == 1 ) + while (*s && !t_isspace(s)) + s++; + while (*s && t_isspace(s)) + s++; + if (*s && pg_mblen(s) == 1) Conf->compoundcontrol = *s; oldformat++; continue; @@ -433,12 +477,13 @@ NIImportAffixes(IspellDict * Conf, const char *filename) s = str + 4; flagflags = 0; - while (*s && t_isspace(s)) s++; + while (*s && t_isspace(s)) + s++; oldformat++; /* allow only single-encoded flags */ - if ( pg_mblen(s) != 1 ) - elog(ERROR,"Multiencoded flag at line %d: %s", line, s); + if (pg_mblen(s) != 1) + elog(ERROR, "Multiencoded flag at line %d: %s", line, s); if (*s == '*') { @@ -455,29 +500,31 @@ NIImportAffixes(IspellDict * Conf, const char *filename) s++; /* allow only single-encoded flags */ - if ( pg_mblen(s) != 1 ) { + if (pg_mblen(s) != 1) + { flagflags = 0; - elog(ERROR,"Multiencoded flag at line %d: %s", line, s); + elog(ERROR, "Multiencoded flag at line %d: %s", line, s); } flag = (unsigned char) *s; continue; } - if ( STRNCMP(str, "COMPOUNDFLAG") == 0 || STRNCMP(str, "COMPOUNDMIN") == 0 || - STRNCMP(str, "PFX")==0 || STRNCMP(str, "SFX")==0 ) { + if (STRNCMP(str, "COMPOUNDFLAG") == 0 || STRNCMP(str, "COMPOUNDMIN") == 0 || + STRNCMP(str, "PFX") == 0 || STRNCMP(str, "SFX") == 0) + { - if ( oldformat ) - elog(ERROR,"Wrong affix file format"); + if (oldformat) + elog(ERROR, "Wrong affix file format"); fclose(affix); return NIImportOOAffixes(Conf, filename); - + } if ((!suffixes) && (!prefixes)) continue; lowerstr(str); - if ( !parse_affentry(str, mask, find, repl, line) ) + if (!parse_affentry(str, mask, find, repl, line)) continue; NIAddAffix(Conf, flag, flagflags, mask, find, repl, suffixes ? FF_SUFFIX : FF_PREFIX); @@ -488,7 +535,8 @@ NIImportAffixes(IspellDict * Conf, const char *filename) } int -NIImportOOAffixes(IspellDict * Conf, const char *filename) { +NIImportOOAffixes(IspellDict * Conf, const char *filename) +{ char str[BUFSIZ]; char type[BUFSIZ]; char sflag[BUFSIZ]; @@ -499,11 +547,11 @@ NIImportOOAffixes(IspellDict * Conf, const char *filename) { int flag = 0; char flagflags = 0; FILE *affix; - int line=0; - int scanread = 0; + int line = 0; + int scanread = 0; char scanbuf[BUFSIZ]; - sprintf(scanbuf,"%%6s %%%ds %%%ds %%%ds %%%ds", BUFSIZ/5, BUFSIZ/5, BUFSIZ/5, BUFSIZ/5); + sprintf(scanbuf, "%%6s %%%ds %%%ds %%%ds %%%ds", BUFSIZ / 5, BUFSIZ / 5, BUFSIZ / 5, BUFSIZ / 5); if (!(affix = fopen(filename, "r"))) return (1); @@ -512,14 +560,17 @@ NIImportOOAffixes(IspellDict * Conf, const char *filename) { while (fgets(str, sizeof(str), affix)) { line++; - if ( *str == '\0' || t_isspace(str) || t_iseq(str,'#') ) + if (*str == '\0' || t_isspace(str) || t_iseq(str, '#')) continue; - pg_verifymbstr( str, strlen(str), false); + pg_verifymbstr(str, strlen(str), false); - if ( STRNCMP(str, "COMPOUNDFLAG")==0 ) { - char *s = str+strlen("COMPOUNDFLAG"); - while (*s && t_isspace(s)) s++; - if ( *s && pg_mblen(s) == 1 ) + if (STRNCMP(str, "COMPOUNDFLAG") == 0) + { + char *s = str + strlen("COMPOUNDFLAG"); + + while (*s && t_isspace(s)) + s++; + if (*s && pg_mblen(s) == 1) Conf->compoundcontrol = *s; continue; } @@ -527,28 +578,31 @@ NIImportOOAffixes(IspellDict * Conf, const char *filename) { scanread = sscanf(str, scanbuf, type, sflag, find, repl, mask); lowerstr(type); - if ( scanread<4 || (STRNCMP(type,"sfx") && STRNCMP(type,"pfx")) ) + if (scanread < 4 || (STRNCMP(type, "sfx") && STRNCMP(type, "pfx"))) continue; - if ( scanread == 4 ) { - if ( strlen(sflag) != 1 ) + if (scanread == 4) + { + if (strlen(sflag) != 1) continue; flag = *sflag; - isSuffix = (STRNCMP(type,"sfx")==0) ? true : false; + isSuffix = (STRNCMP(type, "sfx") == 0) ? true : false; lowerstr(find); - if ( t_iseq(find,'y') ) + if (t_iseq(find, 'y')) flagflags |= FF_CROSSPRODUCT; else flagflags = 0; - } else { - if ( strlen(sflag) != 1 || flag != *sflag || flag==0 ) + } + else + { + if (strlen(sflag) != 1 || flag != *sflag || flag == 0) continue; lowerstr(repl); lowerstr(find); lowerstr(mask); - if ( t_iseq(find,'0') ) + if (t_iseq(find, '0')) *find = '\0'; - if ( t_iseq(repl,'0') ) + if (t_iseq(repl, '0')) *repl = '\0'; NIAddAffix(Conf, flag, flagflags, mask, find, repl, isSuffix ? FF_SUFFIX : FF_PREFIX); @@ -658,7 +712,7 @@ NISortDictionary(IspellDict * Conf) int naffix = 3; /* compress affixes */ - qsort((void *) Conf->Spell, Conf->nspell, sizeof(SPELL*), cmpspellaffix); + qsort((void *) Conf->Spell, Conf->nspell, sizeof(SPELL *), cmpspellaffix); for (i = 1; i < Conf->nspell; i++) if (strcmp(Conf->Spell[i]->p.flag, Conf->Spell[i - 1]->p.flag)) naffix++; @@ -685,7 +739,7 @@ NISortDictionary(IspellDict * Conf) Conf->Spell[i]->p.d.len = strlen(Conf->Spell[i]->word); } - qsort((void *) Conf->Spell, Conf->nspell, sizeof(SPELL*), cmpspell); + qsort((void *) Conf->Spell, Conf->nspell, sizeof(SPELL *), cmpspell); Conf->Dictionary = mkSPNode(Conf, 0, Conf->nspell, 0); for (i = 0; i < Conf->nspell; i++) @@ -806,7 +860,7 @@ NISortAffixes(IspellDict * Conf) CMPDAffix *ptr; int firstsuffix = -1; - if (Conf->naffixes==0) + if (Conf->naffixes == 0) return; if (Conf->naffixes > 1) @@ -822,7 +876,7 @@ NISortAffixes(IspellDict * Conf) { if (firstsuffix < 0) firstsuffix = i; - if ((Affix->flagflags & FF_COMPOUNDONLYAFX) && Affix->replen>0 ) + if ((Affix->flagflags & FF_COMPOUNDONLYAFX) && Affix->replen > 0) { if (ptr == Conf->CompoundAffix || strbncmp((const unsigned char *) (ptr - 1)->affix, @@ -907,14 +961,16 @@ CheckAffix(const char *word, size_t len, AFFIX * Affix, char flagflags, char *ne { strcpy(newword, word); strcpy(newword + len - Affix->replen, Affix->find); - if ( baselen ) /* store length of non-changed part of word */ + if (baselen) /* store length of non-changed part of word */ *baselen = len - Affix->replen; } else { - /* if prefix is a all non-chaged part's length then all word contains only prefix and suffix, - so out */ - if ( baselen && *baselen + strlen(Affix->find) <= Affix->replen ) + /* + * if prefix is a all non-chaged part's length then all word contains + * only prefix and suffix, so out + */ + if (baselen && *baselen + strlen(Affix->find) <= Affix->replen) return NULL; strcpy(newword, Affix->find); strcat(newword, word + Affix->replen); @@ -944,6 +1000,7 @@ CheckAffix(const char *word, size_t len, AFFIX * Affix, char flagflags, char *ne int wmasklen, masklen = strlen(Affix->mask); pg_wchar *mask; + mask = (pg_wchar *) palloc((masklen + 1) * sizeof(pg_wchar)); wmasklen = pg_mb2wchar_with_len(Affix->mask, mask, masklen); @@ -1040,7 +1097,7 @@ NormalizeSubWord(IspellDict * Conf, char *word, char flag) */ while (snode) { - int baselen=0; + int baselen = 0; /* find possible suffix */ suffix = FinfAffixes(snode, word, wrdlen, &slevel, FF_SUFFIX); @@ -1111,7 +1168,8 @@ typedef struct SplitVar static int CheckCompoundAffixes(CMPDAffix ** ptr, char *word, int len, bool CheckInPlace) { - if ( CheckInPlace ) { + if (CheckInPlace) + { while ((*ptr)->affix) { if (len > (*ptr)->len && strncmp((*ptr)->affix, word, (*ptr)->len) == 0) @@ -1122,13 +1180,16 @@ CheckCompoundAffixes(CMPDAffix ** ptr, char *word, int len, bool CheckInPlace) } (*ptr)++; } - } else { - char *affbegin; + } + else + { + char *affbegin; + while ((*ptr)->affix) { if (len > (*ptr)->len && (affbegin = strstr(word, (*ptr)->affix)) != NULL) { - len = (*ptr)->len + (affbegin-word); + len = (*ptr)->len + (affbegin - word); (*ptr)++; return len; } @@ -1227,8 +1288,8 @@ SplitToVariants(IspellDict * Conf, SPNode * snode, SplitVar * orig, char *word, } } - if ( !node ) - break; + if (!node) + break; StopLow = node->data; StopHigh = node->data + node->length; @@ -1243,7 +1304,8 @@ SplitToVariants(IspellDict * Conf, SPNode * snode, SplitVar * orig, char *word, StopHigh = StopMiddle; } - if (StopLow < StopHigh) { + if (StopLow < StopHigh) + { /* find infinitive */ if (StopMiddle->isword && StopMiddle->compoundallow && notprobed[level]) @@ -1264,7 +1326,7 @@ SplitToVariants(IspellDict * Conf, SPNode * snode, SplitVar * orig, char *word, { /* then we will search more big word at the same point */ SplitVar *ptr = var; - + while (ptr->next) ptr = ptr->next; ptr->next = SplitToVariants(Conf, node, var, word, wordlen, startpos, level); @@ -1279,8 +1341,9 @@ SplitToVariants(IspellDict * Conf, SPNode * snode, SplitVar * orig, char *word, } } node = StopMiddle->node; - } else - node = NULL; + } + else + node = NULL; level++; } @@ -1436,9 +1499,12 @@ NIFree(IspellDict * Conf) else pg_regfree(&(Affix[i].reg.regex)); } - if ( Affix[i].mask != VoidString ) free(Affix[i].mask); - if ( Affix[i].find != VoidString ) free(Affix[i].find); - if ( Affix[i].repl != VoidString ) free(Affix[i].repl); + if (Affix[i].mask != VoidString) + free(Affix[i].mask); + if (Affix[i].find != VoidString) + free(Affix[i].find); + if (Affix[i].repl != VoidString) + free(Affix[i].repl); } if (Conf->Spell) { diff --git a/contrib/tsearch2/ispell/spell.h b/contrib/tsearch2/ispell/spell.h index 5734881947e..50a5947680e 100644 --- a/contrib/tsearch2/ispell/spell.h +++ b/contrib/tsearch2/ispell/spell.h @@ -42,8 +42,8 @@ typedef struct spell_struct int affix; int len; } d; - } p; - char word[1]; + } p; + char word[1]; } SPELL; #define SPELLHDRSZ (offsetof(SPELL, word)) @@ -110,7 +110,7 @@ typedef struct int nspell; int mspell; - SPELL **Spell; + SPELL **Spell; AffixNode *Suffix; AffixNode *Prefix; diff --git a/contrib/tsearch2/prs_dcfg.c b/contrib/tsearch2/prs_dcfg.c index 42fd6712e6d..c519f5f3d4d 100644 --- a/contrib/tsearch2/prs_dcfg.c +++ b/contrib/tsearch2/prs_dcfg.c @@ -33,9 +33,9 @@ nstrdup(char *ptr, int len) { if (t_iseq(ptr, '\\')) ptr++; - COPYCHAR( cptr, ptr ); - cptr+=pg_mblen(ptr); - ptr+=pg_mblen(ptr); + COPYCHAR(cptr, ptr); + cptr += pg_mblen(ptr); + ptr += pg_mblen(ptr); } *cptr = '\0'; @@ -53,9 +53,9 @@ parse_cfgdict(text *in, Map ** m) while (ptr - VARDATA(in) < VARSIZE(in) - VARHDRSZ) { - if ( t_iseq(ptr, ',') ) + if (t_iseq(ptr, ',')) num++; - ptr+=pg_mblen(ptr); + ptr += pg_mblen(ptr); } *m = mptr = (Map *) palloc(sizeof(Map) * (num + 2)); @@ -84,7 +84,7 @@ parse_cfgdict(text *in, Map ** m) mptr->key = nstrdup(begin, ptr - begin); state = CS_WAITEQ; } - else if (t_iseq(ptr,'=')) + else if (t_iseq(ptr, '=')) { mptr->key = nstrdup(begin, ptr - begin); state = CS_WAITVALUE; @@ -163,7 +163,7 @@ parse_cfgdict(text *in, Map ** m) errmsg("bad parser state"), errdetail("%d at position %d.", state, (int) (ptr - VARDATA(in))))); - ptr+=pg_mblen(ptr); + ptr += pg_mblen(ptr); } if (state == CS_IN2VALUE) diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c index 6aeff0078d1..c325e453d4f 100644 --- a/contrib/tsearch2/query.c +++ b/contrib/tsearch2/query.c @@ -108,11 +108,11 @@ get_weight(char *buf, int2 *weight) { *weight = 0; - if ( !t_iseq(buf, ':') ) + if (!t_iseq(buf, ':')) return buf; buf++; - while ( *buf && pg_mblen(buf) == 1 ) + while (*buf && pg_mblen(buf) == 1) { switch (*buf) { @@ -153,25 +153,26 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 { case WAITFIRSTOPERAND: case WAITOPERAND: - if ( t_iseq(state->buf, '!') ) + if (t_iseq(state->buf, '!')) { - (state->buf)++; /* can safely ++, t_iseq guarantee that pg_mblen()==1 */ + (state->buf)++; /* can safely ++, t_iseq guarantee + * that pg_mblen()==1 */ *val = (int4) '!'; return OPR; } - else if ( t_iseq(state->buf, '(') ) + else if (t_iseq(state->buf, '(')) { state->count++; (state->buf)++; return OPEN; } - else if ( t_iseq(state->buf, ':') ) + else if (t_iseq(state->buf, ':')) { ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("error at start of operand"))); } - else if ( !t_isspace(state->buf) ) + else if (!t_isspace(state->buf)) { state->valstate.prsbuf = state->buf; if (gettoken_tsvector(&(state->valstate))) @@ -191,14 +192,14 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 } break; case WAITOPERATOR: - if ( t_iseq(state->buf, '&') || t_iseq(state->buf, '|') ) + if (t_iseq(state->buf, '&') || t_iseq(state->buf, '|')) { state->state = WAITOPERAND; *val = (int4) *(state->buf); (state->buf)++; return OPR; } - else if ( t_iseq(state->buf, ')') ) + else if (t_iseq(state->buf, ')')) { (state->buf)++; state->count--; @@ -206,7 +207,7 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 } else if (*(state->buf) == '\0') return (state->count) ? ERR : END; - else if ( !t_isspace(state->buf) ) + else if (!t_isspace(state->buf)) return ERR; break; case WAITSINGLEOPERAND: @@ -221,7 +222,7 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 return ERR; break; } - state->buf+=pg_mblen(state->buf); + state->buf += pg_mblen(state->buf); } return END; } @@ -604,7 +605,7 @@ findoprnd(ITEM * ptr, int4 *pos) * input */ static QUERYTYPE * -queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain) + queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain) { QPRS_STATE state; int4 i; @@ -701,8 +702,9 @@ queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int c Datum tsquery_in(PG_FUNCTION_ARGS) { - char * in = (char*)PG_GETARG_POINTER(0); - pg_verifymbstr( in, strlen(in), false); + char *in = (char *) PG_GETARG_POINTER(0); + + pg_verifymbstr(in, strlen(in), false); SET_FUNCOID(); PG_RETURN_POINTER(queryin((char *) in, pushval_asis, 0, false)); @@ -739,23 +741,23 @@ infix(INFIX * in, bool first) if (in->curpol->type == VAL) { char *op = in->op + in->curpol->distance; - int clen; + int clen; - RESIZEBUF(in, in->curpol->length * (pg_database_encoding_max_length()+1) + 2 + 5); + RESIZEBUF(in, in->curpol->length * (pg_database_encoding_max_length() + 1) + 2 + 5); *(in->cur) = '\''; in->cur++; while (*op) { - if ( t_iseq(op, '\'') ) + if (t_iseq(op, '\'')) { *(in->cur) = '\''; in->cur++; } - COPYCHAR(in->cur,op); + COPYCHAR(in->cur, op); clen = pg_mblen(op); - op+=clen; - in->cur+=clen; + op += clen; + in->cur += clen; } *(in->cur) = '\''; in->cur++; diff --git a/contrib/tsearch2/query.h b/contrib/tsearch2/query.h index bf1fe18c33a..b4d586a684b 100644 --- a/contrib/tsearch2/query.h +++ b/contrib/tsearch2/query.h @@ -48,7 +48,7 @@ typedef struct #define CLOSE 5 #define VALSTOP 6 /* for stop words */ -bool TS_execute(ITEM *curitem, void *checkval, - bool calcnot, bool (*chkcond) (void *checkval, ITEM *val)); +bool TS_execute(ITEM * curitem, void *checkval, + bool calcnot, bool (*chkcond) (void *checkval, ITEM * val)); #endif diff --git a/contrib/tsearch2/query_cleanup.h b/contrib/tsearch2/query_cleanup.h index f6ce893609c..5879f644e64 100644 --- a/contrib/tsearch2/query_cleanup.h +++ b/contrib/tsearch2/query_cleanup.h @@ -3,7 +3,7 @@ #include "query.h" -ITEM *clean_NOT_v2(ITEM *ptr, int4 *len); -ITEM *clean_fakeval_v2(ITEM *ptr, int4 *len); +ITEM *clean_NOT_v2(ITEM * ptr, int4 *len); +ITEM *clean_fakeval_v2(ITEM * ptr, int4 *len); #endif diff --git a/contrib/tsearch2/query_gist.c b/contrib/tsearch2/query_gist.c index ffa765560d9..aafb6901092 100644 --- a/contrib/tsearch2/query_gist.c +++ b/contrib/tsearch2/query_gist.c @@ -29,7 +29,7 @@ makesign(QUERYTYPE * a) for (i = 0; i < a->size; i++) { if (ptr->type == VAL) - sign |= ((TPQTGist)1) << (ptr->val % SIGLEN); + sign |= ((TPQTGist) 1) << (ptr->val % SIGLEN); ptr++; } @@ -104,7 +104,7 @@ tsq_mcontained(PG_FUNCTION_ARGS) PG_GETARG_DATUM(1), PG_GETARG_DATUM(0) ) - ); + ); } PG_FUNCTION_INFO_V1(gtsq_in); @@ -272,7 +272,7 @@ typedef struct { OffsetNumber pos; int4 cost; -} SPLITCOST; +} SPLITCOST; static int comparecost(const void *a, const void *b) diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index 7ffa62051f5..41e633580d5 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -41,13 +41,13 @@ static float weights[] = {0.1, 0.2, 0.4, 1.0}; #define wpos(wep) ( w[ WEP_GETWEIGHT(wep) ] ) -#define RANK_NO_NORM 0x00 -#define RANK_NORM_LOGLENGTH 0x01 -#define RANK_NORM_LENGTH 0x02 -#define RANK_NORM_EXTDIST 0x04 +#define RANK_NO_NORM 0x00 +#define RANK_NORM_LOGLENGTH 0x01 +#define RANK_NORM_LENGTH 0x02 +#define RANK_NORM_EXTDIST 0x04 #define RANK_NORM_UNIQ 0x08 #define RANK_NORM_LOGUNIQ 0x10 -#define DEF_NORM_METHOD RANK_NO_NORM +#define DEF_NORM_METHOD RANK_NO_NORM static float calc_rank_or(float *w, tsvector * t, QUERYTYPE * q); static float calc_rank_and(float *w, tsvector * t, QUERYTYPE * q); @@ -334,19 +334,20 @@ calc_rank(float *w, tsvector * t, QUERYTYPE * q, int4 method) if (res < 0) res = 1e-20; - if ( (method & RANK_NORM_LOGLENGTH) && t->size>0 ) + if ((method & RANK_NORM_LOGLENGTH) && t->size > 0) res /= log((double) (cnt_length(t) + 1)) / log(2.0); - if ( method & RANK_NORM_LENGTH ) { + if (method & RANK_NORM_LENGTH) + { len = cnt_length(t); - if ( len>0 ) + if (len > 0) res /= (float) len; } - if ( (method & RANK_NORM_UNIQ) && t->size > 0 ) - res /= (float)( t->size ); + if ((method & RANK_NORM_UNIQ) && t->size > 0) + res /= (float) (t->size); - if ( (method & RANK_NORM_LOGUNIQ) && t->size > 0 ) + if ((method & RANK_NORM_LOGUNIQ) && t->size > 0) res /= log((double) (t->size + 1)) / log(2.0); return res; @@ -457,17 +458,18 @@ reset_istrue_flag(QUERYTYPE * query) } } -typedef struct { - int pos; - int p; - int q; - DocRepresentation *begin; - DocRepresentation *end; -} Extention; +typedef struct +{ + int pos; + int p; + int q; + DocRepresentation *begin; + DocRepresentation *end; +} Extention; static bool -Cover(DocRepresentation * doc, int len, QUERYTYPE * query, Extention *ext) +Cover(DocRepresentation * doc, int len, QUERYTYPE * query, Extention * ext) { DocRepresentation *ptr; int lastpos = ext->pos; @@ -513,7 +515,8 @@ Cover(DocRepresentation * doc, int len, QUERYTYPE * query, Extention *ext) ptr->item[i]->istrue = 1; if (TS_execute(GETQUERY(query), NULL, true, checkcondition_ITEM)) { - if (ptr->pos < ext->p) { + if (ptr->pos < ext->p) + { ext->begin = ptr; ext->p = ptr->pos; } @@ -629,69 +632,77 @@ get_docrep(tsvector * txt, QUERYTYPE * query, int *doclen) } static float4 -calc_rank_cd(float4 *arrdata, tsvector *txt, QUERYTYPE *query, int method) { +calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method) +{ DocRepresentation *doc; - int len, + int len, i, doclen = 0; Extention ext; double Wdoc = 0.0; double invws[lengthof(weights)]; - double SumDist=0.0, PrevExtPos=0.0, CurExtPos=0.0; - int NExtent=0; + double SumDist = 0.0, + PrevExtPos = 0.0, + CurExtPos = 0.0; + int NExtent = 0; for (i = 0; i < lengthof(weights); i++) { - invws[i] = ((double)((arrdata[i] >= 0) ? arrdata[i] : weights[i])); + invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : weights[i])); if (invws[i] > 1.0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("weight out of range"))); - invws[i] = 1.0/invws[i]; + invws[i] = 1.0 / invws[i]; } doc = get_docrep(txt, query, &doclen); - if (!doc) + if (!doc) return 0.0; - MemSet( &ext, 0, sizeof(Extention) ); - while (Cover(doc, doclen, query, &ext)) { - double Cpos = 0.0; - double InvSum = 0.0; + MemSet(&ext, 0, sizeof(Extention)); + while (Cover(doc, doclen, query, &ext)) + { + double Cpos = 0.0; + double InvSum = 0.0; DocRepresentation *ptr = ext.begin; - while ( ptr<=ext.end ) { - InvSum += invws[ ptr->wclass ]; + while (ptr <= ext.end) + { + InvSum += invws[ptr->wclass]; ptr++; } - Cpos = ((double)( ext.end-ext.begin+1 )) / InvSum; - Wdoc += Cpos / ( (double)(( 1 + (ext.q - ext.p) - (ext.end - ext.begin) )) ); + Cpos = ((double) (ext.end - ext.begin + 1)) / InvSum; + Wdoc += Cpos / ((double) ((1 + (ext.q - ext.p) - (ext.end - ext.begin)))); - CurExtPos = ((double)(ext.q + ext.p))/2.0; - if ( NExtent>0 && CurExtPos > PrevExtPos /* prevent devision by zero in a case of multiple lexize */ ) - SumDist += 1.0/( CurExtPos - PrevExtPos ); + CurExtPos = ((double) (ext.q + ext.p)) / 2.0; + if (NExtent > 0 && CurExtPos > PrevExtPos /* prevent devision by + * zero in a case of + multiple lexize */ ) + SumDist += 1.0 / (CurExtPos - PrevExtPos); PrevExtPos = CurExtPos; - NExtent++; + NExtent++; } - if ( (method & RANK_NORM_LOGLENGTH) && txt->size > 0 ) + if ((method & RANK_NORM_LOGLENGTH) && txt->size > 0) Wdoc /= log((double) (cnt_length(txt) + 1)); - if ( method & RANK_NORM_LENGTH ) { + if (method & RANK_NORM_LENGTH) + { len = cnt_length(txt); - if ( len>0 ) + if (len > 0) Wdoc /= (double) len; } - if ( (method & RANK_NORM_EXTDIST) && SumDist > 0 ) - Wdoc /= ((double)NExtent) / SumDist; + if ((method & RANK_NORM_EXTDIST) && SumDist > 0) + Wdoc /= ((double) NExtent) / SumDist; - if ( (method & RANK_NORM_UNIQ) && txt->size > 0 ) - Wdoc /= (double)( txt->size ); + if ((method & RANK_NORM_UNIQ) && txt->size > 0) + Wdoc /= (double) (txt->size); - if ( (method & RANK_NORM_LOGUNIQ) && txt->size > 0 ) + if ((method & RANK_NORM_LOGUNIQ) && txt->size > 0) Wdoc /= log((double) (txt->size + 1)) / log(2.0); for (i = 0; i < doclen; i++) @@ -699,13 +710,13 @@ calc_rank_cd(float4 *arrdata, tsvector *txt, QUERYTYPE *query, int method) { pfree(doc[i].item); pfree(doc); - return (float4)Wdoc; -} + return (float4) Wdoc; +} Datum rank_cd(PG_FUNCTION_ARGS) { - ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); tsvector *txt = (tsvector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(2)); int method = DEF_NORM_METHOD; @@ -729,7 +740,7 @@ rank_cd(PG_FUNCTION_ARGS) if (PG_NARGS() == 4) method = PG_GETARG_INT32(3); - res = calc_rank_cd( (float4 *) ARR_DATA_PTR(win), txt, query, method); + res = calc_rank_cd((float4 *) ARR_DATA_PTR(win), txt, query, method); PG_FREE_IF_COPY(win, 0); PG_FREE_IF_COPY(txt, 1); @@ -744,10 +755,10 @@ rank_cd_def(PG_FUNCTION_ARGS) { tsvector *txt = (tsvector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)); - float4 res; + float4 res; + + res = calc_rank_cd(weights, txt, query, (PG_NARGS() == 3) ? PG_GETARG_DATUM(2) : DEF_NORM_METHOD); - res = calc_rank_cd( weights, txt, query, (PG_NARGS() == 3) ? PG_GETARG_DATUM(2) : DEF_NORM_METHOD); - PG_FREE_IF_COPY(txt, 0); PG_FREE_IF_COPY(query, 1); @@ -791,7 +802,7 @@ get_covers(PG_FUNCTION_ARGS) text *out; char *cptr; DocRepresentation *doc; - int olddwpos = 0; + int olddwpos = 0; int ncover = 1; Extention ext; @@ -833,7 +844,7 @@ get_covers(PG_FUNCTION_ARGS) } qsort((void *) dw, dlen, sizeof(DocWord), compareDocWord); - MemSet( &ext, 0, sizeof(Extention) ); + MemSet(&ext, 0, sizeof(Extention)); while (Cover(doc, rlen, query, &ext)) { dwptr = dw + olddwpos; diff --git a/contrib/tsearch2/snowball/russian_stem_UTF8.c b/contrib/tsearch2/snowball/russian_stem_UTF8.c index 99f84db7907..994ff267cab 100644 --- a/contrib/tsearch2/snowball/russian_stem_UTF8.c +++ b/contrib/tsearch2/snowball/russian_stem_UTF8.c @@ -3,707 +3,940 @@ #include "header.h" -extern int russian_UTF_8_stem(struct SN_env * z); -static int r_tidy_up(struct SN_env * z); -static int r_derivational(struct SN_env * z); -static int r_noun(struct SN_env * z); -static int r_verb(struct SN_env * z); -static int r_reflexive(struct SN_env * z); -static int r_adjectival(struct SN_env * z); -static int r_adjective(struct SN_env * z); -static int r_perfective_gerund(struct SN_env * z); -static int r_R2(struct SN_env * z); -static int r_mark_regions(struct SN_env * z); - -extern struct SN_env * russian_UTF_8_create_env(void); +extern int russian_UTF_8_stem(struct SN_env * z); +static int r_tidy_up(struct SN_env * z); +static int r_derivational(struct SN_env * z); +static int r_noun(struct SN_env * z); +static int r_verb(struct SN_env * z); +static int r_reflexive(struct SN_env * z); +static int r_adjectival(struct SN_env * z); +static int r_adjective(struct SN_env * z); +static int r_perfective_gerund(struct SN_env * z); +static int r_R2(struct SN_env * z); +static int r_mark_regions(struct SN_env * z); + +extern struct SN_env *russian_UTF_8_create_env(void); extern void russian_UTF_8_close_env(struct SN_env * z); -static symbol s_0_0[10] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; -static symbol s_0_1[12] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; -static symbol s_0_2[12] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C }; -static symbol s_0_3[2] = { 0xD0, 0xB2 }; -static symbol s_0_4[4] = { 0xD1, 0x8B, 0xD0, 0xB2 }; -static symbol s_0_5[4] = { 0xD0, 0xB8, 0xD0, 0xB2 }; -static symbol s_0_6[6] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; -static symbol s_0_7[8] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; -static symbol s_0_8[8] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 }; +static symbol s_0_0[10] = {0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C}; +static symbol s_0_1[12] = {0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C}; +static symbol s_0_2[12] = {0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C}; +static symbol s_0_3[2] = {0xD0, 0xB2}; +static symbol s_0_4[4] = {0xD1, 0x8B, 0xD0, 0xB2}; +static symbol s_0_5[4] = {0xD0, 0xB8, 0xD0, 0xB2}; +static symbol s_0_6[6] = {0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8}; +static symbol s_0_7[8] = {0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8}; +static symbol s_0_8[8] = {0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8}; static struct among a_0[9] = { -/* 0 */ { 10, s_0_0, -1, 1, 0}, -/* 1 */ { 12, s_0_1, 0, 2, 0}, -/* 2 */ { 12, s_0_2, 0, 2, 0}, -/* 3 */ { 2, s_0_3, -1, 1, 0}, -/* 4 */ { 4, s_0_4, 3, 2, 0}, -/* 5 */ { 4, s_0_5, 3, 2, 0}, -/* 6 */ { 6, s_0_6, -1, 1, 0}, -/* 7 */ { 8, s_0_7, 6, 2, 0}, -/* 8 */ { 8, s_0_8, 6, 2, 0} + /* 0 */ {10, s_0_0, -1, 1, 0}, + /* 1 */ {12, s_0_1, 0, 2, 0}, + /* 2 */ {12, s_0_2, 0, 2, 0}, + /* 3 */ {2, s_0_3, -1, 1, 0}, + /* 4 */ {4, s_0_4, 3, 2, 0}, + /* 5 */ {4, s_0_5, 3, 2, 0}, + /* 6 */ {6, s_0_6, -1, 1, 0}, + /* 7 */ {8, s_0_7, 6, 2, 0}, + /* 8 */ {8, s_0_8, 6, 2, 0} }; -static symbol s_1_0[6] = { 0xD0, 0xB5, 0xD0, 0xBC, 0xD1, 0x83 }; -static symbol s_1_1[6] = { 0xD0, 0xBE, 0xD0, 0xBC, 0xD1, 0x83 }; -static symbol s_1_2[4] = { 0xD1, 0x8B, 0xD1, 0x85 }; -static symbol s_1_3[4] = { 0xD0, 0xB8, 0xD1, 0x85 }; -static symbol s_1_4[4] = { 0xD1, 0x83, 0xD1, 0x8E }; -static symbol s_1_5[4] = { 0xD1, 0x8E, 0xD1, 0x8E }; -static symbol s_1_6[4] = { 0xD0, 0xB5, 0xD1, 0x8E }; -static symbol s_1_7[4] = { 0xD0, 0xBE, 0xD1, 0x8E }; -static symbol s_1_8[4] = { 0xD1, 0x8F, 0xD1, 0x8F }; -static symbol s_1_9[4] = { 0xD0, 0xB0, 0xD1, 0x8F }; -static symbol s_1_10[4] = { 0xD1, 0x8B, 0xD0, 0xB5 }; -static symbol s_1_11[4] = { 0xD0, 0xB5, 0xD0, 0xB5 }; -static symbol s_1_12[4] = { 0xD0, 0xB8, 0xD0, 0xB5 }; -static symbol s_1_13[4] = { 0xD0, 0xBE, 0xD0, 0xB5 }; -static symbol s_1_14[6] = { 0xD1, 0x8B, 0xD0, 0xBC, 0xD0, 0xB8 }; -static symbol s_1_15[6] = { 0xD0, 0xB8, 0xD0, 0xBC, 0xD0, 0xB8 }; -static symbol s_1_16[4] = { 0xD1, 0x8B, 0xD0, 0xB9 }; -static symbol s_1_17[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; -static symbol s_1_18[4] = { 0xD0, 0xB8, 0xD0, 0xB9 }; -static symbol s_1_19[4] = { 0xD0, 0xBE, 0xD0, 0xB9 }; -static symbol s_1_20[4] = { 0xD1, 0x8B, 0xD0, 0xBC }; -static symbol s_1_21[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; -static symbol s_1_22[4] = { 0xD0, 0xB8, 0xD0, 0xBC }; -static symbol s_1_23[4] = { 0xD0, 0xBE, 0xD0, 0xBC }; -static symbol s_1_24[6] = { 0xD0, 0xB5, 0xD0, 0xB3, 0xD0, 0xBE }; -static symbol s_1_25[6] = { 0xD0, 0xBE, 0xD0, 0xB3, 0xD0, 0xBE }; +static symbol s_1_0[6] = {0xD0, 0xB5, 0xD0, 0xBC, 0xD1, 0x83}; +static symbol s_1_1[6] = {0xD0, 0xBE, 0xD0, 0xBC, 0xD1, 0x83}; +static symbol s_1_2[4] = {0xD1, 0x8B, 0xD1, 0x85}; +static symbol s_1_3[4] = {0xD0, 0xB8, 0xD1, 0x85}; +static symbol s_1_4[4] = {0xD1, 0x83, 0xD1, 0x8E}; +static symbol s_1_5[4] = {0xD1, 0x8E, 0xD1, 0x8E}; +static symbol s_1_6[4] = {0xD0, 0xB5, 0xD1, 0x8E}; +static symbol s_1_7[4] = {0xD0, 0xBE, 0xD1, 0x8E}; +static symbol s_1_8[4] = {0xD1, 0x8F, 0xD1, 0x8F}; +static symbol s_1_9[4] = {0xD0, 0xB0, 0xD1, 0x8F}; +static symbol s_1_10[4] = {0xD1, 0x8B, 0xD0, 0xB5}; +static symbol s_1_11[4] = {0xD0, 0xB5, 0xD0, 0xB5}; +static symbol s_1_12[4] = {0xD0, 0xB8, 0xD0, 0xB5}; +static symbol s_1_13[4] = {0xD0, 0xBE, 0xD0, 0xB5}; +static symbol s_1_14[6] = {0xD1, 0x8B, 0xD0, 0xBC, 0xD0, 0xB8}; +static symbol s_1_15[6] = {0xD0, 0xB8, 0xD0, 0xBC, 0xD0, 0xB8}; +static symbol s_1_16[4] = {0xD1, 0x8B, 0xD0, 0xB9}; +static symbol s_1_17[4] = {0xD0, 0xB5, 0xD0, 0xB9}; +static symbol s_1_18[4] = {0xD0, 0xB8, 0xD0, 0xB9}; +static symbol s_1_19[4] = {0xD0, 0xBE, 0xD0, 0xB9}; +static symbol s_1_20[4] = {0xD1, 0x8B, 0xD0, 0xBC}; +static symbol s_1_21[4] = {0xD0, 0xB5, 0xD0, 0xBC}; +static symbol s_1_22[4] = {0xD0, 0xB8, 0xD0, 0xBC}; +static symbol s_1_23[4] = {0xD0, 0xBE, 0xD0, 0xBC}; +static symbol s_1_24[6] = {0xD0, 0xB5, 0xD0, 0xB3, 0xD0, 0xBE}; +static symbol s_1_25[6] = {0xD0, 0xBE, 0xD0, 0xB3, 0xD0, 0xBE}; static struct among a_1[26] = { -/* 0 */ { 6, s_1_0, -1, 1, 0}, -/* 1 */ { 6, s_1_1, -1, 1, 0}, -/* 2 */ { 4, s_1_2, -1, 1, 0}, -/* 3 */ { 4, s_1_3, -1, 1, 0}, -/* 4 */ { 4, s_1_4, -1, 1, 0}, -/* 5 */ { 4, s_1_5, -1, 1, 0}, -/* 6 */ { 4, s_1_6, -1, 1, 0}, -/* 7 */ { 4, s_1_7, -1, 1, 0}, -/* 8 */ { 4, s_1_8, -1, 1, 0}, -/* 9 */ { 4, s_1_9, -1, 1, 0}, -/* 10 */ { 4, s_1_10, -1, 1, 0}, -/* 11 */ { 4, s_1_11, -1, 1, 0}, -/* 12 */ { 4, s_1_12, -1, 1, 0}, -/* 13 */ { 4, s_1_13, -1, 1, 0}, -/* 14 */ { 6, s_1_14, -1, 1, 0}, -/* 15 */ { 6, s_1_15, -1, 1, 0}, -/* 16 */ { 4, s_1_16, -1, 1, 0}, -/* 17 */ { 4, s_1_17, -1, 1, 0}, -/* 18 */ { 4, s_1_18, -1, 1, 0}, -/* 19 */ { 4, s_1_19, -1, 1, 0}, -/* 20 */ { 4, s_1_20, -1, 1, 0}, -/* 21 */ { 4, s_1_21, -1, 1, 0}, -/* 22 */ { 4, s_1_22, -1, 1, 0}, -/* 23 */ { 4, s_1_23, -1, 1, 0}, -/* 24 */ { 6, s_1_24, -1, 1, 0}, -/* 25 */ { 6, s_1_25, -1, 1, 0} + /* 0 */ {6, s_1_0, -1, 1, 0}, + /* 1 */ {6, s_1_1, -1, 1, 0}, + /* 2 */ {4, s_1_2, -1, 1, 0}, + /* 3 */ {4, s_1_3, -1, 1, 0}, + /* 4 */ {4, s_1_4, -1, 1, 0}, + /* 5 */ {4, s_1_5, -1, 1, 0}, + /* 6 */ {4, s_1_6, -1, 1, 0}, + /* 7 */ {4, s_1_7, -1, 1, 0}, + /* 8 */ {4, s_1_8, -1, 1, 0}, + /* 9 */ {4, s_1_9, -1, 1, 0}, + /* 10 */ {4, s_1_10, -1, 1, 0}, + /* 11 */ {4, s_1_11, -1, 1, 0}, + /* 12 */ {4, s_1_12, -1, 1, 0}, + /* 13 */ {4, s_1_13, -1, 1, 0}, + /* 14 */ {6, s_1_14, -1, 1, 0}, + /* 15 */ {6, s_1_15, -1, 1, 0}, + /* 16 */ {4, s_1_16, -1, 1, 0}, + /* 17 */ {4, s_1_17, -1, 1, 0}, + /* 18 */ {4, s_1_18, -1, 1, 0}, + /* 19 */ {4, s_1_19, -1, 1, 0}, + /* 20 */ {4, s_1_20, -1, 1, 0}, + /* 21 */ {4, s_1_21, -1, 1, 0}, + /* 22 */ {4, s_1_22, -1, 1, 0}, + /* 23 */ {4, s_1_23, -1, 1, 0}, + /* 24 */ {6, s_1_24, -1, 1, 0}, + /* 25 */ {6, s_1_25, -1, 1, 0} }; -static symbol s_2_0[4] = { 0xD0, 0xB2, 0xD1, 0x88 }; -static symbol s_2_1[6] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88 }; -static symbol s_2_2[6] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88 }; -static symbol s_2_3[2] = { 0xD1, 0x89 }; -static symbol s_2_4[4] = { 0xD1, 0x8E, 0xD1, 0x89 }; -static symbol s_2_5[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x89 }; -static symbol s_2_6[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; -static symbol s_2_7[4] = { 0xD0, 0xBD, 0xD0, 0xBD }; +static symbol s_2_0[4] = {0xD0, 0xB2, 0xD1, 0x88}; +static symbol s_2_1[6] = {0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88}; +static symbol s_2_2[6] = {0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88}; +static symbol s_2_3[2] = {0xD1, 0x89}; +static symbol s_2_4[4] = {0xD1, 0x8E, 0xD1, 0x89}; +static symbol s_2_5[6] = {0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x89}; +static symbol s_2_6[4] = {0xD0, 0xB5, 0xD0, 0xBC}; +static symbol s_2_7[4] = {0xD0, 0xBD, 0xD0, 0xBD}; static struct among a_2[8] = { -/* 0 */ { 4, s_2_0, -1, 1, 0}, -/* 1 */ { 6, s_2_1, 0, 2, 0}, -/* 2 */ { 6, s_2_2, 0, 2, 0}, -/* 3 */ { 2, s_2_3, -1, 1, 0}, -/* 4 */ { 4, s_2_4, 3, 1, 0}, -/* 5 */ { 6, s_2_5, 4, 2, 0}, -/* 6 */ { 4, s_2_6, -1, 1, 0}, -/* 7 */ { 4, s_2_7, -1, 1, 0} + /* 0 */ {4, s_2_0, -1, 1, 0}, + /* 1 */ {6, s_2_1, 0, 2, 0}, + /* 2 */ {6, s_2_2, 0, 2, 0}, + /* 3 */ {2, s_2_3, -1, 1, 0}, + /* 4 */ {4, s_2_4, 3, 1, 0}, + /* 5 */ {6, s_2_5, 4, 2, 0}, + /* 6 */ {4, s_2_6, -1, 1, 0}, + /* 7 */ {4, s_2_7, -1, 1, 0} }; -static symbol s_3_0[4] = { 0xD1, 0x81, 0xD1, 0x8C }; -static symbol s_3_1[4] = { 0xD1, 0x81, 0xD1, 0x8F }; +static symbol s_3_0[4] = {0xD1, 0x81, 0xD1, 0x8C}; +static symbol s_3_1[4] = {0xD1, 0x81, 0xD1, 0x8F}; static struct among a_3[2] = { -/* 0 */ { 4, s_3_0, -1, 1, 0}, -/* 1 */ { 4, s_3_1, -1, 1, 0} + /* 0 */ {4, s_3_0, -1, 1, 0}, + /* 1 */ {4, s_3_1, -1, 1, 0} }; -static symbol s_4_0[4] = { 0xD1, 0x8B, 0xD1, 0x82 }; -static symbol s_4_1[4] = { 0xD1, 0x8E, 0xD1, 0x82 }; -static symbol s_4_2[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x82 }; -static symbol s_4_3[4] = { 0xD1, 0x8F, 0xD1, 0x82 }; -static symbol s_4_4[4] = { 0xD0, 0xB5, 0xD1, 0x82 }; -static symbol s_4_5[6] = { 0xD1, 0x83, 0xD0, 0xB5, 0xD1, 0x82 }; -static symbol s_4_6[4] = { 0xD0, 0xB8, 0xD1, 0x82 }; -static symbol s_4_7[4] = { 0xD0, 0xBD, 0xD1, 0x8B }; -static symbol s_4_8[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD1, 0x8B }; -static symbol s_4_9[4] = { 0xD1, 0x82, 0xD1, 0x8C }; -static symbol s_4_10[6] = { 0xD1, 0x8B, 0xD1, 0x82, 0xD1, 0x8C }; -static symbol s_4_11[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD1, 0x8C }; -static symbol s_4_12[6] = { 0xD0, 0xB5, 0xD1, 0x88, 0xD1, 0x8C }; -static symbol s_4_13[6] = { 0xD0, 0xB8, 0xD1, 0x88, 0xD1, 0x8C }; -static symbol s_4_14[2] = { 0xD1, 0x8E }; -static symbol s_4_15[4] = { 0xD1, 0x83, 0xD1, 0x8E }; -static symbol s_4_16[4] = { 0xD0, 0xBB, 0xD0, 0xB0 }; -static symbol s_4_17[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB0 }; -static symbol s_4_18[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB0 }; -static symbol s_4_19[4] = { 0xD0, 0xBD, 0xD0, 0xB0 }; -static symbol s_4_20[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB0 }; -static symbol s_4_21[6] = { 0xD0, 0xB5, 0xD1, 0x82, 0xD0, 0xB5 }; -static symbol s_4_22[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD0, 0xB5 }; -static symbol s_4_23[6] = { 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; -static symbol s_4_24[8] = { 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; -static symbol s_4_25[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 }; -static symbol s_4_26[4] = { 0xD0, 0xBB, 0xD0, 0xB8 }; -static symbol s_4_27[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB8 }; -static symbol s_4_28[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8 }; -static symbol s_4_29[2] = { 0xD0, 0xB9 }; -static symbol s_4_30[4] = { 0xD1, 0x83, 0xD0, 0xB9 }; -static symbol s_4_31[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; -static symbol s_4_32[2] = { 0xD0, 0xBB }; -static symbol s_4_33[4] = { 0xD1, 0x8B, 0xD0, 0xBB }; -static symbol s_4_34[4] = { 0xD0, 0xB8, 0xD0, 0xBB }; -static symbol s_4_35[4] = { 0xD1, 0x8B, 0xD0, 0xBC }; -static symbol s_4_36[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; -static symbol s_4_37[4] = { 0xD0, 0xB8, 0xD0, 0xBC }; -static symbol s_4_38[2] = { 0xD0, 0xBD }; -static symbol s_4_39[4] = { 0xD0, 0xB5, 0xD0, 0xBD }; -static symbol s_4_40[4] = { 0xD0, 0xBB, 0xD0, 0xBE }; -static symbol s_4_41[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xBE }; -static symbol s_4_42[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xBE }; -static symbol s_4_43[4] = { 0xD0, 0xBD, 0xD0, 0xBE }; -static symbol s_4_44[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xBE }; -static symbol s_4_45[6] = { 0xD0, 0xBD, 0xD0, 0xBD, 0xD0, 0xBE }; +static symbol s_4_0[4] = {0xD1, 0x8B, 0xD1, 0x82}; +static symbol s_4_1[4] = {0xD1, 0x8E, 0xD1, 0x82}; +static symbol s_4_2[6] = {0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x82}; +static symbol s_4_3[4] = {0xD1, 0x8F, 0xD1, 0x82}; +static symbol s_4_4[4] = {0xD0, 0xB5, 0xD1, 0x82}; +static symbol s_4_5[6] = {0xD1, 0x83, 0xD0, 0xB5, 0xD1, 0x82}; +static symbol s_4_6[4] = {0xD0, 0xB8, 0xD1, 0x82}; +static symbol s_4_7[4] = {0xD0, 0xBD, 0xD1, 0x8B}; +static symbol s_4_8[6] = {0xD0, 0xB5, 0xD0, 0xBD, 0xD1, 0x8B}; +static symbol s_4_9[4] = {0xD1, 0x82, 0xD1, 0x8C}; +static symbol s_4_10[6] = {0xD1, 0x8B, 0xD1, 0x82, 0xD1, 0x8C}; +static symbol s_4_11[6] = {0xD0, 0xB8, 0xD1, 0x82, 0xD1, 0x8C}; +static symbol s_4_12[6] = {0xD0, 0xB5, 0xD1, 0x88, 0xD1, 0x8C}; +static symbol s_4_13[6] = {0xD0, 0xB8, 0xD1, 0x88, 0xD1, 0x8C}; +static symbol s_4_14[2] = {0xD1, 0x8E}; +static symbol s_4_15[4] = {0xD1, 0x83, 0xD1, 0x8E}; +static symbol s_4_16[4] = {0xD0, 0xBB, 0xD0, 0xB0}; +static symbol s_4_17[6] = {0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB0}; +static symbol s_4_18[6] = {0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB0}; +static symbol s_4_19[4] = {0xD0, 0xBD, 0xD0, 0xB0}; +static symbol s_4_20[6] = {0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB0}; +static symbol s_4_21[6] = {0xD0, 0xB5, 0xD1, 0x82, 0xD0, 0xB5}; +static symbol s_4_22[6] = {0xD0, 0xB8, 0xD1, 0x82, 0xD0, 0xB5}; +static symbol s_4_23[6] = {0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5}; +static symbol s_4_24[8] = {0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5}; +static symbol s_4_25[8] = {0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5}; +static symbol s_4_26[4] = {0xD0, 0xBB, 0xD0, 0xB8}; +static symbol s_4_27[6] = {0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB8}; +static symbol s_4_28[6] = {0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8}; +static symbol s_4_29[2] = {0xD0, 0xB9}; +static symbol s_4_30[4] = {0xD1, 0x83, 0xD0, 0xB9}; +static symbol s_4_31[4] = {0xD0, 0xB5, 0xD0, 0xB9}; +static symbol s_4_32[2] = {0xD0, 0xBB}; +static symbol s_4_33[4] = {0xD1, 0x8B, 0xD0, 0xBB}; +static symbol s_4_34[4] = {0xD0, 0xB8, 0xD0, 0xBB}; +static symbol s_4_35[4] = {0xD1, 0x8B, 0xD0, 0xBC}; +static symbol s_4_36[4] = {0xD0, 0xB5, 0xD0, 0xBC}; +static symbol s_4_37[4] = {0xD0, 0xB8, 0xD0, 0xBC}; +static symbol s_4_38[2] = {0xD0, 0xBD}; +static symbol s_4_39[4] = {0xD0, 0xB5, 0xD0, 0xBD}; +static symbol s_4_40[4] = {0xD0, 0xBB, 0xD0, 0xBE}; +static symbol s_4_41[6] = {0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xBE}; +static symbol s_4_42[6] = {0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xBE}; +static symbol s_4_43[4] = {0xD0, 0xBD, 0xD0, 0xBE}; +static symbol s_4_44[6] = {0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xBE}; +static symbol s_4_45[6] = {0xD0, 0xBD, 0xD0, 0xBD, 0xD0, 0xBE}; static struct among a_4[46] = { -/* 0 */ { 4, s_4_0, -1, 2, 0}, -/* 1 */ { 4, s_4_1, -1, 1, 0}, -/* 2 */ { 6, s_4_2, 1, 2, 0}, -/* 3 */ { 4, s_4_3, -1, 2, 0}, -/* 4 */ { 4, s_4_4, -1, 1, 0}, -/* 5 */ { 6, s_4_5, 4, 2, 0}, -/* 6 */ { 4, s_4_6, -1, 2, 0}, -/* 7 */ { 4, s_4_7, -1, 1, 0}, -/* 8 */ { 6, s_4_8, 7, 2, 0}, -/* 9 */ { 4, s_4_9, -1, 1, 0}, -/* 10 */ { 6, s_4_10, 9, 2, 0}, -/* 11 */ { 6, s_4_11, 9, 2, 0}, -/* 12 */ { 6, s_4_12, -1, 1, 0}, -/* 13 */ { 6, s_4_13, -1, 2, 0}, -/* 14 */ { 2, s_4_14, -1, 2, 0}, -/* 15 */ { 4, s_4_15, 14, 2, 0}, -/* 16 */ { 4, s_4_16, -1, 1, 0}, -/* 17 */ { 6, s_4_17, 16, 2, 0}, -/* 18 */ { 6, s_4_18, 16, 2, 0}, -/* 19 */ { 4, s_4_19, -1, 1, 0}, -/* 20 */ { 6, s_4_20, 19, 2, 0}, -/* 21 */ { 6, s_4_21, -1, 1, 0}, -/* 22 */ { 6, s_4_22, -1, 2, 0}, -/* 23 */ { 6, s_4_23, -1, 1, 0}, -/* 24 */ { 8, s_4_24, 23, 2, 0}, -/* 25 */ { 8, s_4_25, 23, 2, 0}, -/* 26 */ { 4, s_4_26, -1, 1, 0}, -/* 27 */ { 6, s_4_27, 26, 2, 0}, -/* 28 */ { 6, s_4_28, 26, 2, 0}, -/* 29 */ { 2, s_4_29, -1, 1, 0}, -/* 30 */ { 4, s_4_30, 29, 2, 0}, -/* 31 */ { 4, s_4_31, 29, 2, 0}, -/* 32 */ { 2, s_4_32, -1, 1, 0}, -/* 33 */ { 4, s_4_33, 32, 2, 0}, -/* 34 */ { 4, s_4_34, 32, 2, 0}, -/* 35 */ { 4, s_4_35, -1, 2, 0}, -/* 36 */ { 4, s_4_36, -1, 1, 0}, -/* 37 */ { 4, s_4_37, -1, 2, 0}, -/* 38 */ { 2, s_4_38, -1, 1, 0}, -/* 39 */ { 4, s_4_39, 38, 2, 0}, -/* 40 */ { 4, s_4_40, -1, 1, 0}, -/* 41 */ { 6, s_4_41, 40, 2, 0}, -/* 42 */ { 6, s_4_42, 40, 2, 0}, -/* 43 */ { 4, s_4_43, -1, 1, 0}, -/* 44 */ { 6, s_4_44, 43, 2, 0}, -/* 45 */ { 6, s_4_45, 43, 1, 0} + /* 0 */ {4, s_4_0, -1, 2, 0}, + /* 1 */ {4, s_4_1, -1, 1, 0}, + /* 2 */ {6, s_4_2, 1, 2, 0}, + /* 3 */ {4, s_4_3, -1, 2, 0}, + /* 4 */ {4, s_4_4, -1, 1, 0}, + /* 5 */ {6, s_4_5, 4, 2, 0}, + /* 6 */ {4, s_4_6, -1, 2, 0}, + /* 7 */ {4, s_4_7, -1, 1, 0}, + /* 8 */ {6, s_4_8, 7, 2, 0}, + /* 9 */ {4, s_4_9, -1, 1, 0}, + /* 10 */ {6, s_4_10, 9, 2, 0}, + /* 11 */ {6, s_4_11, 9, 2, 0}, + /* 12 */ {6, s_4_12, -1, 1, 0}, + /* 13 */ {6, s_4_13, -1, 2, 0}, + /* 14 */ {2, s_4_14, -1, 2, 0}, + /* 15 */ {4, s_4_15, 14, 2, 0}, + /* 16 */ {4, s_4_16, -1, 1, 0}, + /* 17 */ {6, s_4_17, 16, 2, 0}, + /* 18 */ {6, s_4_18, 16, 2, 0}, + /* 19 */ {4, s_4_19, -1, 1, 0}, + /* 20 */ {6, s_4_20, 19, 2, 0}, + /* 21 */ {6, s_4_21, -1, 1, 0}, + /* 22 */ {6, s_4_22, -1, 2, 0}, + /* 23 */ {6, s_4_23, -1, 1, 0}, + /* 24 */ {8, s_4_24, 23, 2, 0}, + /* 25 */ {8, s_4_25, 23, 2, 0}, + /* 26 */ {4, s_4_26, -1, 1, 0}, + /* 27 */ {6, s_4_27, 26, 2, 0}, + /* 28 */ {6, s_4_28, 26, 2, 0}, + /* 29 */ {2, s_4_29, -1, 1, 0}, + /* 30 */ {4, s_4_30, 29, 2, 0}, + /* 31 */ {4, s_4_31, 29, 2, 0}, + /* 32 */ {2, s_4_32, -1, 1, 0}, + /* 33 */ {4, s_4_33, 32, 2, 0}, + /* 34 */ {4, s_4_34, 32, 2, 0}, + /* 35 */ {4, s_4_35, -1, 2, 0}, + /* 36 */ {4, s_4_36, -1, 1, 0}, + /* 37 */ {4, s_4_37, -1, 2, 0}, + /* 38 */ {2, s_4_38, -1, 1, 0}, + /* 39 */ {4, s_4_39, 38, 2, 0}, + /* 40 */ {4, s_4_40, -1, 1, 0}, + /* 41 */ {6, s_4_41, 40, 2, 0}, + /* 42 */ {6, s_4_42, 40, 2, 0}, + /* 43 */ {4, s_4_43, -1, 1, 0}, + /* 44 */ {6, s_4_44, 43, 2, 0}, + /* 45 */ {6, s_4_45, 43, 1, 0} }; -static symbol s_5_0[2] = { 0xD1, 0x83 }; -static symbol s_5_1[4] = { 0xD1, 0x8F, 0xD1, 0x85 }; -static symbol s_5_2[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD1, 0x85 }; -static symbol s_5_3[4] = { 0xD0, 0xB0, 0xD1, 0x85 }; -static symbol s_5_4[2] = { 0xD1, 0x8B }; -static symbol s_5_5[2] = { 0xD1, 0x8C }; -static symbol s_5_6[2] = { 0xD1, 0x8E }; -static symbol s_5_7[4] = { 0xD1, 0x8C, 0xD1, 0x8E }; -static symbol s_5_8[4] = { 0xD0, 0xB8, 0xD1, 0x8E }; -static symbol s_5_9[2] = { 0xD1, 0x8F }; -static symbol s_5_10[4] = { 0xD1, 0x8C, 0xD1, 0x8F }; -static symbol s_5_11[4] = { 0xD0, 0xB8, 0xD1, 0x8F }; -static symbol s_5_12[2] = { 0xD0, 0xB0 }; -static symbol s_5_13[4] = { 0xD0, 0xB5, 0xD0, 0xB2 }; -static symbol s_5_14[4] = { 0xD0, 0xBE, 0xD0, 0xB2 }; -static symbol s_5_15[2] = { 0xD0, 0xB5 }; -static symbol s_5_16[4] = { 0xD1, 0x8C, 0xD0, 0xB5 }; -static symbol s_5_17[4] = { 0xD0, 0xB8, 0xD0, 0xB5 }; -static symbol s_5_18[2] = { 0xD0, 0xB8 }; -static symbol s_5_19[4] = { 0xD0, 0xB5, 0xD0, 0xB8 }; -static symbol s_5_20[4] = { 0xD0, 0xB8, 0xD0, 0xB8 }; -static symbol s_5_21[6] = { 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 }; -static symbol s_5_22[8] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 }; -static symbol s_5_23[6] = { 0xD0, 0xB0, 0xD0, 0xBC, 0xD0, 0xB8 }; -static symbol s_5_24[2] = { 0xD0, 0xB9 }; -static symbol s_5_25[4] = { 0xD0, 0xB5, 0xD0, 0xB9 }; -static symbol s_5_26[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xB9 }; -static symbol s_5_27[4] = { 0xD0, 0xB8, 0xD0, 0xB9 }; -static symbol s_5_28[4] = { 0xD0, 0xBE, 0xD0, 0xB9 }; -static symbol s_5_29[4] = { 0xD1, 0x8F, 0xD0, 0xBC }; -static symbol s_5_30[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC }; -static symbol s_5_31[4] = { 0xD0, 0xB0, 0xD0, 0xBC }; -static symbol s_5_32[4] = { 0xD0, 0xB5, 0xD0, 0xBC }; -static symbol s_5_33[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC }; -static symbol s_5_34[4] = { 0xD0, 0xBE, 0xD0, 0xBC }; -static symbol s_5_35[2] = { 0xD0, 0xBE }; +static symbol s_5_0[2] = {0xD1, 0x83}; +static symbol s_5_1[4] = {0xD1, 0x8F, 0xD1, 0x85}; +static symbol s_5_2[6] = {0xD0, 0xB8, 0xD1, 0x8F, 0xD1, 0x85}; +static symbol s_5_3[4] = {0xD0, 0xB0, 0xD1, 0x85}; +static symbol s_5_4[2] = {0xD1, 0x8B}; +static symbol s_5_5[2] = {0xD1, 0x8C}; +static symbol s_5_6[2] = {0xD1, 0x8E}; +static symbol s_5_7[4] = {0xD1, 0x8C, 0xD1, 0x8E}; +static symbol s_5_8[4] = {0xD0, 0xB8, 0xD1, 0x8E}; +static symbol s_5_9[2] = {0xD1, 0x8F}; +static symbol s_5_10[4] = {0xD1, 0x8C, 0xD1, 0x8F}; +static symbol s_5_11[4] = {0xD0, 0xB8, 0xD1, 0x8F}; +static symbol s_5_12[2] = {0xD0, 0xB0}; +static symbol s_5_13[4] = {0xD0, 0xB5, 0xD0, 0xB2}; +static symbol s_5_14[4] = {0xD0, 0xBE, 0xD0, 0xB2}; +static symbol s_5_15[2] = {0xD0, 0xB5}; +static symbol s_5_16[4] = {0xD1, 0x8C, 0xD0, 0xB5}; +static symbol s_5_17[4] = {0xD0, 0xB8, 0xD0, 0xB5}; +static symbol s_5_18[2] = {0xD0, 0xB8}; +static symbol s_5_19[4] = {0xD0, 0xB5, 0xD0, 0xB8}; +static symbol s_5_20[4] = {0xD0, 0xB8, 0xD0, 0xB8}; +static symbol s_5_21[6] = {0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8}; +static symbol s_5_22[8] = {0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8}; +static symbol s_5_23[6] = {0xD0, 0xB0, 0xD0, 0xBC, 0xD0, 0xB8}; +static symbol s_5_24[2] = {0xD0, 0xB9}; +static symbol s_5_25[4] = {0xD0, 0xB5, 0xD0, 0xB9}; +static symbol s_5_26[6] = {0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xB9}; +static symbol s_5_27[4] = {0xD0, 0xB8, 0xD0, 0xB9}; +static symbol s_5_28[4] = {0xD0, 0xBE, 0xD0, 0xB9}; +static symbol s_5_29[4] = {0xD1, 0x8F, 0xD0, 0xBC}; +static symbol s_5_30[6] = {0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC}; +static symbol s_5_31[4] = {0xD0, 0xB0, 0xD0, 0xBC}; +static symbol s_5_32[4] = {0xD0, 0xB5, 0xD0, 0xBC}; +static symbol s_5_33[6] = {0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC}; +static symbol s_5_34[4] = {0xD0, 0xBE, 0xD0, 0xBC}; +static symbol s_5_35[2] = {0xD0, 0xBE}; static struct among a_5[36] = { -/* 0 */ { 2, s_5_0, -1, 1, 0}, -/* 1 */ { 4, s_5_1, -1, 1, 0}, -/* 2 */ { 6, s_5_2, 1, 1, 0}, -/* 3 */ { 4, s_5_3, -1, 1, 0}, -/* 4 */ { 2, s_5_4, -1, 1, 0}, -/* 5 */ { 2, s_5_5, -1, 1, 0}, -/* 6 */ { 2, s_5_6, -1, 1, 0}, -/* 7 */ { 4, s_5_7, 6, 1, 0}, -/* 8 */ { 4, s_5_8, 6, 1, 0}, -/* 9 */ { 2, s_5_9, -1, 1, 0}, -/* 10 */ { 4, s_5_10, 9, 1, 0}, -/* 11 */ { 4, s_5_11, 9, 1, 0}, -/* 12 */ { 2, s_5_12, -1, 1, 0}, -/* 13 */ { 4, s_5_13, -1, 1, 0}, -/* 14 */ { 4, s_5_14, -1, 1, 0}, -/* 15 */ { 2, s_5_15, -1, 1, 0}, -/* 16 */ { 4, s_5_16, 15, 1, 0}, -/* 17 */ { 4, s_5_17, 15, 1, 0}, -/* 18 */ { 2, s_5_18, -1, 1, 0}, -/* 19 */ { 4, s_5_19, 18, 1, 0}, -/* 20 */ { 4, s_5_20, 18, 1, 0}, -/* 21 */ { 6, s_5_21, 18, 1, 0}, -/* 22 */ { 8, s_5_22, 21, 1, 0}, -/* 23 */ { 6, s_5_23, 18, 1, 0}, -/* 24 */ { 2, s_5_24, -1, 1, 0}, -/* 25 */ { 4, s_5_25, 24, 1, 0}, -/* 26 */ { 6, s_5_26, 25, 1, 0}, -/* 27 */ { 4, s_5_27, 24, 1, 0}, -/* 28 */ { 4, s_5_28, 24, 1, 0}, -/* 29 */ { 4, s_5_29, -1, 1, 0}, -/* 30 */ { 6, s_5_30, 29, 1, 0}, -/* 31 */ { 4, s_5_31, -1, 1, 0}, -/* 32 */ { 4, s_5_32, -1, 1, 0}, -/* 33 */ { 6, s_5_33, 32, 1, 0}, -/* 34 */ { 4, s_5_34, -1, 1, 0}, -/* 35 */ { 2, s_5_35, -1, 1, 0} + /* 0 */ {2, s_5_0, -1, 1, 0}, + /* 1 */ {4, s_5_1, -1, 1, 0}, + /* 2 */ {6, s_5_2, 1, 1, 0}, + /* 3 */ {4, s_5_3, -1, 1, 0}, + /* 4 */ {2, s_5_4, -1, 1, 0}, + /* 5 */ {2, s_5_5, -1, 1, 0}, + /* 6 */ {2, s_5_6, -1, 1, 0}, + /* 7 */ {4, s_5_7, 6, 1, 0}, + /* 8 */ {4, s_5_8, 6, 1, 0}, + /* 9 */ {2, s_5_9, -1, 1, 0}, + /* 10 */ {4, s_5_10, 9, 1, 0}, + /* 11 */ {4, s_5_11, 9, 1, 0}, + /* 12 */ {2, s_5_12, -1, 1, 0}, + /* 13 */ {4, s_5_13, -1, 1, 0}, + /* 14 */ {4, s_5_14, -1, 1, 0}, + /* 15 */ {2, s_5_15, -1, 1, 0}, + /* 16 */ {4, s_5_16, 15, 1, 0}, + /* 17 */ {4, s_5_17, 15, 1, 0}, + /* 18 */ {2, s_5_18, -1, 1, 0}, + /* 19 */ {4, s_5_19, 18, 1, 0}, + /* 20 */ {4, s_5_20, 18, 1, 0}, + /* 21 */ {6, s_5_21, 18, 1, 0}, + /* 22 */ {8, s_5_22, 21, 1, 0}, + /* 23 */ {6, s_5_23, 18, 1, 0}, + /* 24 */ {2, s_5_24, -1, 1, 0}, + /* 25 */ {4, s_5_25, 24, 1, 0}, + /* 26 */ {6, s_5_26, 25, 1, 0}, + /* 27 */ {4, s_5_27, 24, 1, 0}, + /* 28 */ {4, s_5_28, 24, 1, 0}, + /* 29 */ {4, s_5_29, -1, 1, 0}, + /* 30 */ {6, s_5_30, 29, 1, 0}, + /* 31 */ {4, s_5_31, -1, 1, 0}, + /* 32 */ {4, s_5_32, -1, 1, 0}, + /* 33 */ {6, s_5_33, 32, 1, 0}, + /* 34 */ {4, s_5_34, -1, 1, 0}, + /* 35 */ {2, s_5_35, -1, 1, 0} }; -static symbol s_6_0[6] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82 }; -static symbol s_6_1[8] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8C }; +static symbol s_6_0[6] = {0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82}; +static symbol s_6_1[8] = {0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8C}; static struct among a_6[2] = { -/* 0 */ { 6, s_6_0, -1, 1, 0}, -/* 1 */ { 8, s_6_1, -1, 1, 0} + /* 0 */ {6, s_6_0, -1, 1, 0}, + /* 1 */ {8, s_6_1, -1, 1, 0} }; -static symbol s_7_0[6] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88 }; -static symbol s_7_1[2] = { 0xD1, 0x8C }; -static symbol s_7_2[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88, 0xD0, 0xB5 }; -static symbol s_7_3[2] = { 0xD0, 0xBD }; +static symbol s_7_0[6] = {0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88}; +static symbol s_7_1[2] = {0xD1, 0x8C}; +static symbol s_7_2[8] = {0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88, 0xD0, 0xB5}; +static symbol s_7_3[2] = {0xD0, 0xBD}; static struct among a_7[4] = { -/* 0 */ { 6, s_7_0, -1, 1, 0}, -/* 1 */ { 2, s_7_1, -1, 3, 0}, -/* 2 */ { 8, s_7_2, -1, 1, 0}, -/* 3 */ { 2, s_7_3, -1, 2, 0} + /* 0 */ {6, s_7_0, -1, 1, 0}, + /* 1 */ {2, s_7_1, -1, 3, 0}, + /* 2 */ {8, s_7_2, -1, 1, 0}, + /* 3 */ {2, s_7_3, -1, 2, 0} }; -static unsigned char g_v[] = { 33, 65, 8, 232 }; - -static symbol s_0[] = { 0xD0, 0xB0 }; -static symbol s_1[] = { 0xD1, 0x8F }; -static symbol s_2[] = { 0xD0, 0xB0 }; -static symbol s_3[] = { 0xD1, 0x8F }; -static symbol s_4[] = { 0xD0, 0xB0 }; -static symbol s_5[] = { 0xD1, 0x8F }; -static symbol s_6[] = { 0xD0, 0xBD }; -static symbol s_7[] = { 0xD0, 0xBD }; -static symbol s_8[] = { 0xD0, 0xBD }; -static symbol s_9[] = { 0xD0, 0xB8 }; - -static int r_mark_regions(struct SN_env * z) { - z->I[0] = z->l; - z->I[1] = z->l; - { int c = z->c; /* do, line 61 */ - while(1) { /* gopast, line 62 */ - if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab1; - break; - lab1: - { int c = skip_utf8(z->p, z->c, 0, z->l, 1); - if (c < 0) goto lab0; - z->c = c; /* gopast, line 62 */ - } - } - z->I[0] = z->c; /* setmark pV, line 62 */ - while(1) { /* gopast, line 62 */ - if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab2; - break; - lab2: - { int c = skip_utf8(z->p, z->c, 0, z->l, 1); - if (c < 0) goto lab0; - z->c = c; /* gopast, line 62 */ - } - } - while(1) { /* gopast, line 63 */ - if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab3; - break; - lab3: - { int c = skip_utf8(z->p, z->c, 0, z->l, 1); - if (c < 0) goto lab0; - z->c = c; /* gopast, line 63 */ - } - } - while(1) { /* gopast, line 63 */ - if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab4; - break; - lab4: - { int c = skip_utf8(z->p, z->c, 0, z->l, 1); - if (c < 0) goto lab0; - z->c = c; /* gopast, line 63 */ - } - } - z->I[1] = z->c; /* setmark p2, line 63 */ - lab0: - z->c = c; - } - return 1; +static unsigned char g_v[] = {33, 65, 8, 232}; + +static symbol s_0[] = {0xD0, 0xB0}; +static symbol s_1[] = {0xD1, 0x8F}; +static symbol s_2[] = {0xD0, 0xB0}; +static symbol s_3[] = {0xD1, 0x8F}; +static symbol s_4[] = {0xD0, 0xB0}; +static symbol s_5[] = {0xD1, 0x8F}; +static symbol s_6[] = {0xD0, 0xBD}; +static symbol s_7[] = {0xD0, 0xBD}; +static symbol s_8[] = {0xD0, 0xBD}; +static symbol s_9[] = {0xD0, 0xB8}; + +static int +r_mark_regions(struct SN_env * z) +{ + z->I[0] = z->l; + z->I[1] = z->l; + { + int c = z->c; /* do, line 61 */ + + while (1) + { /* gopast, line 62 */ + if (!(in_grouping_U(z, g_v, 1072, 1103))) + goto lab1; + break; + lab1: + { + int c = skip_utf8(z->p, z->c, 0, z->l, 1); + + if (c < 0) + goto lab0; + z->c = c; /* gopast, line 62 */ + } + } + z->I[0] = z->c; /* setmark pV, line 62 */ + while (1) + { /* gopast, line 62 */ + if (!(out_grouping_U(z, g_v, 1072, 1103))) + goto lab2; + break; + lab2: + { + int c = skip_utf8(z->p, z->c, 0, z->l, 1); + + if (c < 0) + goto lab0; + z->c = c; /* gopast, line 62 */ + } + } + while (1) + { /* gopast, line 63 */ + if (!(in_grouping_U(z, g_v, 1072, 1103))) + goto lab3; + break; + lab3: + { + int c = skip_utf8(z->p, z->c, 0, z->l, 1); + + if (c < 0) + goto lab0; + z->c = c; /* gopast, line 63 */ + } + } + while (1) + { /* gopast, line 63 */ + if (!(out_grouping_U(z, g_v, 1072, 1103))) + goto lab4; + break; + lab4: + { + int c = skip_utf8(z->p, z->c, 0, z->l, 1); + + if (c < 0) + goto lab0; + z->c = c; /* gopast, line 63 */ + } + } + z->I[1] = z->c; /* setmark p2, line 63 */ +lab0: + z->c = c; + } + return 1; } -static int r_R2(struct SN_env * z) { - if (!(z->I[1] <= z->c)) return 0; - return 1; +static int +r_R2(struct SN_env * z) +{ + if (!(z->I[1] <= z->c)) + return 0; + return 1; } -static int r_perfective_gerund(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 72 */ - among_var = find_among_b(z, a_0, 9); /* substring, line 72 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 72 */ - switch(among_var) { - case 0: return 0; - case 1: - { int m = z->l - z->c; (void) m; /* or, line 76 */ - if (!(eq_s_b(z, 2, s_0))) goto lab1; - goto lab0; - lab1: - z->c = z->l - m; - if (!(eq_s_b(z, 2, s_1))) return 0; - } - lab0: - { int ret; - ret = slice_del(z); /* delete, line 76 */ - if (ret < 0) return ret; - } - break; - case 2: - { int ret; - ret = slice_del(z); /* delete, line 83 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_perfective_gerund(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 72 */ + among_var = find_among_b(z, a_0, 9); /* substring, line 72 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 72 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int m = z->l - z->c; + + (void) m; /* or, line 76 */ + if (!(eq_s_b(z, 2, s_0))) + goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 2, s_1))) + return 0; + } + lab0: + { + int ret; + + ret = slice_del(z); /* delete, line 76 */ + if (ret < 0) + return ret; + } + break; + case 2: + { + int ret; + + ret = slice_del(z); /* delete, line 83 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_adjective(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 88 */ - among_var = find_among_b(z, a_1, 26); /* substring, line 88 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 88 */ - switch(among_var) { - case 0: return 0; - case 1: - { int ret; - ret = slice_del(z); /* delete, line 97 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_adjective(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 88 */ + among_var = find_among_b(z, a_1, 26); /* substring, line 88 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 88 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int ret; + + ret = slice_del(z); /* delete, line 97 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_adjectival(struct SN_env * z) { - int among_var; - { int ret = r_adjective(z); - if (ret == 0) return 0; /* call adjective, line 102 */ - if (ret < 0) return ret; - } - { int m = z->l - z->c; (void) m; /* try, line 109 */ - z->ket = z->c; /* [, line 110 */ - among_var = find_among_b(z, a_2, 8); /* substring, line 110 */ - if (!(among_var)) { z->c = z->l - m; goto lab0; } - z->bra = z->c; /* ], line 110 */ - switch(among_var) { - case 0: { z->c = z->l - m; goto lab0; } - case 1: - { int m = z->l - z->c; (void) m; /* or, line 115 */ - if (!(eq_s_b(z, 2, s_2))) goto lab2; - goto lab1; - lab2: - z->c = z->l - m; - if (!(eq_s_b(z, 2, s_3))) { z->c = z->l - m; goto lab0; } - } - lab1: - { int ret; - ret = slice_del(z); /* delete, line 115 */ - if (ret < 0) return ret; - } - break; - case 2: - { int ret; - ret = slice_del(z); /* delete, line 122 */ - if (ret < 0) return ret; - } - break; - } - lab0: - ; - } - return 1; +static int +r_adjectival(struct SN_env * z) +{ + int among_var; + + { + int ret = r_adjective(z); + + if (ret == 0) + return 0; /* call adjective, line 102 */ + if (ret < 0) + return ret; + } + { + int m = z->l - z->c; + + (void) m; /* try, line 109 */ + z->ket = z->c; /* [, line 110 */ + among_var = find_among_b(z, a_2, 8); /* substring, line 110 */ + if (!(among_var)) + { + z->c = z->l - m; + goto lab0; + } + z->bra = z->c; /* ], line 110 */ + switch (among_var) + { + case 0: + { + z->c = z->l - m; + goto lab0; + } + case 1: + { + int m = z->l - z->c; + + (void) m; /* or, line 115 */ + if (!(eq_s_b(z, 2, s_2))) + goto lab2; + goto lab1; + lab2: + z->c = z->l - m; + if (!(eq_s_b(z, 2, s_3))) + { + z->c = z->l - m; + goto lab0; + } + } + lab1: + { + int ret; + + ret = slice_del(z); /* delete, line 115 */ + if (ret < 0) + return ret; + } + break; + case 2: + { + int ret; + + ret = slice_del(z); /* delete, line 122 */ + if (ret < 0) + return ret; + } + break; + } +lab0: + ; + } + return 1; } -static int r_reflexive(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 129 */ - among_var = find_among_b(z, a_3, 2); /* substring, line 129 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 129 */ - switch(among_var) { - case 0: return 0; - case 1: - { int ret; - ret = slice_del(z); /* delete, line 132 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_reflexive(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 129 */ + among_var = find_among_b(z, a_3, 2); /* substring, line 129 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 129 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int ret; + + ret = slice_del(z); /* delete, line 132 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_verb(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 137 */ - among_var = find_among_b(z, a_4, 46); /* substring, line 137 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 137 */ - switch(among_var) { - case 0: return 0; - case 1: - { int m = z->l - z->c; (void) m; /* or, line 143 */ - if (!(eq_s_b(z, 2, s_4))) goto lab1; - goto lab0; - lab1: - z->c = z->l - m; - if (!(eq_s_b(z, 2, s_5))) return 0; - } - lab0: - { int ret; - ret = slice_del(z); /* delete, line 143 */ - if (ret < 0) return ret; - } - break; - case 2: - { int ret; - ret = slice_del(z); /* delete, line 151 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_verb(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 137 */ + among_var = find_among_b(z, a_4, 46); /* substring, line 137 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 137 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int m = z->l - z->c; + + (void) m; /* or, line 143 */ + if (!(eq_s_b(z, 2, s_4))) + goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 2, s_5))) + return 0; + } + lab0: + { + int ret; + + ret = slice_del(z); /* delete, line 143 */ + if (ret < 0) + return ret; + } + break; + case 2: + { + int ret; + + ret = slice_del(z); /* delete, line 151 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_noun(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 160 */ - among_var = find_among_b(z, a_5, 36); /* substring, line 160 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 160 */ - switch(among_var) { - case 0: return 0; - case 1: - { int ret; - ret = slice_del(z); /* delete, line 167 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_noun(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 160 */ + among_var = find_among_b(z, a_5, 36); /* substring, line 160 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 160 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int ret; + + ret = slice_del(z); /* delete, line 167 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_derivational(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 176 */ - among_var = find_among_b(z, a_6, 2); /* substring, line 176 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 176 */ - { int ret = r_R2(z); - if (ret == 0) return 0; /* call R2, line 176 */ - if (ret < 0) return ret; - } - switch(among_var) { - case 0: return 0; - case 1: - { int ret; - ret = slice_del(z); /* delete, line 179 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_derivational(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 176 */ + among_var = find_among_b(z, a_6, 2); /* substring, line 176 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 176 */ + { + int ret = r_R2(z); + + if (ret == 0) + return 0; /* call R2, line 176 */ + if (ret < 0) + return ret; + } + switch (among_var) + { + case 0: + return 0; + case 1: + { + int ret; + + ret = slice_del(z); /* delete, line 179 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -static int r_tidy_up(struct SN_env * z) { - int among_var; - z->ket = z->c; /* [, line 184 */ - among_var = find_among_b(z, a_7, 4); /* substring, line 184 */ - if (!(among_var)) return 0; - z->bra = z->c; /* ], line 184 */ - switch(among_var) { - case 0: return 0; - case 1: - { int ret; - ret = slice_del(z); /* delete, line 188 */ - if (ret < 0) return ret; - } - z->ket = z->c; /* [, line 189 */ - if (!(eq_s_b(z, 2, s_6))) return 0; - z->bra = z->c; /* ], line 189 */ - if (!(eq_s_b(z, 2, s_7))) return 0; - { int ret; - ret = slice_del(z); /* delete, line 189 */ - if (ret < 0) return ret; - } - break; - case 2: - if (!(eq_s_b(z, 2, s_8))) return 0; - { int ret; - ret = slice_del(z); /* delete, line 192 */ - if (ret < 0) return ret; - } - break; - case 3: - { int ret; - ret = slice_del(z); /* delete, line 194 */ - if (ret < 0) return ret; - } - break; - } - return 1; +static int +r_tidy_up(struct SN_env * z) +{ + int among_var; + + z->ket = z->c; /* [, line 184 */ + among_var = find_among_b(z, a_7, 4); /* substring, line 184 */ + if (!(among_var)) + return 0; + z->bra = z->c; /* ], line 184 */ + switch (among_var) + { + case 0: + return 0; + case 1: + { + int ret; + + ret = slice_del(z); /* delete, line 188 */ + if (ret < 0) + return ret; + } + z->ket = z->c; /* [, line 189 */ + if (!(eq_s_b(z, 2, s_6))) + return 0; + z->bra = z->c; /* ], line 189 */ + if (!(eq_s_b(z, 2, s_7))) + return 0; + { + int ret; + + ret = slice_del(z); /* delete, line 189 */ + if (ret < 0) + return ret; + } + break; + case 2: + if (!(eq_s_b(z, 2, s_8))) + return 0; + { + int ret; + + ret = slice_del(z); /* delete, line 192 */ + if (ret < 0) + return ret; + } + break; + case 3: + { + int ret; + + ret = slice_del(z); /* delete, line 194 */ + if (ret < 0) + return ret; + } + break; + } + return 1; } -extern int russian_UTF_8_stem(struct SN_env * z) { - { int c = z->c; /* do, line 201 */ - { int ret = r_mark_regions(z); - if (ret == 0) goto lab0; /* call mark_regions, line 201 */ - if (ret < 0) return ret; - } - lab0: - z->c = c; - } - z->lb = z->c; z->c = z->l; /* backwards, line 202 */ - - { int m3; /* setlimit, line 202 */ - int m = z->l - z->c; (void) m; - if (z->c < z->I[0]) return 0; - z->c = z->I[0]; /* tomark, line 202 */ - m3 = z->lb; z->lb = z->c; - z->c = z->l - m; - { int m = z->l - z->c; (void) m; /* do, line 203 */ - { int m = z->l - z->c; (void) m; /* or, line 204 */ - { int ret = r_perfective_gerund(z); - if (ret == 0) goto lab3; /* call perfective_gerund, line 204 */ - if (ret < 0) return ret; - } - goto lab2; - lab3: - z->c = z->l - m; - { int m = z->l - z->c; (void) m; /* try, line 205 */ - { int ret = r_reflexive(z); - if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 205 */ - if (ret < 0) return ret; - } - lab4: - ; - } - { int m = z->l - z->c; (void) m; /* or, line 206 */ - { int ret = r_adjectival(z); - if (ret == 0) goto lab6; /* call adjectival, line 206 */ - if (ret < 0) return ret; - } - goto lab5; - lab6: - z->c = z->l - m; - { int ret = r_verb(z); - if (ret == 0) goto lab7; /* call verb, line 206 */ - if (ret < 0) return ret; - } - goto lab5; - lab7: - z->c = z->l - m; - { int ret = r_noun(z); - if (ret == 0) goto lab1; /* call noun, line 206 */ - if (ret < 0) return ret; - } - } - lab5: - ; - } - lab2: - lab1: - z->c = z->l - m; - } - { int m = z->l - z->c; (void) m; /* try, line 209 */ - z->ket = z->c; /* [, line 209 */ - if (!(eq_s_b(z, 2, s_9))) { z->c = z->l - m; goto lab8; } - z->bra = z->c; /* ], line 209 */ - { int ret; - ret = slice_del(z); /* delete, line 209 */ - if (ret < 0) return ret; - } - lab8: - ; - } - { int m = z->l - z->c; (void) m; /* do, line 212 */ - { int ret = r_derivational(z); - if (ret == 0) goto lab9; /* call derivational, line 212 */ - if (ret < 0) return ret; - } - lab9: - z->c = z->l - m; - } - { int m = z->l - z->c; (void) m; /* do, line 213 */ - { int ret = r_tidy_up(z); - if (ret == 0) goto lab10; /* call tidy_up, line 213 */ - if (ret < 0) return ret; - } - lab10: - z->c = z->l - m; - } - z->lb = m3; - } - z->c = z->lb; - return 1; +extern int +russian_UTF_8_stem(struct SN_env * z) +{ + { + int c = z->c; /* do, line 201 */ + + { + int ret = r_mark_regions(z); + + if (ret == 0) + goto lab0; /* call mark_regions, line 201 */ + if (ret < 0) + return ret; + } +lab0: + z->c = c; + } + z->lb = z->c; + z->c = z->l; /* backwards, line 202 */ + + { + int m3; /* setlimit, line 202 */ + int m = z->l - z->c; + + (void) m; + if (z->c < z->I[0]) + return 0; + z->c = z->I[0]; /* tomark, line 202 */ + m3 = z->lb; + z->lb = z->c; + z->c = z->l - m; + { + int m = z->l - z->c; + + (void) m; /* do, line 203 */ + { + int m = z->l - z->c; + + (void) m; /* or, line 204 */ + { + int ret = r_perfective_gerund(z); + + if (ret == 0) + goto lab3; /* call perfective_gerund, line 204 */ + if (ret < 0) + return ret; + } + goto lab2; + lab3: + z->c = z->l - m; + { + int m = z->l - z->c; + + (void) m; /* try, line 205 */ + { + int ret = r_reflexive(z); + + if (ret == 0) + { + z->c = z->l - m; + goto lab4; + } /* call reflexive, line 205 */ + if (ret < 0) + return ret; + } + lab4: + ; + } + { + int m = z->l - z->c; + + (void) m; /* or, line 206 */ + { + int ret = r_adjectival(z); + + if (ret == 0) + goto lab6; /* call adjectival, line 206 */ + if (ret < 0) + return ret; + } + goto lab5; + lab6: + z->c = z->l - m; + { + int ret = r_verb(z); + + if (ret == 0) + goto lab7; /* call verb, line 206 */ + if (ret < 0) + return ret; + } + goto lab5; + lab7: + z->c = z->l - m; + { + int ret = r_noun(z); + + if (ret == 0) + goto lab1; /* call noun, line 206 */ + if (ret < 0) + return ret; + } + } + lab5: + ; + } + lab2: + lab1: + z->c = z->l - m; + } + { + int m = z->l - z->c; + + (void) m; /* try, line 209 */ + z->ket = z->c; /* [, line 209 */ + if (!(eq_s_b(z, 2, s_9))) + { + z->c = z->l - m; + goto lab8; + } + z->bra = z->c; /* ], line 209 */ + { + int ret; + + ret = slice_del(z); /* delete, line 209 */ + if (ret < 0) + return ret; + } + lab8: + ; + } + { + int m = z->l - z->c; + + (void) m; /* do, line 212 */ + { + int ret = r_derivational(z); + + if (ret == 0) + goto lab9; /* call derivational, line 212 */ + if (ret < 0) + return ret; + } + lab9: + z->c = z->l - m; + } + { + int m = z->l - z->c; + + (void) m; /* do, line 213 */ + { + int ret = r_tidy_up(z); + + if (ret == 0) + goto lab10; /* call tidy_up, line 213 */ + if (ret < 0) + return ret; + } + lab10: + z->c = z->l - m; + } + z->lb = m3; + } + z->c = z->lb; + return 1; } -extern struct SN_env * russian_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); } - -extern void russian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); } +extern struct SN_env *russian_UTF_8_create_env(void) +{ + return SN_create_env(0, 2, 0); +} +extern void russian_UTF_8_close_env(struct SN_env * z) +{ + SN_close_env(z); +} diff --git a/contrib/tsearch2/snowball/russian_stem_UTF8.h b/contrib/tsearch2/snowball/russian_stem_UTF8.h index 4ef774ddccb..0beb0b9719a 100644 --- a/contrib/tsearch2/snowball/russian_stem_UTF8.h +++ b/contrib/tsearch2/snowball/russian_stem_UTF8.h @@ -2,15 +2,16 @@ /* This file was generated automatically by the Snowball to ANSI C compiler */ #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -extern struct SN_env * russian_UTF_8_create_env(void); -extern void russian_UTF_8_close_env(struct SN_env * z); + extern struct SN_env *russian_UTF_8_create_env(void); + extern void russian_UTF_8_close_env(struct SN_env * z); -extern int russian_UTF_8_stem(struct SN_env * z); + extern int russian_UTF_8_stem(struct SN_env * z); #ifdef __cplusplus } -#endif +#endif diff --git a/contrib/tsearch2/stopword.c b/contrib/tsearch2/stopword.c index e6141f83903..73db8abba69 100644 --- a/contrib/tsearch2/stopword.c +++ b/contrib/tsearch2/stopword.c @@ -48,7 +48,7 @@ readstoplist(text *in, StopList * s) while (fgets(buf, STOPBUFLEN, hin)) { buf[strlen(buf) - 1] = '\0'; - pg_verifymbstr( buf, strlen(buf), false ); + pg_verifymbstr(buf, strlen(buf), false); lowerstr(buf); if (*buf == '\0') continue; diff --git a/contrib/tsearch2/ts_cfg.c b/contrib/tsearch2/ts_cfg.c index d0e18916682..0526ce9879c 100644 --- a/contrib/tsearch2/ts_cfg.c +++ b/contrib/tsearch2/ts_cfg.c @@ -301,14 +301,15 @@ parsetext_v2(TSCfgInfo * cfg, PRSTEXT * prs, char *buf, int4 buflen) LexizeInit(&ldata, cfg); - do { + do + { type = DatumGetInt32(FunctionCall3( - &(prsobj->getlexeme_info), - PointerGetDatum(prsobj->prs), - PointerGetDatum(&lemm), + &(prsobj->getlexeme_info), + PointerGetDatum(prsobj->prs), + PointerGetDatum(&lemm), PointerGetDatum(&lenlemm))); - if (type>0 && lenlemm >= MAXSTRLEN) + if (type > 0 && lenlemm >= MAXSTRLEN) { #ifdef IGNORE_LONGLEXEME ereport(NOTICE, @@ -324,9 +325,9 @@ parsetext_v2(TSCfgInfo * cfg, PRSTEXT * prs, char *buf, int4 buflen) LexizeAddLemm(&ldata, type, lemm, lenlemm); - while( (norms = LexizeExec(&ldata, NULL)) != NULL ) + while ((norms = LexizeExec(&ldata, NULL)) != NULL) { - TSLexeme *ptr = norms; + TSLexeme *ptr = norms; prs->pos++; /* set pos */ @@ -338,7 +339,7 @@ parsetext_v2(TSCfgInfo * cfg, PRSTEXT * prs, char *buf, int4 buflen) prs->words = (TSWORD *) repalloc((void *) prs->words, prs->lenwords * sizeof(TSWORD)); } - if ( ptr->flags & TSL_ADDPOS ) + if (ptr->flags & TSL_ADDPOS) prs->pos++; prs->words[prs->curwords].len = strlen(ptr->lexeme); prs->words[prs->curwords].word = ptr->lexeme; @@ -349,8 +350,8 @@ parsetext_v2(TSCfgInfo * cfg, PRSTEXT * prs, char *buf, int4 buflen) prs->curwords++; } pfree(norms); - } - } while(type>0); + } + } while (type > 0); FunctionCall1( &(prsobj->end_info), @@ -407,30 +408,35 @@ hlfinditem(HLPRSTEXT * prs, QUERYTYPE * query, char *buf, int buflen) } static void -addHLParsedLex(HLPRSTEXT *prs, QUERYTYPE * query, ParsedLex *lexs, TSLexeme *norms) { - ParsedLex *tmplexs; - TSLexeme *ptr; +addHLParsedLex(HLPRSTEXT * prs, QUERYTYPE * query, ParsedLex * lexs, TSLexeme * norms) +{ + ParsedLex *tmplexs; + TSLexeme *ptr; - while( lexs ) { - - if ( lexs->type > 0 ) + while (lexs) + { + + if (lexs->type > 0) hladdword(prs, lexs->lemm, lexs->lenlemm, lexs->type); ptr = norms; - while( ptr && ptr->lexeme ) { + while (ptr && ptr->lexeme) + { hlfinditem(prs, query, ptr->lexeme, strlen(ptr->lexeme)); ptr++; } tmplexs = lexs->next; - pfree( lexs ); + pfree(lexs); lexs = tmplexs; } - if ( norms ) { + if (norms) + { ptr = norms; - while( ptr->lexeme ) { - pfree( ptr->lexeme ); + while (ptr->lexeme) + { + pfree(ptr->lexeme); ptr++; } pfree(norms); @@ -445,8 +451,8 @@ hlparsetext(TSCfgInfo * cfg, HLPRSTEXT * prs, QUERYTYPE * query, char *buf, int4 char *lemm = NULL; WParserInfo *prsobj = findprs(cfg->prs_id); LexizeData ldata; - TSLexeme *norms; - ParsedLex *lexs; + TSLexeme *norms; + ParsedLex *lexs; prsobj->prs = (void *) DatumGetPointer( FunctionCall2( @@ -458,14 +464,15 @@ hlparsetext(TSCfgInfo * cfg, HLPRSTEXT * prs, QUERYTYPE * query, char *buf, int4 LexizeInit(&ldata, cfg); - do { + do + { type = DatumGetInt32(FunctionCall3( - &(prsobj->getlexeme_info), - PointerGetDatum(prsobj->prs), - PointerGetDatum(&lemm), - PointerGetDatum(&lenlemm))); + &(prsobj->getlexeme_info), + PointerGetDatum(prsobj->prs), + PointerGetDatum(&lemm), + PointerGetDatum(&lenlemm))); - if (type>0 && lenlemm >= MAXSTRLEN) + if (type > 0 && lenlemm >= MAXSTRLEN) { #ifdef IGNORE_LONGLEXEME ereport(NOTICE, @@ -481,14 +488,15 @@ hlparsetext(TSCfgInfo * cfg, HLPRSTEXT * prs, QUERYTYPE * query, char *buf, int4 LexizeAddLemm(&ldata, type, lemm, lenlemm); - do { - if ( (norms = LexizeExec(&ldata,&lexs)) != NULL ) + do + { + if ((norms = LexizeExec(&ldata, &lexs)) != NULL) addHLParsedLex(prs, query, lexs, norms); - else + else addHLParsedLex(prs, query, lexs, NULL); - } while( norms ); + } while (norms); - } while( type>0 ); + } while (type > 0); FunctionCall1( &(prsobj->end_info), diff --git a/contrib/tsearch2/ts_lexize.c b/contrib/tsearch2/ts_lexize.c index c90848c6fdf..f2e4904eb7b 100644 --- a/contrib/tsearch2/ts_lexize.c +++ b/contrib/tsearch2/ts_lexize.c @@ -1,5 +1,5 @@ /* - * lexize stream of lexemes + * lexize stream of lexemes * Teodor Sigaev <[email protected]> */ #include "postgres.h" @@ -11,34 +11,39 @@ #include "dict.h" void -LexizeInit(LexizeData *ld, TSCfgInfo *cfg) { +LexizeInit(LexizeData * ld, TSCfgInfo * cfg) +{ ld->cfg = cfg; ld->curDictId = InvalidOid; ld->posDict = 0; ld->towork.head = ld->towork.tail = ld->curSub = NULL; ld->waste.head = ld->waste.tail = NULL; - ld->lastRes=NULL; - ld->tmpRes=NULL; + ld->lastRes = NULL; + ld->tmpRes = NULL; } static void -LPLAddTail(ListParsedLex *list, ParsedLex *newpl) { - if ( list->tail ) { +LPLAddTail(ListParsedLex * list, ParsedLex * newpl) +{ + if (list->tail) + { list->tail->next = newpl; list->tail = newpl; - } else + } + else list->head = list->tail = newpl; newpl->next = NULL; } -static ParsedLex* -LPLRemoveHead(ListParsedLex *list) { - ParsedLex *res = list->head; +static ParsedLex * +LPLRemoveHead(ListParsedLex * list) +{ + ParsedLex *res = list->head; - if ( list->head ) + if (list->head) list->head = list->head->next; - if ( list->head == NULL ) + if (list->head == NULL) list->tail = NULL; return res; @@ -46,10 +51,11 @@ LPLRemoveHead(ListParsedLex *list) { void -LexizeAddLemm(LexizeData *ld, int type, char *lemm, int lenlemm) { - ParsedLex *newpl = (ParsedLex*)palloc( sizeof(ParsedLex) ); +LexizeAddLemm(LexizeData * ld, int type, char *lemm, int lenlemm) +{ + ParsedLex *newpl = (ParsedLex *) palloc(sizeof(ParsedLex)); - newpl = (ParsedLex*)palloc( sizeof(ParsedLex) ); + newpl = (ParsedLex *) palloc(sizeof(ParsedLex)); newpl->type = type; newpl->lemm = lemm; newpl->lenlemm = lenlemm; @@ -58,20 +64,27 @@ LexizeAddLemm(LexizeData *ld, int type, char *lemm, int lenlemm) { } static void -RemoveHead(LexizeData *ld) { +RemoveHead(LexizeData * ld) +{ LPLAddTail(&ld->waste, LPLRemoveHead(&ld->towork)); ld->posDict = 0; } static void -setCorrLex(LexizeData *ld, ParsedLex **correspondLexem) { - if ( correspondLexem ) { +setCorrLex(LexizeData * ld, ParsedLex ** correspondLexem) +{ + if (correspondLexem) + { *correspondLexem = ld->waste.head; - } else { - ParsedLex *tmp, *ptr = ld->waste.head; + } + else + { + ParsedLex *tmp, + *ptr = ld->waste.head; - while(ptr) { + while (ptr) + { tmp = ptr->next; pfree(ptr); ptr = tmp; @@ -81,11 +94,14 @@ setCorrLex(LexizeData *ld, ParsedLex **correspondLexem) { } static void -moveToWaste(LexizeData *ld, ParsedLex *stop) { - bool go = true; - - while( ld->towork.head && go) { - if (ld->towork.head == stop) { +moveToWaste(LexizeData * ld, ParsedLex * stop) +{ + bool go = true; + + while (ld->towork.head && go) + { + if (ld->towork.head == stop) + { ld->curSub = stop->next; go = false; } @@ -94,110 +110,124 @@ moveToWaste(LexizeData *ld, ParsedLex *stop) { } static void -setNewTmpRes(LexizeData *ld, ParsedLex *lex, TSLexeme *res) { - if ( ld->tmpRes ) { - TSLexeme *ptr; - for( ptr=ld->tmpRes; ptr->lexeme; ptr++ ) - pfree( ptr->lexeme ); - pfree( ld->tmpRes ); +setNewTmpRes(LexizeData * ld, ParsedLex * lex, TSLexeme * res) +{ + if (ld->tmpRes) + { + TSLexeme *ptr; + + for (ptr = ld->tmpRes; ptr->lexeme; ptr++) + pfree(ptr->lexeme); + pfree(ld->tmpRes); } ld->tmpRes = res; ld->lastRes = lex; } -TSLexeme* -LexizeExec(LexizeData *ld, ParsedLex **correspondLexem) { - int i; - ListDictionary *map; - DictInfo *dict; - TSLexeme *res; - - if ( ld->curDictId == InvalidOid ) { - /* - * usial mode: dictionary wants only one word, - * but we should keep in mind that we should go through - * all stack +TSLexeme * +LexizeExec(LexizeData * ld, ParsedLex ** correspondLexem) +{ + int i; + ListDictionary *map; + DictInfo *dict; + TSLexeme *res; + + if (ld->curDictId == InvalidOid) + { + /* + * usial mode: dictionary wants only one word, but we should keep in + * mind that we should go through all stack */ - while( ld->towork.head ) { - ParsedLex *curVal = ld->towork.head; + while (ld->towork.head) + { + ParsedLex *curVal = ld->towork.head; map = ld->cfg->map + curVal->type; - if (curVal->type == 0 || curVal->type >= ld->cfg->len || map->len == 0 ) { + if (curVal->type == 0 || curVal->type >= ld->cfg->len || map->len == 0) + { /* skip this type of lexeme */ RemoveHead(ld); continue; } - for (i = ld->posDict; i < map->len; i++) { + for (i = ld->posDict; i < map->len; i++) + { dict = finddict(DatumGetObjectId(map->dict_id[i])); ld->dictState.isend = ld->dictState.getnext = false; ld->dictState.private = NULL; - res = (TSLexeme *) DatumGetPointer( FunctionCall4( - &(dict->lexize_info), - PointerGetDatum(dict->dictionary), - PointerGetDatum(curVal->lemm), - Int32GetDatum(curVal->lenlemm), - PointerGetDatum(&ld->dictState) - )); - - if ( ld->dictState.getnext ) { - /* - * dictinary wants next word, so setup and store - * current position and go to multiword mode + res = (TSLexeme *) DatumGetPointer(FunctionCall4( + &(dict->lexize_info), + PointerGetDatum(dict->dictionary), + PointerGetDatum(curVal->lemm), + Int32GetDatum(curVal->lenlemm), + PointerGetDatum(&ld->dictState) + )); + + if (ld->dictState.getnext) + { + /* + * dictinary wants next word, so setup and store current + * position and go to multiword mode */ - + ld->curDictId = DatumGetObjectId(map->dict_id[i]); - ld->posDict = i+1; + ld->posDict = i + 1; ld->curSub = curVal->next; - if ( res ) + if (res) setNewTmpRes(ld, curVal, res); return LexizeExec(ld, correspondLexem); } - if (!res) /* dictionary doesn't know this lexeme */ + if (!res) /* dictionary doesn't know this lexeme */ continue; - + RemoveHead(ld); setCorrLex(ld, correspondLexem); return res; } RemoveHead(ld); - } - } else { /* curDictId is valid */ + } + } + else + { /* curDictId is valid */ dict = finddict(ld->curDictId); - + /* * Dictionary ld->curDictId asks us about following words */ - while( ld->curSub ) { - ParsedLex *curVal = ld->curSub; + while (ld->curSub) + { + ParsedLex *curVal = ld->curSub; map = ld->cfg->map + curVal->type; - if (curVal->type != 0) { - bool dictExists = false; + if (curVal->type != 0) + { + bool dictExists = false; - if (curVal->type >= ld->cfg->len || map->len == 0 ) { + if (curVal->type >= ld->cfg->len || map->len == 0) + { /* skip this type of lexeme */ ld->curSub = curVal->next; continue; } /* - * We should be sure that current type of lexeme is recognized by - * our dictinonary: we just check is it exist in - * list of dictionaries ? + * We should be sure that current type of lexeme is recognized + * by our dictinonary: we just check is it exist in list of + * dictionaries ? */ - for(i=0;i < map->len && !dictExists; i++) - if ( ld->curDictId == DatumGetObjectId(map->dict_id[i]) ) + for (i = 0; i < map->len && !dictExists; i++) + if (ld->curDictId == DatumGetObjectId(map->dict_id[i])) dictExists = true; - if ( !dictExists ) { + if (!dictExists) + { /* * Dictionary can't work with current tpe of lexeme, * return to basic mode and redo all stored lexemes @@ -205,38 +235,43 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem) { ld->curDictId = InvalidOid; return LexizeExec(ld, correspondLexem); } - } - - ld->dictState.isend = (curVal->type==0) ? true : false; + } + + ld->dictState.isend = (curVal->type == 0) ? true : false; ld->dictState.getnext = false; - res = (TSLexeme *) DatumGetPointer( FunctionCall4( - &(dict->lexize_info), - PointerGetDatum(dict->dictionary), - PointerGetDatum(curVal->lemm), - Int32GetDatum(curVal->lenlemm), - PointerGetDatum(&ld->dictState) - )); + res = (TSLexeme *) DatumGetPointer(FunctionCall4( + &(dict->lexize_info), + PointerGetDatum(dict->dictionary), + PointerGetDatum(curVal->lemm), + Int32GetDatum(curVal->lenlemm), + PointerGetDatum(&ld->dictState) + )); - if ( ld->dictState.getnext ) { + if (ld->dictState.getnext) + { /* Dictionary wants one more */ ld->curSub = curVal->next; - if ( res ) + if (res) setNewTmpRes(ld, curVal, res); continue; } - if ( res || ld->tmpRes ) { + if (res || ld->tmpRes) + { /* - * Dictionary normalizes lexemes, - * so we remove from stack all used lexemes , - * return to basic mode and redo end of stack (if it exists) + * Dictionary normalizes lexemes, so we remove from stack all + * used lexemes , return to basic mode and redo end of stack + * (if it exists) */ - if ( res ) { - moveToWaste( ld, ld->curSub ); - } else { + if (res) + { + moveToWaste(ld, ld->curSub); + } + else + { res = ld->tmpRes; - moveToWaste( ld, ld->lastRes ); + moveToWaste(ld, ld->lastRes); } /* reset to initial state */ @@ -248,14 +283,15 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem) { return res; } - /* Dict don't want next lexem and didn't recognize anything, - redo from ld->towork.head */ + /* + * Dict don't want next lexem and didn't recognize anything, redo + * from ld->towork.head + */ ld->curDictId = InvalidOid; return LexizeExec(ld, correspondLexem); - } + } } setCorrLex(ld, correspondLexem); return NULL; } - diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c index e8be69f4586..203c977e4ea 100644 --- a/contrib/tsearch2/ts_locale.c +++ b/contrib/tsearch2/ts_locale.c @@ -70,54 +70,59 @@ char2wchar(wchar_t *to, const char *from, size_t len) return mbstowcs(to, from, len); } - -#endif /* WIN32 */ +#endif /* WIN32 */ int -_t_isalpha( const char *ptr ) { - wchar_t character; +_t_isalpha(const char *ptr) +{ + wchar_t character; char2wchar(&character, ptr, 1); - return iswalpha( (wint_t)character ); + return iswalpha((wint_t) character); } int -_t_isprint( const char *ptr ) { - wchar_t character; +_t_isprint(const char *ptr) +{ + wchar_t character; char2wchar(&character, ptr, 1); - return iswprint( (wint_t)character ); + return iswprint((wint_t) character); } - -#endif /* TS_USE_WIDE */ +#endif /* TS_USE_WIDE */ char * lowerstr(char *str) { - char *ptr = str; + char *ptr = str; #ifdef TS_USE_WIDE + /* * Use wide char code only when max encoding length > 1 and ctype != C. * Some operating systems fail with multi-byte encodings and a C locale. * Also, for a C locale there is no need to process as multibyte. From * backend/utils/adt/oracle_compat.c Teodor */ - if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c()) { - wchar_t *wstr, *wptr; - int len = strlen(str); - - wptr = wstr = (wchar_t *) palloc(sizeof(wchar_t) * (len+1)); - char2wchar(wstr, str, len+1); - while (*wptr) { - *wptr = towlower((wint_t) *wptr); - wptr++; - } - wchar2char(str, wstr, len); - pfree( wstr ); - } else + if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c()) + { + wchar_t *wstr, + *wptr; + int len = strlen(str); + + wptr = wstr = (wchar_t *) palloc(sizeof(wchar_t) * (len + 1)); + char2wchar(wstr, str, len + 1); + while (*wptr) + { + *wptr = towlower((wint_t) *wptr); + wptr++; + } + wchar2char(str, wstr, len); + pfree(wstr); + } + else #endif while (*ptr) { @@ -126,4 +131,3 @@ lowerstr(char *str) } return str; } - diff --git a/contrib/tsearch2/ts_locale.h b/contrib/tsearch2/ts_locale.h index 2c0c52b23f9..e2e22481370 100644 --- a/contrib/tsearch2/ts_locale.h +++ b/contrib/tsearch2/ts_locale.h @@ -35,44 +35,44 @@ size_t wchar2char(char *to, const wchar_t *from, size_t len); size_t char2wchar(wchar_t *to, const char *from, size_t len); -#else /* WIN32 */ +#else /* WIN32 */ /* correct mbstowcs */ #define char2wchar mbstowcs #define wchar2char wcstombs #endif /* WIN32 */ -#define t_isdigit(x) ( pg_mblen(x)==1 && isdigit( TOUCHAR(x) ) ) -#define t_isspace(x) ( pg_mblen(x)==1 && isspace( TOUCHAR(x) ) ) -extern int _t_isalpha( const char *ptr ); -#define t_isalpha(x) ( (pg_mblen(x)==1) ? isalpha( TOUCHAR(x) ) : _t_isalpha(x) ) -extern int _t_isprint( const char *ptr ); -#define t_isprint(x) ( (pg_mblen(x)==1) ? isprint( TOUCHAR(x) ) : _t_isprint(x) ) +#define t_isdigit(x) ( pg_mblen(x)==1 && isdigit( TOUCHAR(x) ) ) +#define t_isspace(x) ( pg_mblen(x)==1 && isspace( TOUCHAR(x) ) ) +extern int _t_isalpha(const char *ptr); + +#define t_isalpha(x) ( (pg_mblen(x)==1) ? isalpha( TOUCHAR(x) ) : _t_isalpha(x) ) +extern int _t_isprint(const char *ptr); + +#define t_isprint(x) ( (pg_mblen(x)==1) ? isprint( TOUCHAR(x) ) : _t_isprint(x) ) /* - * t_iseq() should be called only for ASCII symbols + * t_iseq() should be called only for ASCII symbols */ -#define t_iseq(x,c) ( (pg_mblen(x)==1) ? ( TOUCHAR(x) == ((unsigned char)(c)) ) : false ) +#define t_iseq(x,c) ( (pg_mblen(x)==1) ? ( TOUCHAR(x) == ((unsigned char)(c)) ) : false ) #define COPYCHAR(d,s) do { \ int lll = pg_mblen( s ); \ \ - while( lll-- ) \ + while( lll-- ) \ TOUCHAR((d)+lll) = TOUCHAR((s)+lll); \ } while(0) - -#else /* not def TS_USE_WIDE */ - -#define t_isdigit(x) isdigit( TOUCHAR(x) ) -#define t_isspace(x) isspace( TOUCHAR(x) ) -#define t_isalpha(x) isalpha( TOUCHAR(x) ) -#define t_isprint(x) isprint( TOUCHAR(x) ) -#define t_iseq(x,c) ( TOUCHAR(x) == ((unsigned char)(c)) ) +#else /* not def TS_USE_WIDE */ -#define COPYCHAR(d,s) TOUCHAR(d) = TOUCHAR(s) +#define t_isdigit(x) isdigit( TOUCHAR(x) ) +#define t_isspace(x) isspace( TOUCHAR(x) ) +#define t_isalpha(x) isalpha( TOUCHAR(x) ) +#define t_isprint(x) isprint( TOUCHAR(x) ) +#define t_iseq(x,c) ( TOUCHAR(x) == ((unsigned char)(c)) ) +#define COPYCHAR(d,s) TOUCHAR(d) = TOUCHAR(s) #endif -char* lowerstr(char *str); +char *lowerstr(char *str); #endif /* __TSLOCALE_H__ */ diff --git a/contrib/tsearch2/ts_stat.c b/contrib/tsearch2/ts_stat.c index 3a90fe5a192..17d1ccb0505 100644 --- a/contrib/tsearch2/ts_stat.c +++ b/contrib/tsearch2/ts_stat.c @@ -477,7 +477,8 @@ ts_stat_sql(text *txt, text *ws) buf = VARDATA(ws); while (buf - VARDATA(ws) < VARSIZE(ws) - VARHDRSZ) { - if ( pg_mblen(buf) == 1 ) { + if (pg_mblen(buf) == 1) + { switch (*buf) { case 'A': @@ -500,7 +501,7 @@ ts_stat_sql(text *txt, text *ws) stat->weight |= 0; } } - buf+=pg_mblen(buf); + buf += pg_mblen(buf); } } diff --git a/contrib/tsearch2/tsvector.c b/contrib/tsearch2/tsvector.c index 7e8dd8a772b..a4a9d57d645 100644 --- a/contrib/tsearch2/tsvector.c +++ b/contrib/tsearch2/tsvector.c @@ -165,13 +165,13 @@ uniqueentry(WordEntryIN * a, int4 l, char *buf, int4 *outbuflen) } #define WAITWORD 1 -#define WAITENDWORD 2 +#define WAITENDWORD 2 #define WAITNEXTCHAR 3 #define WAITENDCMPLX 4 -#define WAITPOSINFO 5 +#define WAITPOSINFO 5 #define INPOSINFO 6 #define WAITPOSDELIM 7 -#define WAITCHARCMPLX 8 +#define WAITCHARCMPLX 8 #define RESIZEPRSBUF \ do { \ @@ -200,9 +200,9 @@ gettoken_tsvector(TI_IN_STATE * state) { if (*(state->prsbuf) == '\0') return 0; - else if ( t_iseq(state->prsbuf, '\'') ) + else if (t_iseq(state->prsbuf, '\'')) state->state = WAITENDCMPLX; - else if ( t_iseq(state->prsbuf, '\\') ) + else if (t_iseq(state->prsbuf, '\\')) { state->state = WAITNEXTCHAR; oldstate = WAITENDWORD; @@ -214,7 +214,7 @@ gettoken_tsvector(TI_IN_STATE * state) else if (!t_isspace(state->prsbuf)) { COPYCHAR(state->curpos, state->prsbuf); - state->curpos+=pg_mblen(state->prsbuf); + state->curpos += pg_mblen(state->prsbuf); state->state = WAITENDWORD; } } @@ -228,18 +228,18 @@ gettoken_tsvector(TI_IN_STATE * state) { RESIZEPRSBUF; COPYCHAR(state->curpos, state->prsbuf); - state->curpos+=pg_mblen(state->prsbuf); + state->curpos += pg_mblen(state->prsbuf); state->state = oldstate; } } else if (state->state == WAITENDWORD) { - if ( t_iseq(state->prsbuf, '\\') ) + if (t_iseq(state->prsbuf, '\\')) { state->state = WAITNEXTCHAR; oldstate = WAITENDWORD; } - else if ( t_isspace(state->prsbuf) || *(state->prsbuf) == '\0' || + else if (t_isspace(state->prsbuf) || *(state->prsbuf) == '\0' || (state->oprisdelim && ISOPERATOR(state->prsbuf))) { RESIZEPRSBUF; @@ -250,7 +250,7 @@ gettoken_tsvector(TI_IN_STATE * state) *(state->curpos) = '\0'; return 1; } - else if ( t_iseq(state->prsbuf,':') ) + else if (t_iseq(state->prsbuf, ':')) { if (state->curpos == state->word) ereport(ERROR, @@ -266,15 +266,16 @@ gettoken_tsvector(TI_IN_STATE * state) { RESIZEPRSBUF; COPYCHAR(state->curpos, state->prsbuf); - state->curpos+=pg_mblen(state->prsbuf); + state->curpos += pg_mblen(state->prsbuf); } } else if (state->state == WAITENDCMPLX) { - if ( t_iseq(state->prsbuf, '\'') ) { - state->state = WAITCHARCMPLX; + if (t_iseq(state->prsbuf, '\'')) + { + state->state = WAITCHARCMPLX; } - else if ( t_iseq(state->prsbuf, '\\') ) + else if (t_iseq(state->prsbuf, '\\')) { state->state = WAITNEXTCHAR; oldstate = WAITENDCMPLX; @@ -287,18 +288,20 @@ gettoken_tsvector(TI_IN_STATE * state) { RESIZEPRSBUF; COPYCHAR(state->curpos, state->prsbuf); - state->curpos+=pg_mblen(state->prsbuf); + state->curpos += pg_mblen(state->prsbuf); } } else if (state->state == WAITCHARCMPLX) { - if ( t_iseq(state->prsbuf, '\'') ) + if (t_iseq(state->prsbuf, '\'')) { RESIZEPRSBUF; COPYCHAR(state->curpos, state->prsbuf); - state->curpos+=pg_mblen(state->prsbuf); + state->curpos += pg_mblen(state->prsbuf); state->state = WAITENDCMPLX; - } else { + } + else + { RESIZEPRSBUF; *(state->curpos) = '\0'; if (state->curpos == state->word) @@ -312,12 +315,12 @@ gettoken_tsvector(TI_IN_STATE * state) } else state->state = WAITPOSINFO; - continue; /* recheck current character */ + continue; /* recheck current character */ } } else if (state->state == WAITPOSINFO) { - if ( t_iseq(state->prsbuf, ':') ) + if (t_iseq(state->prsbuf, ':')) state->state = INPOSINFO; else return 1; @@ -353,9 +356,9 @@ gettoken_tsvector(TI_IN_STATE * state) } else if (state->state == WAITPOSDELIM) { - if ( t_iseq(state->prsbuf, ',') ) + if (t_iseq(state->prsbuf, ',')) state->state = INPOSINFO; - else if ( t_iseq(state->prsbuf, 'a') || t_iseq(state->prsbuf, 'A') || t_iseq(state->prsbuf, '*') ) + else if (t_iseq(state->prsbuf, 'a') || t_iseq(state->prsbuf, 'A') || t_iseq(state->prsbuf, '*')) { if (WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)])) ereport(ERROR, @@ -363,7 +366,7 @@ gettoken_tsvector(TI_IN_STATE * state) errmsg("syntax error"))); WEP_SETWEIGHT(state->pos[*(uint16 *) (state->pos)], 3); } - else if ( t_iseq(state->prsbuf, 'b') || t_iseq(state->prsbuf, 'B') ) + else if (t_iseq(state->prsbuf, 'b') || t_iseq(state->prsbuf, 'B')) { if (WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)])) ereport(ERROR, @@ -371,7 +374,7 @@ gettoken_tsvector(TI_IN_STATE * state) errmsg("syntax error"))); WEP_SETWEIGHT(state->pos[*(uint16 *) (state->pos)], 2); } - else if ( t_iseq(state->prsbuf, 'c') || t_iseq(state->prsbuf, 'C') ) + else if (t_iseq(state->prsbuf, 'c') || t_iseq(state->prsbuf, 'C')) { if (WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)])) ereport(ERROR, @@ -379,7 +382,7 @@ gettoken_tsvector(TI_IN_STATE * state) errmsg("syntax error"))); WEP_SETWEIGHT(state->pos[*(uint16 *) (state->pos)], 1); } - else if ( t_iseq(state->prsbuf, 'd') || t_iseq(state->prsbuf, 'D') ) + else if (t_iseq(state->prsbuf, 'd') || t_iseq(state->prsbuf, 'D')) { if (WEP_GETWEIGHT(state->pos[*(uint16 *) (state->pos)])) ereport(ERROR, @@ -400,7 +403,7 @@ gettoken_tsvector(TI_IN_STATE * state) elog(ERROR, "internal error"); /* get next char */ - state->prsbuf+=pg_mblen(state->prsbuf); + state->prsbuf += pg_mblen(state->prsbuf); } return 0; @@ -423,7 +426,7 @@ tsvector_in(PG_FUNCTION_ARGS) SET_FUNCOID(); - pg_verifymbstr( buf, strlen(buf), false ); + pg_verifymbstr(buf, strlen(buf), false); state.prsbuf = buf; state.len = 32; state.word = (char *) palloc(state.len); @@ -517,13 +520,14 @@ tsvector_out(PG_FUNCTION_ARGS) lenbuf = 0, pp; WordEntry *ptr = ARRPTR(out); - char *curbegin, *curin, + char *curbegin, + *curin, *curout; lenbuf = out->size * 2 /* '' */ + out->size - 1 /* space */ + 2 /* \0 */ ; for (i = 0; i < out->size; i++) { - lenbuf += ptr[i].len * 2 * pg_database_encoding_max_length()/* for escape */ ; + lenbuf += ptr[i].len * 2 * pg_database_encoding_max_length() /* for escape */ ; if (ptr[i].haspos) lenbuf += 7 * POSDATALEN(out, &(ptr[i])); } @@ -535,10 +539,11 @@ tsvector_out(PG_FUNCTION_ARGS) if (i != 0) *curout++ = ' '; *curout++ = '\''; - while ( curin-curbegin < ptr->len ) + while (curin - curbegin < ptr->len) { - int len = pg_mblen(curin); - if ( t_iseq(curin, '\'') ) + int len = pg_mblen(curin); + + if (t_iseq(curin, '\'')) { int4 pos = curout - outbuf; @@ -546,7 +551,7 @@ tsvector_out(PG_FUNCTION_ARGS) curout = outbuf + pos; *curout++ = '\''; } - while(len--) + while (len--) *curout++ = *curin++; } *curout++ = '\''; @@ -983,36 +988,49 @@ silly_cmp_tsvector(const tsvector * a, const tsvector * b) { WordEntry *aptr = ARRPTR(a); WordEntry *bptr = ARRPTR(b); - int i = 0; - int res; + int i = 0; + int res; - for(i=0;i<a->size;i++) { - if ( aptr->haspos != bptr->haspos ) { - return ( aptr->haspos > bptr->haspos ) ? -1 : 1; - } else if ( aptr->len != bptr->len ) { - return ( aptr->len > bptr->len ) ? -1 : 1; - } else if ( (res=strncmp(STRPTR(a) + aptr->pos, STRPTR(b) + bptr->pos, bptr->len))!= 0 ) { + for (i = 0; i < a->size; i++) + { + if (aptr->haspos != bptr->haspos) + { + return (aptr->haspos > bptr->haspos) ? -1 : 1; + } + else if (aptr->len != bptr->len) + { + return (aptr->len > bptr->len) ? -1 : 1; + } + else if ((res = strncmp(STRPTR(a) + aptr->pos, STRPTR(b) + bptr->pos, bptr->len)) != 0) + { return res; - } else if ( aptr->haspos ) { - WordEntryPos *ap = POSDATAPTR(a, aptr); - WordEntryPos *bp = POSDATAPTR(b, bptr); - int j; - - if ( POSDATALEN(a, aptr) != POSDATALEN(b, bptr) ) - return ( POSDATALEN(a, aptr) > POSDATALEN(b, bptr) ) ? -1 : 1; - - for(j=0;j<POSDATALEN(a, aptr);j++) { - if ( WEP_GETPOS(*ap) != WEP_GETPOS(*bp) ) { - return ( WEP_GETPOS(*ap) > WEP_GETPOS(*bp) ) ? -1 : 1; - } else if ( WEP_GETWEIGHT(*ap) != WEP_GETWEIGHT(*bp) ) { - return ( WEP_GETWEIGHT(*ap) > WEP_GETWEIGHT(*bp) ) ? -1 : 1; + } + else if (aptr->haspos) + { + WordEntryPos *ap = POSDATAPTR(a, aptr); + WordEntryPos *bp = POSDATAPTR(b, bptr); + int j; + + if (POSDATALEN(a, aptr) != POSDATALEN(b, bptr)) + return (POSDATALEN(a, aptr) > POSDATALEN(b, bptr)) ? -1 : 1; + + for (j = 0; j < POSDATALEN(a, aptr); j++) + { + if (WEP_GETPOS(*ap) != WEP_GETPOS(*bp)) + { + return (WEP_GETPOS(*ap) > WEP_GETPOS(*bp)) ? -1 : 1; + } + else if (WEP_GETWEIGHT(*ap) != WEP_GETWEIGHT(*bp)) + { + return (WEP_GETWEIGHT(*ap) > WEP_GETWEIGHT(*bp)) ? -1 : 1; } ap++, bp++; } } - aptr++; bptr++; + aptr++; + bptr++; } } diff --git a/contrib/tsearch2/tsvector.h b/contrib/tsearch2/tsvector.h index df03436a0a9..48bae42de0d 100644 --- a/contrib/tsearch2/tsvector.h +++ b/contrib/tsearch2/tsvector.h @@ -49,17 +49,17 @@ typedef uint16 WordEntryPos; /* * Structure of tsvector datatype: - * 1) int4 len - varlena's length + * 1) int4 len - varlena's length * 2) int4 size - number of lexemes or WordEntry array, which is the same * 3) Array of WordEntry - sorted array, comparison based on word's length * and strncmp(). WordEntry->pos points number of * bytes from end of WordEntry array to start of * corresponding lexeme. * 4) Lexeme's storage: - * SHORTALIGNED(lexeme) and position information if it exists - * Position information: first int2 - is a number of positions and it - * follows array of WordEntryPos - */ + * SHORTALIGNED(lexeme) and position information if it exists + * Position information: first int2 - is a number of positions and it + * follows array of WordEntryPos + */ typedef struct { diff --git a/contrib/tsearch2/wordparser/parser.c b/contrib/tsearch2/wordparser/parser.c index 2efb4937524..fced41ec5e8 100644 --- a/contrib/tsearch2/wordparser/parser.c +++ b/contrib/tsearch2/wordparser/parser.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/wordparser/parser.c,v 1.10 2006/03/11 04:38:30 momjian Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/wordparser/parser.c,v 1.11 2006/10/04 00:29:47 momjian Exp $ */ #include "postgres.h" @@ -458,7 +458,7 @@ static TParserStateActionItem actionTPS_InVerVersion[] = { static TParserStateActionItem actionTPS_InSVerVersion[] = { {p_isEOF, 0, A_POP, TPS_Null, 0, NULL}, - {p_isdigit, 0, A_BINGO|A_CLRALL, TPS_InUnsignedInt, SPACE, NULL}, + {p_isdigit, 0, A_BINGO | A_CLRALL, TPS_InUnsignedInt, SPACE, NULL}, {NULL, 0, A_NEXT, TPS_Null, 0, NULL} }; @@ -613,7 +613,7 @@ static TParserStateActionItem actionTPS_InTagEnd[] = { static TParserStateActionItem actionTPS_InCommentFirst[] = { {p_isEOF, 0, A_POP, TPS_Null, 0, NULL}, {p_iseqC, '-', A_NEXT, TPS_InCommentLast, 0, NULL}, - /* <!DOCTYPE ...>*/ + /* <!DOCTYPE ...> */ {p_iseqC, 'D', A_NEXT, TPS_InTag, 0, NULL}, {p_iseqC, 'd', A_NEXT, TPS_InTag, 0, NULL}, {NULL, 0, A_POP, TPS_Null, 0, NULL} @@ -753,10 +753,10 @@ static TParserStateActionItem actionTPS_InPathFirstFirst[] = { }; static TParserStateActionItem actionTPS_InPathSecond[] = { - {p_isEOF, 0, A_BINGO|A_CLEAR, TPS_Base, FILEPATH, NULL}, - {p_iseqC, '/', A_NEXT|A_PUSH, TPS_InFileFirst, 0, NULL}, - {p_iseqC, '/', A_BINGO|A_CLEAR, TPS_Base, FILEPATH, NULL}, - {p_isspace, 0, A_BINGO|A_CLEAR, TPS_Base, FILEPATH, NULL}, + {p_isEOF, 0, A_BINGO | A_CLEAR, TPS_Base, FILEPATH, NULL}, + {p_iseqC, '/', A_NEXT | A_PUSH, TPS_InFileFirst, 0, NULL}, + {p_iseqC, '/', A_BINGO | A_CLEAR, TPS_Base, FILEPATH, NULL}, + {p_isspace, 0, A_BINGO | A_CLEAR, TPS_Base, FILEPATH, NULL}, {NULL, 0, A_POP, TPS_Null, 0, NULL} }; diff --git a/contrib/tsearch2/wparser.c b/contrib/tsearch2/wparser.c index eb990817301..efe449451fd 100644 --- a/contrib/tsearch2/wparser.c +++ b/contrib/tsearch2/wparser.c @@ -347,8 +347,8 @@ typedef struct typedef struct { - int cur; - int len; + int cur; + int len; LexemeEntry *list; } PrsStorage; diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index cc830322193..11349eff0b0 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -671,7 +671,7 @@ xpath_table(PG_FUNCTION_ARGS) * document */ int had_values; /* To determine end of nodeset results */ - StringInfoData query_buf; + StringInfoData query_buf; /* We only have a valid tuple description in table function mode */ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index d3b06d8ae63..d0f4b3d3825 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -16,7 +16,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.110 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.111 2006/10/04 00:29:47 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1294,7 +1294,7 @@ slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull) { if (tuple == NULL) /* internal error */ elog(ERROR, "cannot extract system attribute from virtual tuple"); - if (slot->tts_mintuple) /* internal error */ + if (slot->tts_mintuple) /* internal error */ elog(ERROR, "cannot extract system attribute from minimal tuple"); return heap_getsysattr(tuple, attnum, tupleDesc, isnull); } @@ -1480,7 +1480,7 @@ slot_attisnull(TupleTableSlot *slot, int attnum) { if (tuple == NULL) /* internal error */ elog(ERROR, "cannot extract system attribute from virtual tuple"); - if (slot->tts_mintuple) /* internal error */ + if (slot->tts_mintuple) /* internal error */ elog(ERROR, "cannot extract system attribute from minimal tuple"); return heap_attisnull(tuple, attnum); } diff --git a/src/backend/access/common/printtup.c b/src/backend/access/common/printtup.c index 82117e5fe6e..ab2d8b4771d 100644 --- a/src/backend/access/common/printtup.c +++ b/src/backend/access/common/printtup.c @@ -9,7 +9,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/printtup.c,v 1.98 2006/08/12 02:52:03 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/printtup.c,v 1.99 2006/10/04 00:29:47 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -127,8 +127,8 @@ printtup_startup(DestReceiver *self, int operation, TupleDesc typeinfo) } /* - * If we are supposed to emit row descriptions, - * then send the tuple descriptor of the tuples. + * If we are supposed to emit row descriptions, then send the tuple + * descriptor of the tuples. */ if (myState->sendDescrip) SendRowDescriptionMessage(typeinfo, diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 8506070f101..0bcda36c06a 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.1 2006/07/03 22:45:36 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.2 2006/10/04 00:29:47 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -59,7 +59,7 @@ transformRelOptions(Datum oldOptions, List *defList, /* Copy any oldOptions that aren't to be replaced */ if (oldOptions != (Datum) 0) { - ArrayType *array = DatumGetArrayTypeP(oldOptions); + ArrayType *array = DatumGetArrayTypeP(oldOptions); Datum *oldoptions; int noldoptions; int i; @@ -71,15 +71,15 @@ transformRelOptions(Datum oldOptions, List *defList, for (i = 0; i < noldoptions; i++) { - text *oldoption = DatumGetTextP(oldoptions[i]); - char *text_str = (char *) VARATT_DATA(oldoption); - int text_len = VARATT_SIZE(oldoption) - VARHDRSZ; + text *oldoption = DatumGetTextP(oldoptions[i]); + char *text_str = (char *) VARATT_DATA(oldoption); + int text_len = VARATT_SIZE(oldoption) - VARHDRSZ; /* Search for a match in defList */ foreach(cell, defList) { - DefElem *def = lfirst(cell); - int kw_len = strlen(def->defname); + DefElem *def = lfirst(cell); + int kw_len = strlen(def->defname); if (text_len > kw_len && text_str[kw_len] == '=' && pg_strncasecmp(text_str, def->defname, kw_len) == 0) @@ -96,33 +96,33 @@ transformRelOptions(Datum oldOptions, List *defList, } /* - * If CREATE/SET, add new options to array; if RESET, just check that - * the user didn't say RESET (option=val). (Must do this because the - * grammar doesn't enforce it.) + * If CREATE/SET, add new options to array; if RESET, just check that the + * user didn't say RESET (option=val). (Must do this because the grammar + * doesn't enforce it.) */ foreach(cell, defList) { - DefElem *def = lfirst(cell); + DefElem *def = lfirst(cell); if (isReset) { if (def->arg != NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("RESET must not include values for parameters"))); + errmsg("RESET must not include values for parameters"))); } else { - text *t; + text *t; const char *value; - Size len; + Size len; if (ignoreOids && pg_strcasecmp(def->defname, "oids") == 0) continue; /* - * Flatten the DefElem into a text string like "name=arg". - * If we have just "name", assume "name=true" is meant. + * Flatten the DefElem into a text string like "name=arg". If we + * have just "name", assume "name=true" is meant. */ if (def->arg != NULL) value = defGetString(def); @@ -163,10 +163,10 @@ transformRelOptions(Datum oldOptions, List *defList, * containing the corresponding value, or NULL if the keyword does not appear. */ void -parseRelOptions(Datum options, int numkeywords, const char * const *keywords, +parseRelOptions(Datum options, int numkeywords, const char *const * keywords, char **values, bool validate) { - ArrayType *array; + ArrayType *array; Datum *optiondatums; int noptions; int i; @@ -187,21 +187,21 @@ parseRelOptions(Datum options, int numkeywords, const char * const *keywords, for (i = 0; i < noptions; i++) { - text *optiontext = DatumGetTextP(optiondatums[i]); - char *text_str = (char *) VARATT_DATA(optiontext); - int text_len = VARATT_SIZE(optiontext) - VARHDRSZ; - int j; + text *optiontext = DatumGetTextP(optiondatums[i]); + char *text_str = (char *) VARATT_DATA(optiontext); + int text_len = VARATT_SIZE(optiontext) - VARHDRSZ; + int j; /* Search for a match in keywords */ for (j = 0; j < numkeywords; j++) { - int kw_len = strlen(keywords[j]); + int kw_len = strlen(keywords[j]); if (text_len > kw_len && text_str[kw_len] == '=' && pg_strncasecmp(text_str, keywords[j], kw_len) == 0) { - char *value; - int value_len; + char *value; + int value_len; if (values[j] && validate) ereport(ERROR, @@ -218,8 +218,8 @@ parseRelOptions(Datum options, int numkeywords, const char * const *keywords, } if (j >= numkeywords && validate) { - char *s; - char *p; + char *s; + char *p; s = DatumGetCString(DirectFunctionCall1(textout, optiondatums[i])); p = strchr(s, '='); @@ -240,17 +240,17 @@ bytea * default_reloptions(Datum reloptions, bool validate, int minFillfactor, int defaultFillfactor) { - static const char * const default_keywords[1] = { "fillfactor" }; - char *values[1]; - int32 fillfactor; + static const char *const default_keywords[1] = {"fillfactor"}; + char *values[1]; + int32 fillfactor; StdRdOptions *result; parseRelOptions(reloptions, 1, default_keywords, values, validate); /* * If no options, we can just return NULL rather than doing anything. - * (defaultFillfactor is thus not used, but we require callers to pass - * it anyway since we would need it if more options were added.) + * (defaultFillfactor is thus not used, but we require callers to pass it + * anyway since we would need it if more options were added.) */ if (values[0] == NULL) return NULL; diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c index 911cf629832..33a8b44a14d 100644 --- a/src/backend/access/gin/ginarrayproc.c +++ b/src/backend/access/gin/ginarrayproc.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginarrayproc.c - * support functions for GIN's indexing of any array + * support functions for GIN's indexing of any array * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginarrayproc.c,v 1.5 2006/09/10 20:14:20 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginarrayproc.c,v 1.6 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -23,64 +23,73 @@ #define GinContainedStrategy 3 #define GinEqualStrategy 4 -#define ARRAYCHECK(x) do { \ +#define ARRAYCHECK(x) do { \ if ( ARR_HASNULL(x) ) \ - ereport(ERROR, \ - (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \ - errmsg("array must not contain nulls"))); \ -} while(0) + ereport(ERROR, \ + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), \ + errmsg("array must not contain nulls"))); \ +} while(0) /* * Function used as extractValue and extractQuery both */ Datum -ginarrayextract(PG_FUNCTION_ARGS) { - ArrayType *array; - uint32 *nentries = (uint32*)PG_GETARG_POINTER(1); - Datum *entries = NULL; - int16 elmlen; - bool elmbyval; - char elmalign; +ginarrayextract(PG_FUNCTION_ARGS) +{ + ArrayType *array; + uint32 *nentries = (uint32 *) PG_GETARG_POINTER(1); + Datum *entries = NULL; + int16 elmlen; + bool elmbyval; + char elmalign; - /* we should guarantee that array will not be destroyed during all operation */ + /* + * we should guarantee that array will not be destroyed during all + * operation + */ array = PG_GETARG_ARRAYTYPE_P_COPY(0); ARRAYCHECK(array); get_typlenbyvalalign(ARR_ELEMTYPE(array), - &elmlen, &elmbyval, &elmalign); + &elmlen, &elmbyval, &elmalign); deconstruct_array(array, - ARR_ELEMTYPE(array), - elmlen, elmbyval, elmalign, - &entries, NULL, (int*)nentries); + ARR_ELEMTYPE(array), + elmlen, elmbyval, elmalign, + &entries, NULL, (int *) nentries); /* we should not free array, entries[i] points into it */ PG_RETURN_POINTER(entries); } Datum -ginarrayconsistent(PG_FUNCTION_ARGS) { - bool *check = (bool*)PG_GETARG_POINTER(0); - StrategyNumber strategy = PG_GETARG_UINT16(1); - ArrayType *query = PG_GETARG_ARRAYTYPE_P(2); - int res, i, nentries; +ginarrayconsistent(PG_FUNCTION_ARGS) +{ + bool *check = (bool *) PG_GETARG_POINTER(0); + StrategyNumber strategy = PG_GETARG_UINT16(1); + ArrayType *query = PG_GETARG_ARRAYTYPE_P(2); + int res, + i, + nentries; /* ARRAYCHECK was already done by previous ginarrayextract call */ - switch( strategy ) { + switch (strategy) + { case GinOverlapStrategy: case GinContainedStrategy: - /* at least one element in check[] is true, so result = true */ + /* at least one element in check[] is true, so result = true */ res = TRUE; break; case GinContainsStrategy: case GinEqualStrategy: - nentries=ArrayGetNItems(ARR_NDIM(query), ARR_DIMS(query)); + nentries = ArrayGetNItems(ARR_NDIM(query), ARR_DIMS(query)); res = TRUE; - for(i=0;i<nentries;i++) - if ( !check[i] ) { + for (i = 0; i < nentries; i++) + if (!check[i]) + { res = FALSE; break; } diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index bc3e02973f9..fc44a5a0c7f 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginbtree.c - * page utilities routines for the postgres inverted index access method. + * page utilities routines for the postgres inverted index access method. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.4 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.5 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -20,24 +20,29 @@ * Locks buffer by needed method for search. */ static int -ginTraverseLock(Buffer buffer, bool searchMode) { - Page page; - int access=GIN_SHARE; +ginTraverseLock(Buffer buffer, bool searchMode) +{ + Page page; + int access = GIN_SHARE; LockBuffer(buffer, GIN_SHARE); - page = BufferGetPage( buffer ); - if ( GinPageIsLeaf(page) ) { - if ( searchMode == FALSE ) { + page = BufferGetPage(buffer); + if (GinPageIsLeaf(page)) + { + if (searchMode == FALSE) + { /* we should relock our page */ LockBuffer(buffer, GIN_UNLOCK); LockBuffer(buffer, GIN_EXCLUSIVE); /* But root can become non-leaf during relock */ - if ( !GinPageIsLeaf(page) ) { - /* resore old lock type (very rare) */ + if (!GinPageIsLeaf(page)) + { + /* resore old lock type (very rare) */ LockBuffer(buffer, GIN_UNLOCK); LockBuffer(buffer, GIN_SHARE); - } else + } + else access = GIN_EXCLUSIVE; } } @@ -45,9 +50,10 @@ ginTraverseLock(Buffer buffer, bool searchMode) { return access; } -GinBtreeStack* -ginPrepareFindLeafPage(GinBtree btree, BlockNumber blkno) { - GinBtreeStack *stack = (GinBtreeStack*)palloc(sizeof(GinBtreeStack)); +GinBtreeStack * +ginPrepareFindLeafPage(GinBtree btree, BlockNumber blkno) +{ + GinBtreeStack *stack = (GinBtreeStack *) palloc(sizeof(GinBtreeStack)); stack->blkno = blkno; stack->buffer = ReadBuffer(btree->index, stack->blkno); @@ -62,63 +68,73 @@ ginPrepareFindLeafPage(GinBtree btree, BlockNumber blkno) { /* * Locates leaf page contained tuple */ -GinBtreeStack* -ginFindLeafPage(GinBtree btree, GinBtreeStack *stack) { - bool isfirst=TRUE; +GinBtreeStack * +ginFindLeafPage(GinBtree btree, GinBtreeStack *stack) +{ + bool isfirst = TRUE; BlockNumber rootBlkno; - if ( !stack ) + if (!stack) stack = ginPrepareFindLeafPage(btree, GIN_ROOT_BLKNO); rootBlkno = stack->blkno; - for(;;) { - Page page; + for (;;) + { + Page page; BlockNumber child; - int access=GIN_SHARE; + int access = GIN_SHARE; stack->off = InvalidOffsetNumber; - - page = BufferGetPage( stack->buffer ); - if ( isfirst ) { - if ( GinPageIsLeaf(page) && !btree->searchMode ) + page = BufferGetPage(stack->buffer); + + if (isfirst) + { + if (GinPageIsLeaf(page) && !btree->searchMode) access = GIN_EXCLUSIVE; isfirst = FALSE; - } else + } + else access = ginTraverseLock(stack->buffer, btree->searchMode); - /* ok, page is correctly locked, we should check to move right .., - root never has a right link, so small optimization */ - while( btree->fullScan==FALSE && stack->blkno != rootBlkno && btree->isMoveRight(btree, page) ) { + /* + * ok, page is correctly locked, we should check to move right .., + * root never has a right link, so small optimization + */ + while (btree->fullScan == FALSE && stack->blkno != rootBlkno && btree->isMoveRight(btree, page)) + { BlockNumber rightlink = GinPageGetOpaque(page)->rightlink; - if ( rightlink==InvalidBlockNumber ) + if (rightlink == InvalidBlockNumber) /* rightmost page */ break; stack->blkno = rightlink; LockBuffer(stack->buffer, GIN_UNLOCK); stack->buffer = ReleaseAndReadBuffer(stack->buffer, btree->index, stack->blkno); - LockBuffer(stack->buffer, access); - page = BufferGetPage( stack->buffer ); + LockBuffer(stack->buffer, access); + page = BufferGetPage(stack->buffer); } - if ( GinPageIsLeaf(page) ) /* we found, return locked page */ + if (GinPageIsLeaf(page)) /* we found, return locked page */ return stack; /* now we have correct buffer, try to find child */ child = btree->findChildPage(btree, stack); LockBuffer(stack->buffer, GIN_UNLOCK); - Assert( child != InvalidBlockNumber ); - Assert( stack->blkno != child ); + Assert(child != InvalidBlockNumber); + Assert(stack->blkno != child); - if ( btree->searchMode ) { + if (btree->searchMode) + { /* in search mode we may forget path to leaf */ stack->blkno = child; - stack->buffer = ReleaseAndReadBuffer( stack->buffer, btree->index, stack->blkno ); - } else { - GinBtreeStack *ptr = (GinBtreeStack*)palloc(sizeof(GinBtreeStack)); + stack->buffer = ReleaseAndReadBuffer(stack->buffer, btree->index, stack->blkno); + } + else + { + GinBtreeStack *ptr = (GinBtreeStack *) palloc(sizeof(GinBtreeStack)); ptr->parent = stack; stack = ptr; @@ -133,93 +149,110 @@ ginFindLeafPage(GinBtree btree, GinBtreeStack *stack) { } void -freeGinBtreeStack( GinBtreeStack *stack ) { - while(stack) { - GinBtreeStack *tmp = stack->parent; - if ( stack->buffer != InvalidBuffer ) +freeGinBtreeStack(GinBtreeStack *stack) +{ + while (stack) + { + GinBtreeStack *tmp = stack->parent; + + if (stack->buffer != InvalidBuffer) ReleaseBuffer(stack->buffer); - pfree( stack ); + pfree(stack); stack = tmp; } } /* - * Try to find parent for current stack position, returns correct + * Try to find parent for current stack position, returns correct * parent and child's offset in stack->parent. * Function should never release root page to prevent conflicts * with vacuum process */ void -findParents( GinBtree btree, GinBtreeStack *stack, - BlockNumber rootBlkno) { - - Page page; - Buffer buffer; - BlockNumber blkno, leftmostBlkno; +findParents(GinBtree btree, GinBtreeStack *stack, + BlockNumber rootBlkno) +{ + + Page page; + Buffer buffer; + BlockNumber blkno, + leftmostBlkno; OffsetNumber offset; - GinBtreeStack *root = stack->parent; - GinBtreeStack *ptr; + GinBtreeStack *root = stack->parent; + GinBtreeStack *ptr; - if ( !root ) { + if (!root) + { /* XLog mode... */ - root = (GinBtreeStack*)palloc(sizeof(GinBtreeStack)); + root = (GinBtreeStack *) palloc(sizeof(GinBtreeStack)); root->blkno = rootBlkno; root->buffer = ReadBuffer(btree->index, rootBlkno); LockBuffer(root->buffer, GIN_EXCLUSIVE); root->parent = NULL; - } else { - /* find root, we should not release root page until update is finished!! */ - while( root->parent ) { - ReleaseBuffer( root->buffer ); + } + else + { + /* + * find root, we should not release root page until update is + * finished!! + */ + while (root->parent) + { + ReleaseBuffer(root->buffer); root = root->parent; } - Assert( root->blkno == rootBlkno ); - Assert( BufferGetBlockNumber(root->buffer) == rootBlkno ); + Assert(root->blkno == rootBlkno); + Assert(BufferGetBlockNumber(root->buffer) == rootBlkno); LockBuffer(root->buffer, GIN_EXCLUSIVE); } root->off = InvalidOffsetNumber; page = BufferGetPage(root->buffer); - Assert( !GinPageIsLeaf(page) ); + Assert(!GinPageIsLeaf(page)); /* check trivial case */ - if ( (root->off = btree->findChildPtr(btree, page, stack->blkno, InvalidOffsetNumber)) != InvalidOffsetNumber ) { + if ((root->off = btree->findChildPtr(btree, page, stack->blkno, InvalidOffsetNumber)) != InvalidOffsetNumber) + { stack->parent = root; return; } leftmostBlkno = blkno = btree->getLeftMostPage(btree, page); - LockBuffer(root->buffer, GIN_UNLOCK ); - Assert( blkno!=InvalidBlockNumber ); + LockBuffer(root->buffer, GIN_UNLOCK); + Assert(blkno != InvalidBlockNumber); - for(;;) { + for (;;) + { buffer = ReadBuffer(btree->index, blkno); LockBuffer(buffer, GIN_EXCLUSIVE); page = BufferGetPage(buffer); - if ( GinPageIsLeaf(page) ) + if (GinPageIsLeaf(page)) elog(ERROR, "Lost path"); leftmostBlkno = btree->getLeftMostPage(btree, page); - while( (offset = btree->findChildPtr(btree, page, stack->blkno, InvalidOffsetNumber))==InvalidOffsetNumber ) { + while ((offset = btree->findChildPtr(btree, page, stack->blkno, InvalidOffsetNumber)) == InvalidOffsetNumber) + { blkno = GinPageGetOpaque(page)->rightlink; - LockBuffer(buffer,GIN_UNLOCK); + LockBuffer(buffer, GIN_UNLOCK); ReleaseBuffer(buffer); - if ( blkno == InvalidBlockNumber ) + if (blkno == InvalidBlockNumber) break; buffer = ReadBuffer(btree->index, blkno); LockBuffer(buffer, GIN_EXCLUSIVE); page = BufferGetPage(buffer); } - if ( blkno != InvalidBlockNumber ) { - ptr = (GinBtreeStack*)palloc(sizeof(GinBtreeStack)); + if (blkno != InvalidBlockNumber) + { + ptr = (GinBtreeStack *) palloc(sizeof(GinBtreeStack)); ptr->blkno = blkno; ptr->buffer = buffer; - ptr->parent = root; /* it's may be wrong, but in next call we will correct */ + ptr->parent = root; /* it's may be wrong, but in next call we will + * correct */ ptr->off = offset; stack->parent = ptr; return; @@ -233,79 +266,94 @@ findParents( GinBtree btree, GinBtreeStack *stack, * Insert value (stored in GinBtree) to tree descibed by stack */ void -ginInsertValue(GinBtree btree, GinBtreeStack *stack) { - GinBtreeStack *parent = stack; - BlockNumber rootBlkno = InvalidBuffer; - Page page, rpage, lpage; +ginInsertValue(GinBtree btree, GinBtreeStack *stack) +{ + GinBtreeStack *parent = stack; + BlockNumber rootBlkno = InvalidBuffer; + Page page, + rpage, + lpage; /* remember root BlockNumber */ - while( parent ) { + while (parent) + { rootBlkno = parent->blkno; parent = parent->parent; } - while( stack ) { + while (stack) + { XLogRecData *rdata; - BlockNumber savedRightLink; + BlockNumber savedRightLink; - page = BufferGetPage( stack->buffer ); + page = BufferGetPage(stack->buffer); savedRightLink = GinPageGetOpaque(page)->rightlink; - if ( btree->isEnoughSpace( btree, stack->buffer, stack->off ) ) { + if (btree->isEnoughSpace(btree, stack->buffer, stack->off)) + { START_CRIT_SECTION(); - btree->placeToPage( btree, stack->buffer, stack->off, &rdata ); + btree->placeToPage(btree, stack->buffer, stack->off, &rdata); - if (!btree->index->rd_istemp) { - XLogRecPtr recptr; + if (!btree->index->rd_istemp) + { + XLogRecPtr recptr; recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT, rdata); PageSetLSN(page, recptr); PageSetTLI(page, ThisTimeLineID); - } + } - MarkBufferDirty( stack->buffer ); + MarkBufferDirty(stack->buffer); UnlockReleaseBuffer(stack->buffer); END_CRIT_SECTION(); freeGinBtreeStack(stack->parent); return; - } else { - Buffer rbuffer = GinNewBuffer(btree->index); - Page newlpage; + } + else + { + Buffer rbuffer = GinNewBuffer(btree->index); + Page newlpage; - /* newlpage is a pointer to memory page, it does'nt assosiates with buffer, - stack->buffer shoud be untouched */ - newlpage = btree->splitPage( btree, stack->buffer, rbuffer, stack->off, &rdata ); + /* + * newlpage is a pointer to memory page, it does'nt assosiates + * with buffer, stack->buffer shoud be untouched + */ + newlpage = btree->splitPage(btree, stack->buffer, rbuffer, stack->off, &rdata); - ((ginxlogSplit*)(rdata->data))->rootBlkno = rootBlkno; + ((ginxlogSplit *) (rdata->data))->rootBlkno = rootBlkno; parent = stack->parent; - if ( parent == NULL ) { - /* split root, so we need to allocate new left page and - place pointer on root to left and right page */ - Buffer lbuffer = GinNewBuffer(btree->index); + if (parent == NULL) + { + /* + * split root, so we need to allocate new left page and place + * pointer on root to left and right page + */ + Buffer lbuffer = GinNewBuffer(btree->index); - ((ginxlogSplit*)(rdata->data))->isRootSplit = TRUE; - ((ginxlogSplit*)(rdata->data))->rrlink = InvalidBlockNumber; + ((ginxlogSplit *) (rdata->data))->isRootSplit = TRUE; + ((ginxlogSplit *) (rdata->data))->rrlink = InvalidBlockNumber; - page = BufferGetPage( stack->buffer ); - lpage = BufferGetPage( lbuffer ); - rpage = BufferGetPage( rbuffer ); + page = BufferGetPage(stack->buffer); + lpage = BufferGetPage(lbuffer); + rpage = BufferGetPage(rbuffer); GinPageGetOpaque(rpage)->rightlink = InvalidBlockNumber; GinPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer); - ((ginxlogSplit*)(rdata->data))->lblkno = BufferGetBlockNumber(lbuffer); + ((ginxlogSplit *) (rdata->data))->lblkno = BufferGetBlockNumber(lbuffer); START_CRIT_SECTION(); - GinInitBuffer( stack->buffer, GinPageGetOpaque(newlpage)->flags & ~GIN_LEAF ); - PageRestoreTempPage( newlpage, lpage ); - btree->fillRoot( btree, stack->buffer, lbuffer, rbuffer ); - if (!btree->index->rd_istemp) { - XLogRecPtr recptr; + GinInitBuffer(stack->buffer, GinPageGetOpaque(newlpage)->flags & ~GIN_LEAF); + PageRestoreTempPage(newlpage, lpage); + btree->fillRoot(btree, stack->buffer, lbuffer, rbuffer); + if (!btree->index->rd_istemp) + { + XLogRecPtr recptr; recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata); PageSetLSN(page, recptr); @@ -324,23 +372,26 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) { UnlockReleaseBuffer(stack->buffer); END_CRIT_SECTION(); - + return; - } else { + } + else + { /* split non-root page */ - ((ginxlogSplit*)(rdata->data))->isRootSplit = FALSE; - ((ginxlogSplit*)(rdata->data))->rrlink = savedRightLink; + ((ginxlogSplit *) (rdata->data))->isRootSplit = FALSE; + ((ginxlogSplit *) (rdata->data))->rrlink = savedRightLink; - lpage = BufferGetPage( stack->buffer ); - rpage = BufferGetPage( rbuffer ); + lpage = BufferGetPage(stack->buffer); + rpage = BufferGetPage(rbuffer); GinPageGetOpaque(rpage)->rightlink = savedRightLink; GinPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer); START_CRIT_SECTION(); - PageRestoreTempPage( newlpage, lpage ); - if (!btree->index->rd_istemp) { - XLogRecPtr recptr; + PageRestoreTempPage(newlpage, lpage); + if (!btree->index->rd_istemp) + { + XLogRecPtr recptr; recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata); PageSetLSN(lpage, recptr); @@ -350,7 +401,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) { } MarkBufferDirty(rbuffer); UnlockReleaseBuffer(rbuffer); - MarkBufferDirty( stack->buffer ); + MarkBufferDirty(stack->buffer); END_CRIT_SECTION(); } } @@ -361,31 +412,33 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) { LockBuffer(parent->buffer, GIN_EXCLUSIVE); /* move right if it's needed */ - page = BufferGetPage( parent->buffer ); - while( (parent->off=btree->findChildPtr(btree, page, stack->blkno, parent->off)) == InvalidOffsetNumber ) { + page = BufferGetPage(parent->buffer); + while ((parent->off = btree->findChildPtr(btree, page, stack->blkno, parent->off)) == InvalidOffsetNumber) + { BlockNumber rightlink = GinPageGetOpaque(page)->rightlink; LockBuffer(parent->buffer, GIN_UNLOCK); - if ( rightlink==InvalidBlockNumber ) { - /* rightmost page, but we don't find parent, we should - use plain search... */ + if (rightlink == InvalidBlockNumber) + { + /* + * rightmost page, but we don't find parent, we should use + * plain search... + */ findParents(btree, stack, rootBlkno); - parent=stack->parent; - page = BufferGetPage( parent->buffer ); + parent = stack->parent; + page = BufferGetPage(parent->buffer); break; } parent->blkno = rightlink; parent->buffer = ReleaseAndReadBuffer(parent->buffer, btree->index, parent->blkno); - LockBuffer(parent->buffer, GIN_EXCLUSIVE); - page = BufferGetPage( parent->buffer ); + LockBuffer(parent->buffer, GIN_EXCLUSIVE); + page = BufferGetPage(parent->buffer); } UnlockReleaseBuffer(stack->buffer); - pfree( stack ); + pfree(stack); stack = parent; } } - - diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c index 5bcd91af141..3db9e332a75 100644 --- a/src/backend/access/gin/ginbulk.c +++ b/src/backend/access/gin/ginbulk.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginbulk.c - * routines for fast build of inverted index + * routines for fast build of inverted index * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginbulk.c,v 1.5 2006/08/29 14:05:44 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginbulk.c,v 1.6 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -22,7 +22,8 @@ #define DEF_NPTR 4 void -ginInitBA(BuildAccumulator *accum) { +ginInitBA(BuildAccumulator *accum) +{ accum->maxdepth = 1; accum->stackpos = 0; accum->entries = NULL; @@ -31,11 +32,13 @@ ginInitBA(BuildAccumulator *accum) { accum->entryallocator = NULL; } -static EntryAccumulator* -EAAllocate( BuildAccumulator *accum ) { - if ( accum->entryallocator == NULL || accum->length>=DEF_NENTRY ) { - accum->entryallocator = palloc(sizeof(EntryAccumulator)*DEF_NENTRY); - accum->allocatedMemory += sizeof(EntryAccumulator)*DEF_NENTRY; +static EntryAccumulator * +EAAllocate(BuildAccumulator *accum) +{ + if (accum->entryallocator == NULL || accum->length >= DEF_NENTRY) + { + accum->entryallocator = palloc(sizeof(EntryAccumulator) * DEF_NENTRY); + accum->allocatedMemory += sizeof(EntryAccumulator) * DEF_NENTRY; accum->length = 0; } @@ -48,24 +51,27 @@ EAAllocate( BuildAccumulator *accum ) { * item pointer are ordered */ static void -ginInsertData(BuildAccumulator *accum, EntryAccumulator *entry, ItemPointer heapptr) { - if ( entry->number >= entry->length ) { +ginInsertData(BuildAccumulator *accum, EntryAccumulator *entry, ItemPointer heapptr) +{ + if (entry->number >= entry->length) + { accum->allocatedMemory += sizeof(ItemPointerData) * entry->length; entry->length *= 2; - entry->list = (ItemPointerData*)repalloc(entry->list, - sizeof(ItemPointerData)*entry->length); + entry->list = (ItemPointerData *) repalloc(entry->list, + sizeof(ItemPointerData) * entry->length); } - if ( entry->shouldSort==FALSE ) { - int res = compareItemPointers( entry->list + entry->number - 1, heapptr ); + if (entry->shouldSort == FALSE) + { + int res = compareItemPointers(entry->list + entry->number - 1, heapptr); - Assert( res != 0 ); + Assert(res != 0); - if ( res > 0 ) - entry->shouldSort=TRUE; + if (res > 0) + entry->shouldSort = TRUE; } - entry->list[ entry->number ] = *heapptr; + entry->list[entry->number] = *heapptr; entry->number++; } @@ -74,7 +80,8 @@ ginInsertData(BuildAccumulator *accum, EntryAccumulator *entry, ItemPointer heap * to avoid computing the datum size twice. */ static Datum -getDatumCopy(BuildAccumulator *accum, Datum value) { +getDatumCopy(BuildAccumulator *accum, Datum value) +{ Form_pg_attribute *att = accum->ginstate->tupdesc->attrs; Datum res; @@ -100,51 +107,58 @@ getDatumCopy(BuildAccumulator *accum, Datum value) { * Find/store one entry from indexed value. */ static void -ginInsertEntry(BuildAccumulator *accum, ItemPointer heapptr, Datum entry) { - EntryAccumulator *ea = accum->entries, *pea = NULL; - int res = 0; - uint32 depth = 1; - - while( ea ) { +ginInsertEntry(BuildAccumulator *accum, ItemPointer heapptr, Datum entry) +{ + EntryAccumulator *ea = accum->entries, + *pea = NULL; + int res = 0; + uint32 depth = 1; + + while (ea) + { res = compareEntries(accum->ginstate, entry, ea->value); - if ( res == 0 ) - break; /* found */ - else { + if (res == 0) + break; /* found */ + else + { pea = ea; - if ( res < 0 ) + if (res < 0) ea = ea->left; else ea = ea->right; } depth++; } - - if ( depth > accum->maxdepth ) + + if (depth > accum->maxdepth) accum->maxdepth = depth; - if ( ea == NULL ) { + if (ea == NULL) + { ea = EAAllocate(accum); ea->left = ea->right = NULL; - ea->value = getDatumCopy(accum, entry); + ea->value = getDatumCopy(accum, entry); ea->length = DEF_NPTR; ea->number = 1; ea->shouldSort = FALSE; - ea->list = (ItemPointerData*)palloc(sizeof(ItemPointerData)*DEF_NPTR); + ea->list = (ItemPointerData *) palloc(sizeof(ItemPointerData) * DEF_NPTR); ea->list[0] = *heapptr; - accum->allocatedMemory += sizeof(ItemPointerData)*DEF_NPTR; + accum->allocatedMemory += sizeof(ItemPointerData) * DEF_NPTR; - if ( pea == NULL ) + if (pea == NULL) accum->entries = ea; - else { - Assert( res != 0 ); - if ( res < 0 ) + else + { + Assert(res != 0); + if (res < 0) pea->left = ea; else pea->right = ea; } - } else - ginInsertData( accum, ea, heapptr ); + } + else + ginInsertData(accum, ea, heapptr); } /* @@ -152,22 +166,23 @@ ginInsertEntry(BuildAccumulator *accum, ItemPointer heapptr, Datum entry) { * then calls itself for each parts */ static void -ginChooseElem(BuildAccumulator *accum, ItemPointer heapptr, Datum *entries, uint32 nentry, - uint32 low, uint32 high, uint32 offset) { - uint32 pos; - uint32 middle = (low+high)>>1; - - pos = (low+middle)>>1; - if ( low!=middle && pos>=offset && pos-offset < nentry ) - ginInsertEntry( accum, heapptr, entries[ pos-offset ]); - pos = (high+middle+1)>>1; - if ( middle+1 != high && pos>=offset && pos-offset < nentry ) - ginInsertEntry( accum, heapptr, entries[ pos-offset ]); - - if ( low!=middle ) - ginChooseElem(accum, heapptr, entries, nentry, low, middle, offset ); - if ( high!=middle+1 ) - ginChooseElem(accum, heapptr, entries, nentry, middle+1, high, offset ); +ginChooseElem(BuildAccumulator *accum, ItemPointer heapptr, Datum *entries, uint32 nentry, + uint32 low, uint32 high, uint32 offset) +{ + uint32 pos; + uint32 middle = (low + high) >> 1; + + pos = (low + middle) >> 1; + if (low != middle && pos >= offset && pos - offset < nentry) + ginInsertEntry(accum, heapptr, entries[pos - offset]); + pos = (high + middle + 1) >> 1; + if (middle + 1 != high && pos >= offset && pos - offset < nentry) + ginInsertEntry(accum, heapptr, entries[pos - offset]); + + if (low != middle) + ginChooseElem(accum, heapptr, entries, nentry, low, middle, offset); + if (high != middle + 1) + ginChooseElem(accum, heapptr, entries, nentry, middle + 1, high, offset); } /* @@ -176,56 +191,71 @@ ginChooseElem(BuildAccumulator *accum, ItemPointer heapptr, Datum *entries, uint * next middle on left part and middle of right part. */ void -ginInsertRecordBA( BuildAccumulator *accum, ItemPointer heapptr, Datum *entries, uint32 nentry ) { - uint32 i, nbit=0, offset; +ginInsertRecordBA(BuildAccumulator *accum, ItemPointer heapptr, Datum *entries, uint32 nentry) +{ + uint32 i, + nbit = 0, + offset; - if (nentry==0) + if (nentry == 0) return; - i=nentry-1; - for(;i>0;i>>=1) nbit++; + i = nentry - 1; + for (; i > 0; i >>= 1) + nbit++; - nbit = 1<<nbit; - offset = (nbit-nentry)/2; + nbit = 1 << nbit; + offset = (nbit - nentry) / 2; - ginInsertEntry( accum, heapptr, entries[ (nbit>>1)-offset ]); + ginInsertEntry(accum, heapptr, entries[(nbit >> 1) - offset]); ginChooseElem(accum, heapptr, entries, nentry, 0, nbit, offset); } -static int -qsortCompareItemPointers( const void *a, const void *b ) { - int res = compareItemPointers( (ItemPointer)a, (ItemPointer)b ); - Assert( res!=0 ); +static int +qsortCompareItemPointers(const void *a, const void *b) +{ + int res = compareItemPointers((ItemPointer) a, (ItemPointer) b); + + Assert(res != 0); return res; } /* - * walk on binary tree and returns ordered nodes - */ -static EntryAccumulator* -walkTree( BuildAccumulator *accum ) { - EntryAccumulator *entry = accum->stack[ accum->stackpos ]; + * walk on binary tree and returns ordered nodes + */ +static EntryAccumulator * +walkTree(BuildAccumulator *accum) +{ + EntryAccumulator *entry = accum->stack[accum->stackpos]; - if ( entry->list != NULL ) { + if (entry->list != NULL) + { /* return entry itself: we already was at left sublink */ return entry; - } else if ( entry->right && entry->right != accum->stack[ accum->stackpos+1 ] ) { + } + else if (entry->right && entry->right != accum->stack[accum->stackpos + 1]) + { /* go on right sublink */ accum->stackpos++; entry = entry->right; /* find most-left value */ - for(;;) { - accum->stack[ accum->stackpos ] = entry; - if ( entry->left ) { + for (;;) + { + accum->stack[accum->stackpos] = entry; + if (entry->left) + { accum->stackpos++; entry = entry->left; - } else + } + else break; } - } else { + } + else + { /* we already return all left subtree, itself and right subtree */ - if ( accum->stackpos == 0 ) + if (accum->stackpos == 0) return 0; accum->stackpos--; return walkTree(accum); @@ -234,47 +264,53 @@ walkTree( BuildAccumulator *accum ) { return entry; } -ItemPointerData* -ginGetEntry(BuildAccumulator *accum, Datum *value, uint32 *n) { - EntryAccumulator *entry; +ItemPointerData * +ginGetEntry(BuildAccumulator *accum, Datum *value, uint32 *n) +{ + EntryAccumulator *entry; ItemPointerData *list; - if ( accum->stack == NULL ) { + if (accum->stack == NULL) + { /* first call */ - accum->stack = palloc0(sizeof(EntryAccumulator*)*(accum->maxdepth+1)); + accum->stack = palloc0(sizeof(EntryAccumulator *) * (accum->maxdepth + 1)); entry = accum->entries; - if ( entry == NULL ) + if (entry == NULL) return NULL; /* find most-left value */ - for(;;) { - accum->stack[ accum->stackpos ] = entry; - if ( entry->left ) { + for (;;) + { + accum->stack[accum->stackpos] = entry; + if (entry->left) + { accum->stackpos++; entry = entry->left; - } else + } + else break; } - } else { - pfree( accum->stack[ accum->stackpos ]->list ); - accum->stack[ accum->stackpos ]->list = NULL; - entry = walkTree( accum ); + } + else + { + pfree(accum->stack[accum->stackpos]->list); + accum->stack[accum->stackpos]->list = NULL; + entry = walkTree(accum); } - if ( entry == NULL ) + if (entry == NULL) return NULL; - *n = entry->number; - *value = entry->value; - list = entry->list; + *n = entry->number; + *value = entry->value; + list = entry->list; Assert(list != NULL); - if ( entry->shouldSort && entry->number > 1 ) + if (entry->shouldSort && entry->number > 1) qsort(list, *n, sizeof(ItemPointerData), qsortCompareItemPointers); return list; } - diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 5789dc18f9b..94b07f3ed91 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * gindatapage.c - * page utilities routines for the postgres inverted index access method. + * page utilities routines for the postgres inverted index access method. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.3 2006/07/16 00:52:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.4 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -16,50 +16,56 @@ #include "access/gin.h" int -compareItemPointers( ItemPointer a, ItemPointer b ) { - if ( GinItemPointerGetBlockNumber(a) == GinItemPointerGetBlockNumber(b) ) { - if ( GinItemPointerGetOffsetNumber(a) == GinItemPointerGetOffsetNumber(b) ) +compareItemPointers(ItemPointer a, ItemPointer b) +{ + if (GinItemPointerGetBlockNumber(a) == GinItemPointerGetBlockNumber(b)) + { + if (GinItemPointerGetOffsetNumber(a) == GinItemPointerGetOffsetNumber(b)) return 0; - return ( GinItemPointerGetOffsetNumber(a) > GinItemPointerGetOffsetNumber(b) ) ? 1 : -1; - } + return (GinItemPointerGetOffsetNumber(a) > GinItemPointerGetOffsetNumber(b)) ? 1 : -1; + } - return ( GinItemPointerGetBlockNumber(a) > GinItemPointerGetBlockNumber(b) ) ? 1 : -1; + return (GinItemPointerGetBlockNumber(a) > GinItemPointerGetBlockNumber(b)) ? 1 : -1; } /* * Merge two ordered array of itempointer */ -void -MergeItemPointers(ItemPointerData *dst, ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb) { +void +MergeItemPointers(ItemPointerData *dst, ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb) +{ ItemPointerData *dptr = dst; - ItemPointerData *aptr = a, *bptr = b; + ItemPointerData *aptr = a, + *bptr = b; - while( aptr - a < na && bptr - b < nb ) { - if ( compareItemPointers(aptr, bptr) > 0 ) + while (aptr - a < na && bptr - b < nb) + { + if (compareItemPointers(aptr, bptr) > 0) *dptr++ = *bptr++; else *dptr++ = *aptr++; } - while( aptr - a < na ) + while (aptr - a < na) *dptr++ = *aptr++; - while( bptr - b < nb ) + while (bptr - b < nb) *dptr++ = *bptr++; } /* - * Checks, should we move to right link... + * Checks, should we move to right link... * Compares inserting itemp pointer with right bound of current page */ static bool -dataIsMoveRight(GinBtree btree, Page page) { - ItemPointer iptr = GinDataPageGetRightBound(page); +dataIsMoveRight(GinBtree btree, Page page) +{ + ItemPointer iptr = GinDataPageGetRightBound(page); - if ( GinPageRightMost(page) ) - return FALSE; + if (GinPageRightMost(page)) + return FALSE; - return ( compareItemPointers( btree->items + btree->curitem, iptr ) > 0 ) ? TRUE : FALSE; + return (compareItemPointers(btree->items + btree->curitem, iptr) > 0) ? TRUE : FALSE; } /* @@ -67,94 +73,113 @@ dataIsMoveRight(GinBtree btree, Page page) { * page correctly choosen and searching value SHOULD be on page */ static BlockNumber -dataLocateItem(GinBtree btree, GinBtreeStack *stack) { - OffsetNumber low, high, maxoff; - PostingItem *pitem=NULL; - int result; - Page page = BufferGetPage( stack->buffer ); - - Assert( !GinPageIsLeaf(page) ); - Assert( GinPageIsData(page) ); - - if ( btree->fullScan ) { +dataLocateItem(GinBtree btree, GinBtreeStack *stack) +{ + OffsetNumber low, + high, + maxoff; + PostingItem *pitem = NULL; + int result; + Page page = BufferGetPage(stack->buffer); + + Assert(!GinPageIsLeaf(page)); + Assert(GinPageIsData(page)); + + if (btree->fullScan) + { stack->off = FirstOffsetNumber; stack->predictNumber *= GinPageGetOpaque(page)->maxoff; return btree->getLeftMostPage(btree, page); } low = FirstOffsetNumber; - maxoff = high = GinPageGetOpaque(page)->maxoff; - Assert( high >= low ); + maxoff = high = GinPageGetOpaque(page)->maxoff; + Assert(high >= low); high++; - while (high > low) { + while (high > low) + { OffsetNumber mid = low + ((high - low) / 2); - pitem = (PostingItem*)GinDataPageGetItem(page,mid); - if ( mid == maxoff ) - /* Right infinity, page already correctly choosen - with a help of dataIsMoveRight */ + pitem = (PostingItem *) GinDataPageGetItem(page, mid); + + if (mid == maxoff) + + /* + * Right infinity, page already correctly choosen with a help of + * dataIsMoveRight + */ result = -1; - else { - pitem = (PostingItem*)GinDataPageGetItem(page,mid); - result = compareItemPointers( btree->items + btree->curitem, &( pitem->key ) ); + else + { + pitem = (PostingItem *) GinDataPageGetItem(page, mid); + result = compareItemPointers(btree->items + btree->curitem, &(pitem->key)); } - if ( result == 0 ) { + if (result == 0) + { stack->off = mid; return PostingItemGetBlockNumber(pitem); - } else if ( result > 0 ) + } + else if (result > 0) low = mid + 1; else high = mid; } - Assert( high>=FirstOffsetNumber && high <= maxoff ); + Assert(high >= FirstOffsetNumber && high <= maxoff); stack->off = high; - pitem = (PostingItem*)GinDataPageGetItem(page,high); + pitem = (PostingItem *) GinDataPageGetItem(page, high); return PostingItemGetBlockNumber(pitem); } -/* +/* * Searches correct position for value on leaf page. - * Page should be corrrectly choosen. + * Page should be corrrectly choosen. * Returns true if value found on page. */ static bool -dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack) { - Page page = BufferGetPage( stack->buffer ); - OffsetNumber low, high; - int result; - - Assert( GinPageIsLeaf(page) ); - Assert( GinPageIsData(page) ); - - if ( btree->fullScan ) { +dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack) +{ + Page page = BufferGetPage(stack->buffer); + OffsetNumber low, + high; + int result; + + Assert(GinPageIsLeaf(page)); + Assert(GinPageIsData(page)); + + if (btree->fullScan) + { stack->off = FirstOffsetNumber; return TRUE; } - low=FirstOffsetNumber; + low = FirstOffsetNumber; high = GinPageGetOpaque(page)->maxoff; - if ( high < low ) { + if (high < low) + { stack->off = FirstOffsetNumber; return false; } high++; - while (high > low) { + while (high > low) + { OffsetNumber mid = low + ((high - low) / 2); - result = compareItemPointers( btree->items + btree->curitem, (ItemPointer)GinDataPageGetItem(page,mid) ); + result = compareItemPointers(btree->items + btree->curitem, (ItemPointer) GinDataPageGetItem(page, mid)); - if ( result == 0 ) { + if (result == 0) + { stack->off = mid; return true; - } else if ( result > 0 ) + } + else if (result > 0) low = mid + 1; else high = mid; @@ -169,34 +194,41 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack) { * offset of PostingItem */ static OffsetNumber -dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber storedOff) { - OffsetNumber i, maxoff = GinPageGetOpaque(page)->maxoff; +dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber storedOff) +{ + OffsetNumber i, + maxoff = GinPageGetOpaque(page)->maxoff; PostingItem *pitem; - Assert( !GinPageIsLeaf(page) ); - Assert( GinPageIsData(page) ); + Assert(!GinPageIsLeaf(page)); + Assert(GinPageIsData(page)); /* if page isn't changed, we returns storedOff */ - if ( storedOff>= FirstOffsetNumber && storedOff<=maxoff) { - pitem = (PostingItem*)GinDataPageGetItem(page, storedOff); - if ( PostingItemGetBlockNumber(pitem) == blkno ) + if (storedOff >= FirstOffsetNumber && storedOff <= maxoff) + { + pitem = (PostingItem *) GinDataPageGetItem(page, storedOff); + if (PostingItemGetBlockNumber(pitem) == blkno) return storedOff; - /* we hope, that needed pointer goes to right. It's true - if there wasn't a deletion */ - for( i=storedOff+1 ; i <= maxoff ; i++ ) { - pitem = (PostingItem*)GinDataPageGetItem(page, i); - if ( PostingItemGetBlockNumber(pitem) == blkno ) + /* + * we hope, that needed pointer goes to right. It's true if there + * wasn't a deletion + */ + for (i = storedOff + 1; i <= maxoff; i++) + { + pitem = (PostingItem *) GinDataPageGetItem(page, i); + if (PostingItemGetBlockNumber(pitem) == blkno) return i; } - maxoff = storedOff-1; + maxoff = storedOff - 1; } /* last chance */ - for( i=FirstOffsetNumber; i <= maxoff ; i++ ) { - pitem = (PostingItem*)GinDataPageGetItem(page, i); - if ( PostingItemGetBlockNumber(pitem) == blkno ) + for (i = FirstOffsetNumber; i <= maxoff; i++) + { + pitem = (PostingItem *) GinDataPageGetItem(page, i); + if (PostingItemGetBlockNumber(pitem) == blkno) return i; } @@ -207,14 +239,15 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor * retunrs blkno of lefmost child */ static BlockNumber -dataGetLeftMostPage(GinBtree btree, Page page) { +dataGetLeftMostPage(GinBtree btree, Page page) +{ PostingItem *pitem; - Assert( !GinPageIsLeaf(page) ); - Assert( GinPageIsData(page) ); - Assert( GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber ); + Assert(!GinPageIsLeaf(page)); + Assert(GinPageIsData(page)); + Assert(GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber); - pitem = (PostingItem*)GinDataPageGetItem(page, FirstOffsetNumber); + pitem = (PostingItem *) GinDataPageGetItem(page, FirstOffsetNumber); return PostingItemGetBlockNumber(pitem); } @@ -223,18 +256,22 @@ dataGetLeftMostPage(GinBtree btree, Page page) { * correct value! depending on leaf or non-leaf page */ void -GinDataPageAddItem( Page page, void *data, OffsetNumber offset ) { +GinDataPageAddItem(Page page, void *data, OffsetNumber offset) +{ OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff; - char *ptr; - - if ( offset == InvalidOffsetNumber ) { - ptr = GinDataPageGetItem(page,maxoff+1); - } else { - ptr = GinDataPageGetItem(page,offset); - if ( maxoff+1-offset != 0 ) - memmove( ptr+GinSizeOfItem(page), ptr, (maxoff-offset+1) * GinSizeOfItem(page) ); + char *ptr; + + if (offset == InvalidOffsetNumber) + { + ptr = GinDataPageGetItem(page, maxoff + 1); } - memcpy( ptr, data, GinSizeOfItem(page) ); + else + { + ptr = GinDataPageGetItem(page, offset); + if (maxoff + 1 - offset != 0) + memmove(ptr + GinSizeOfItem(page), ptr, (maxoff - offset + 1) * GinSizeOfItem(page)); + } + memcpy(ptr, data, GinSizeOfItem(page)); GinPageGetOpaque(page)->maxoff++; } @@ -243,15 +280,16 @@ GinDataPageAddItem( Page page, void *data, OffsetNumber offset ) { * Deletes posting item from non-leaf page */ void -PageDeletePostingItem(Page page, OffsetNumber offset) { - OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff; +PageDeletePostingItem(Page page, OffsetNumber offset) +{ + OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff; - Assert( !GinPageIsLeaf(page) ); - Assert( offset>=FirstOffsetNumber && offset <= maxoff ); + Assert(!GinPageIsLeaf(page)); + Assert(offset >= FirstOffsetNumber && offset <= maxoff); - if ( offset != maxoff ) - memmove( GinDataPageGetItem(page,offset), GinDataPageGetItem(page,offset+1), - sizeof(PostingItem) * (maxoff-offset) ); + if (offset != maxoff) + memmove(GinDataPageGetItem(page, offset), GinDataPageGetItem(page, offset + 1), + sizeof(PostingItem) * (maxoff - offset)); GinPageGetOpaque(page)->maxoff--; } @@ -261,19 +299,24 @@ PageDeletePostingItem(Page page, OffsetNumber offset) { * item pointer never deletes! */ static bool -dataIsEnoughSpace( GinBtree btree, Buffer buf, OffsetNumber off ) { - Page page = BufferGetPage(buf); - - Assert( GinPageIsData(page) ); - Assert( !btree->isDelete ); - - if ( GinPageIsLeaf(page) ) { - if ( GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff ) { - if ( (btree->nitem - btree->curitem) * sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page) ) +dataIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off) +{ + Page page = BufferGetPage(buf); + + Assert(GinPageIsData(page)); + Assert(!btree->isDelete); + + if (GinPageIsLeaf(page)) + { + if (GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff) + { + if ((btree->nitem - btree->curitem) * sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page)) return true; - } else if ( sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page) ) + } + else if (sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page)) return true; - } else if ( sizeof(PostingItem) <= GinDataPageGetFreeSpace(page) ) + } + else if (sizeof(PostingItem) <= GinDataPageGetFreeSpace(page)) return true; return false; @@ -285,14 +328,17 @@ dataIsEnoughSpace( GinBtree btree, Buffer buf, OffsetNumber off ) { * item pointer never deletes! */ static BlockNumber -dataPrepareData( GinBtree btree, Page page, OffsetNumber off) { +dataPrepareData(GinBtree btree, Page page, OffsetNumber off) +{ BlockNumber ret = InvalidBlockNumber; - Assert( GinPageIsData(page) ); + Assert(GinPageIsData(page)); - if ( !GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber ) { - PostingItem *pitem = (PostingItem*)GinDataPageGetItem(page,off); - PostingItemSetBlockNumber( pitem, btree->rightblkno ); + if (!GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber) + { + PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, off); + + PostingItemSetBlockNumber(pitem, btree->rightblkno); ret = btree->rightblkno; } @@ -301,24 +347,25 @@ dataPrepareData( GinBtree btree, Page page, OffsetNumber off) { return ret; } -/* +/* * Places keys to page and fills WAL record. In case leaf page and * build mode puts all ItemPointers to page. */ static void -dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata) { - Page page = BufferGetPage(buf); +dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata) +{ + Page page = BufferGetPage(buf); static XLogRecData rdata[3]; - int sizeofitem = GinSizeOfItem(page); - static ginxlogInsert data; + int sizeofitem = GinSizeOfItem(page); + static ginxlogInsert data; *prdata = rdata; - Assert( GinPageIsData(page) ); + Assert(GinPageIsData(page)); - data.updateBlkno = dataPrepareData( btree, page, off ); + data.updateBlkno = dataPrepareData(btree, page, off); data.node = btree->index->rd_node; - data.blkno = BufferGetBlockNumber( buf ); + data.blkno = BufferGetBlockNumber(buf); data.offset = off; data.nitem = 1; data.isDelete = FALSE; @@ -337,109 +384,124 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda rdata[1].next = &rdata[2]; rdata[2].buffer = InvalidBuffer; - rdata[2].data = (GinPageIsLeaf(page)) ? ((char*)(btree->items+btree->curitem)) : ((char*)&(btree->pitem)); + rdata[2].data = (GinPageIsLeaf(page)) ? ((char *) (btree->items + btree->curitem)) : ((char *) &(btree->pitem)); rdata[2].len = sizeofitem; rdata[2].next = NULL; - if ( GinPageIsLeaf(page) ) { - if ( GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff ) { + if (GinPageIsLeaf(page)) + { + if (GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff) + { /* usually, create index... */ - uint32 savedPos = btree->curitem; + uint32 savedPos = btree->curitem; - while( btree->curitem < btree->nitem ) { - GinDataPageAddItem(page, btree->items+btree->curitem, off); + while (btree->curitem < btree->nitem) + { + GinDataPageAddItem(page, btree->items + btree->curitem, off); off++; btree->curitem++; } - data.nitem = btree->curitem-savedPos; + data.nitem = btree->curitem - savedPos; rdata[2].len = sizeofitem * data.nitem; - } else { - GinDataPageAddItem(page, btree->items+btree->curitem, off); + } + else + { + GinDataPageAddItem(page, btree->items + btree->curitem, off); btree->curitem++; } - } else - GinDataPageAddItem(page, &(btree->pitem), off); + } + else + GinDataPageAddItem(page, &(btree->pitem), off); } /* * split page and fills WAL record. original buffer(lbuf) leaves untouched, - * returns shadow page of lbuf filled new data. In leaf page and build mode puts all + * returns shadow page of lbuf filled new data. In leaf page and build mode puts all * ItemPointers to pages. Also, in build mode splits data by way to full fulled * left page */ static Page -dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRecData **prdata) { +dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRecData **prdata) +{ static ginxlogSplit data; static XLogRecData rdata[4]; - static char vector[2*BLCKSZ]; - char *ptr; + static char vector[2 * BLCKSZ]; + char *ptr; OffsetNumber separator; - ItemPointer bound; - Page lpage = GinPageGetCopyPage( BufferGetPage( lbuf ) ); - ItemPointerData oldbound = *GinDataPageGetRightBound(lpage); - int sizeofitem = GinSizeOfItem(lpage); + ItemPointer bound; + Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf)); + ItemPointerData oldbound = *GinDataPageGetRightBound(lpage); + int sizeofitem = GinSizeOfItem(lpage); OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff; - Page rpage = BufferGetPage( rbuf ); - Size pageSize = PageGetPageSize( lpage ); - Size freeSpace; - uint32 nCopied = 1; + Page rpage = BufferGetPage(rbuf); + Size pageSize = PageGetPageSize(lpage); + Size freeSpace; + uint32 nCopied = 1; - GinInitPage( rpage, GinPageGetOpaque(lpage)->flags, pageSize ); + GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize); freeSpace = GinDataPageGetFreeSpace(rpage); *prdata = rdata; - data.leftChildBlkno = ( GinPageIsLeaf(lpage) ) ? - InvalidOffsetNumber : PostingItemGetBlockNumber( &(btree->pitem) ); - data.updateBlkno = dataPrepareData( btree, lpage, off ); + data.leftChildBlkno = (GinPageIsLeaf(lpage)) ? + InvalidOffsetNumber : PostingItemGetBlockNumber(&(btree->pitem)); + data.updateBlkno = dataPrepareData(btree, lpage, off); - memcpy(vector, GinDataPageGetItem(lpage, FirstOffsetNumber), - maxoff*sizeofitem); + memcpy(vector, GinDataPageGetItem(lpage, FirstOffsetNumber), + maxoff * sizeofitem); - if ( GinPageIsLeaf(lpage) && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff ) { + if (GinPageIsLeaf(lpage) && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff) + { nCopied = 0; - while( btree->curitem < btree->nitem && maxoff*sizeof(ItemPointerData) < 2*(freeSpace - sizeof(ItemPointerData)) ) { - memcpy( vector + maxoff*sizeof(ItemPointerData), btree->items+btree->curitem, - sizeof(ItemPointerData) ); + while (btree->curitem < btree->nitem && maxoff * sizeof(ItemPointerData) < 2 * (freeSpace - sizeof(ItemPointerData))) + { + memcpy(vector + maxoff * sizeof(ItemPointerData), btree->items + btree->curitem, + sizeof(ItemPointerData)); maxoff++; nCopied++; btree->curitem++; } - } else { - ptr = vector + (off-1)*sizeofitem; - if ( maxoff+1-off != 0 ) - memmove( ptr+sizeofitem, ptr, (maxoff-off+1) * sizeofitem ); - if ( GinPageIsLeaf(lpage) ) { - memcpy(ptr, btree->items+btree->curitem, sizeofitem ); + } + else + { + ptr = vector + (off - 1) * sizeofitem; + if (maxoff + 1 - off != 0) + memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem); + if (GinPageIsLeaf(lpage)) + { + memcpy(ptr, btree->items + btree->curitem, sizeofitem); btree->curitem++; - } else - memcpy(ptr, &(btree->pitem), sizeofitem ); - + } + else + memcpy(ptr, &(btree->pitem), sizeofitem); + maxoff++; } - /* we suppose that during index creation table scaned from - begin to end, so ItemPointers are monotonically increased.. */ - if ( btree->isBuild && GinPageRightMost(lpage) ) - separator=freeSpace/sizeofitem; + /* + * we suppose that during index creation table scaned from begin to end, + * so ItemPointers are monotonically increased.. + */ + if (btree->isBuild && GinPageRightMost(lpage)) + separator = freeSpace / sizeofitem; else - separator=maxoff/2; + separator = maxoff / 2; - GinInitPage( rpage, GinPageGetOpaque(lpage)->flags, pageSize ); - GinInitPage( lpage, GinPageGetOpaque(rpage)->flags, pageSize ); + GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize); + GinInitPage(lpage, GinPageGetOpaque(rpage)->flags, pageSize); - memcpy( GinDataPageGetItem(lpage, FirstOffsetNumber), vector, separator * sizeofitem ); + memcpy(GinDataPageGetItem(lpage, FirstOffsetNumber), vector, separator * sizeofitem); GinPageGetOpaque(lpage)->maxoff = separator; - memcpy( GinDataPageGetItem(rpage, FirstOffsetNumber), - vector + separator * sizeofitem, (maxoff-separator) * sizeofitem ); - GinPageGetOpaque(rpage)->maxoff = maxoff-separator; - - PostingItemSetBlockNumber( &(btree->pitem), BufferGetBlockNumber(lbuf) ); - if ( GinPageIsLeaf(lpage) ) - btree->pitem.key = *(ItemPointerData*)GinDataPageGetItem(lpage, - GinPageGetOpaque(lpage)->maxoff); - else - btree->pitem.key = ((PostingItem*)GinDataPageGetItem(lpage, - GinPageGetOpaque(lpage)->maxoff))->key; + memcpy(GinDataPageGetItem(rpage, FirstOffsetNumber), + vector + separator * sizeofitem, (maxoff - separator) * sizeofitem); + GinPageGetOpaque(rpage)->maxoff = maxoff - separator; + + PostingItemSetBlockNumber(&(btree->pitem), BufferGetBlockNumber(lbuf)); + if (GinPageIsLeaf(lpage)) + btree->pitem.key = *(ItemPointerData *) GinDataPageGetItem(lpage, + GinPageGetOpaque(lpage)->maxoff); + else + btree->pitem.key = ((PostingItem *) GinDataPageGetItem(lpage, + GinPageGetOpaque(lpage)->maxoff))->key; btree->rightblkno = BufferGetBlockNumber(rbuf); /* set up right bound for left page */ @@ -452,8 +514,8 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe data.node = btree->index->rd_node; data.rootBlkno = InvalidBlockNumber; - data.lblkno = BufferGetBlockNumber( lbuf ); - data.rblkno = BufferGetBlockNumber( rbuf ); + data.lblkno = BufferGetBlockNumber(lbuf); + data.rblkno = BufferGetBlockNumber(rbuf); data.separator = separator; data.nitem = maxoff; data.isData = TRUE; @@ -468,34 +530,37 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe rdata[1].buffer = InvalidBuffer; rdata[1].data = vector; - rdata[1].len = MAXALIGN( maxoff * sizeofitem ); + rdata[1].len = MAXALIGN(maxoff * sizeofitem); rdata[1].next = NULL; return lpage; } /* - * Fills new root by right bound values from child. + * Fills new root by right bound values from child. * Also called from ginxlog, should not use btree */ void -dataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf) { - Page page = BufferGetPage(root), - lpage = BufferGetPage(lbuf), - rpage = BufferGetPage(rbuf); - PostingItem li, ri; +dataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf) +{ + Page page = BufferGetPage(root), + lpage = BufferGetPage(lbuf), + rpage = BufferGetPage(rbuf); + PostingItem li, + ri; li.key = *GinDataPageGetRightBound(lpage); - PostingItemSetBlockNumber( &li, BufferGetBlockNumber(lbuf) ); - GinDataPageAddItem(page, &li, InvalidOffsetNumber ); + PostingItemSetBlockNumber(&li, BufferGetBlockNumber(lbuf)); + GinDataPageAddItem(page, &li, InvalidOffsetNumber); ri.key = *GinDataPageGetRightBound(rpage); - PostingItemSetBlockNumber( &ri, BufferGetBlockNumber(rbuf) ); - GinDataPageAddItem(page, &ri, InvalidOffsetNumber ); + PostingItemSetBlockNumber(&ri, BufferGetBlockNumber(rbuf)); + GinDataPageAddItem(page, &ri, InvalidOffsetNumber); } void -prepareDataScan( GinBtree btree, Relation index) { +prepareDataScan(GinBtree btree, Relation index) +{ memset(btree, 0, sizeof(GinBtreeData)); btree->index = index; btree->isMoveRight = dataIsMoveRight; @@ -509,21 +574,22 @@ prepareDataScan( GinBtree btree, Relation index) { btree->fillRoot = dataFillRoot; btree->searchMode = FALSE; - btree->isDelete = FALSE; + btree->isDelete = FALSE; btree->fullScan = FALSE; - btree->isBuild= FALSE; + btree->isBuild = FALSE; } -GinPostingTreeScan* -prepareScanPostingTree( Relation index, BlockNumber rootBlkno, bool searchMode) { - GinPostingTreeScan *gdi = (GinPostingTreeScan*)palloc0( sizeof(GinPostingTreeScan) ); +GinPostingTreeScan * +prepareScanPostingTree(Relation index, BlockNumber rootBlkno, bool searchMode) +{ + GinPostingTreeScan *gdi = (GinPostingTreeScan *) palloc0(sizeof(GinPostingTreeScan)); + + prepareDataScan(&gdi->btree, index); - prepareDataScan( &gdi->btree, index ); - gdi->btree.searchMode = searchMode; gdi->btree.fullScan = searchMode; - gdi->stack = ginPrepareFindLeafPage( &gdi->btree, rootBlkno ); + gdi->stack = ginPrepareFindLeafPage(&gdi->btree, rootBlkno); return gdi; } @@ -532,33 +598,35 @@ prepareScanPostingTree( Relation index, BlockNumber rootBlkno, bool searchMode) * Inserts array of item pointers, may execute several tree scan (very rare) */ void -insertItemPointer(GinPostingTreeScan *gdi, ItemPointerData *items, uint32 nitem) { +insertItemPointer(GinPostingTreeScan *gdi, ItemPointerData *items, uint32 nitem) +{ BlockNumber rootBlkno = gdi->stack->blkno; gdi->btree.items = items; gdi->btree.nitem = nitem; gdi->btree.curitem = 0; - while( gdi->btree.curitem < gdi->btree.nitem ) { + while (gdi->btree.curitem < gdi->btree.nitem) + { if (!gdi->stack) - gdi->stack = ginPrepareFindLeafPage( &gdi->btree, rootBlkno ); + gdi->stack = ginPrepareFindLeafPage(&gdi->btree, rootBlkno); - gdi->stack = ginFindLeafPage( &gdi->btree, gdi->stack ); + gdi->stack = ginFindLeafPage(&gdi->btree, gdi->stack); - if ( gdi->btree.findItem( &(gdi->btree), gdi->stack ) ) - elog(ERROR,"item pointer (%u,%d) already exists", - ItemPointerGetBlockNumber(gdi->btree.items + gdi->btree.curitem), - ItemPointerGetOffsetNumber(gdi->btree.items + gdi->btree.curitem)); + if (gdi->btree.findItem(&(gdi->btree), gdi->stack)) + elog(ERROR, "item pointer (%u,%d) already exists", + ItemPointerGetBlockNumber(gdi->btree.items + gdi->btree.curitem), + ItemPointerGetOffsetNumber(gdi->btree.items + gdi->btree.curitem)); ginInsertValue(&(gdi->btree), gdi->stack); - gdi->stack=NULL; + gdi->stack = NULL; } } Buffer -scanBeginPostingTree( GinPostingTreeScan *gdi ) { - gdi->stack = ginFindLeafPage( &gdi->btree, gdi->stack ); +scanBeginPostingTree(GinPostingTreeScan *gdi) +{ + gdi->stack = ginFindLeafPage(&gdi->btree, gdi->stack); return gdi->stack->buffer; } - diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c index 6e3cc75ce08..129c9550969 100644 --- a/src/backend/access/gin/ginentrypage.c +++ b/src/backend/access/gin/ginentrypage.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginentrypage.c - * page utilities routines for the postgres inverted index access method. + * page utilities routines for the postgres inverted index access method. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginentrypage.c,v 1.3 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginentrypage.c,v 1.4 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -23,48 +23,52 @@ * 1) Posting list * - itup->t_info & INDEX_SIZE_MASK contains size of tuple as usial * - ItemPointerGetBlockNumber(&itup->t_tid) contains original - * size of tuple (without posting list). + * size of tuple (without posting list). * Macroses: GinGetOrigSizePosting(itup) / GinSetOrigSizePosting(itup,n) * - ItemPointerGetOffsetNumber(&itup->t_tid) contains number * of elements in posting list (number of heap itempointer) * Macroses: GinGetNPosting(itup) / GinSetNPosting(itup,n) - * - After usial part of tuple there is a posting list + * - After usial part of tuple there is a posting list * Macros: GinGetPosting(itup) * 2) Posting tree * - itup->t_info & INDEX_SIZE_MASK contains size of tuple as usial - * - ItemPointerGetBlockNumber(&itup->t_tid) contains block number of + * - ItemPointerGetBlockNumber(&itup->t_tid) contains block number of * root of posting tree * - ItemPointerGetOffsetNumber(&itup->t_tid) contains magick number GIN_TREE_POSTING */ IndexTuple -GinFormTuple(GinState *ginstate, Datum key, ItemPointerData *ipd, uint32 nipd) { - bool isnull=FALSE; +GinFormTuple(GinState *ginstate, Datum key, ItemPointerData *ipd, uint32 nipd) +{ + bool isnull = FALSE; IndexTuple itup; - itup = index_form_tuple(ginstate->tupdesc, &key, &isnull); + itup = index_form_tuple(ginstate->tupdesc, &key, &isnull); - GinSetOrigSizePosting( itup, IndexTupleSize(itup) ); + GinSetOrigSizePosting(itup, IndexTupleSize(itup)); - if ( nipd > 0 ) { - uint32 newsize = MAXALIGN(SHORTALIGN(IndexTupleSize(itup)) + sizeof(ItemPointerData)*nipd); + if (nipd > 0) + { + uint32 newsize = MAXALIGN(SHORTALIGN(IndexTupleSize(itup)) + sizeof(ItemPointerData) * nipd); - if ( newsize >= INDEX_SIZE_MASK ) + if (newsize >= INDEX_SIZE_MASK) return NULL; - if ( newsize > TOAST_INDEX_TARGET && nipd > 1 ) + if (newsize > TOAST_INDEX_TARGET && nipd > 1) return NULL; - itup = repalloc( itup, newsize ); + itup = repalloc(itup, newsize); /* set new size */ - itup->t_info &= ~INDEX_SIZE_MASK; + itup->t_info &= ~INDEX_SIZE_MASK; itup->t_info |= newsize; - if ( ipd ) - memcpy( GinGetPosting(itup), ipd, sizeof(ItemPointerData)*nipd ); - GinSetNPosting(itup, nipd); - } else { - GinSetNPosting(itup, 0); + if (ipd) + memcpy(GinGetPosting(itup), ipd, sizeof(ItemPointerData) * nipd); + GinSetNPosting(itup, nipd); + } + else + { + GinSetNPosting(itup, 0); } return itup; } @@ -74,31 +78,35 @@ GinFormTuple(GinState *ginstate, Datum key, ItemPointerData *ipd, uint32 nipd) { * so we don't use right bound, we use rightest key instead. */ static IndexTuple -getRightMostTuple(Page page) { +getRightMostTuple(Page page) +{ OffsetNumber maxoff = PageGetMaxOffsetNumber(page); + return (IndexTuple) PageGetItem(page, PageGetItemId(page, maxoff)); } Datum -ginGetHighKey(GinState *ginstate, Page page) { - IndexTuple itup; - bool isnull; +ginGetHighKey(GinState *ginstate, Page page) +{ + IndexTuple itup; + bool isnull; itup = getRightMostTuple(page); - return index_getattr(itup, FirstOffsetNumber, ginstate->tupdesc, &isnull); + return index_getattr(itup, FirstOffsetNumber, ginstate->tupdesc, &isnull); } -static bool -entryIsMoveRight(GinBtree btree, Page page) { - Datum highkey; +static bool +entryIsMoveRight(GinBtree btree, Page page) +{ + Datum highkey; - if ( GinPageRightMost(page) ) + if (GinPageRightMost(page)) return FALSE; highkey = ginGetHighKey(btree->ginstate, page); - if ( compareEntries(btree->ginstate, btree->entryValue, highkey) > 0 ) + if (compareEntries(btree->ginstate, btree->entryValue, highkey) > 0) return TRUE; return FALSE; @@ -109,16 +117,20 @@ entryIsMoveRight(GinBtree btree, Page page) { * page correctly choosen and searching value SHOULD be on page */ static BlockNumber -entryLocateEntry(GinBtree btree, GinBtreeStack *stack) { - OffsetNumber low, high, maxoff; - IndexTuple itup = NULL; - int result; - Page page = BufferGetPage( stack->buffer ); - - Assert( !GinPageIsLeaf(page) ); - Assert( !GinPageIsData(page) ); - - if ( btree->fullScan ) { +entryLocateEntry(GinBtree btree, GinBtreeStack *stack) +{ + OffsetNumber low, + high, + maxoff; + IndexTuple itup = NULL; + int result; + Page page = BufferGetPage(stack->buffer); + + Assert(!GinPageIsLeaf(page)); + Assert(!GinPageIsData(page)); + + if (btree->fullScan) + { stack->off = FirstOffsetNumber; stack->predictNumber *= PageGetMaxOffsetNumber(page); return btree->getLeftMostPage(btree, page); @@ -126,39 +138,43 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack) { low = FirstOffsetNumber; maxoff = high = PageGetMaxOffsetNumber(page); - Assert( high >= low ); + Assert(high >= low); high++; - while (high > low) { + while (high > low) + { OffsetNumber mid = low + ((high - low) / 2); - if ( mid == maxoff && GinPageRightMost(page) ) + if (mid == maxoff && GinPageRightMost(page)) /* Right infinity */ result = -1; - else { - bool isnull; + else + { + bool isnull; itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, mid)); - result = compareEntries(btree->ginstate, btree->entryValue, - index_getattr(itup, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull) ); + result = compareEntries(btree->ginstate, btree->entryValue, + index_getattr(itup, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull)); } - if ( result == 0 ) { + if (result == 0) + { stack->off = mid; - Assert( GinItemPointerGetBlockNumber(&(itup)->t_tid) != GIN_ROOT_BLKNO ); + Assert(GinItemPointerGetBlockNumber(&(itup)->t_tid) != GIN_ROOT_BLKNO); return GinItemPointerGetBlockNumber(&(itup)->t_tid); - } else if ( result > 0 ) + } + else if (result > 0) low = mid + 1; else high = mid; } - Assert( high>=FirstOffsetNumber && high <= maxoff ); + Assert(high >= FirstOffsetNumber && high <= maxoff); stack->off = high; itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, high)); - Assert( GinItemPointerGetBlockNumber(&(itup)->t_tid) != GIN_ROOT_BLKNO ); + Assert(GinItemPointerGetBlockNumber(&(itup)->t_tid) != GIN_ROOT_BLKNO); return GinItemPointerGetBlockNumber(&(itup)->t_tid); } @@ -168,15 +184,18 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack) { * Returns true if value found on page. */ static bool -entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack) { - Page page = BufferGetPage( stack->buffer ); - OffsetNumber low, high; - IndexTuple itup; +entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack) +{ + Page page = BufferGetPage(stack->buffer); + OffsetNumber low, + high; + IndexTuple itup; - Assert( GinPageIsLeaf(page) ); - Assert( !GinPageIsData(page) ); + Assert(GinPageIsLeaf(page)); + Assert(!GinPageIsData(page)); - if ( btree->fullScan ) { + if (btree->fullScan) + { stack->off = FirstOffsetNumber; return TRUE; } @@ -184,26 +203,30 @@ entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack) { low = FirstOffsetNumber; high = PageGetMaxOffsetNumber(page); - if ( high < low ) { + if (high < low) + { stack->off = FirstOffsetNumber; return false; } high++; - while (high > low) { + while (high > low) + { OffsetNumber mid = low + ((high - low) / 2); - bool isnull; - int result; + bool isnull; + int result; itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, mid)); result = compareEntries(btree->ginstate, btree->entryValue, - index_getattr(itup, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull) ); + index_getattr(itup, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull)); - if ( result == 0 ) { + if (result == 0) + { stack->off = mid; return true; - } else if ( result > 0 ) + } + else if (result > 0) low = mid + 1; else high = mid; @@ -214,33 +237,40 @@ entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack) { } static OffsetNumber -entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber storedOff) { - OffsetNumber i, maxoff = PageGetMaxOffsetNumber(page); - IndexTuple itup; +entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber storedOff) +{ + OffsetNumber i, + maxoff = PageGetMaxOffsetNumber(page); + IndexTuple itup; - Assert( !GinPageIsLeaf(page) ); - Assert( !GinPageIsData(page) ); + Assert(!GinPageIsLeaf(page)); + Assert(!GinPageIsData(page)); /* if page isn't changed, we returns storedOff */ - if ( storedOff>= FirstOffsetNumber && storedOff<=maxoff) { + if (storedOff >= FirstOffsetNumber && storedOff <= maxoff) + { itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, storedOff)); - if ( GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno ) + if (GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno) return storedOff; - /* we hope, that needed pointer goes to right. It's true - if there wasn't a deletion */ - for( i=storedOff+1 ; i <= maxoff ; i++ ) { + /* + * we hope, that needed pointer goes to right. It's true if there + * wasn't a deletion + */ + for (i = storedOff + 1; i <= maxoff; i++) + { itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i)); - if ( GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno ) + if (GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno) return i; } - maxoff = storedOff-1; + maxoff = storedOff - 1; } /* last chance */ - for( i=FirstOffsetNumber; i <= maxoff ; i++ ) { + for (i = FirstOffsetNumber; i <= maxoff; i++) + { itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i)); - if ( GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno ) + if (GinItemPointerGetBlockNumber(&(itup)->t_tid) == blkno) return i; } @@ -248,31 +278,35 @@ entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber sto } static BlockNumber -entryGetLeftMostPage(GinBtree btree, Page page) { - IndexTuple itup; +entryGetLeftMostPage(GinBtree btree, Page page) +{ + IndexTuple itup; - Assert( !GinPageIsLeaf(page) ); - Assert( !GinPageIsData(page) ); - Assert( PageGetMaxOffsetNumber(page) >= FirstOffsetNumber ); + Assert(!GinPageIsLeaf(page)); + Assert(!GinPageIsData(page)); + Assert(PageGetMaxOffsetNumber(page) >= FirstOffsetNumber); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, FirstOffsetNumber)); - return GinItemPointerGetBlockNumber(&(itup)->t_tid); + return GinItemPointerGetBlockNumber(&(itup)->t_tid); } static bool -entryIsEnoughSpace( GinBtree btree, Buffer buf, OffsetNumber off ) { - Size itupsz = 0; - Page page = BufferGetPage(buf); +entryIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off) +{ + Size itupsz = 0; + Page page = BufferGetPage(buf); + + Assert(btree->entry); + Assert(!GinPageIsData(page)); - Assert( btree->entry ); - Assert( !GinPageIsData(page) ); + if (btree->isDelete) + { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off)); - if ( btree->isDelete ) { - IndexTuple itup = (IndexTuple)PageGetItem(page, PageGetItemId(page, off)); - itupsz = MAXALIGN( IndexTupleSize( itup ) ) + sizeof(ItemIdData); + itupsz = MAXALIGN(IndexTupleSize(itup)) + sizeof(ItemIdData); } - if ( PageGetFreeSpace(page) + itupsz >= MAXALIGN(IndexTupleSize(btree->entry)) + sizeof(ItemIdData) ) + if (PageGetFreeSpace(page) + itupsz >= MAXALIGN(IndexTupleSize(btree->entry)) + sizeof(ItemIdData)) return true; return false; @@ -284,19 +318,23 @@ entryIsEnoughSpace( GinBtree btree, Buffer buf, OffsetNumber off ) { * if child split is occured */ static BlockNumber -entryPreparePage( GinBtree btree, Page page, OffsetNumber off) { +entryPreparePage(GinBtree btree, Page page, OffsetNumber off) +{ BlockNumber ret = InvalidBlockNumber; - Assert( btree->entry ); - Assert( !GinPageIsData(page) ); + Assert(btree->entry); + Assert(!GinPageIsData(page)); - if ( btree->isDelete ) { - Assert( GinPageIsLeaf(page) ); + if (btree->isDelete) + { + Assert(GinPageIsLeaf(page)); PageIndexTupleDelete(page, off); } - if ( !GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber ) { - IndexTuple itup = (IndexTuple)PageGetItem(page, PageGetItemId(page, off)); + if (!GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber) + { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off)); + ItemPointerSet(&itup->t_tid, btree->rightblkno, InvalidOffsetNumber); ret = btree->rightblkno; } @@ -310,22 +348,23 @@ entryPreparePage( GinBtree btree, Page page, OffsetNumber off) { * Place tuple on page and fills WAL record */ static void -entryPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata) { - Page page = BufferGetPage(buf); +entryPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prdata) +{ + Page page = BufferGetPage(buf); static XLogRecData rdata[3]; - OffsetNumber placed; - static ginxlogInsert data; + OffsetNumber placed; + static ginxlogInsert data; *prdata = rdata; - data.updateBlkno = entryPreparePage( btree, page, off ); + data.updateBlkno = entryPreparePage(btree, page, off); - placed = PageAddItem( page, (Item)btree->entry, IndexTupleSize(btree->entry), off, LP_USED); - if ( placed != off ) + placed = PageAddItem(page, (Item) btree->entry, IndexTupleSize(btree->entry), off, LP_USED); + if (placed != off) elog(ERROR, "failed to add item to index page in \"%s\"", - RelationGetRelationName(btree->index)); + RelationGetRelationName(btree->index)); data.node = btree->index->rd_node; - data.blkno = BufferGetBlockNumber( buf ); + data.blkno = BufferGetBlockNumber(buf); data.offset = off; data.nitem = 1; data.isDelete = btree->isDelete; @@ -358,87 +397,99 @@ entryPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prd * an equal number! */ static Page -entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRecData **prdata) { +entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRecData **prdata) +{ static XLogRecData rdata[2]; - OffsetNumber i, maxoff, separator=InvalidOffsetNumber; - Size totalsize=0; - Size lsize = 0, size; - static char tupstore[ 2*BLCKSZ ]; - char *ptr; - IndexTuple itup, leftrightmost=NULL; - static ginxlogSplit data; - Datum value; - bool isnull; - Page page; - Page lpage = GinPageGetCopyPage( BufferGetPage( lbuf ) ); - Page rpage = BufferGetPage( rbuf ); - Size pageSize = PageGetPageSize( lpage ); + OffsetNumber i, + maxoff, + separator = InvalidOffsetNumber; + Size totalsize = 0; + Size lsize = 0, + size; + static char tupstore[2 * BLCKSZ]; + char *ptr; + IndexTuple itup, + leftrightmost = NULL; + static ginxlogSplit data; + Datum value; + bool isnull; + Page page; + Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf)); + Page rpage = BufferGetPage(rbuf); + Size pageSize = PageGetPageSize(lpage); *prdata = rdata; - data.leftChildBlkno = ( GinPageIsLeaf(lpage) ) ? - InvalidOffsetNumber : GinItemPointerGetBlockNumber( &(btree->entry->t_tid) ); - data.updateBlkno = entryPreparePage( btree, lpage, off ); + data.leftChildBlkno = (GinPageIsLeaf(lpage)) ? + InvalidOffsetNumber : GinItemPointerGetBlockNumber(&(btree->entry->t_tid)); + data.updateBlkno = entryPreparePage(btree, lpage, off); maxoff = PageGetMaxOffsetNumber(lpage); - ptr = tupstore; + ptr = tupstore; - for(i=FirstOffsetNumber; i<=maxoff; i++) { - if ( i==off ) { - size = MAXALIGN( IndexTupleSize(btree->entry) ); + for (i = FirstOffsetNumber; i <= maxoff; i++) + { + if (i == off) + { + size = MAXALIGN(IndexTupleSize(btree->entry)); memcpy(ptr, btree->entry, size); - ptr+=size; + ptr += size; totalsize += size + sizeof(ItemIdData); } - itup = (IndexTuple)PageGetItem(lpage, PageGetItemId(lpage, i)); - size = MAXALIGN( IndexTupleSize(itup) ); + itup = (IndexTuple) PageGetItem(lpage, PageGetItemId(lpage, i)); + size = MAXALIGN(IndexTupleSize(itup)); memcpy(ptr, itup, size); - ptr+=size; + ptr += size; totalsize += size + sizeof(ItemIdData); } - if ( off==maxoff+1 ) { - size = MAXALIGN( IndexTupleSize(btree->entry) ); + if (off == maxoff + 1) + { + size = MAXALIGN(IndexTupleSize(btree->entry)); memcpy(ptr, btree->entry, size); - ptr+=size; + ptr += size; totalsize += size + sizeof(ItemIdData); } - GinInitPage( rpage, GinPageGetOpaque(lpage)->flags, pageSize ); - GinInitPage( lpage, GinPageGetOpaque(rpage)->flags, pageSize ); + GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize); + GinInitPage(lpage, GinPageGetOpaque(rpage)->flags, pageSize); ptr = tupstore; - maxoff++; + maxoff++; lsize = 0; page = lpage; - for(i=FirstOffsetNumber; i<=maxoff; i++) { - itup = (IndexTuple)ptr; - - if ( lsize > totalsize/2 ) { - if ( separator==InvalidOffsetNumber ) - separator = i-1; + for (i = FirstOffsetNumber; i <= maxoff; i++) + { + itup = (IndexTuple) ptr; + + if (lsize > totalsize / 2) + { + if (separator == InvalidOffsetNumber) + separator = i - 1; page = rpage; - } else { + } + else + { leftrightmost = itup; - lsize += MAXALIGN( IndexTupleSize(itup) ) + sizeof(ItemIdData); + lsize += MAXALIGN(IndexTupleSize(itup)) + sizeof(ItemIdData); } - if ( PageAddItem( page, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) elog(ERROR, "failed to add item to index page in \"%s\"", - RelationGetRelationName(btree->index)); - ptr += MAXALIGN( IndexTupleSize(itup) ); + RelationGetRelationName(btree->index)); + ptr += MAXALIGN(IndexTupleSize(itup)); } - + value = index_getattr(leftrightmost, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull); - btree->entry = GinFormTuple( btree->ginstate, value, NULL, 0); - ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber( lbuf ), InvalidOffsetNumber); - btree->rightblkno = BufferGetBlockNumber( rbuf ); - + btree->entry = GinFormTuple(btree->ginstate, value, NULL, 0); + ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber(lbuf), InvalidOffsetNumber); + btree->rightblkno = BufferGetBlockNumber(rbuf); + data.node = btree->index->rd_node; data.rootBlkno = InvalidBlockNumber; - data.lblkno = BufferGetBlockNumber( lbuf ); - data.rblkno = BufferGetBlockNumber( rbuf ); + data.lblkno = BufferGetBlockNumber(lbuf); + data.rblkno = BufferGetBlockNumber(rbuf); data.separator = separator; data.nitem = maxoff; data.isData = FALSE; @@ -458,23 +509,28 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR return lpage; } -/* +/* * return newly allocate rightmost tuple */ IndexTuple -ginPageGetLinkItup(Buffer buf) { - IndexTuple itup, nitup; - Page page = BufferGetPage(buf); - - itup = getRightMostTuple( page ); - if ( GinPageIsLeaf(page) && !GinIsPostingTree(itup) ) { - nitup = (IndexTuple)palloc( MAXALIGN(GinGetOrigSizePosting(itup)) ); - memcpy( nitup, itup, GinGetOrigSizePosting(itup) ); +ginPageGetLinkItup(Buffer buf) +{ + IndexTuple itup, + nitup; + Page page = BufferGetPage(buf); + + itup = getRightMostTuple(page); + if (GinPageIsLeaf(page) && !GinIsPostingTree(itup)) + { + nitup = (IndexTuple) palloc(MAXALIGN(GinGetOrigSizePosting(itup))); + memcpy(nitup, itup, GinGetOrigSizePosting(itup)); nitup->t_info &= ~INDEX_SIZE_MASK; nitup->t_info |= GinGetOrigSizePosting(itup); - } else { - nitup = (IndexTuple)palloc( MAXALIGN(IndexTupleSize(itup)) ); - memcpy( nitup, itup, IndexTupleSize(itup) ); + } + else + { + nitup = (IndexTuple) palloc(MAXALIGN(IndexTupleSize(itup))); + memcpy(nitup, itup, IndexTupleSize(itup)); } ItemPointerSet(&nitup->t_tid, BufferGetBlockNumber(buf), InvalidOffsetNumber); @@ -486,23 +542,25 @@ ginPageGetLinkItup(Buffer buf) { * Also called from ginxlog, should not use btree */ void -entryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf) { - Page page; - IndexTuple itup; +entryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf) +{ + Page page; + IndexTuple itup; page = BufferGetPage(root); - itup = ginPageGetLinkItup( lbuf ); - if ( PageAddItem( page, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) + itup = ginPageGetLinkItup(lbuf); + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) elog(ERROR, "failed to add item to index root page"); - itup = ginPageGetLinkItup( rbuf ); - if ( PageAddItem( page, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) + itup = ginPageGetLinkItup(rbuf); + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) elog(ERROR, "failed to add item to index root page"); } void -prepareEntryScan( GinBtree btree, Relation index, Datum value, GinState *ginstate) { +prepareEntryScan(GinBtree btree, Relation index, Datum value, GinState *ginstate) +{ memset(btree, 0, sizeof(GinBtreeData)); btree->isMoveRight = entryIsMoveRight; @@ -524,4 +582,3 @@ prepareEntryScan( GinBtree btree, Relation index, Datum value, GinState *ginstat btree->fullScan = FALSE; btree->isBuild = FALSE; } - diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index d40612f3ada..090bbe4f256 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginget.c - * fetch tuples from a GIN scan. + * fetch tuples from a GIN scan. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.2 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.3 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -18,15 +18,17 @@ #include "utils/memutils.h" static OffsetNumber -findItemInPage( Page page, ItemPointer item, OffsetNumber off ) { +findItemInPage(Page page, ItemPointer item, OffsetNumber off) +{ OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff; - int res; + int res; - for(; off<=maxoff; off++) { - res = compareItemPointers( item, (ItemPointer)GinDataPageGetItem(page, off) ); - Assert( res>= 0 ); + for (; off <= maxoff; off++) + { + res = compareItemPointers(item, (ItemPointer) GinDataPageGetItem(page, off)); + Assert(res >= 0); - if ( res == 0 ) + if (res == 0) return off; } @@ -38,24 +40,29 @@ findItemInPage( Page page, ItemPointer item, OffsetNumber off ) { * Stop* functions unlock buffer (but don't release!) */ static void -startScanEntry( Relation index, GinState *ginstate, GinScanEntry entry, bool firstCall ) { - if ( entry->master != NULL ) { +startScanEntry(Relation index, GinState *ginstate, GinScanEntry entry, bool firstCall) +{ + if (entry->master != NULL) + { entry->isFinished = entry->master->isFinished; return; } - if ( firstCall ) { - /* at first call we should find entry, and - begin scan of posting tree or just store posting list in memory */ + if (firstCall) + { + /* + * at first call we should find entry, and begin scan of posting tree + * or just store posting list in memory + */ GinBtreeData btreeEntry; - GinBtreeStack *stackEntry; - Page page; - bool needUnlock = TRUE; + GinBtreeStack *stackEntry; + Page page; + bool needUnlock = TRUE; - prepareEntryScan( &btreeEntry, index, entry->entry, ginstate ); + prepareEntryScan(&btreeEntry, index, entry->entry, ginstate); btreeEntry.searchMode = TRUE; stackEntry = ginFindLeafPage(&btreeEntry, NULL); - page = BufferGetPage( stackEntry->buffer ); + page = BufferGetPage(stackEntry->buffer); entry->isFinished = TRUE; entry->buffer = InvalidBuffer; @@ -65,103 +72,115 @@ startScanEntry( Relation index, GinState *ginstate, GinScanEntry entry, bool fir entry->reduceResult = FALSE; entry->predictNumberResult = 0; - if ( btreeEntry.findItem( &btreeEntry, stackEntry ) ) { - IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stackEntry->off)); + if (btreeEntry.findItem(&btreeEntry, stackEntry)) + { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stackEntry->off)); - if ( GinIsPostingTree(itup) ) { + if (GinIsPostingTree(itup)) + { BlockNumber rootPostingTree = GinGetPostingTree(itup); GinPostingTreeScan *gdi; - Page page; + Page page; LockBuffer(stackEntry->buffer, GIN_UNLOCK); - needUnlock = FALSE; - gdi = prepareScanPostingTree( index, rootPostingTree, TRUE ); + needUnlock = FALSE; + gdi = prepareScanPostingTree(index, rootPostingTree, TRUE); - entry->buffer = scanBeginPostingTree( gdi ); - IncrBufferRefCount( entry->buffer ); + entry->buffer = scanBeginPostingTree(gdi); + IncrBufferRefCount(entry->buffer); - page = BufferGetPage( entry->buffer ); - entry->predictNumberResult = gdi->stack->predictNumber * GinPageGetOpaque(page)->maxoff; + page = BufferGetPage(entry->buffer); + entry->predictNumberResult = gdi->stack->predictNumber * GinPageGetOpaque(page)->maxoff; - freeGinBtreeStack( gdi->stack ); - pfree( gdi ); + freeGinBtreeStack(gdi->stack); + pfree(gdi); entry->isFinished = FALSE; - } else if ( GinGetNPosting(itup) > 0 ) { + } + else if (GinGetNPosting(itup) > 0) + { entry->nlist = GinGetNPosting(itup); - entry->list = (ItemPointerData*)palloc( sizeof(ItemPointerData) * entry->nlist ); - memcpy( entry->list, GinGetPosting(itup), sizeof(ItemPointerData) * entry->nlist ); + entry->list = (ItemPointerData *) palloc(sizeof(ItemPointerData) * entry->nlist); + memcpy(entry->list, GinGetPosting(itup), sizeof(ItemPointerData) * entry->nlist); entry->isFinished = FALSE; } } - if ( needUnlock ) + if (needUnlock) LockBuffer(stackEntry->buffer, GIN_UNLOCK); - freeGinBtreeStack( stackEntry ); - } else if ( entry->buffer != InvalidBuffer ) { + freeGinBtreeStack(stackEntry); + } + else if (entry->buffer != InvalidBuffer) + { /* we should find place were we was stopped */ BlockNumber blkno; - Page page; + Page page; - LockBuffer( entry->buffer, GIN_SHARE ); + LockBuffer(entry->buffer, GIN_SHARE); - if ( !ItemPointerIsValid( &entry->curItem ) ) + if (!ItemPointerIsValid(&entry->curItem)) /* start position */ return; - Assert( entry->offset!=InvalidOffsetNumber ); + Assert(entry->offset != InvalidOffsetNumber); - page = BufferGetPage( entry->buffer ); + page = BufferGetPage(entry->buffer); /* try to find curItem in current buffer */ - if ( (entry->offset=findItemInPage(page , &entry->curItem, entry->offset))!=InvalidOffsetNumber ) + if ((entry->offset = findItemInPage(page, &entry->curItem, entry->offset)) != InvalidOffsetNumber) return; /* walk to right */ - while( (blkno = GinPageGetOpaque( page )->rightlink)!=InvalidBlockNumber ) { - LockBuffer( entry->buffer, GIN_UNLOCK ); - entry->buffer = ReleaseAndReadBuffer( entry->buffer, index, blkno ); - LockBuffer( entry->buffer, GIN_SHARE ); - page = BufferGetPage( entry->buffer ); - - if ( (entry->offset=findItemInPage(page , &entry->curItem, FirstOffsetNumber))!=InvalidOffsetNumber ) + while ((blkno = GinPageGetOpaque(page)->rightlink) != InvalidBlockNumber) + { + LockBuffer(entry->buffer, GIN_UNLOCK); + entry->buffer = ReleaseAndReadBuffer(entry->buffer, index, blkno); + LockBuffer(entry->buffer, GIN_SHARE); + page = BufferGetPage(entry->buffer); + + if ((entry->offset = findItemInPage(page, &entry->curItem, FirstOffsetNumber)) != InvalidOffsetNumber) return; } - elog(ERROR,"Logic error: lost previously founded ItemId"); + elog(ERROR, "Logic error: lost previously founded ItemId"); } } static void -stopScanEntry( GinScanEntry entry ) { - if ( entry->buffer != InvalidBuffer ) - LockBuffer( entry->buffer, GIN_UNLOCK ); +stopScanEntry(GinScanEntry entry) +{ + if (entry->buffer != InvalidBuffer) + LockBuffer(entry->buffer, GIN_UNLOCK); } static void -startScanKey( Relation index, GinState *ginstate, GinScanKey key ) { - uint32 i; - - for(i=0;i<key->nentries;i++) - startScanEntry( index, ginstate, key->scanEntry+i, key->firstCall ); - - if ( key->firstCall ) { - memset( key->entryRes, TRUE, sizeof(bool) * key->nentries ); +startScanKey(Relation index, GinState *ginstate, GinScanKey key) +{ + uint32 i; + + for (i = 0; i < key->nentries; i++) + startScanEntry(index, ginstate, key->scanEntry + i, key->firstCall); + + if (key->firstCall) + { + memset(key->entryRes, TRUE, sizeof(bool) * key->nentries); key->isFinished = FALSE; key->firstCall = FALSE; - if ( GinFuzzySearchLimit > 0 ) { + if (GinFuzzySearchLimit > 0) + { /* - * If all of keys more than treshold we will try to reduce - * result, we hope (and only hope, for intersection operation of array - * our supposition isn't true), that total result will not more - * than minimal predictNumberResult. + * If all of keys more than treshold we will try to reduce result, + * we hope (and only hope, for intersection operation of array our + * supposition isn't true), that total result will not more than + * minimal predictNumberResult. */ - for(i=0;i<key->nentries;i++) - if ( key->scanEntry[i].predictNumberResult <= key->nentries * GinFuzzySearchLimit ) - return; - - for(i=0;i<key->nentries;i++) - if ( key->scanEntry[i].predictNumberResult > key->nentries * GinFuzzySearchLimit ) { + for (i = 0; i < key->nentries; i++) + if (key->scanEntry[i].predictNumberResult <= key->nentries * GinFuzzySearchLimit) + return; + + for (i = 0; i < key->nentries; i++) + if (key->scanEntry[i].predictNumberResult > key->nentries * GinFuzzySearchLimit) + { key->scanEntry[i].predictNumberResult /= key->nentries; key->scanEntry[i].reduceResult = TRUE; } @@ -170,50 +189,60 @@ startScanKey( Relation index, GinState *ginstate, GinScanKey key ) { } static void -stopScanKey( GinScanKey key ) { - uint32 i; +stopScanKey(GinScanKey key) +{ + uint32 i; - for(i=0;i<key->nentries;i++) - stopScanEntry( key->scanEntry+i ); + for (i = 0; i < key->nentries; i++) + stopScanEntry(key->scanEntry + i); } static void -startScan( IndexScanDesc scan ) { - uint32 i; - GinScanOpaque so = (GinScanOpaque) scan->opaque; +startScan(IndexScanDesc scan) +{ + uint32 i; + GinScanOpaque so = (GinScanOpaque) scan->opaque; - for(i=0; i<so->nkeys; i++) - startScanKey( scan->indexRelation, &so->ginstate, so->keys + i ); + for (i = 0; i < so->nkeys; i++) + startScanKey(scan->indexRelation, &so->ginstate, so->keys + i); } static void -stopScan( IndexScanDesc scan ) { - uint32 i; - GinScanOpaque so = (GinScanOpaque) scan->opaque; +stopScan(IndexScanDesc scan) +{ + uint32 i; + GinScanOpaque so = (GinScanOpaque) scan->opaque; - for(i=0; i<so->nkeys; i++) - stopScanKey( so->keys + i ); + for (i = 0; i < so->nkeys; i++) + stopScanKey(so->keys + i); } static void -entryGetNextItem( Relation index, GinScanEntry entry ) { - Page page = BufferGetPage( entry->buffer ); +entryGetNextItem(Relation index, GinScanEntry entry) +{ + Page page = BufferGetPage(entry->buffer); entry->offset++; - if ( entry->offset <= GinPageGetOpaque( page )->maxoff && GinPageGetOpaque( page )->maxoff >= FirstOffsetNumber ) { - entry->curItem = *(ItemPointerData*)GinDataPageGetItem(page, entry->offset); - } else { - BlockNumber blkno = GinPageGetOpaque( page )->rightlink; - - LockBuffer( entry->buffer, GIN_UNLOCK ); - if ( blkno == InvalidBlockNumber ) { - ReleaseBuffer( entry->buffer ); + if (entry->offset <= GinPageGetOpaque(page)->maxoff && GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber) + { + entry->curItem = *(ItemPointerData *) GinDataPageGetItem(page, entry->offset); + } + else + { + BlockNumber blkno = GinPageGetOpaque(page)->rightlink; + + LockBuffer(entry->buffer, GIN_UNLOCK); + if (blkno == InvalidBlockNumber) + { + ReleaseBuffer(entry->buffer); entry->buffer = InvalidBuffer; entry->isFinished = TRUE; - } else { - entry->buffer = ReleaseAndReadBuffer( entry->buffer, index, blkno ); - LockBuffer( entry->buffer, GIN_SHARE ); + } + else + { + entry->buffer = ReleaseAndReadBuffer(entry->buffer, index, blkno); + LockBuffer(entry->buffer, GIN_SHARE); entry->offset = InvalidOffsetNumber; entryGetNextItem(index, entry); } @@ -221,29 +250,37 @@ entryGetNextItem( Relation index, GinScanEntry entry ) { } #define gin_rand() (((double) random()) / ((double) MAX_RANDOM_VALUE)) -#define dropItem(e) ( gin_rand() > ((double)GinFuzzySearchLimit)/((double)((e)->predictNumberResult)) ) +#define dropItem(e) ( gin_rand() > ((double)GinFuzzySearchLimit)/((double)((e)->predictNumberResult)) ) /* - * Sets entry->curItem to new found heap item pointer for one + * Sets entry->curItem to new found heap item pointer for one * entry of one scan key */ static bool -entryGetItem( Relation index, GinScanEntry entry ) { - if ( entry->master ) { +entryGetItem(Relation index, GinScanEntry entry) +{ + if (entry->master) + { entry->isFinished = entry->master->isFinished; entry->curItem = entry->master->curItem; - } else if ( entry->list ) { + } + else if (entry->list) + { entry->offset++; - if ( entry->offset <= entry->nlist ) - entry->curItem = entry->list[ entry->offset - 1 ]; - else { - ItemPointerSet( &entry->curItem, InvalidBlockNumber, InvalidOffsetNumber ); + if (entry->offset <= entry->nlist) + entry->curItem = entry->list[entry->offset - 1]; + else + { + ItemPointerSet(&entry->curItem, InvalidBlockNumber, InvalidOffsetNumber); entry->isFinished = TRUE; } - } else { - do { + } + else + { + do + { entryGetNextItem(index, entry); - } while ( entry->isFinished == FALSE && entry->reduceResult == TRUE && dropItem(entry) ); + } while (entry->isFinished == FALSE && entry->reduceResult == TRUE && dropItem(entry)); } return entry->isFinished; @@ -254,155 +291,180 @@ entryGetItem( Relation index, GinScanEntry entry ) { * returns isFinished! */ static bool -keyGetItem( Relation index, GinState *ginstate, MemoryContext tempCtx, GinScanKey key ) { - uint32 i; - GinScanEntry entry; - bool res; - MemoryContext oldCtx; - - if ( key->isFinished ) +keyGetItem(Relation index, GinState *ginstate, MemoryContext tempCtx, GinScanKey key) +{ + uint32 i; + GinScanEntry entry; + bool res; + MemoryContext oldCtx; + + if (key->isFinished) return TRUE; - do { - /* move forward from previously value and set new curItem, - which is minimal from entries->curItems */ - ItemPointerSetMax( &key->curItem ); - for(i=0;i<key->nentries;i++) { - entry = key->scanEntry+i; - - if ( key->entryRes[i] ) { - if ( entry->isFinished == FALSE && entryGetItem(index, entry) == FALSE ) { - if (compareItemPointers( &entry->curItem, &key->curItem ) < 0) + do + { + /* + * move forward from previously value and set new curItem, which is + * minimal from entries->curItems + */ + ItemPointerSetMax(&key->curItem); + for (i = 0; i < key->nentries; i++) + { + entry = key->scanEntry + i; + + if (key->entryRes[i]) + { + if (entry->isFinished == FALSE && entryGetItem(index, entry) == FALSE) + { + if (compareItemPointers(&entry->curItem, &key->curItem) < 0) key->curItem = entry->curItem; - } else + } + else key->entryRes[i] = FALSE; - } else if ( entry->isFinished == FALSE ) { - if (compareItemPointers( &entry->curItem, &key->curItem ) < 0) + } + else if (entry->isFinished == FALSE) + { + if (compareItemPointers(&entry->curItem, &key->curItem) < 0) key->curItem = entry->curItem; - } + } } - if ( ItemPointerIsMax( &key->curItem ) ) { + if (ItemPointerIsMax(&key->curItem)) + { /* all entries are finished */ key->isFinished = TRUE; return TRUE; } - - if ( key->nentries == 1 ) { + + if (key->nentries == 1) + { /* we can do not call consistentFn !! */ key->entryRes[0] = TRUE; return FALSE; } /* setting up array for consistentFn */ - for(i=0;i<key->nentries;i++) { - entry = key->scanEntry+i; - - if ( entry->isFinished == FALSE && compareItemPointers( &entry->curItem, &key->curItem )==0 ) + for (i = 0; i < key->nentries; i++) + { + entry = key->scanEntry + i; + + if (entry->isFinished == FALSE && compareItemPointers(&entry->curItem, &key->curItem) == 0) key->entryRes[i] = TRUE; else key->entryRes[i] = FALSE; } oldCtx = MemoryContextSwitchTo(tempCtx); - res = DatumGetBool( FunctionCall3( - &ginstate->consistentFn, - PointerGetDatum( key->entryRes ), - UInt16GetDatum( key->strategy ), - key->query - )); + res = DatumGetBool(FunctionCall3( + &ginstate->consistentFn, + PointerGetDatum(key->entryRes), + UInt16GetDatum(key->strategy), + key->query + )); MemoryContextSwitchTo(oldCtx); MemoryContextReset(tempCtx); - } while( !res ); - + } while (!res); + return FALSE; } /* - * Get heap item pointer from scan - * returns true if found + * Get heap item pointer from scan + * returns true if found */ static bool -scanGetItem( IndexScanDesc scan, ItemPointerData *item ) { - uint32 i; - GinScanOpaque so = (GinScanOpaque) scan->opaque; - - ItemPointerSetMin( item ); - for(i=0;i<so->nkeys;i++) { - GinScanKey key = so->keys+i; - - if ( keyGetItem( scan->indexRelation, &so->ginstate, so->tempCtx, key )==FALSE ) { - if ( compareItemPointers( item, &key->curItem ) < 0 ) +scanGetItem(IndexScanDesc scan, ItemPointerData *item) +{ + uint32 i; + GinScanOpaque so = (GinScanOpaque) scan->opaque; + + ItemPointerSetMin(item); + for (i = 0; i < so->nkeys; i++) + { + GinScanKey key = so->keys + i; + + if (keyGetItem(scan->indexRelation, &so->ginstate, so->tempCtx, key) == FALSE) + { + if (compareItemPointers(item, &key->curItem) < 0) *item = key->curItem; - } else - return FALSE; /* finshed one of keys */ + } + else + return FALSE; /* finshed one of keys */ } - - for(i=1;i<=so->nkeys;i++) { - GinScanKey key = so->keys+i-1; - for(;;) { - int cmp = compareItemPointers( item, &key->curItem ); + for (i = 1; i <= so->nkeys; i++) + { + GinScanKey key = so->keys + i - 1; + + for (;;) + { + int cmp = compareItemPointers(item, &key->curItem); - if ( cmp == 0 ) + if (cmp == 0) break; - else if ( cmp > 0 ) { - if ( keyGetItem( scan->indexRelation, &so->ginstate, so->tempCtx, key )==TRUE ) - return FALSE; /* finshed one of keys */ - } else { /* returns to begin */ + else if (cmp > 0) + { + if (keyGetItem(scan->indexRelation, &so->ginstate, so->tempCtx, key) == TRUE) + return FALSE; /* finshed one of keys */ + } + else + { /* returns to begin */ *item = key->curItem; - i=0; + i = 0; break; } } } - return TRUE; + return TRUE; } #define GinIsNewKey(s) ( ((GinScanOpaque) scan->opaque)->keys == NULL ) -Datum -gingetmulti(PG_FUNCTION_ARGS) { - IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); +Datum +gingetmulti(PG_FUNCTION_ARGS) +{ + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer tids = (ItemPointer) PG_GETARG_POINTER(1); - int32 max_tids = PG_GETARG_INT32(2); - int32 *returned_tids = (int32 *) PG_GETARG_POINTER(3); + int32 max_tids = PG_GETARG_INT32(2); + int32 *returned_tids = (int32 *) PG_GETARG_POINTER(3); - if ( GinIsNewKey(scan) ) - newScanKey( scan ); + if (GinIsNewKey(scan)) + newScanKey(scan); - startScan( scan ); + startScan(scan); *returned_tids = 0; - do { - if ( scanGetItem( scan, tids + *returned_tids ) ) + do + { + if (scanGetItem(scan, tids + *returned_tids)) (*returned_tids)++; else break; - } while ( *returned_tids < max_tids ); + } while (*returned_tids < max_tids); - stopScan( scan ); + stopScan(scan); PG_RETURN_BOOL(*returned_tids == max_tids); } Datum -gingettuple(PG_FUNCTION_ARGS) { +gingettuple(PG_FUNCTION_ARGS) +{ IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); - bool res; + bool res; - if ( dir != ForwardScanDirection ) + if (dir != ForwardScanDirection) elog(ERROR, "Gin doesn't support other scan directions than forward"); - - if ( GinIsNewKey(scan) ) - newScanKey( scan ); - startScan( scan ); + if (GinIsNewKey(scan)) + newScanKey(scan); + + startScan(scan); res = scanGetItem(scan, &scan->xs_ctup.t_self); - stopScan( scan ); + stopScan(scan); PG_RETURN_BOOL(res); } diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index 60107a57709..e4f87e720da 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * gininsert.c - * insert routines for the postgres inverted index access method. + * insert routines for the postgres inverted index access method. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.4 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.5 2006/10/04 00:29:47 momjian Exp $ *------------------------------------------------------------------------- */ @@ -19,12 +19,13 @@ #include "miscadmin.h" #include "utils/memutils.h" -typedef struct { - GinState ginstate; - double indtuples; - MemoryContext tmpCtx; - MemoryContext funcCtx; - BuildAccumulator accum; +typedef struct +{ + GinState ginstate; + double indtuples; + MemoryContext tmpCtx; + MemoryContext funcCtx; + BuildAccumulator accum; } GinBuildState; /* @@ -32,24 +33,26 @@ typedef struct { * suppose that items[] fits to page */ static BlockNumber -createPostingTree( Relation index, ItemPointerData *items, uint32 nitems ) { +createPostingTree(Relation index, ItemPointerData *items, uint32 nitems) +{ BlockNumber blkno; - Buffer buffer = GinNewBuffer(index); - Page page; + Buffer buffer = GinNewBuffer(index); + Page page; START_CRIT_SECTION(); - GinInitBuffer( buffer, GIN_DATA|GIN_LEAF ); + GinInitBuffer(buffer, GIN_DATA | GIN_LEAF); page = BufferGetPage(buffer); blkno = BufferGetBlockNumber(buffer); - memcpy( GinDataPageGetData(page), items, sizeof(ItemPointerData) * nitems ); + memcpy(GinDataPageGetData(page), items, sizeof(ItemPointerData) * nitems); GinPageGetOpaque(page)->maxoff = nitems; - if (!index->rd_istemp) { - XLogRecPtr recptr; + if (!index->rd_istemp) + { + XLogRecPtr recptr; XLogRecData rdata[2]; - ginxlogCreatePostingTree data; + ginxlogCreatePostingTree data; data.node = index->rd_node; data.blkno = blkno; @@ -71,7 +74,7 @@ createPostingTree( Relation index, ItemPointerData *items, uint32 nitems ) { PageSetLSN(page, recptr); PageSetTLI(page, ThisTimeLineID); - } + } MarkBufferDirty(buffer); UnlockReleaseBuffer(buffer); @@ -89,21 +92,25 @@ createPostingTree( Relation index, ItemPointerData *items, uint32 nitems ) { * GinFormTuple(). */ static IndexTuple -addItemPointersToTuple(Relation index, GinState *ginstate, GinBtreeStack *stack, - IndexTuple old, ItemPointerData *items, uint32 nitem, bool isBuild) { - bool isnull; - Datum key = index_getattr(old, FirstOffsetNumber, ginstate->tupdesc, &isnull); - IndexTuple res = GinFormTuple(ginstate, key, NULL, nitem + GinGetNPosting(old)); - - if ( res ) { +addItemPointersToTuple(Relation index, GinState *ginstate, GinBtreeStack *stack, + IndexTuple old, ItemPointerData *items, uint32 nitem, bool isBuild) +{ + bool isnull; + Datum key = index_getattr(old, FirstOffsetNumber, ginstate->tupdesc, &isnull); + IndexTuple res = GinFormTuple(ginstate, key, NULL, nitem + GinGetNPosting(old)); + + if (res) + { /* good, small enough */ - MergeItemPointers( GinGetPosting(res), - GinGetPosting(old), GinGetNPosting(old), - items, nitem - ); - + MergeItemPointers(GinGetPosting(res), + GinGetPosting(old), GinGetNPosting(old), + items, nitem + ); + GinSetNPosting(res, nitem + GinGetNPosting(old)); - } else { + } + else + { BlockNumber postingRoot; GinPostingTreeScan *gdi; @@ -112,7 +119,7 @@ addItemPointersToTuple(Relation index, GinState *ginstate, GinBtreeStack *stack, postingRoot = createPostingTree(index, GinGetPosting(old), GinGetNPosting(old)); GinSetPostingTree(res, postingRoot); - gdi = prepareScanPostingTree(index, postingRoot, FALSE); + gdi = prepareScanPostingTree(index, postingRoot, FALSE); gdi->btree.isBuild = isBuild; insertItemPointer(gdi, items, nitem); @@ -124,36 +131,39 @@ addItemPointersToTuple(Relation index, GinState *ginstate, GinBtreeStack *stack, } /* - * Inserts only one entry to the index, but it can adds more that 1 - * ItemPointer. + * Inserts only one entry to the index, but it can adds more that 1 + * ItemPointer. */ static void -ginEntryInsert( Relation index, GinState *ginstate, Datum value, ItemPointerData *items, uint32 nitem, bool isBuild) { - GinBtreeData btree; +ginEntryInsert(Relation index, GinState *ginstate, Datum value, ItemPointerData *items, uint32 nitem, bool isBuild) +{ + GinBtreeData btree; GinBtreeStack *stack; - IndexTuple itup; - Page page; + IndexTuple itup; + Page page; - prepareEntryScan( &btree, index, value, ginstate ); + prepareEntryScan(&btree, index, value, ginstate); stack = ginFindLeafPage(&btree, NULL); - page = BufferGetPage( stack->buffer ); + page = BufferGetPage(stack->buffer); - if ( btree.findItem( &btree, stack ) ) { + if (btree.findItem(&btree, stack)) + { /* found entry */ itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off)); - if ( GinIsPostingTree(itup) ) { + if (GinIsPostingTree(itup)) + { /* lock root of posting tree */ GinPostingTreeScan *gdi; - BlockNumber rootPostingTree = GinGetPostingTree(itup); + BlockNumber rootPostingTree = GinGetPostingTree(itup); /* release all stack */ LockBuffer(stack->buffer, GIN_UNLOCK); - freeGinBtreeStack( stack ); + freeGinBtreeStack(stack); /* insert into posting tree */ - gdi = prepareScanPostingTree( index, rootPostingTree, FALSE ); + gdi = prepareScanPostingTree(index, rootPostingTree, FALSE); gdi->btree.isBuild = isBuild; insertItemPointer(gdi, items, nitem); @@ -163,23 +173,26 @@ ginEntryInsert( Relation index, GinState *ginstate, Datum value, ItemPointerData itup = addItemPointersToTuple(index, ginstate, stack, itup, items, nitem, isBuild); btree.isDelete = TRUE; - } else { + } + else + { /* We suppose, that tuple can store at list one itempointer */ - itup = GinFormTuple( ginstate, value, items, 1); - if ( itup==NULL || IndexTupleSize(itup) >= GinMaxItemSize ) + itup = GinFormTuple(ginstate, value, items, 1); + if (itup == NULL || IndexTupleSize(itup) >= GinMaxItemSize) elog(ERROR, "huge tuple"); - if ( nitem>1 ) { + if (nitem > 1) + { IndexTuple previtup = itup; - itup = addItemPointersToTuple(index, ginstate, stack, previtup, items+1, nitem-1, isBuild); + itup = addItemPointersToTuple(index, ginstate, stack, previtup, items + 1, nitem - 1, isBuild); pfree(previtup); } } btree.entry = itup; ginInsertValue(&btree, stack); - pfree( itup ); + pfree(itup); } /* @@ -187,48 +200,53 @@ ginEntryInsert( Relation index, GinState *ginstate, Datum value, ItemPointerData * Function isnt use during normal insert */ static uint32 -ginHeapTupleBulkInsert(GinBuildState *buildstate, Datum value, ItemPointer heapptr) { - Datum *entries; - uint32 nentries; +ginHeapTupleBulkInsert(GinBuildState *buildstate, Datum value, ItemPointer heapptr) +{ + Datum *entries; + uint32 nentries; MemoryContext oldCtx; oldCtx = MemoryContextSwitchTo(buildstate->funcCtx); - entries = extractEntriesSU( buildstate->accum.ginstate, value, &nentries); + entries = extractEntriesSU(buildstate->accum.ginstate, value, &nentries); MemoryContextSwitchTo(oldCtx); - if ( nentries==0 ) + if (nentries == 0) /* nothing to insert */ return 0; - ginInsertRecordBA( &buildstate->accum, heapptr, entries, nentries); + ginInsertRecordBA(&buildstate->accum, heapptr, entries, nentries); MemoryContextReset(buildstate->funcCtx); return nentries; } -static void +static void ginBuildCallback(Relation index, HeapTuple htup, Datum *values, - bool *isnull, bool tupleIsAlive, void *state) { + bool *isnull, bool tupleIsAlive, void *state) +{ - GinBuildState *buildstate = (GinBuildState*)state; + GinBuildState *buildstate = (GinBuildState *) state; MemoryContext oldCtx; - if ( *isnull ) + if (*isnull) return; oldCtx = MemoryContextSwitchTo(buildstate->tmpCtx); buildstate->indtuples += ginHeapTupleBulkInsert(buildstate, *values, &htup->t_self); - /* we use only half maintenance_work_mem, because there is some leaks - during insertion and extract values */ - if ( buildstate->accum.allocatedMemory >= maintenance_work_mem*1024L/2L ) { - ItemPointerData *list; - Datum entry; - uint32 nlist; + /* + * we use only half maintenance_work_mem, because there is some leaks + * during insertion and extract values + */ + if (buildstate->accum.allocatedMemory >= maintenance_work_mem * 1024L / 2L) + { + ItemPointerData *list; + Datum entry; + uint32 nlist; - while( (list=ginGetEntry(&buildstate->accum, &entry, &nlist)) != NULL ) + while ((list = ginGetEntry(&buildstate->accum, &entry, &nlist)) != NULL) ginEntryInsert(index, &buildstate->ginstate, entry, list, nlist, TRUE); MemoryContextReset(buildstate->tmpCtx); @@ -239,22 +257,23 @@ ginBuildCallback(Relation index, HeapTuple htup, Datum *values, } Datum -ginbuild(PG_FUNCTION_ARGS) { - Relation heap = (Relation) PG_GETARG_POINTER(0); - Relation index = (Relation) PG_GETARG_POINTER(1); +ginbuild(PG_FUNCTION_ARGS) +{ + Relation heap = (Relation) PG_GETARG_POINTER(0); + Relation index = (Relation) PG_GETARG_POINTER(1); IndexInfo *indexInfo = (IndexInfo *) PG_GETARG_POINTER(2); IndexBuildResult *result; - double reltuples; - GinBuildState buildstate; + double reltuples; + GinBuildState buildstate; Buffer buffer; - ItemPointerData *list; - Datum entry; - uint32 nlist; + ItemPointerData *list; + Datum entry; + uint32 nlist; MemoryContext oldCtx; if (RelationGetNumberOfBlocks(index) != 0) elog(ERROR, "index \"%s\" already contains data", - RelationGetRelationName(index)); + RelationGetRelationName(index)); initGinState(&buildstate.ginstate, index); @@ -262,10 +281,11 @@ ginbuild(PG_FUNCTION_ARGS) { buffer = GinNewBuffer(index); START_CRIT_SECTION(); GinInitBuffer(buffer, GIN_LEAF); - if (!index->rd_istemp) { - XLogRecPtr recptr; + if (!index->rd_istemp) + { + XLogRecPtr recptr; XLogRecData rdata; - Page page; + Page page; rdata.buffer = InvalidBuffer; rdata.data = (char *) &(index->rd_node); @@ -279,7 +299,7 @@ ginbuild(PG_FUNCTION_ARGS) { PageSetLSN(page, recptr); PageSetTLI(page, ThisTimeLineID); - } + } MarkBufferDirty(buffer); UnlockReleaseBuffer(buffer); @@ -293,26 +313,26 @@ ginbuild(PG_FUNCTION_ARGS) { * inserted into the index */ buildstate.tmpCtx = AllocSetContextCreate(CurrentMemoryContext, - "Gin build temporary context", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + "Gin build temporary context", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); buildstate.funcCtx = AllocSetContextCreate(buildstate.tmpCtx, - "Gin build temporary context for user-defined function", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + "Gin build temporary context for user-defined function", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); buildstate.accum.ginstate = &buildstate.ginstate; - ginInitBA( &buildstate.accum ); + ginInitBA(&buildstate.accum); /* do the heap scan */ reltuples = IndexBuildHeapScan(heap, index, indexInfo, - ginBuildCallback, (void *) &buildstate); + ginBuildCallback, (void *) &buildstate); oldCtx = MemoryContextSwitchTo(buildstate.tmpCtx); - while( (list=ginGetEntry(&buildstate.accum, &entry, &nlist)) != NULL ) + while ((list = ginGetEntry(&buildstate.accum, &entry, &nlist)) != NULL) ginEntryInsert(index, &buildstate.ginstate, entry, list, nlist, TRUE); MemoryContextSwitchTo(oldCtx); @@ -333,55 +353,58 @@ ginbuild(PG_FUNCTION_ARGS) { * Inserts value during normal insertion */ static uint32 -ginHeapTupleInsert( Relation index, GinState *ginstate, Datum value, ItemPointer item) { - Datum *entries; - uint32 i,nentries; +ginHeapTupleInsert(Relation index, GinState *ginstate, Datum value, ItemPointer item) +{ + Datum *entries; + uint32 i, + nentries; - entries = extractEntriesSU( ginstate, value, &nentries); + entries = extractEntriesSU(ginstate, value, &nentries); - if ( nentries==0 ) + if (nentries == 0) /* nothing to insert */ return 0; - for(i=0;i<nentries;i++) + for (i = 0; i < nentries; i++) ginEntryInsert(index, ginstate, entries[i], item, 1, FALSE); return nentries; } Datum -gininsert(PG_FUNCTION_ARGS) { - Relation index = (Relation) PG_GETARG_POINTER(0); - Datum *values = (Datum *) PG_GETARG_POINTER(1); - bool *isnull = (bool *) PG_GETARG_POINTER(2); +gininsert(PG_FUNCTION_ARGS) +{ + Relation index = (Relation) PG_GETARG_POINTER(0); + Datum *values = (Datum *) PG_GETARG_POINTER(1); + bool *isnull = (bool *) PG_GETARG_POINTER(2); ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3); + #ifdef NOT_USED - Relation heapRel = (Relation) PG_GETARG_POINTER(4); - bool checkUnique = PG_GETARG_BOOL(5); + Relation heapRel = (Relation) PG_GETARG_POINTER(4); + bool checkUnique = PG_GETARG_BOOL(5); #endif - GinState ginstate; + GinState ginstate; MemoryContext oldCtx; MemoryContext insertCtx; - uint32 res; + uint32 res; - if ( *isnull ) + if (*isnull) PG_RETURN_BOOL(false); insertCtx = AllocSetContextCreate(CurrentMemoryContext, - "Gin insert temporary context", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + "Gin insert temporary context", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); oldCtx = MemoryContextSwitchTo(insertCtx); initGinState(&ginstate, index); - res = ginHeapTupleInsert(index, &ginstate, *values, ht_ctid); + res = ginHeapTupleInsert(index, &ginstate, *values, ht_ctid); MemoryContextSwitchTo(oldCtx); MemoryContextDelete(insertCtx); - PG_RETURN_BOOL(res>0); + PG_RETURN_BOOL(res > 0); } - diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c index 2093f1ce8a6..b69f409e1cd 100644 --- a/src/backend/access/gin/ginscan.c +++ b/src/backend/access/gin/ginscan.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginscan.c - * routines to manage scans inverted index relations + * routines to manage scans inverted index relations * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.5 2006/09/14 11:26:49 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.6 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ @@ -19,11 +19,12 @@ #include "utils/memutils.h" -Datum -ginbeginscan(PG_FUNCTION_ARGS) { - Relation rel = (Relation) PG_GETARG_POINTER(0); - int keysz = PG_GETARG_INT32(1); - ScanKey scankey = (ScanKey) PG_GETARG_POINTER(2); +Datum +ginbeginscan(PG_FUNCTION_ARGS) +{ + Relation rel = (Relation) PG_GETARG_POINTER(0); + int keysz = PG_GETARG_INT32(1); + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(2); IndexScanDesc scan; scan = RelationGetIndexScan(rel, keysz, scankey); @@ -32,22 +33,25 @@ ginbeginscan(PG_FUNCTION_ARGS) { } static void -fillScanKey( GinState *ginstate, GinScanKey key, Datum query, - Datum *entryValues, uint32 nEntryValues, StrategyNumber strategy ) { - uint32 i,j; +fillScanKey(GinState *ginstate, GinScanKey key, Datum query, + Datum *entryValues, uint32 nEntryValues, StrategyNumber strategy) +{ + uint32 i, + j; key->nentries = nEntryValues; - key->entryRes = (bool*)palloc0( sizeof(bool) * nEntryValues ); - key->scanEntry = (GinScanEntry) palloc( sizeof(GinScanEntryData) * nEntryValues ); + key->entryRes = (bool *) palloc0(sizeof(bool) * nEntryValues); + key->scanEntry = (GinScanEntry) palloc(sizeof(GinScanEntryData) * nEntryValues); key->strategy = strategy; key->query = query; - key->firstCall= TRUE; - ItemPointerSet( &(key->curItem), InvalidBlockNumber, InvalidOffsetNumber ); + key->firstCall = TRUE; + ItemPointerSet(&(key->curItem), InvalidBlockNumber, InvalidOffsetNumber); - for(i=0; i<nEntryValues; i++) { + for (i = 0; i < nEntryValues; i++) + { key->scanEntry[i].pval = key->entryRes + i; key->scanEntry[i].entry = entryValues[i]; - ItemPointerSet( &(key->scanEntry[i].curItem), InvalidBlockNumber, InvalidOffsetNumber ); + ItemPointerSet(&(key->scanEntry[i].curItem), InvalidBlockNumber, InvalidOffsetNumber); key->scanEntry[i].offset = InvalidOffsetNumber; key->scanEntry[i].buffer = InvalidBuffer; key->scanEntry[i].list = NULL; @@ -55,8 +59,9 @@ fillScanKey( GinState *ginstate, GinScanKey key, Datum query, /* link to the equals entry in current scan key */ key->scanEntry[i].master = NULL; - for( j=0; j<i; j++) - if ( compareEntries( ginstate, entryValues[i], entryValues[j] ) == 0 ) { + for (j = 0; j < i; j++) + if (compareEntries(ginstate, entryValues[i], entryValues[j]) == 0) + { key->scanEntry[i].master = key->scanEntry + j; break; } @@ -66,23 +71,27 @@ fillScanKey( GinState *ginstate, GinScanKey key, Datum query, #ifdef NOT_USED static void -resetScanKeys(GinScanKey keys, uint32 nkeys) { - uint32 i, j; +resetScanKeys(GinScanKey keys, uint32 nkeys) +{ + uint32 i, + j; - if ( keys == NULL ) + if (keys == NULL) return; - for(i=0;i<nkeys;i++) { - GinScanKey key = keys + i; + for (i = 0; i < nkeys; i++) + { + GinScanKey key = keys + i; key->firstCall = TRUE; - ItemPointerSet( &(key->curItem), InvalidBlockNumber, InvalidOffsetNumber ); + ItemPointerSet(&(key->curItem), InvalidBlockNumber, InvalidOffsetNumber); - for(j=0;j<key->nentries;j++) { - if ( key->scanEntry[j].buffer != InvalidBuffer ) - ReleaseBuffer( key->scanEntry[i].buffer ); + for (j = 0; j < key->nentries; j++) + { + if (key->scanEntry[j].buffer != InvalidBuffer) + ReleaseBuffer(key->scanEntry[i].buffer); - ItemPointerSet( &(key->scanEntry[j].curItem), InvalidBlockNumber, InvalidOffsetNumber ); + ItemPointerSet(&(key->scanEntry[j].curItem), InvalidBlockNumber, InvalidOffsetNumber); key->scanEntry[j].offset = InvalidOffsetNumber; key->scanEntry[j].buffer = InvalidBuffer; key->scanEntry[j].list = NULL; @@ -90,111 +99,121 @@ resetScanKeys(GinScanKey keys, uint32 nkeys) { } } } - #endif static void -freeScanKeys(GinScanKey keys, uint32 nkeys, bool removeRes) { - uint32 i, j; +freeScanKeys(GinScanKey keys, uint32 nkeys, bool removeRes) +{ + uint32 i, + j; - if ( keys == NULL ) + if (keys == NULL) return; - for(i=0;i<nkeys;i++) { - GinScanKey key = keys + i; + for (i = 0; i < nkeys; i++) + { + GinScanKey key = keys + i; - for(j=0;j<key->nentries;j++) { - if ( key->scanEntry[j].buffer != InvalidBuffer ) - ReleaseBuffer( key->scanEntry[j].buffer ); - if ( removeRes && key->scanEntry[j].list ) + for (j = 0; j < key->nentries; j++) + { + if (key->scanEntry[j].buffer != InvalidBuffer) + ReleaseBuffer(key->scanEntry[j].buffer); + if (removeRes && key->scanEntry[j].list) pfree(key->scanEntry[j].list); } - if ( removeRes ) + if (removeRes) pfree(key->entryRes); pfree(key->scanEntry); } - + pfree(keys); } void -newScanKey( IndexScanDesc scan ) { - ScanKey scankey = scan->keyData; +newScanKey(IndexScanDesc scan) +{ + ScanKey scankey = scan->keyData; GinScanOpaque so = (GinScanOpaque) scan->opaque; - int i; - uint32 nkeys = 0; + int i; + uint32 nkeys = 0; - so->keys = (GinScanKey) palloc( scan->numberOfKeys * sizeof(GinScanKeyData) ); + so->keys = (GinScanKey) palloc(scan->numberOfKeys * sizeof(GinScanKeyData)); if (scan->numberOfKeys < 1) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("GIN indexes do not support whole-index scans"))); + errmsg("GIN indexes do not support whole-index scans"))); - for(i=0; i<scan->numberOfKeys; i++) { - Datum* entryValues; - uint32 nEntryValues; + for (i = 0; i < scan->numberOfKeys; i++) + { + Datum *entryValues; + uint32 nEntryValues; - if ( scankey[i].sk_flags & SK_ISNULL ) + if (scankey[i].sk_flags & SK_ISNULL) elog(ERROR, "Gin doesn't support NULL as scan key"); - Assert( scankey[i].sk_attno == 1 ); - - entryValues = (Datum*)DatumGetPointer( - FunctionCall3( - &so->ginstate.extractQueryFn, - scankey[i].sk_argument, - PointerGetDatum( &nEntryValues ), - UInt16GetDatum(scankey[i].sk_strategy) - ) - ); - if ( entryValues==NULL || nEntryValues == 0 ) + Assert(scankey[i].sk_attno == 1); + + entryValues = (Datum *) DatumGetPointer( + FunctionCall3( + &so->ginstate.extractQueryFn, + scankey[i].sk_argument, + PointerGetDatum(&nEntryValues), + UInt16GetDatum(scankey[i].sk_strategy) + ) + ); + if (entryValues == NULL || nEntryValues == 0) /* full scan... */ continue; - fillScanKey( &so->ginstate, &(so->keys[nkeys]), scankey[i].sk_argument, - entryValues, nEntryValues, scankey[i].sk_strategy ); + fillScanKey(&so->ginstate, &(so->keys[nkeys]), scankey[i].sk_argument, + entryValues, nEntryValues, scankey[i].sk_strategy); nkeys++; } so->nkeys = nkeys; - if ( so->nkeys == 0 ) + if (so->nkeys == 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("GIN index doesn't support search with void query"))); + errmsg("GIN index doesn't support search with void query"))); pgstat_count_index_scan(&scan->xs_pgstat_info); } Datum -ginrescan(PG_FUNCTION_ARGS) { +ginrescan(PG_FUNCTION_ARGS) +{ IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - ScanKey scankey = (ScanKey) PG_GETARG_POINTER(1); - GinScanOpaque so; + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(1); + GinScanOpaque so; so = (GinScanOpaque) scan->opaque; - if ( so == NULL ) { + if (so == NULL) + { /* if called from ginbeginscan */ - so = (GinScanOpaque)palloc( sizeof(GinScanOpaqueData) ); + so = (GinScanOpaque) palloc(sizeof(GinScanOpaqueData)); so->tempCtx = AllocSetContextCreate(CurrentMemoryContext, - "Gin scan temporary context", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + "Gin scan temporary context", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); initGinState(&so->ginstate, scan->indexRelation); scan->opaque = so; - } else { + } + else + { freeScanKeys(so->keys, so->nkeys, TRUE); freeScanKeys(so->markPos, so->nkeys, FALSE); } - so->markPos=so->keys=NULL; + so->markPos = so->keys = NULL; - if ( scankey && scan->numberOfKeys > 0 ) { + if (scankey && scan->numberOfKeys > 0) + { memmove(scan->keyData, scankey, - scan->numberOfKeys * sizeof(ScanKeyData)); + scan->numberOfKeys * sizeof(ScanKeyData)); } PG_RETURN_VOID(); @@ -202,13 +221,15 @@ ginrescan(PG_FUNCTION_ARGS) { Datum -ginendscan(PG_FUNCTION_ARGS) { +ginendscan(PG_FUNCTION_ARGS) +{ IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GinScanOpaque so = (GinScanOpaque) scan->opaque; + GinScanOpaque so = (GinScanOpaque) scan->opaque; - if ( so != NULL ) { - freeScanKeys(so->keys, so->nkeys, TRUE); - freeScanKeys(so->markPos, so->nkeys, FALSE); + if (so != NULL) + { + freeScanKeys(so->keys, so->nkeys, TRUE); + freeScanKeys(so->markPos, so->nkeys, FALSE); MemoryContextDelete(so->tempCtx); @@ -219,22 +240,28 @@ ginendscan(PG_FUNCTION_ARGS) { } static GinScanKey -copyScanKeys( GinScanKey keys, uint32 nkeys ) { +copyScanKeys(GinScanKey keys, uint32 nkeys) +{ GinScanKey newkeys; - uint32 i, j; + uint32 i, + j; + + newkeys = (GinScanKey) palloc(sizeof(GinScanKeyData) * nkeys); + memcpy(newkeys, keys, sizeof(GinScanKeyData) * nkeys); - newkeys = (GinScanKey)palloc( sizeof(GinScanKeyData) * nkeys ); - memcpy( newkeys, keys, sizeof(GinScanKeyData) * nkeys ); + for (i = 0; i < nkeys; i++) + { + newkeys[i].scanEntry = (GinScanEntry) palloc(sizeof(GinScanEntryData) * keys[i].nentries); + memcpy(newkeys[i].scanEntry, keys[i].scanEntry, sizeof(GinScanEntryData) * keys[i].nentries); - for(i=0;i<nkeys;i++) { - newkeys[i].scanEntry = (GinScanEntry)palloc(sizeof(GinScanEntryData) * keys[i].nentries ); - memcpy( newkeys[i].scanEntry, keys[i].scanEntry, sizeof(GinScanEntryData) * keys[i].nentries ); + for (j = 0; j < keys[i].nentries; j++) + { + if (keys[i].scanEntry[j].buffer != InvalidBuffer) + IncrBufferRefCount(keys[i].scanEntry[j].buffer); + if (keys[i].scanEntry[j].master) + { + int masterN = keys[i].scanEntry[j].master - keys[i].scanEntry; - for(j=0;j<keys[i].nentries; j++) { - if ( keys[i].scanEntry[j].buffer != InvalidBuffer ) - IncrBufferRefCount( keys[i].scanEntry[j].buffer ); - if ( keys[i].scanEntry[j].master ) { - int masterN = keys[i].scanEntry[j].master - keys[i].scanEntry; newkeys[i].scanEntry[j].master = newkeys[i].scanEntry + masterN; } } @@ -243,24 +270,26 @@ copyScanKeys( GinScanKey keys, uint32 nkeys ) { return newkeys; } -Datum -ginmarkpos(PG_FUNCTION_ARGS) { +Datum +ginmarkpos(PG_FUNCTION_ARGS) +{ IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GinScanOpaque so = (GinScanOpaque) scan->opaque; + GinScanOpaque so = (GinScanOpaque) scan->opaque; freeScanKeys(so->markPos, so->nkeys, FALSE); - so->markPos = copyScanKeys( so->keys, so->nkeys ); + so->markPos = copyScanKeys(so->keys, so->nkeys); PG_RETURN_VOID(); } -Datum -ginrestrpos(PG_FUNCTION_ARGS) { +Datum +ginrestrpos(PG_FUNCTION_ARGS) +{ IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GinScanOpaque so = (GinScanOpaque) scan->opaque; + GinScanOpaque so = (GinScanOpaque) scan->opaque; freeScanKeys(so->keys, so->nkeys, FALSE); - so->keys = copyScanKeys( so->markPos, so->nkeys ); + so->keys = copyScanKeys(so->markPos, so->nkeys); PG_RETURN_VOID(); } diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index 17eca3d239f..e64137a1062 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginutil.c - * utilities routines for the postgres inverted index access method. + * utilities routines for the postgres inverted index access method. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginutil.c,v 1.6 2006/09/05 18:25:10 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginutil.c,v 1.7 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ @@ -19,26 +19,27 @@ #include "access/reloptions.h" #include "storage/freespace.h" -void -initGinState( GinState *state, Relation index ) { - if ( index->rd_att->natts != 1 ) - elog(ERROR, "numberOfAttributes %d != 1", - index->rd_att->natts); - +void +initGinState(GinState *state, Relation index) +{ + if (index->rd_att->natts != 1) + elog(ERROR, "numberOfAttributes %d != 1", + index->rd_att->natts); + state->tupdesc = index->rd_att; fmgr_info_copy(&(state->compareFn), - index_getprocinfo(index, 1, GIN_COMPARE_PROC), - CurrentMemoryContext); + index_getprocinfo(index, 1, GIN_COMPARE_PROC), + CurrentMemoryContext); fmgr_info_copy(&(state->extractValueFn), - index_getprocinfo(index, 1, GIN_EXTRACTVALUE_PROC), - CurrentMemoryContext); + index_getprocinfo(index, 1, GIN_EXTRACTVALUE_PROC), + CurrentMemoryContext); fmgr_info_copy(&(state->extractQueryFn), - index_getprocinfo(index, 1, GIN_EXTRACTQUERY_PROC), - CurrentMemoryContext); + index_getprocinfo(index, 1, GIN_EXTRACTQUERY_PROC), + CurrentMemoryContext); fmgr_info_copy(&(state->consistentFn), - index_getprocinfo(index, 1, GIN_CONSISTENT_PROC), - CurrentMemoryContext); + index_getprocinfo(index, 1, GIN_CONSISTENT_PROC), + CurrentMemoryContext); } /* @@ -48,13 +49,16 @@ initGinState( GinState *state, Relation index ) { */ Buffer -GinNewBuffer(Relation index) { - Buffer buffer; - bool needLock; +GinNewBuffer(Relation index) +{ + Buffer buffer; + bool needLock; /* First, try to get a page from FSM */ - for(;;) { + for (;;) + { BlockNumber blkno = GetFreeIndexPage(&index->rd_node); + if (blkno == InvalidBlockNumber) break; @@ -64,14 +68,15 @@ GinNewBuffer(Relation index) { * We have to guard against the possibility that someone else already * recycled this page; the buffer may be locked if so. */ - if (ConditionalLockBuffer(buffer)) { - Page page = BufferGetPage(buffer); + if (ConditionalLockBuffer(buffer)) + { + Page page = BufferGetPage(buffer); if (PageIsNew(page)) - return buffer; /* OK to use, if never initialized */ + return buffer; /* OK to use, if never initialized */ if (GinPageIsDeleted(page)) - return buffer; /* OK to use */ + return buffer; /* OK to use */ LockBuffer(buffer, GIN_UNLOCK); } @@ -95,36 +100,39 @@ GinNewBuffer(Relation index) { } void -GinInitPage(Page page, uint32 f, Size pageSize) { +GinInitPage(Page page, uint32 f, Size pageSize) +{ GinPageOpaque opaque; PageInit(page, pageSize, sizeof(GinPageOpaqueData)); opaque = GinPageGetOpaque(page); - memset( opaque, 0, sizeof(GinPageOpaqueData) ); - opaque->flags = f; + memset(opaque, 0, sizeof(GinPageOpaqueData)); + opaque->flags = f; opaque->rightlink = InvalidBlockNumber; } void -GinInitBuffer(Buffer b, uint32 f) { - GinInitPage( BufferGetPage(b), f, BufferGetPageSize(b) ); +GinInitBuffer(Buffer b, uint32 f) +{ + GinInitPage(BufferGetPage(b), f, BufferGetPageSize(b)); } int -compareEntries(GinState *ginstate, Datum a, Datum b) { +compareEntries(GinState *ginstate, Datum a, Datum b) +{ return DatumGetInt32( - FunctionCall2( - &ginstate->compareFn, - a, b - ) + FunctionCall2( + &ginstate->compareFn, + a, b + ) ); } -static FmgrInfo* cmpDatumPtr=NULL; +static FmgrInfo *cmpDatumPtr = NULL; -#if defined(__INTEL_COMPILER) && (defined(__ia64__) || defined(__ia64)) -/* +#if defined(__INTEL_COMPILER) && (defined(__ia64__) || defined(__ia64)) +/* * Intel Compiler on Intel Itanium with -O2 has a bug around * change static variable by user function called from * libc func: it doesn't change. So mark it as volatile. @@ -132,7 +140,7 @@ static FmgrInfo* cmpDatumPtr=NULL; * It's a pity, but it's impossible to define optimization * level here. */ -#define VOLATILE volatile +#define VOLATILE volatile #else #define VOLATILE #endif @@ -140,57 +148,64 @@ static FmgrInfo* cmpDatumPtr=NULL; static bool VOLATILE needUnique = FALSE; static int -cmpEntries(const void * a, const void * b) { - int res = DatumGetInt32( - FunctionCall2( - cmpDatumPtr, - *(Datum*)a, - *(Datum*)b - ) +cmpEntries(const void *a, const void *b) +{ + int res = DatumGetInt32( + FunctionCall2( + cmpDatumPtr, + *(Datum *) a, + *(Datum *) b + ) ); - if ( res == 0 ) + if (res == 0) needUnique = TRUE; return res; } -Datum* -extractEntriesS(GinState *ginstate, Datum value, uint32 *nentries) { - Datum *entries; +Datum * +extractEntriesS(GinState *ginstate, Datum value, uint32 *nentries) +{ + Datum *entries; - entries = (Datum*)DatumGetPointer( - FunctionCall2( - &ginstate->extractValueFn, - value, - PointerGetDatum( nentries ) - ) - ); + entries = (Datum *) DatumGetPointer( + FunctionCall2( + &ginstate->extractValueFn, + value, + PointerGetDatum(nentries) + ) + ); - if ( entries == NULL ) + if (entries == NULL) *nentries = 0; - if ( *nentries > 1 ) { + if (*nentries > 1) + { cmpDatumPtr = &ginstate->compareFn; needUnique = FALSE; - qsort(entries, *nentries, sizeof(Datum), cmpEntries); + qsort(entries, *nentries, sizeof(Datum), cmpEntries); } return entries; } -Datum* -extractEntriesSU(GinState *ginstate, Datum value, uint32 *nentries) { - Datum *entries = extractEntriesS(ginstate, value, nentries); +Datum * +extractEntriesSU(GinState *ginstate, Datum value, uint32 *nentries) +{ + Datum *entries = extractEntriesS(ginstate, value, nentries); - if ( *nentries>1 && needUnique ) { - Datum *ptr, *res; + if (*nentries > 1 && needUnique) + { + Datum *ptr, + *res; ptr = res = entries; - while( ptr - entries < *nentries ) { - if ( compareEntries(ginstate, *ptr, *res ) != 0 ) + while (ptr - entries < *nentries) + { + if (compareEntries(ginstate, *ptr, *res) != 0) *(++res) = *ptr++; else ptr++; @@ -206,13 +221,14 @@ extractEntriesSU(GinState *ginstate, Datum value, uint32 *nentries) { * It's analog of PageGetTempPage(), but copies whole page */ Page -GinPageGetCopyPage( Page page ) { - Size pageSize = PageGetPageSize( page ); - Page tmppage; +GinPageGetCopyPage(Page page) +{ + Size pageSize = PageGetPageSize(page); + Page tmppage; + + tmppage = (Page) palloc(pageSize); + memcpy(tmppage, page, pageSize); - tmppage=(Page)palloc( pageSize ); - memcpy( tmppage, page, pageSize ); - return tmppage; } diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index 31e5f647f07..e0718862c51 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -1,14 +1,14 @@ /*------------------------------------------------------------------------- * * ginvacuum.c - * delete & vacuum routines for the postgres GIN + * delete & vacuum routines for the postgres GIN * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.6 2006/09/21 20:31:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.7 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ @@ -21,42 +21,50 @@ #include "storage/freespace.h" #include "commands/vacuum.h" -typedef struct { - Relation index; - IndexBulkDeleteResult *result; - IndexBulkDeleteCallback callback; - void *callback_state; - GinState ginstate; +typedef struct +{ + Relation index; + IndexBulkDeleteResult *result; + IndexBulkDeleteCallback callback; + void *callback_state; + GinState ginstate; } GinVacuumState; /* * Cleans array of ItemPointer (removes dead pointers) * Results are always stored in *cleaned, which will be allocated - * if its needed. In case of *cleaned!=NULL caller is resposible to + * if its needed. In case of *cleaned!=NULL caller is resposible to * enough space. *cleaned and items may point to the same * memory addres. */ static uint32 -ginVacuumPostingList( GinVacuumState *gvs, ItemPointerData *items, uint32 nitem, ItemPointerData **cleaned ) { - uint32 i,j=0; +ginVacuumPostingList(GinVacuumState *gvs, ItemPointerData *items, uint32 nitem, ItemPointerData **cleaned) +{ + uint32 i, + j = 0; /* * just scan over ItemPointer array */ - for(i=0;i<nitem;i++) { - if ( gvs->callback(items+i, gvs->callback_state) ) { + for (i = 0; i < nitem; i++) + { + if (gvs->callback(items + i, gvs->callback_state)) + { gvs->result->tuples_removed += 1; - if ( !*cleaned ) { - *cleaned = (ItemPointerData*)palloc(sizeof(ItemPointerData)*nitem); - if ( i!=0 ) - memcpy( *cleaned, items, sizeof(ItemPointerData)*i); + if (!*cleaned) + { + *cleaned = (ItemPointerData *) palloc(sizeof(ItemPointerData) * nitem); + if (i != 0) + memcpy(*cleaned, items, sizeof(ItemPointerData) * i); } - } else { + } + else + { gvs->result->num_index_tuples += 1; - if (i!=j) + if (i != j) (*cleaned)[j] = items[i]; j++; } @@ -69,56 +77,65 @@ ginVacuumPostingList( GinVacuumState *gvs, ItemPointerData *items, uint32 nitem, * fills WAL record for vacuum leaf page */ static void -xlogVacuumPage(Relation index, Buffer buffer) { - Page page = BufferGetPage( buffer ); - XLogRecPtr recptr; +xlogVacuumPage(Relation index, Buffer buffer) +{ + Page page = BufferGetPage(buffer); + XLogRecPtr recptr; XLogRecData rdata[3]; - ginxlogVacuumPage data; - char *backup; - char itups[BLCKSZ]; - uint32 len=0; + ginxlogVacuumPage data; + char *backup; + char itups[BLCKSZ]; + uint32 len = 0; - Assert( GinPageIsLeaf( page ) ); + Assert(GinPageIsLeaf(page)); if (index->rd_istemp) - return; + return; data.node = index->rd_node; data.blkno = BufferGetBlockNumber(buffer); - if ( GinPageIsData( page ) ) { - backup = GinDataPageGetData( page ); - data.nitem = GinPageGetOpaque( page )->maxoff; - if ( data.nitem ) - len = MAXALIGN( sizeof(ItemPointerData)*data.nitem ); - } else { - char *ptr; + if (GinPageIsData(page)) + { + backup = GinDataPageGetData(page); + data.nitem = GinPageGetOpaque(page)->maxoff; + if (data.nitem) + len = MAXALIGN(sizeof(ItemPointerData) * data.nitem); + } + else + { + char *ptr; OffsetNumber i; ptr = backup = itups; - for(i=FirstOffsetNumber;i<=PageGetMaxOffsetNumber(page);i++) { - IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i)); - memcpy( ptr, itup, IndexTupleSize( itup ) ); - ptr += MAXALIGN( IndexTupleSize( itup ) ); + for (i = FirstOffsetNumber; i <= PageGetMaxOffsetNumber(page); i++) + { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i)); + + memcpy(ptr, itup, IndexTupleSize(itup)); + ptr += MAXALIGN(IndexTupleSize(itup)); } data.nitem = PageGetMaxOffsetNumber(page); - len = ptr-backup; + len = ptr - backup; } rdata[0].buffer = buffer; - rdata[0].buffer_std = ( GinPageIsData( page ) ) ? FALSE : TRUE; + rdata[0].buffer_std = (GinPageIsData(page)) ? FALSE : TRUE; rdata[0].len = 0; rdata[0].data = NULL; rdata[0].next = rdata + 1; rdata[1].buffer = InvalidBuffer; rdata[1].len = sizeof(ginxlogVacuumPage); - rdata[1].data = (char*)&data; + rdata[1].data = (char *) &data; - if ( len == 0 ) { + if (len == 0) + { rdata[1].next = NULL; - } else { + } + else + { rdata[1].next = rdata + 2; rdata[2].buffer = InvalidBuffer; @@ -133,71 +150,84 @@ xlogVacuumPage(Relation index, Buffer buffer) { } static bool -ginVacuumPostingTreeLeaves( GinVacuumState *gvs, BlockNumber blkno, bool isRoot, Buffer *rootBuffer ) { - Buffer buffer = ReadBuffer( gvs->index, blkno ); - Page page = BufferGetPage( buffer ); - bool hasVoidPage = FALSE; +ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, Buffer *rootBuffer) +{ + Buffer buffer = ReadBuffer(gvs->index, blkno); + Page page = BufferGetPage(buffer); + bool hasVoidPage = FALSE; - /* + /* * We should be sure that we don't concurrent with inserts, insert process - * never release root page until end (but it can unlock it and lock again). - * If we lock root with with LockBufferForCleanup, new scan process can't begin, - * but previous may run. - * ginmarkpos/start* keeps buffer pinned, so we will wait for it. - * We lock only one posting tree in whole index, so, it's concurrent enough.. - * Side effect: after this is full complete, tree is unused by any other process + * never release root page until end (but it can unlock it and lock + * again). If we lock root with with LockBufferForCleanup, new scan + * process can't begin, but previous may run. ginmarkpos/start* keeps + * buffer pinned, so we will wait for it. We lock only one posting tree in + * whole index, so, it's concurrent enough.. Side effect: after this is + * full complete, tree is unused by any other process */ - LockBufferForCleanup( buffer ); + LockBufferForCleanup(buffer); - Assert( GinPageIsData(page) ); + Assert(GinPageIsData(page)); - if ( GinPageIsLeaf(page) ) { - OffsetNumber newMaxOff, oldMaxOff = GinPageGetOpaque(page)->maxoff; + if (GinPageIsLeaf(page)) + { + OffsetNumber newMaxOff, + oldMaxOff = GinPageGetOpaque(page)->maxoff; ItemPointerData *cleaned = NULL; - newMaxOff = ginVacuumPostingList( gvs, - (ItemPointer)GinDataPageGetData(page), oldMaxOff, &cleaned ); + newMaxOff = ginVacuumPostingList(gvs, + (ItemPointer) GinDataPageGetData(page), oldMaxOff, &cleaned); /* saves changes about deleted tuple ... */ - if ( oldMaxOff != newMaxOff ) { + if (oldMaxOff != newMaxOff) + { START_CRIT_SECTION(); - if ( newMaxOff > 0 ) - memcpy( GinDataPageGetData(page), cleaned, sizeof(ItemPointerData) * newMaxOff ); - pfree( cleaned ); + if (newMaxOff > 0) + memcpy(GinDataPageGetData(page), cleaned, sizeof(ItemPointerData) * newMaxOff); + pfree(cleaned); GinPageGetOpaque(page)->maxoff = newMaxOff; - xlogVacuumPage(gvs->index, buffer); + xlogVacuumPage(gvs->index, buffer); - MarkBufferDirty( buffer ); + MarkBufferDirty(buffer); END_CRIT_SECTION(); - - /* if root is a leaf page, we don't desire futher processing */ - if ( !isRoot && GinPageGetOpaque(page)->maxoff < FirstOffsetNumber ) + + /* if root is a leaf page, we don't desire futher processing */ + if (!isRoot && GinPageGetOpaque(page)->maxoff < FirstOffsetNumber) hasVoidPage = TRUE; } - } else { + } + else + { OffsetNumber i; - bool isChildHasVoid = FALSE; + bool isChildHasVoid = FALSE; + + for (i = FirstOffsetNumber; i <= GinPageGetOpaque(page)->maxoff; i++) + { + PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, i); - for( i=FirstOffsetNumber ; i <= GinPageGetOpaque(page)->maxoff ; i++ ) { - PostingItem *pitem = (PostingItem*)GinDataPageGetItem(page, i); - if ( ginVacuumPostingTreeLeaves( gvs, PostingItemGetBlockNumber(pitem), FALSE, NULL ) ) + if (ginVacuumPostingTreeLeaves(gvs, PostingItemGetBlockNumber(pitem), FALSE, NULL)) isChildHasVoid = TRUE; } - if ( isChildHasVoid ) + if (isChildHasVoid) hasVoidPage = TRUE; } - /* if we have root and theres void pages in tree, then we don't release lock - to go further processing and guarantee that tree is unused */ - if ( !(isRoot && hasVoidPage) ) { - UnlockReleaseBuffer( buffer ); - } else { - Assert( rootBuffer ); + /* + * if we have root and theres void pages in tree, then we don't release + * lock to go further processing and guarantee that tree is unused + */ + if (!(isRoot && hasVoidPage)) + { + UnlockReleaseBuffer(buffer); + } + else + { + Assert(rootBuffer); *rootBuffer = buffer; } @@ -205,49 +235,54 @@ ginVacuumPostingTreeLeaves( GinVacuumState *gvs, BlockNumber blkno, bool isRoot, } static void -ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkno, - BlockNumber parentBlkno, OffsetNumber myoff, bool isParentRoot ) { - Buffer dBuffer = ReadBuffer( gvs->index, deleteBlkno ); - Buffer lBuffer = (leftBlkno==InvalidBlockNumber) ? InvalidBuffer : ReadBuffer( gvs->index, leftBlkno ); - Buffer pBuffer = ReadBuffer( gvs->index, parentBlkno ); - Page page, parentPage; - - LockBuffer( dBuffer, GIN_EXCLUSIVE ); - if ( !isParentRoot ) /* parent is already locked by LockBufferForCleanup() */ - LockBuffer( pBuffer, GIN_EXCLUSIVE ); +ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkno, + BlockNumber parentBlkno, OffsetNumber myoff, bool isParentRoot) +{ + Buffer dBuffer = ReadBuffer(gvs->index, deleteBlkno); + Buffer lBuffer = (leftBlkno == InvalidBlockNumber) ? InvalidBuffer : ReadBuffer(gvs->index, leftBlkno); + Buffer pBuffer = ReadBuffer(gvs->index, parentBlkno); + Page page, + parentPage; + + LockBuffer(dBuffer, GIN_EXCLUSIVE); + if (!isParentRoot) /* parent is already locked by + * LockBufferForCleanup() */ + LockBuffer(pBuffer, GIN_EXCLUSIVE); START_CRIT_SECTION(); - if ( leftBlkno!= InvalidBlockNumber ) { + if (leftBlkno != InvalidBlockNumber) + { BlockNumber rightlink; - LockBuffer( lBuffer, GIN_EXCLUSIVE ); + LockBuffer(lBuffer, GIN_EXCLUSIVE); - page = BufferGetPage( dBuffer ); + page = BufferGetPage(dBuffer); rightlink = GinPageGetOpaque(page)->rightlink; - page = BufferGetPage( lBuffer ); + page = BufferGetPage(lBuffer); GinPageGetOpaque(page)->rightlink = rightlink; } - parentPage = BufferGetPage( pBuffer ); + parentPage = BufferGetPage(pBuffer); PageDeletePostingItem(parentPage, myoff); - page = BufferGetPage( dBuffer ); + page = BufferGetPage(dBuffer); GinPageGetOpaque(page)->flags = GIN_DELETED; - if (!gvs->index->rd_istemp) { - XLogRecPtr recptr; + if (!gvs->index->rd_istemp) + { + XLogRecPtr recptr; XLogRecData rdata[4]; - ginxlogDeletePage data; - int n; + ginxlogDeletePage data; + int n; data.node = gvs->index->rd_node; data.blkno = deleteBlkno; data.parentBlkno = parentBlkno; data.parentOffset = myoff; - data.leftBlkno = leftBlkno; - data.rightLink = GinPageGetOpaque(page)->rightlink; + data.leftBlkno = leftBlkno; + data.rightLink = GinPageGetOpaque(page)->rightlink; rdata[0].buffer = dBuffer; rdata[0].buffer_std = FALSE; @@ -261,20 +296,22 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn rdata[1].len = 0; rdata[1].next = rdata + 2; - if ( leftBlkno!= InvalidBlockNumber ) { + if (leftBlkno != InvalidBlockNumber) + { rdata[2].buffer = lBuffer; rdata[2].buffer_std = FALSE; rdata[2].data = NULL; rdata[2].len = 0; rdata[2].next = rdata + 3; n = 3; - } else + } + else n = 2; rdata[n].buffer = InvalidBuffer; rdata[n].buffer_std = FALSE; rdata[n].len = sizeof(ginxlogDeletePage); - rdata[n].data = (char*)&data; + rdata[n].data = (char *) &data; rdata[n].next = NULL; recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_DELETE_PAGE, rdata); @@ -282,122 +319,141 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn PageSetTLI(page, ThisTimeLineID); PageSetLSN(parentPage, recptr); PageSetTLI(parentPage, ThisTimeLineID); - if ( leftBlkno!= InvalidBlockNumber ) { - page = BufferGetPage( lBuffer ); + if (leftBlkno != InvalidBlockNumber) + { + page = BufferGetPage(lBuffer); PageSetLSN(page, recptr); PageSetTLI(page, ThisTimeLineID); } } - MarkBufferDirty( pBuffer ); - if ( !isParentRoot ) - LockBuffer( pBuffer, GIN_UNLOCK ); - ReleaseBuffer( pBuffer ); + MarkBufferDirty(pBuffer); + if (!isParentRoot) + LockBuffer(pBuffer, GIN_UNLOCK); + ReleaseBuffer(pBuffer); - if ( leftBlkno!= InvalidBlockNumber ) { - MarkBufferDirty( lBuffer ); - UnlockReleaseBuffer( lBuffer ); + if (leftBlkno != InvalidBlockNumber) + { + MarkBufferDirty(lBuffer); + UnlockReleaseBuffer(lBuffer); } - MarkBufferDirty( dBuffer ); - UnlockReleaseBuffer( dBuffer ); + MarkBufferDirty(dBuffer); + UnlockReleaseBuffer(dBuffer); END_CRIT_SECTION(); gvs->result->pages_deleted++; } -typedef struct DataPageDeleteStack { - struct DataPageDeleteStack *child; - struct DataPageDeleteStack *parent; +typedef struct DataPageDeleteStack +{ + struct DataPageDeleteStack *child; + struct DataPageDeleteStack *parent; - BlockNumber blkno; - bool isRoot; + BlockNumber blkno; + bool isRoot; } DataPageDeleteStack; /* * scans posting tree and deletes empty pages */ static bool -ginScanToDelete( GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDeleteStack *parent, OffsetNumber myoff ) { - DataPageDeleteStack *me; - Buffer buffer; - Page page; - bool meDelete = FALSE; - - if ( isRoot ) { +ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDeleteStack *parent, OffsetNumber myoff) +{ + DataPageDeleteStack *me; + Buffer buffer; + Page page; + bool meDelete = FALSE; + + if (isRoot) + { me = parent; - } else { - if ( ! parent->child ) { - me = (DataPageDeleteStack*)palloc0(sizeof(DataPageDeleteStack)); - me->parent=parent; + } + else + { + if (!parent->child) + { + me = (DataPageDeleteStack *) palloc0(sizeof(DataPageDeleteStack)); + me->parent = parent; parent->child = me; me->blkno = InvalidBlockNumber; - } else + } + else me = parent->child; } - buffer = ReadBuffer( gvs->index, blkno ); - page = BufferGetPage( buffer ); + buffer = ReadBuffer(gvs->index, blkno); + page = BufferGetPage(buffer); - Assert( GinPageIsData(page) ); + Assert(GinPageIsData(page)); - if ( !GinPageIsLeaf(page) ) { + if (!GinPageIsLeaf(page)) + { OffsetNumber i; - for(i=FirstOffsetNumber;i<=GinPageGetOpaque(page)->maxoff;i++) { - PostingItem *pitem = (PostingItem*)GinDataPageGetItem(page, i); + for (i = FirstOffsetNumber; i <= GinPageGetOpaque(page)->maxoff; i++) + { + PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, i); - if ( ginScanToDelete( gvs, PostingItemGetBlockNumber(pitem), FALSE, me, i ) ) + if (ginScanToDelete(gvs, PostingItemGetBlockNumber(pitem), FALSE, me, i)) i--; } } - if ( GinPageGetOpaque(page)->maxoff < FirstOffsetNumber ) { - if ( !( me->blkno == InvalidBlockNumber && GinPageRightMost(page) ) ) { + if (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber) + { + if (!(me->blkno == InvalidBlockNumber && GinPageRightMost(page))) + { /* we never delete right most branch */ - Assert( !isRoot ); - if ( GinPageGetOpaque(page)->maxoff < FirstOffsetNumber ) { - ginDeletePage( gvs, blkno, me->blkno, me->parent->blkno, myoff, me->parent->isRoot ); + Assert(!isRoot); + if (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber) + { + ginDeletePage(gvs, blkno, me->blkno, me->parent->blkno, myoff, me->parent->isRoot); meDelete = TRUE; } } } - ReleaseBuffer( buffer ); + ReleaseBuffer(buffer); - if ( !meDelete ) + if (!meDelete) me->blkno = blkno; return meDelete; } static void -ginVacuumPostingTree( GinVacuumState *gvs, BlockNumber rootBlkno ) { - Buffer rootBuffer = InvalidBuffer; - DataPageDeleteStack root, *ptr, *tmp; - - if ( ginVacuumPostingTreeLeaves(gvs, rootBlkno, TRUE, &rootBuffer)==FALSE ) { - Assert( rootBuffer == InvalidBuffer ); +ginVacuumPostingTree(GinVacuumState *gvs, BlockNumber rootBlkno) +{ + Buffer rootBuffer = InvalidBuffer; + DataPageDeleteStack root, + *ptr, + *tmp; + + if (ginVacuumPostingTreeLeaves(gvs, rootBlkno, TRUE, &rootBuffer) == FALSE) + { + Assert(rootBuffer == InvalidBuffer); return; } - memset(&root,0,sizeof(DataPageDeleteStack)); + memset(&root, 0, sizeof(DataPageDeleteStack)); root.blkno = rootBlkno; root.isRoot = TRUE; vacuum_delay_point(); - ginScanToDelete( gvs, rootBlkno, TRUE, &root, InvalidOffsetNumber ); + ginScanToDelete(gvs, rootBlkno, TRUE, &root, InvalidOffsetNumber); ptr = root.child; - while( ptr ) { + while (ptr) + { tmp = ptr->child; - pfree( ptr ); + pfree(ptr); ptr = tmp; } - UnlockReleaseBuffer( rootBuffer ); + UnlockReleaseBuffer(rootBuffer); } /* @@ -406,48 +462,65 @@ ginVacuumPostingTree( GinVacuumState *gvs, BlockNumber rootBlkno ) { * then page is copied into temprorary one. */ static Page -ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint32 *nroot) { - Page origpage = BufferGetPage( buffer ), tmppage; - OffsetNumber i, maxoff = PageGetMaxOffsetNumber( origpage ); +ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint32 *nroot) +{ + Page origpage = BufferGetPage(buffer), + tmppage; + OffsetNumber i, + maxoff = PageGetMaxOffsetNumber(origpage); tmppage = origpage; - *nroot=0; + *nroot = 0; - for(i=FirstOffsetNumber; i<= maxoff; i++) { - IndexTuple itup = (IndexTuple) PageGetItem(tmppage, PageGetItemId(tmppage, i)); + for (i = FirstOffsetNumber; i <= maxoff; i++) + { + IndexTuple itup = (IndexTuple) PageGetItem(tmppage, PageGetItemId(tmppage, i)); - if ( GinIsPostingTree(itup) ) { - /* store posting tree's roots for further processing, - we can't vacuum it just now due to risk of deadlocks with scans/inserts */ - roots[ *nroot ] = GinItemPointerGetBlockNumber(&itup->t_tid); + if (GinIsPostingTree(itup)) + { + /* + * store posting tree's roots for further processing, we can't + * vacuum it just now due to risk of deadlocks with scans/inserts + */ + roots[*nroot] = GinItemPointerGetBlockNumber(&itup->t_tid); (*nroot)++; - } else if ( GinGetNPosting(itup) > 0 ) { - /* if we already create temrorary page, we will make changes in place */ - ItemPointerData *cleaned = (tmppage==origpage) ? NULL : GinGetPosting(itup ); - uint32 newN = ginVacuumPostingList( gvs, GinGetPosting(itup), GinGetNPosting(itup), &cleaned ); - - if ( GinGetNPosting(itup) != newN ) { - bool isnull; - Datum value; + } + else if (GinGetNPosting(itup) > 0) + { + /* + * if we already create temrorary page, we will make changes in + * place + */ + ItemPointerData *cleaned = (tmppage == origpage) ? NULL : GinGetPosting(itup); + uint32 newN = ginVacuumPostingList(gvs, GinGetPosting(itup), GinGetNPosting(itup), &cleaned); + + if (GinGetNPosting(itup) != newN) + { + bool isnull; + Datum value; /* - * Some ItemPointers was deleted, so we should remake our tuple + * Some ItemPointers was deleted, so we should remake our + * tuple */ - if ( tmppage==origpage ) { + if (tmppage == origpage) + { /* * On first difference we create temprorary page in memory * and copies content in to it. */ - tmppage=GinPageGetCopyPage ( origpage ); + tmppage = GinPageGetCopyPage(origpage); + + if (newN > 0) + { + Size pos = ((char *) GinGetPosting(itup)) - ((char *) origpage); - if ( newN > 0 ) { - Size pos = ((char*)GinGetPosting(itup)) - ((char*)origpage); - memcpy( tmppage+pos, cleaned, sizeof(ItemPointerData)*newN ); + memcpy(tmppage + pos, cleaned, sizeof(ItemPointerData) * newN); } - pfree( cleaned ); + pfree(cleaned); /* set itup pointer to new page */ itup = (IndexTuple) PageGetItem(tmppage, PageGetItemId(tmppage, i)); @@ -457,30 +530,31 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3 itup = GinFormTuple(&gvs->ginstate, value, GinGetPosting(itup), newN); PageIndexTupleDelete(tmppage, i); - if ( PageAddItem( tmppage, (Item)itup, IndexTupleSize(itup), i, LP_USED ) != i ) - elog(ERROR, "failed to add item to index page in \"%s\"", - RelationGetRelationName(gvs->index)); + if (PageAddItem(tmppage, (Item) itup, IndexTupleSize(itup), i, LP_USED) != i) + elog(ERROR, "failed to add item to index page in \"%s\"", + RelationGetRelationName(gvs->index)); - pfree( itup ); + pfree(itup); } } } - return ( tmppage==origpage ) ? NULL : tmppage; + return (tmppage == origpage) ? NULL : tmppage; } Datum -ginbulkdelete(PG_FUNCTION_ARGS) { +ginbulkdelete(PG_FUNCTION_ARGS) +{ IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0); IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1); IndexBulkDeleteCallback callback = (IndexBulkDeleteCallback) PG_GETARG_POINTER(2); void *callback_state = (void *) PG_GETARG_POINTER(3); Relation index = info->index; - BlockNumber blkno = GIN_ROOT_BLKNO; - GinVacuumState gvs; - Buffer buffer; - BlockNumber rootOfPostingTree[ BLCKSZ/ (sizeof(IndexTupleData)+sizeof(ItemId)) ]; - uint32 nRoot; + BlockNumber blkno = GIN_ROOT_BLKNO; + GinVacuumState gvs; + Buffer buffer; + BlockNumber rootOfPostingTree[BLCKSZ / (sizeof(IndexTupleData) + sizeof(ItemId))]; + uint32 nRoot; /* first time through? */ if (stats == NULL) @@ -494,107 +568,117 @@ ginbulkdelete(PG_FUNCTION_ARGS) { gvs.callback_state = callback_state; initGinState(&gvs.ginstate, index); - buffer = ReadBuffer( index, blkno ); + buffer = ReadBuffer(index, blkno); /* find leaf page */ - for(;;) { - Page page = BufferGetPage( buffer ); - IndexTuple itup; + for (;;) + { + Page page = BufferGetPage(buffer); + IndexTuple itup; - LockBuffer(buffer,GIN_SHARE); + LockBuffer(buffer, GIN_SHARE); - Assert( !GinPageIsData(page) ); + Assert(!GinPageIsData(page)); - if ( GinPageIsLeaf(page) ) { - LockBuffer(buffer,GIN_UNLOCK); - LockBuffer(buffer,GIN_EXCLUSIVE); + if (GinPageIsLeaf(page)) + { + LockBuffer(buffer, GIN_UNLOCK); + LockBuffer(buffer, GIN_EXCLUSIVE); - if ( blkno==GIN_ROOT_BLKNO && !GinPageIsLeaf(page) ) { - LockBuffer(buffer,GIN_UNLOCK); - continue; /* check it one more */ + if (blkno == GIN_ROOT_BLKNO && !GinPageIsLeaf(page)) + { + LockBuffer(buffer, GIN_UNLOCK); + continue; /* check it one more */ } - break; + break; } - Assert( PageGetMaxOffsetNumber(page) >= FirstOffsetNumber ); + Assert(PageGetMaxOffsetNumber(page) >= FirstOffsetNumber); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, FirstOffsetNumber)); blkno = GinItemPointerGetBlockNumber(&(itup)->t_tid); - Assert( blkno!= InvalidBlockNumber ); + Assert(blkno != InvalidBlockNumber); - LockBuffer(buffer,GIN_UNLOCK); - buffer = ReleaseAndReadBuffer( buffer, index, blkno ); + LockBuffer(buffer, GIN_UNLOCK); + buffer = ReleaseAndReadBuffer(buffer, index, blkno); } /* right now we found leftmost page in entry's BTree */ - for(;;) { - Page page = BufferGetPage( buffer ); - Page resPage; - uint32 i; + for (;;) + { + Page page = BufferGetPage(buffer); + Page resPage; + uint32 i; - Assert( !GinPageIsData(page) ); + Assert(!GinPageIsData(page)); resPage = ginVacuumEntryPage(&gvs, buffer, rootOfPostingTree, &nRoot); - blkno = GinPageGetOpaque( page )->rightlink; + blkno = GinPageGetOpaque(page)->rightlink; - if ( resPage ) { + if (resPage) + { START_CRIT_SECTION(); - PageRestoreTempPage( resPage, page ); - xlogVacuumPage(gvs.index, buffer); - MarkBufferDirty( buffer ); + PageRestoreTempPage(resPage, page); + xlogVacuumPage(gvs.index, buffer); + MarkBufferDirty(buffer); UnlockReleaseBuffer(buffer); END_CRIT_SECTION(); - } else { + } + else + { UnlockReleaseBuffer(buffer); } vacuum_delay_point(); - for(i=0; i<nRoot; i++) { - ginVacuumPostingTree( &gvs, rootOfPostingTree[i] ); + for (i = 0; i < nRoot; i++) + { + ginVacuumPostingTree(&gvs, rootOfPostingTree[i]); vacuum_delay_point(); } - if ( blkno==InvalidBlockNumber ) /*rightmost page*/ + if (blkno == InvalidBlockNumber) /* rightmost page */ break; - buffer = ReadBuffer( index, blkno ); - LockBuffer(buffer,GIN_EXCLUSIVE); + buffer = ReadBuffer(index, blkno); + LockBuffer(buffer, GIN_EXCLUSIVE); } PG_RETURN_POINTER(gvs.result); } -Datum -ginvacuumcleanup(PG_FUNCTION_ARGS) { +Datum +ginvacuumcleanup(PG_FUNCTION_ARGS) +{ IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0); IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1); - Relation index = info->index; - bool needLock; - BlockNumber npages, + Relation index = info->index; + bool needLock; + BlockNumber npages, blkno; BlockNumber totFreePages, nFreePages, *freePages, - maxFreePages; + maxFreePages; BlockNumber lastBlock = GIN_ROOT_BLKNO, - lastFilledBlock = GIN_ROOT_BLKNO; + lastFilledBlock = GIN_ROOT_BLKNO; /* Set up all-zero stats if ginbulkdelete wasn't called */ if (stats == NULL) stats = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult)); + /* * XXX we always report the heap tuple count as the number of index - * entries. This is bogus if the index is partial, but it's real hard - * to tell how many distinct heap entries are referenced by a GIN index. + * entries. This is bogus if the index is partial, but it's real hard to + * tell how many distinct heap entries are referenced by a GIN index. */ stats->num_index_tuples = info->num_heap_tuples; /* - * If vacuum full, we already have exclusive lock on the index. - * Otherwise, need lock unless it's local to this backend. + * If vacuum full, we already have exclusive lock on the index. Otherwise, + * need lock unless it's local to this backend. */ if (info->vacuum_full) needLock = false; @@ -614,32 +698,38 @@ ginvacuumcleanup(PG_FUNCTION_ARGS) { totFreePages = nFreePages = 0; freePages = (BlockNumber *) palloc(sizeof(BlockNumber) * maxFreePages); - for (blkno = GIN_ROOT_BLKNO + 1; blkno < npages; blkno++) { - Buffer buffer; - Page page; + for (blkno = GIN_ROOT_BLKNO + 1; blkno < npages; blkno++) + { + Buffer buffer; + Page page; vacuum_delay_point(); - + buffer = ReadBuffer(index, blkno); LockBuffer(buffer, GIN_SHARE); page = (Page) BufferGetPage(buffer); - if ( GinPageIsDeleted(page) ) { + if (GinPageIsDeleted(page)) + { if (nFreePages < maxFreePages) freePages[nFreePages++] = blkno; totFreePages++; - } else + } + else lastFilledBlock = blkno; UnlockReleaseBuffer(buffer); } lastBlock = npages - 1; - if (info->vacuum_full && nFreePages > 0) { + if (info->vacuum_full && nFreePages > 0) + { /* try to truncate index */ - int i; - for (i = 0; i < nFreePages; i++) - if (freePages[i] >= lastFilledBlock) { + int i; + + for (i = 0; i < nFreePages; i++) + if (freePages[i] >= lastFilledBlock) + { totFreePages = nFreePages = i; break; } @@ -661,4 +751,3 @@ ginvacuumcleanup(PG_FUNCTION_ARGS) { PG_RETURN_POINTER(stats); } - diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index 265e7de70c4..788f290b843 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.4 2006/08/07 16:57:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.5 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -17,12 +17,13 @@ #include "access/heapam.h" #include "utils/memutils.h" -static MemoryContext opCtx; /* working memory for operations */ +static MemoryContext opCtx; /* working memory for operations */ static MemoryContext topCtx; -typedef struct ginIncompleteSplit { - RelFileNode node; - BlockNumber leftBlkno; +typedef struct ginIncompleteSplit +{ + RelFileNode node; + BlockNumber leftBlkno; BlockNumber rightBlkno; BlockNumber rootBlkno; } ginIncompleteSplit; @@ -30,10 +31,11 @@ typedef struct ginIncompleteSplit { static List *incomplete_splits; static void -pushIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber rightBlkno, BlockNumber rootBlkno) { - ginIncompleteSplit *split; +pushIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber rightBlkno, BlockNumber rootBlkno) +{ + ginIncompleteSplit *split; - MemoryContextSwitchTo( topCtx ); + MemoryContextSwitchTo(topCtx); split = palloc(sizeof(ginIncompleteSplit)); @@ -44,17 +46,20 @@ pushIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber rightBl incomplete_splits = lappend(incomplete_splits, split); - MemoryContextSwitchTo( opCtx ); + MemoryContextSwitchTo(opCtx); } static void -forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updateBlkno) { +forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updateBlkno) +{ ListCell *l; - foreach(l, incomplete_splits) { - ginIncompleteSplit *split = (ginIncompleteSplit *) lfirst(l); + foreach(l, incomplete_splits) + { + ginIncompleteSplit *split = (ginIncompleteSplit *) lfirst(l); - if ( RelFileNodeEquals(node, split->node) && leftBlkno == split->leftBlkno && updateBlkno == split->rightBlkno ) { + if (RelFileNodeEquals(node, split->node) && leftBlkno == split->leftBlkno && updateBlkno == split->rightBlkno) + { incomplete_splits = list_delete_ptr(incomplete_splits, split); break; } @@ -62,7 +67,8 @@ forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updat } static void -ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record) { +ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record) +{ RelFileNode *node = (RelFileNode *) XLogRecGetData(record); Relation reln; Buffer buffer; @@ -83,9 +89,10 @@ ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record) { } static void -ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record) { - ginxlogCreatePostingTree *data = (ginxlogCreatePostingTree*)XLogRecGetData(record); - ItemPointerData *items = (ItemPointerData*)(XLogRecGetData(record) + sizeof(ginxlogCreatePostingTree)); +ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record) +{ + ginxlogCreatePostingTree *data = (ginxlogCreatePostingTree *) XLogRecGetData(record); + ItemPointerData *items = (ItemPointerData *) (XLogRecGetData(record) + sizeof(ginxlogCreatePostingTree)); Relation reln; Buffer buffer; Page page; @@ -95,8 +102,8 @@ ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record) { Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); - GinInitBuffer(buffer, GIN_DATA|GIN_LEAF); - memcpy( GinDataPageGetData(page), items, sizeof(ItemPointerData) * data->nitem ); + GinInitBuffer(buffer, GIN_DATA | GIN_LEAF); + memcpy(GinDataPageGetData(page), items, sizeof(ItemPointerData) * data->nitem); GinPageGetOpaque(page)->maxoff = data->nitem; PageSetLSN(page, lsn); @@ -107,8 +114,9 @@ ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record) { } static void -ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) { - ginxlogInsert *data = (ginxlogInsert*)XLogRecGetData(record); +ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) +{ + ginxlogInsert *data = (ginxlogInsert *) XLogRecGetData(record); Relation reln; Buffer buffer; Page page; @@ -122,64 +130,73 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) { Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); - if ( data->isData ) { - Assert( data->isDelete == FALSE ); - Assert( GinPageIsData( page ) ); + if (data->isData) + { + Assert(data->isDelete == FALSE); + Assert(GinPageIsData(page)); - if ( data->isLeaf ) { + if (data->isLeaf) + { OffsetNumber i; - ItemPointerData *items = (ItemPointerData*)( XLogRecGetData(record) + sizeof(ginxlogInsert) ); + ItemPointerData *items = (ItemPointerData *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - Assert( GinPageIsLeaf( page ) ); - Assert( data->updateBlkno == InvalidBlockNumber ); + Assert(GinPageIsLeaf(page)); + Assert(data->updateBlkno == InvalidBlockNumber); - for(i=0;i<data->nitem;i++) - GinDataPageAddItem( page, items+i, data->offset + i ); - } else { + for (i = 0; i < data->nitem; i++) + GinDataPageAddItem(page, items + i, data->offset + i); + } + else + { PostingItem *pitem; - Assert( !GinPageIsLeaf( page ) ); + Assert(!GinPageIsLeaf(page)); - if ( data->updateBlkno != InvalidBlockNumber ) { - /* update link to right page after split */ - pitem = (PostingItem*)GinDataPageGetItem(page, data->offset); - PostingItemSetBlockNumber( pitem, data->updateBlkno ); + if (data->updateBlkno != InvalidBlockNumber) + { + /* update link to right page after split */ + pitem = (PostingItem *) GinDataPageGetItem(page, data->offset); + PostingItemSetBlockNumber(pitem, data->updateBlkno); } - pitem = (PostingItem*)( XLogRecGetData(record) + sizeof(ginxlogInsert) ); + pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - GinDataPageAddItem( page, pitem, data->offset ); + GinDataPageAddItem(page, pitem, data->offset); - if ( data->updateBlkno != InvalidBlockNumber ) - forgetIncompleteSplit(data->node, PostingItemGetBlockNumber( pitem ), data->updateBlkno); + if (data->updateBlkno != InvalidBlockNumber) + forgetIncompleteSplit(data->node, PostingItemGetBlockNumber(pitem), data->updateBlkno); } - } else { - IndexTuple itup; + } + else + { + IndexTuple itup; - Assert( !GinPageIsData( page ) ); + Assert(!GinPageIsData(page)); - if ( data->updateBlkno != InvalidBlockNumber ) { - /* update link to right page after split */ - Assert( !GinPageIsLeaf( page ) ); - Assert( data->offset>=FirstOffsetNumber && data->offset<=PageGetMaxOffsetNumber(page) ); + if (data->updateBlkno != InvalidBlockNumber) + { + /* update link to right page after split */ + Assert(!GinPageIsLeaf(page)); + Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, data->offset)); ItemPointerSet(&itup->t_tid, data->updateBlkno, InvalidOffsetNumber); } - if ( data->isDelete ) { - Assert( GinPageIsLeaf( page ) ); - Assert( data->offset>=FirstOffsetNumber && data->offset<=PageGetMaxOffsetNumber(page) ); + if (data->isDelete) + { + Assert(GinPageIsLeaf(page)); + Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); PageIndexTupleDelete(page, data->offset); } - itup = (IndexTuple)( XLogRecGetData(record) + sizeof(ginxlogInsert) ); + itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - if ( PageAddItem( page, (Item)itup, IndexTupleSize(itup), data->offset, LP_USED) == InvalidOffsetNumber ) - elog(ERROR, "failed to add item to index page in %u/%u/%u", - data->node.spcNode, data->node.dbNode, data->node.relNode ); + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), data->offset, LP_USED) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in %u/%u/%u", + data->node.spcNode, data->node.dbNode, data->node.relNode); - if ( !data->isLeaf && data->updateBlkno != InvalidBlockNumber ) - forgetIncompleteSplit(data->node, GinItemPointerGetBlockNumber( &itup->t_tid ), data->updateBlkno); + if (!data->isLeaf && data->updateBlkno != InvalidBlockNumber) + forgetIncompleteSplit(data->node, GinItemPointerGetBlockNumber(&itup->t_tid), data->updateBlkno); } PageSetLSN(page, lsn); @@ -190,18 +207,21 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) { } static void -ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) { - ginxlogSplit *data = (ginxlogSplit*)XLogRecGetData(record); +ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) +{ + ginxlogSplit *data = (ginxlogSplit *) XLogRecGetData(record); Relation reln; - Buffer lbuffer, rbuffer; - Page lpage, rpage; + Buffer lbuffer, + rbuffer; + Page lpage, + rpage; uint32 flags = 0; reln = XLogOpenRelation(data->node); - if ( data->isLeaf ) + if (data->isLeaf) flags |= GIN_LEAF; - if ( data->isData ) + if (data->isData) flags |= GIN_DATA; lbuffer = XLogReadBuffer(reln, data->lblkno, data->isRootSplit); @@ -214,50 +234,57 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) { rpage = (Page) BufferGetPage(rbuffer); GinInitBuffer(rbuffer, flags); - GinPageGetOpaque(lpage)->rightlink = BufferGetBlockNumber( rbuffer ); + GinPageGetOpaque(lpage)->rightlink = BufferGetBlockNumber(rbuffer); GinPageGetOpaque(rpage)->rightlink = data->rrlink; - if ( data->isData ) { - char *ptr = XLogRecGetData(record) + sizeof(ginxlogSplit); - Size sizeofitem = GinSizeOfItem(lpage); + if (data->isData) + { + char *ptr = XLogRecGetData(record) + sizeof(ginxlogSplit); + Size sizeofitem = GinSizeOfItem(lpage); OffsetNumber i; - ItemPointer bound; + ItemPointer bound; - for(i=0;i<data->separator;i++) { - GinDataPageAddItem( lpage, ptr, InvalidOffsetNumber ); + for (i = 0; i < data->separator; i++) + { + GinDataPageAddItem(lpage, ptr, InvalidOffsetNumber); ptr += sizeofitem; } - for(i=data->separator;i<data->nitem;i++) { - GinDataPageAddItem( rpage, ptr, InvalidOffsetNumber ); + for (i = data->separator; i < data->nitem; i++) + { + GinDataPageAddItem(rpage, ptr, InvalidOffsetNumber); ptr += sizeofitem; } /* set up right key */ bound = GinDataPageGetRightBound(lpage); - if ( data->isLeaf ) - *bound = *(ItemPointerData*)GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff); + if (data->isLeaf) + *bound = *(ItemPointerData *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff); else - *bound = ((PostingItem*)GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff))->key; + *bound = ((PostingItem *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff))->key; bound = GinDataPageGetRightBound(rpage); *bound = data->rightbound; - } else { - IndexTuple itup = (IndexTuple)( XLogRecGetData(record) + sizeof(ginxlogSplit) ); + } + else + { + IndexTuple itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogSplit)); OffsetNumber i; - for(i=0;i<data->separator;i++) { - if ( PageAddItem( lpage, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) - elog(ERROR, "failed to add item to index page in %u/%u/%u", - data->node.spcNode, data->node.dbNode, data->node.relNode ); - itup = (IndexTuple)( ((char*)itup) + MAXALIGN( IndexTupleSize(itup) ) ); + for (i = 0; i < data->separator; i++) + { + if (PageAddItem(lpage, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in %u/%u/%u", + data->node.spcNode, data->node.dbNode, data->node.relNode); + itup = (IndexTuple) (((char *) itup) + MAXALIGN(IndexTupleSize(itup))); } - for(i=data->separator;i<data->nitem;i++) { - if ( PageAddItem( rpage, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) - elog(ERROR, "failed to add item to index page in %u/%u/%u", - data->node.spcNode, data->node.dbNode, data->node.relNode ); - itup = (IndexTuple)( ((char*)itup) + MAXALIGN( IndexTupleSize(itup) ) ); + for (i = data->separator; i < data->nitem; i++) + { + if (PageAddItem(rpage, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in %u/%u/%u", + data->node.spcNode, data->node.dbNode, data->node.relNode); + itup = (IndexTuple) (((char *) itup) + MAXALIGN(IndexTupleSize(itup))); } } @@ -269,20 +296,24 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) { PageSetTLI(lpage, ThisTimeLineID); MarkBufferDirty(lbuffer); - if ( !data->isLeaf && data->updateBlkno != InvalidBlockNumber ) + if (!data->isLeaf && data->updateBlkno != InvalidBlockNumber) forgetIncompleteSplit(data->node, data->leftChildBlkno, data->updateBlkno); - if ( data->isRootSplit ) { - Buffer rootBuf = XLogReadBuffer(reln, data->rootBlkno, false); - Page rootPage = BufferGetPage( rootBuf ); + if (data->isRootSplit) + { + Buffer rootBuf = XLogReadBuffer(reln, data->rootBlkno, false); + Page rootPage = BufferGetPage(rootBuf); - GinInitBuffer( rootBuf, flags & ~GIN_LEAF ); + GinInitBuffer(rootBuf, flags & ~GIN_LEAF); - if ( data->isData ) { - Assert( data->rootBlkno != GIN_ROOT_BLKNO ); + if (data->isData) + { + Assert(data->rootBlkno != GIN_ROOT_BLKNO); dataFillRoot(NULL, rootBuf, lbuffer, rbuffer); - } else { - Assert( data->rootBlkno == GIN_ROOT_BLKNO ); + } + else + { + Assert(data->rootBlkno == GIN_ROOT_BLKNO); entryFillRoot(NULL, rootBuf, lbuffer, rbuffer); } @@ -291,7 +322,8 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) { MarkBufferDirty(rootBuf); UnlockReleaseBuffer(rootBuf); - } else + } + else pushIncompleteSplit(data->node, data->lblkno, data->rblkno, data->rootBlkno); UnlockReleaseBuffer(rbuffer); @@ -299,8 +331,9 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) { } static void -ginRedoVacuumPage(XLogRecPtr lsn, XLogRecord *record) { - ginxlogVacuumPage *data = (ginxlogVacuumPage*)XLogRecGetData(record); +ginRedoVacuumPage(XLogRecPtr lsn, XLogRecord *record) +{ + ginxlogVacuumPage *data = (ginxlogVacuumPage *) XLogRecGetData(record); Relation reln; Buffer buffer; Page page; @@ -314,25 +347,30 @@ ginRedoVacuumPage(XLogRecPtr lsn, XLogRecord *record) { Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); - if ( GinPageIsData( page ) ) { - memcpy( GinDataPageGetData(page), XLogRecGetData(record) + sizeof(ginxlogVacuumPage), - GinSizeOfItem(page) * data->nitem ); + if (GinPageIsData(page)) + { + memcpy(GinDataPageGetData(page), XLogRecGetData(record) + sizeof(ginxlogVacuumPage), + GinSizeOfItem(page) *data->nitem); GinPageGetOpaque(page)->maxoff = data->nitem; - } else { - OffsetNumber i, *tod; - IndexTuple itup = (IndexTuple)( XLogRecGetData(record) + sizeof(ginxlogVacuumPage) ); - - tod = (OffsetNumber*)palloc( sizeof(OffsetNumber) * PageGetMaxOffsetNumber(page) ); - for(i=FirstOffsetNumber;i<=PageGetMaxOffsetNumber(page);i++) - tod[i-1] = i; - - PageIndexMultiDelete(page, tod, PageGetMaxOffsetNumber(page)); - - for(i=0;i<data->nitem;i++) { - if ( PageAddItem( page, (Item)itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber ) - elog(ERROR, "failed to add item to index page in %u/%u/%u", - data->node.spcNode, data->node.dbNode, data->node.relNode ); - itup = (IndexTuple)( ((char*)itup) + MAXALIGN( IndexTupleSize(itup) ) ); + } + else + { + OffsetNumber i, + *tod; + IndexTuple itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogVacuumPage)); + + tod = (OffsetNumber *) palloc(sizeof(OffsetNumber) * PageGetMaxOffsetNumber(page)); + for (i = FirstOffsetNumber; i <= PageGetMaxOffsetNumber(page); i++) + tod[i - 1] = i; + + PageIndexMultiDelete(page, tod, PageGetMaxOffsetNumber(page)); + + for (i = 0; i < data->nitem; i++) + { + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, LP_USED) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in %u/%u/%u", + data->node.spcNode, data->node.dbNode, data->node.relNode); + itup = (IndexTuple) (((char *) itup) + MAXALIGN(IndexTupleSize(itup))); } } @@ -344,17 +382,19 @@ ginRedoVacuumPage(XLogRecPtr lsn, XLogRecord *record) { } static void -ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record) { - ginxlogDeletePage *data = (ginxlogDeletePage*)XLogRecGetData(record); +ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record) +{ + ginxlogDeletePage *data = (ginxlogDeletePage *) XLogRecGetData(record); Relation reln; Buffer buffer; Page page; reln = XLogOpenRelation(data->node); - if ( !( record->xl_info & XLR_BKP_BLOCK_1) ) { + if (!(record->xl_info & XLR_BKP_BLOCK_1)) + { buffer = XLogReadBuffer(reln, data->blkno, false); - page = BufferGetPage( buffer ); + page = BufferGetPage(buffer); Assert(GinPageIsData(page)); GinPageGetOpaque(page)->flags = GIN_DELETED; PageSetLSN(page, lsn); @@ -363,9 +403,10 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record) { UnlockReleaseBuffer(buffer); } - if ( !( record->xl_info & XLR_BKP_BLOCK_2) ) { + if (!(record->xl_info & XLR_BKP_BLOCK_2)) + { buffer = XLogReadBuffer(reln, data->parentBlkno, false); - page = BufferGetPage( buffer ); + page = BufferGetPage(buffer); Assert(GinPageIsData(page)); Assert(!GinPageIsLeaf(page)); PageDeletePostingItem(page, data->parentOffset); @@ -375,9 +416,10 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record) { UnlockReleaseBuffer(buffer); } - if ( !( record->xl_info & XLR_BKP_BLOCK_2) && data->leftBlkno != InvalidBlockNumber ) { + if (!(record->xl_info & XLR_BKP_BLOCK_2) && data->leftBlkno != InvalidBlockNumber) + { buffer = XLogReadBuffer(reln, data->leftBlkno, false); - page = BufferGetPage( buffer ); + page = BufferGetPage(buffer); Assert(GinPageIsData(page)); GinPageGetOpaque(page)->rightlink = data->rightLink; PageSetLSN(page, lsn); @@ -387,28 +429,30 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record) { } } -void -gin_redo(XLogRecPtr lsn, XLogRecord *record) { - uint8 info = record->xl_info & ~XLR_INFO_MASK; +void +gin_redo(XLogRecPtr lsn, XLogRecord *record) +{ + uint8 info = record->xl_info & ~XLR_INFO_MASK; topCtx = MemoryContextSwitchTo(opCtx); - switch (info) { - case XLOG_GIN_CREATE_INDEX: + switch (info) + { + case XLOG_GIN_CREATE_INDEX: ginRedoCreateIndex(lsn, record); break; - case XLOG_GIN_CREATE_PTREE: + case XLOG_GIN_CREATE_PTREE: ginRedoCreatePTree(lsn, record); break; - case XLOG_GIN_INSERT: + case XLOG_GIN_INSERT: ginRedoInsert(lsn, record); break; - case XLOG_GIN_SPLIT: + case XLOG_GIN_SPLIT: ginRedoSplit(lsn, record); break; - case XLOG_GIN_VACUUM_PAGE: + case XLOG_GIN_VACUUM_PAGE: ginRedoVacuumPage(lsn, record); break; - case XLOG_GIN_DELETE_PAGE: + case XLOG_GIN_DELETE_PAGE: ginRedoDeletePage(lsn, record); break; default: @@ -419,110 +463,122 @@ gin_redo(XLogRecPtr lsn, XLogRecord *record) { } static void -desc_node( StringInfo buf, RelFileNode node, BlockNumber blkno ) { - appendStringInfo(buf,"node: %u/%u/%u blkno: %u", - node.spcNode, node.dbNode, node.relNode, blkno); +desc_node(StringInfo buf, RelFileNode node, BlockNumber blkno) +{ + appendStringInfo(buf, "node: %u/%u/%u blkno: %u", + node.spcNode, node.dbNode, node.relNode, blkno); } -void -gin_desc(StringInfo buf, uint8 xl_info, char *rec) { - uint8 info = xl_info & ~XLR_INFO_MASK; +void +gin_desc(StringInfo buf, uint8 xl_info, char *rec) +{ + uint8 info = xl_info & ~XLR_INFO_MASK; - switch (info) { - case XLOG_GIN_CREATE_INDEX: - appendStringInfo(buf,"Create index, "); - desc_node(buf, *(RelFileNode*)rec, GIN_ROOT_BLKNO ); + switch (info) + { + case XLOG_GIN_CREATE_INDEX: + appendStringInfo(buf, "Create index, "); + desc_node(buf, *(RelFileNode *) rec, GIN_ROOT_BLKNO); break; - case XLOG_GIN_CREATE_PTREE: - appendStringInfo(buf,"Create posting tree, "); - desc_node(buf, ((ginxlogCreatePostingTree*)rec)->node, ((ginxlogCreatePostingTree*)rec)->blkno ); + case XLOG_GIN_CREATE_PTREE: + appendStringInfo(buf, "Create posting tree, "); + desc_node(buf, ((ginxlogCreatePostingTree *) rec)->node, ((ginxlogCreatePostingTree *) rec)->blkno); break; - case XLOG_GIN_INSERT: - appendStringInfo(buf,"Insert item, "); - desc_node(buf, ((ginxlogInsert*)rec)->node, ((ginxlogInsert*)rec)->blkno ); - appendStringInfo(buf," offset: %u nitem: %u isdata: %c isleaf %c isdelete %c updateBlkno:%u", - ((ginxlogInsert*)rec)->offset, - ((ginxlogInsert*)rec)->nitem, - ( ((ginxlogInsert*)rec)->isData ) ? 'T' : 'F', - ( ((ginxlogInsert*)rec)->isLeaf ) ? 'T' : 'F', - ( ((ginxlogInsert*)rec)->isDelete ) ? 'T' : 'F', - ((ginxlogInsert*)rec)->updateBlkno - ); + case XLOG_GIN_INSERT: + appendStringInfo(buf, "Insert item, "); + desc_node(buf, ((ginxlogInsert *) rec)->node, ((ginxlogInsert *) rec)->blkno); + appendStringInfo(buf, " offset: %u nitem: %u isdata: %c isleaf %c isdelete %c updateBlkno:%u", + ((ginxlogInsert *) rec)->offset, + ((ginxlogInsert *) rec)->nitem, + (((ginxlogInsert *) rec)->isData) ? 'T' : 'F', + (((ginxlogInsert *) rec)->isLeaf) ? 'T' : 'F', + (((ginxlogInsert *) rec)->isDelete) ? 'T' : 'F', + ((ginxlogInsert *) rec)->updateBlkno + ); break; - case XLOG_GIN_SPLIT: - appendStringInfo(buf,"Page split, "); - desc_node(buf, ((ginxlogSplit*)rec)->node, ((ginxlogSplit*)rec)->lblkno ); - appendStringInfo(buf," isrootsplit: %c", ( ((ginxlogSplit*)rec)->isRootSplit ) ? 'T' : 'F'); + case XLOG_GIN_SPLIT: + appendStringInfo(buf, "Page split, "); + desc_node(buf, ((ginxlogSplit *) rec)->node, ((ginxlogSplit *) rec)->lblkno); + appendStringInfo(buf, " isrootsplit: %c", (((ginxlogSplit *) rec)->isRootSplit) ? 'T' : 'F'); break; - case XLOG_GIN_VACUUM_PAGE: - appendStringInfo(buf,"Vacuum page, "); - desc_node(buf, ((ginxlogVacuumPage*)rec)->node, ((ginxlogVacuumPage*)rec)->blkno ); + case XLOG_GIN_VACUUM_PAGE: + appendStringInfo(buf, "Vacuum page, "); + desc_node(buf, ((ginxlogVacuumPage *) rec)->node, ((ginxlogVacuumPage *) rec)->blkno); break; - case XLOG_GIN_DELETE_PAGE: - appendStringInfo(buf,"Delete page, "); - desc_node(buf, ((ginxlogDeletePage*)rec)->node, ((ginxlogDeletePage*)rec)->blkno ); + case XLOG_GIN_DELETE_PAGE: + appendStringInfo(buf, "Delete page, "); + desc_node(buf, ((ginxlogDeletePage *) rec)->node, ((ginxlogDeletePage *) rec)->blkno); break; default: elog(PANIC, "gin_desc: unknown op code %u", info); } } -void -gin_xlog_startup(void) { +void +gin_xlog_startup(void) +{ incomplete_splits = NIL; opCtx = AllocSetContextCreate(CurrentMemoryContext, - "GIN recovery temporary context", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); + "GIN recovery temporary context", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); } static void -ginContinueSplit( ginIncompleteSplit *split ) { +ginContinueSplit(ginIncompleteSplit *split) +{ GinBtreeData btree; Relation reln; Buffer buffer; - GinBtreeStack stack; + GinBtreeStack stack; - /* elog(NOTICE,"ginContinueSplit root:%u l:%u r:%u", split->rootBlkno, split->leftBlkno, split->rightBlkno); */ + /* + * elog(NOTICE,"ginContinueSplit root:%u l:%u r:%u", split->rootBlkno, + * split->leftBlkno, split->rightBlkno); + */ reln = XLogOpenRelation(split->node); - buffer = XLogReadBuffer(reln, split->leftBlkno, false); + buffer = XLogReadBuffer(reln, split->leftBlkno, false); - if ( split->rootBlkno == GIN_ROOT_BLKNO ) { - prepareEntryScan( &btree, reln, (Datum)0, NULL ); - btree.entry = ginPageGetLinkItup( buffer ); - } else { - Page page = BufferGetPage( buffer ); + if (split->rootBlkno == GIN_ROOT_BLKNO) + { + prepareEntryScan(&btree, reln, (Datum) 0, NULL); + btree.entry = ginPageGetLinkItup(buffer); + } + else + { + Page page = BufferGetPage(buffer); - prepareDataScan( &btree, reln ); + prepareDataScan(&btree, reln); - PostingItemSetBlockNumber( &(btree.pitem), split->leftBlkno ); - if ( GinPageIsLeaf(page) ) - btree.pitem.key = *(ItemPointerData*)GinDataPageGetItem(page, - GinPageGetOpaque(page)->maxoff); + PostingItemSetBlockNumber(&(btree.pitem), split->leftBlkno); + if (GinPageIsLeaf(page)) + btree.pitem.key = *(ItemPointerData *) GinDataPageGetItem(page, + GinPageGetOpaque(page)->maxoff); else - btree.pitem.key = ((PostingItem*)GinDataPageGetItem(page, - GinPageGetOpaque(page)->maxoff))->key; + btree.pitem.key = ((PostingItem *) GinDataPageGetItem(page, + GinPageGetOpaque(page)->maxoff))->key; } - btree.rightblkno = split->rightBlkno; + btree.rightblkno = split->rightBlkno; stack.blkno = split->leftBlkno; stack.buffer = buffer; stack.off = InvalidOffsetNumber; stack.parent = NULL; - findParents( &btree, &stack, split->rootBlkno); - ginInsertValue( &btree, stack.parent ); + findParents(&btree, &stack, split->rootBlkno); + ginInsertValue(&btree, stack.parent); - UnlockReleaseBuffer( buffer ); + UnlockReleaseBuffer(buffer); } -void -gin_xlog_cleanup(void) { +void +gin_xlog_cleanup(void) +{ ListCell *l; MemoryContext topCtx; @@ -531,8 +587,9 @@ gin_xlog_cleanup(void) { foreach(l, incomplete_splits) { ginIncompleteSplit *split = (ginIncompleteSplit *) lfirst(l); - ginContinueSplit( split ); - MemoryContextReset( opCtx ); + + ginContinueSplit(split); + MemoryContextReset(opCtx); } MemoryContextSwitchTo(topCtx); diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 7b0c0f6b387..60d0affbfcf 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.142 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.143 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -185,7 +185,7 @@ gistbuildCallback(Relation index, /* form an index tuple and point it at the heap tuple */ itup = gistFormTuple(&buildstate->giststate, index, - values, isnull, true /* size is currently bogus */); + values, isnull, true /* size is currently bogus */ ); itup->t_tid = htup->t_self; /* @@ -199,7 +199,7 @@ gistbuildCallback(Relation index, * after initial build do not. */ gistdoinsert(index, itup, - RelationGetTargetPageFreeSpace(index, GIST_DEFAULT_FILLFACTOR), + RelationGetTargetPageFreeSpace(index, GIST_DEFAULT_FILLFACTOR), &buildstate->giststate); buildstate->indtuples += 1; @@ -236,7 +236,7 @@ gistinsert(PG_FUNCTION_ARGS) initGISTstate(&giststate, r); itup = gistFormTuple(&giststate, r, - values, isnull, true /* size is currently bogus */); + values, isnull, true /* size is currently bogus */ ); itup->t_tid = *ht_ctid; gistdoinsert(r, itup, 0, &giststate); @@ -285,18 +285,17 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) bool is_leaf = (GistPageIsLeaf(state->stack->page)) ? true : false; /* - * if (!is_leaf) remove old key: - * This node's key has been modified, either because a child split - * occurred or because we needed to adjust our key for an insert in a - * child node. Therefore, remove the old version of this node's key. + * if (!is_leaf) remove old key: This node's key has been modified, either + * because a child split occurred or because we needed to adjust our key + * for an insert in a child node. Therefore, remove the old version of + * this node's key. * - * for WAL replay, in the non-split case we handle this by - * setting up a one-element todelete array; in the split case, it's - * handled implicitly because the tuple vector passed to gistSplit - * won't include this tuple. + * for WAL replay, in the non-split case we handle this by setting up a + * one-element todelete array; in the split case, it's handled implicitly + * because the tuple vector passed to gistSplit won't include this tuple. * - * XXX: If we want to change fillfactors between node and leaf, - * fillfactor = (is_leaf ? state->leaf_fillfactor : state->node_fillfactor) + * XXX: If we want to change fillfactors between node and leaf, fillfactor + * = (is_leaf ? state->leaf_fillfactor : state->node_fillfactor) */ if (gistnospace(state->stack->page, state->itup, state->ituplen, is_leaf ? InvalidOffsetNumber : state->stack->childoffnum, @@ -307,80 +306,88 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) int tlen; SplitedPageLayout *dist = NULL, *ptr; - BlockNumber rrlink = InvalidBlockNumber; + BlockNumber rrlink = InvalidBlockNumber; GistNSN oldnsn; is_splitted = true; /* - * Form index tuples vector to split: - * remove old tuple if t's needed and add new tuples to vector + * Form index tuples vector to split: remove old tuple if t's needed + * and add new tuples to vector */ itvec = gistextractpage(state->stack->page, &tlen); - if ( !is_leaf ) { + if (!is_leaf) + { /* on inner page we should remove old tuple */ - int pos = state->stack->childoffnum - FirstOffsetNumber; + int pos = state->stack->childoffnum - FirstOffsetNumber; - tlen--; - if ( pos != tlen ) - memmove( itvec+pos, itvec + pos + 1, sizeof( IndexTuple ) * (tlen-pos) ); + tlen--; + if (pos != tlen) + memmove(itvec + pos, itvec + pos + 1, sizeof(IndexTuple) * (tlen - pos)); } itvec = gistjoinvector(itvec, &tlen, state->itup, state->ituplen); dist = gistSplit(state->r, state->stack->page, itvec, tlen, giststate); - state->itup = (IndexTuple*)palloc( sizeof(IndexTuple) * tlen); + state->itup = (IndexTuple *) palloc(sizeof(IndexTuple) * tlen); state->ituplen = 0; - if (state->stack->blkno != GIST_ROOT_BLKNO) { - /* if non-root split then we should not allocate new buffer, - but we must create temporary page to operate */ + if (state->stack->blkno != GIST_ROOT_BLKNO) + { + /* + * if non-root split then we should not allocate new buffer, but + * we must create temporary page to operate + */ dist->buffer = state->stack->buffer; - dist->page = PageGetTempPage( BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData) ); + dist->page = PageGetTempPage(BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData)); - /*clean all flags except F_LEAF */ + /* clean all flags except F_LEAF */ GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0; } /* make new pages and fills them */ - for (ptr = dist; ptr; ptr = ptr->next) { - int i; - char *data; + for (ptr = dist; ptr; ptr = ptr->next) + { + int i; + char *data; /* get new page */ - if ( ptr->buffer == InvalidBuffer ) { - ptr->buffer = gistNewBuffer( state->r ); - GISTInitBuffer( ptr->buffer, (is_leaf) ? F_LEAF : 0 ); + if (ptr->buffer == InvalidBuffer) + { + ptr->buffer = gistNewBuffer(state->r); + GISTInitBuffer(ptr->buffer, (is_leaf) ? F_LEAF : 0); ptr->page = BufferGetPage(ptr->buffer); } - ptr->block.blkno = BufferGetBlockNumber( ptr->buffer ); + ptr->block.blkno = BufferGetBlockNumber(ptr->buffer); - /* fill page, we can do it becouse all this pages are new (ie not linked in tree - or masked by temp page */ - data = (char*)(ptr->list); - for(i=0;i<ptr->block.num;i++) { - if ( PageAddItem(ptr->page, (Item)data, IndexTupleSize((IndexTuple)data), i+FirstOffsetNumber, LP_USED) == InvalidOffsetNumber ) + /* + * fill page, we can do it becouse all this pages are new (ie not + * linked in tree or masked by temp page + */ + data = (char *) (ptr->list); + for (i = 0; i < ptr->block.num; i++) + { + if (PageAddItem(ptr->page, (Item) data, IndexTupleSize((IndexTuple) data), i + FirstOffsetNumber, LP_USED) == InvalidOffsetNumber) elog(ERROR, "failed to add item to index page in \"%s\"", RelationGetRelationName(state->r)); - data += IndexTupleSize((IndexTuple)data); + data += IndexTupleSize((IndexTuple) data); } /* set up ItemPointer and remmeber it for parent */ ItemPointerSetBlockNumber(&(ptr->itup->t_tid), ptr->block.blkno); - state->itup[ state->ituplen ] = ptr->itup; + state->itup[state->ituplen] = ptr->itup; state->ituplen++; } /* saves old rightlink */ - if ( state->stack->blkno != GIST_ROOT_BLKNO ) - rrlink = GistPageGetOpaque(dist->page)->rightlink; + if (state->stack->blkno != GIST_ROOT_BLKNO) + rrlink = GistPageGetOpaque(dist->page)->rightlink; START_CRIT_SECTION(); /* - * must mark buffers dirty before XLogInsert, even though we'll - * still be changing their opaque fields below. - * set up right links. + * must mark buffers dirty before XLogInsert, even though we'll still + * be changing their opaque fields below. set up right links. */ - for (ptr = dist; ptr; ptr = ptr->next) + for (ptr = dist; ptr; ptr = ptr->next) { MarkBufferDirty(ptr->buffer); GistPageGetOpaque(ptr->page)->rightlink = (ptr->next) ? @@ -388,9 +395,10 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) } /* restore splitted non-root page */ - if ( state->stack->blkno != GIST_ROOT_BLKNO ) { - PageRestoreTempPage( dist->page, BufferGetPage( dist->buffer ) ); - dist->page = BufferGetPage( dist->buffer ); + if (state->stack->blkno != GIST_ROOT_BLKNO) + { + PageRestoreTempPage(dist->page, BufferGetPage(dist->buffer)); + dist->page = BufferGetPage(dist->buffer); } if (!state->r->rd_istemp) @@ -419,25 +427,27 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) /* set up NSN */ oldnsn = GistPageGetOpaque(dist->page)->nsn; - if ( state->stack->blkno == GIST_ROOT_BLKNO ) + if (state->stack->blkno == GIST_ROOT_BLKNO) /* if root split we should put initial value */ oldnsn = PageGetLSN(dist->page); - for (ptr = dist; ptr; ptr = ptr->next) { + for (ptr = dist; ptr; ptr = ptr->next) + { /* only for last set oldnsn */ GistPageGetOpaque(ptr->page)->nsn = (ptr->next) ? PageGetLSN(ptr->page) : oldnsn; } - /* - * release buffers, if it was a root split then - * release all buffers because we create all buffers + /* + * release buffers, if it was a root split then release all buffers + * because we create all buffers */ - ptr = ( state->stack->blkno == GIST_ROOT_BLKNO ) ? dist : dist->next; - for(; ptr; ptr = ptr->next) + ptr = (state->stack->blkno == GIST_ROOT_BLKNO) ? dist : dist->next; + for (; ptr; ptr = ptr->next) UnlockReleaseBuffer(ptr->buffer); - if (state->stack->blkno == GIST_ROOT_BLKNO) { + if (state->stack->blkno == GIST_ROOT_BLKNO) + { gistnewroot(state->r, state->stack->buffer, state->itup, state->ituplen, &(state->key)); state->needInsertComplete = false; } @@ -470,7 +480,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) } rdata = formUpdateRdata(state->r->rd_node, state->stack->buffer, - offs, noffs, + offs, noffs, state->itup, state->ituplen, &(state->key)); @@ -922,16 +932,16 @@ gistSplit(Relation r, GistSplitVector v; GistEntryVector *entryvec; int i; - SplitedPageLayout *res = NULL; + SplitedPageLayout *res = NULL; /* generate the item array */ entryvec = palloc(GEVHDRSZ + (len + 1) * sizeof(GISTENTRY)); entryvec->n = len + 1; - memset( v.spl_lisnull, TRUE, sizeof(bool) * giststate->tupdesc->natts ); - memset( v.spl_risnull, TRUE, sizeof(bool) * giststate->tupdesc->natts ); - gistSplitByKey(r, page, itup, len, giststate, - &v, entryvec, 0); + memset(v.spl_lisnull, TRUE, sizeof(bool) * giststate->tupdesc->natts); + memset(v.spl_risnull, TRUE, sizeof(bool) * giststate->tupdesc->natts); + gistSplitByKey(r, page, itup, len, giststate, + &v, entryvec, 0); /* form left and right vector */ lvectup = (IndexTuple *) palloc(sizeof(IndexTuple) * (len + 1)); @@ -952,19 +962,20 @@ gistSplit(Relation r, { ROTATEDIST(res); res->block.num = v.splitVector.spl_nright; - res->list = gistfillitupvec(rvectup, v.splitVector.spl_nright, &( res->lenlist ) ); + res->list = gistfillitupvec(rvectup, v.splitVector.spl_nright, &(res->lenlist)); res->itup = (v.spl_rightvalid) ? gistFormTuple(giststate, r, v.spl_rattr, v.spl_risnull, false) : gist_form_invalid_tuple(GIST_ROOT_BLKNO); } if (!gistfitpage(lvectup, v.splitVector.spl_nleft)) { - SplitedPageLayout *resptr, *subres; + SplitedPageLayout *resptr, + *subres; resptr = subres = gistSplit(r, page, lvectup, v.splitVector.spl_nleft, giststate); - /* install on list's tail */ - while( resptr->next ) + /* install on list's tail */ + while (resptr->next) resptr = resptr->next; resptr->next = res; @@ -974,7 +985,7 @@ gistSplit(Relation r, { ROTATEDIST(res); res->block.num = v.splitVector.spl_nleft; - res->list = gistfillitupvec(lvectup, v.splitVector.spl_nleft, &( res->lenlist ) ); + res->list = gistfillitupvec(lvectup, v.splitVector.spl_nleft, &(res->lenlist)); res->itup = (v.spl_leftvalid) ? gistFormTuple(giststate, r, v.spl_lattr, v.spl_lisnull, false) : gist_form_invalid_tuple(GIST_ROOT_BLKNO); } diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index ed41f2c335e..68a4c18bb87 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.60 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.61 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -360,8 +360,7 @@ gistindex_keytest(IndexTuple tuple, IncrIndexProcessed(); /* - * Tuple doesn't restore after crash recovery because of incomplete - * insert + * Tuple doesn't restore after crash recovery because of incomplete insert */ if (!GistPageIsLeaf(p) && GistTupleIsInvalid(tuple)) return true; @@ -378,14 +377,18 @@ gistindex_keytest(IndexTuple tuple, giststate->tupdesc, &isNull); - if ( key->sk_flags & SK_ISNULL ) { - /* is the compared-to datum NULL? on non-leaf page it's possible - to have nulls in childs :( */ + if (key->sk_flags & SK_ISNULL) + { + /* + * is the compared-to datum NULL? on non-leaf page it's possible + * to have nulls in childs :( + */ - if ( isNull || !GistPageIsLeaf(p) ) + if (isNull || !GistPageIsLeaf(p)) return true; return false; - } else if ( isNull ) + } + else if (isNull) return false; gistdentryinit(giststate, key->sk_attno - 1, &de, diff --git a/src/backend/access/gist/gistproc.c b/src/backend/access/gist/gistproc.c index ccd54bac120..5c021461eec 100644 --- a/src/backend/access/gist/gistproc.c +++ b/src/backend/access/gist/gistproc.c @@ -10,7 +10,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistproc.c,v 1.8 2006/09/10 00:29:34 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistproc.c,v 1.9 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -112,7 +112,8 @@ gist_box_consistent(PG_FUNCTION_ARGS) } static void -adjustBox( BOX *b, BOX *addon ) { +adjustBox(BOX *b, BOX *addon) +{ if (b->high.x < addon->high.x) b->high.x = addon->high.x; if (b->low.x > addon->low.x) @@ -146,7 +147,7 @@ gist_box_union(PG_FUNCTION_ARGS) for (i = 1; i < numranges; i++) { cur = DatumGetBoxP(entryvec->vector[i].key); - adjustBox( pageunion, cur ); + adjustBox(pageunion, cur); } *sizep = sizeof(BOX); @@ -210,67 +211,79 @@ compare_KB(const void *a, const void *b) } static void -chooseLR( GIST_SPLITVEC *v, - OffsetNumber *list1, int nlist1, BOX *union1, - OffsetNumber *list2, int nlist2, BOX *union2 ) +chooseLR(GIST_SPLITVEC *v, + OffsetNumber *list1, int nlist1, BOX *union1, + OffsetNumber *list2, int nlist2, BOX *union2) { - bool firstToLeft = true; - - if ( v->spl_ldatum_exists || v->spl_rdatum_exists ) { - if ( v->spl_ldatum_exists && v->spl_rdatum_exists ) { - BOX LRl = *union1, LRr = *union2; - BOX RLl = *union2, RLr = *union1; - double sizeLR, sizeRL; - - adjustBox( &LRl, DatumGetBoxP( v->spl_ldatum ) ); - adjustBox( &LRr, DatumGetBoxP( v->spl_rdatum ) ); - adjustBox( &RLl, DatumGetBoxP( v->spl_ldatum ) ); - adjustBox( &RLr, DatumGetBoxP( v->spl_rdatum ) ); - - sizeLR = size_box( DirectFunctionCall2(rt_box_inter, BoxPGetDatum(&LRl), BoxPGetDatum(&LRr)) ); - sizeRL = size_box( DirectFunctionCall2(rt_box_inter, BoxPGetDatum(&RLl), BoxPGetDatum(&RLr)) ); + bool firstToLeft = true; - if ( sizeLR > sizeRL ) + if (v->spl_ldatum_exists || v->spl_rdatum_exists) + { + if (v->spl_ldatum_exists && v->spl_rdatum_exists) + { + BOX LRl = *union1, + LRr = *union2; + BOX RLl = *union2, + RLr = *union1; + double sizeLR, + sizeRL; + + adjustBox(&LRl, DatumGetBoxP(v->spl_ldatum)); + adjustBox(&LRr, DatumGetBoxP(v->spl_rdatum)); + adjustBox(&RLl, DatumGetBoxP(v->spl_ldatum)); + adjustBox(&RLr, DatumGetBoxP(v->spl_rdatum)); + + sizeLR = size_box(DirectFunctionCall2(rt_box_inter, BoxPGetDatum(&LRl), BoxPGetDatum(&LRr))); + sizeRL = size_box(DirectFunctionCall2(rt_box_inter, BoxPGetDatum(&RLl), BoxPGetDatum(&RLr))); + + if (sizeLR > sizeRL) firstToLeft = false; - } else { - float p1, p2; - GISTENTRY oldUnion, addon; + } + else + { + float p1, + p2; + GISTENTRY oldUnion, + addon; - gistentryinit(oldUnion, ( v->spl_ldatum_exists ) ? v->spl_ldatum : v->spl_rdatum, + gistentryinit(oldUnion, (v->spl_ldatum_exists) ? v->spl_ldatum : v->spl_rdatum, NULL, NULL, InvalidOffsetNumber, FALSE); - + gistentryinit(addon, BoxPGetDatum(union1), NULL, NULL, InvalidOffsetNumber, FALSE); - DirectFunctionCall3(gist_box_penalty, PointerGetDatum(&oldUnion), PointerGetDatum(&union1), PointerGetDatum(&p1)); + DirectFunctionCall3(gist_box_penalty, PointerGetDatum(&oldUnion), PointerGetDatum(&union1), PointerGetDatum(&p1)); gistentryinit(addon, BoxPGetDatum(union2), NULL, NULL, InvalidOffsetNumber, FALSE); DirectFunctionCall3(gist_box_penalty, PointerGetDatum(&oldUnion), PointerGetDatum(&union2), PointerGetDatum(&p2)); - if ( (v->spl_ldatum_exists && p1 > p2) || (v->spl_rdatum_exists && p1 < p2) ) - firstToLeft = false; + if ((v->spl_ldatum_exists && p1 > p2) || (v->spl_rdatum_exists && p1 < p2)) + firstToLeft = false; } } - if ( firstToLeft ) { + if (firstToLeft) + { v->spl_left = list1; v->spl_right = list2; v->spl_nleft = nlist1; v->spl_nright = nlist2; - if ( v->spl_ldatum_exists ) - adjustBox(union1, DatumGetBoxP( v->spl_ldatum ) ); + if (v->spl_ldatum_exists) + adjustBox(union1, DatumGetBoxP(v->spl_ldatum)); v->spl_ldatum = BoxPGetDatum(union1); - if ( v->spl_rdatum_exists ) - adjustBox(union2, DatumGetBoxP( v->spl_rdatum ) ); + if (v->spl_rdatum_exists) + adjustBox(union2, DatumGetBoxP(v->spl_rdatum)); v->spl_rdatum = BoxPGetDatum(union2); - } else { + } + else + { v->spl_left = list2; v->spl_right = list1; v->spl_nleft = nlist2; v->spl_nright = nlist1; - if ( v->spl_ldatum_exists ) - adjustBox(union2, DatumGetBoxP( v->spl_ldatum ) ); + if (v->spl_ldatum_exists) + adjustBox(union2, DatumGetBoxP(v->spl_ldatum)); v->spl_ldatum = BoxPGetDatum(union2); - if ( v->spl_rdatum_exists ) - adjustBox(union1, DatumGetBoxP( v->spl_rdatum ) ); + if (v->spl_rdatum_exists) + adjustBox(union1, DatumGetBoxP(v->spl_rdatum)); v->spl_rdatum = BoxPGetDatum(union1); } @@ -326,7 +339,7 @@ gist_box_picksplit(PG_FUNCTION_ARGS) )) allisequal = false; - adjustBox( &pageunion, cur ); + adjustBox(&pageunion, cur); } nbytes = (maxoff + 2) * sizeof(OffsetNumber); @@ -359,12 +372,12 @@ gist_box_picksplit(PG_FUNCTION_ARGS) } } - if ( v->spl_ldatum_exists ) - adjustBox( unionL, DatumGetBoxP( v->spl_ldatum ) ); + if (v->spl_ldatum_exists) + adjustBox(unionL, DatumGetBoxP(v->spl_ldatum)); v->spl_ldatum = BoxPGetDatum(unionL); - if ( v->spl_rdatum_exists ) - adjustBox( unionR, DatumGetBoxP( v->spl_rdatum ) ); + if (v->spl_rdatum_exists) + adjustBox(unionR, DatumGetBoxP(v->spl_rdatum)); v->spl_rdatum = BoxPGetDatum(unionR); v->spl_ldatum_exists = v->spl_rdatum_exists = false; @@ -471,13 +484,13 @@ gist_box_picksplit(PG_FUNCTION_ARGS) } if (direction == 'x') - chooseLR( v, - listL, posL, unionL, - listR, posR, unionR ); - else - chooseLR( v, - listB, posB, unionB, - listT, posT, unionT ); + chooseLR(v, + listL, posL, unionL, + listR, posR, unionR); + else + chooseLR(v, + listB, posB, unionB, + listT, posT, unionT); PG_RETURN_POINTER(v); } diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index 0d3c1d2a9a9..b0fdb740047 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.64 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.65 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -228,12 +228,12 @@ gistendscan(PG_FUNCTION_ARGS) static void gistfreestack(GISTSearchStack *s) -{ +{ while (s != NULL) { GISTSearchStack *p = s->next; + pfree(s); s = p; } } - diff --git a/src/backend/access/gist/gistsplit.c b/src/backend/access/gist/gistsplit.c index 8c6683a4cc7..14a14509cbb 100644 --- a/src/backend/access/gist/gistsplit.c +++ b/src/backend/access/gist/gistsplit.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistsplit.c,v 1.2 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistsplit.c,v 1.3 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -16,12 +16,13 @@ #include "access/gist_private.h" -typedef struct { - Datum *attr; - int len; +typedef struct +{ + Datum *attr; + int len; OffsetNumber *entries; - bool *isnull; - bool *equiv; + bool *isnull; + bool *equiv; } GistSplitUnion; @@ -29,25 +30,28 @@ typedef struct { * Forms unions of subkeys after page split, but * uses only tuples aren't in groups of equalent tuples */ -static void -gistunionsubkeyvec(GISTSTATE *giststate, IndexTuple *itvec, - GistSplitUnion *gsvp, int startkey) { - IndexTuple *cleanedItVec; - int i, cleanedLen=0; +static void +gistunionsubkeyvec(GISTSTATE *giststate, IndexTuple *itvec, + GistSplitUnion *gsvp, int startkey) +{ + IndexTuple *cleanedItVec; + int i, + cleanedLen = 0; - cleanedItVec = (IndexTuple*)palloc(sizeof(IndexTuple) * gsvp->len); + cleanedItVec = (IndexTuple *) palloc(sizeof(IndexTuple) * gsvp->len); - for(i=0;i<gsvp->len;i++) { - if ( gsvp->equiv && gsvp->equiv[gsvp->entries[i]]) + for (i = 0; i < gsvp->len; i++) + { + if (gsvp->equiv && gsvp->equiv[gsvp->entries[i]]) continue; cleanedItVec[cleanedLen++] = itvec[gsvp->entries[i] - 1]; } - gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen, startkey, - gsvp->attr, gsvp->isnull); + gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen, startkey, + gsvp->attr, gsvp->isnull); - pfree( cleanedItVec ); + pfree(cleanedItVec); } /* @@ -56,7 +60,7 @@ gistunionsubkeyvec(GISTSTATE *giststate, IndexTuple *itvec, static void gistunionsubkey(GISTSTATE *giststate, IndexTuple *itvec, GistSplitVector *spl, int attno) { - GistSplitUnion gsvp; + GistSplitUnion gsvp; gsvp.equiv = spl->spl_equiv; @@ -76,34 +80,40 @@ gistunionsubkey(GISTSTATE *giststate, IndexTuple *itvec, GistSplitVector *spl, i } /* - * find group in vector with equivalent value + * find group in vector with equivalent value */ static int gistfindgroup(Relation r, GISTSTATE *giststate, GISTENTRY *valvec, GistSplitVector *spl, int attno) { int i; GISTENTRY entry; - int len=0; + int len = 0; /* - * attno key is always not null (see gistSplitByKey), so we may not check for - * nulls + * attno key is always not null (see gistSplitByKey), so we may not check + * for nulls */ gistentryinit(entry, spl->splitVector.spl_rdatum, r, NULL, (OffsetNumber) 0, FALSE); - for (i = 0; i < spl->splitVector.spl_nleft; i++) { - float penalty = gistpenalty(giststate, attno, &entry, false, - &valvec[spl->splitVector.spl_left[i]], false); - if ( penalty == 0.0 ) { + for (i = 0; i < spl->splitVector.spl_nleft; i++) + { + float penalty = gistpenalty(giststate, attno, &entry, false, + &valvec[spl->splitVector.spl_left[i]], false); + + if (penalty == 0.0) + { spl->spl_equiv[spl->splitVector.spl_left[i]] = true; len++; } } gistentryinit(entry, spl->splitVector.spl_ldatum, r, NULL, (OffsetNumber) 0, FALSE); - for (i = 0; i < spl->splitVector.spl_nright; i++) { - float penalty = gistpenalty(giststate, attno, &entry, false, - &valvec[spl->splitVector.spl_right[i]], false); - if ( penalty == 0.0 ) { + for (i = 0; i < spl->splitVector.spl_nright; i++) + { + float penalty = gistpenalty(giststate, attno, &entry, false, + &valvec[spl->splitVector.spl_right[i]], false); + + if (penalty == 0.0) + { spl->spl_equiv[spl->splitVector.spl_right[i]] = true; len++; } @@ -113,24 +123,32 @@ gistfindgroup(Relation r, GISTSTATE *giststate, GISTENTRY *valvec, GistSplitVect } static void -cleanupOffsets( OffsetNumber *a, int *len, bool *equiv, int *LenEquiv ) { - int curlen,i; - OffsetNumber *curwpos; +cleanupOffsets(OffsetNumber *a, int *len, bool *equiv, int *LenEquiv) +{ + int curlen, + i; + OffsetNumber *curwpos; curlen = *len; curwpos = a; - for (i = 0; i < *len; i++) { - if ( equiv[ a[i] ] == FALSE ) { + for (i = 0; i < *len; i++) + { + if (equiv[a[i]] == FALSE) + { *curwpos = a[i]; curwpos++; - } else { + } + else + { /* corner case: we shouldn't make void array */ - if ( curlen==1 ) { - equiv[ a[i] ] = FALSE; /* mark item as non-equivalent */ - i--; /* redo the same */ + if (curlen == 1) + { + equiv[a[i]] = FALSE; /* mark item as non-equivalent */ + i--; /* redo the same */ *LenEquiv -= 1; continue; - } else + } + else curlen--; } } @@ -139,33 +157,37 @@ cleanupOffsets( OffsetNumber *a, int *len, bool *equiv, int *LenEquiv ) { } static void -placeOne( Relation r, GISTSTATE *giststate, GistSplitVector *v, IndexTuple itup, OffsetNumber off, int attno ) { +placeOne(Relation r, GISTSTATE *giststate, GistSplitVector *v, IndexTuple itup, OffsetNumber off, int attno) +{ GISTENTRY identry[INDEX_MAX_KEYS]; bool isnull[INDEX_MAX_KEYS]; - bool toLeft = true; + bool toLeft = true; gistDeCompressAtt(giststate, r, itup, NULL, (OffsetNumber) 0, identry, isnull); - for(;attno<giststate->tupdesc->natts;attno++) { - float lpenalty, rpenalty; + for (; attno < giststate->tupdesc->natts; attno++) + { + float lpenalty, + rpenalty; GISTENTRY entry; - gistentryinit(entry, v->spl_lattr[attno], r, NULL, 0, FALSE); - lpenalty = gistpenalty(giststate, attno, &entry, v->spl_lisnull[attno], identry+attno, isnull[ attno ]); - gistentryinit(entry, v->spl_rattr[attno], r, NULL, 0, FALSE); - rpenalty = gistpenalty(giststate, attno, &entry, v->spl_risnull[attno], identry+attno, isnull[ attno ]); + gistentryinit(entry, v->spl_lattr[attno], r, NULL, 0, FALSE); + lpenalty = gistpenalty(giststate, attno, &entry, v->spl_lisnull[attno], identry + attno, isnull[attno]); + gistentryinit(entry, v->spl_rattr[attno], r, NULL, 0, FALSE); + rpenalty = gistpenalty(giststate, attno, &entry, v->spl_risnull[attno], identry + attno, isnull[attno]); - if ( lpenalty != rpenalty ) { - if ( lpenalty > rpenalty ) + if (lpenalty != rpenalty) + { + if (lpenalty > rpenalty) toLeft = false; break; } } - if ( toLeft ) - v->splitVector.spl_left[ v->splitVector.spl_nleft++ ] = off; + if (toLeft) + v->splitVector.spl_left[v->splitVector.spl_nleft++] = off; else - v->splitVector.spl_right[ v->splitVector.spl_nright++ ] = off; + v->splitVector.spl_right[v->splitVector.spl_nright++] = off; } #define SWAPVAR( s, d, t ) \ @@ -176,71 +198,83 @@ do { \ } while(0) /* - * adjust left and right unions according to splits by previous - * split by firsts columns. This function is called only in case + * adjust left and right unions according to splits by previous + * split by firsts columns. This function is called only in case * when pickSplit doesn't support subspplit. */ static void -supportSecondarySplit( Relation r, GISTSTATE *giststate, int attno, GIST_SPLITVEC *sv, Datum oldL, Datum oldR ) { - bool leaveOnLeft = true, tmpBool; - GISTENTRY entryL, entryR, entrySL, entrySR; - - gistentryinit(entryL, oldL, r, NULL, 0, FALSE); - gistentryinit(entryR, oldR, r, NULL, 0, FALSE); - gistentryinit(entrySL, sv->spl_ldatum , r, NULL, 0, FALSE); - gistentryinit(entrySR, sv->spl_rdatum , r, NULL, 0, FALSE); - - if ( sv->spl_ldatum_exists && sv->spl_rdatum_exists ) { - float penalty1, penalty2; +supportSecondarySplit(Relation r, GISTSTATE *giststate, int attno, GIST_SPLITVEC *sv, Datum oldL, Datum oldR) +{ + bool leaveOnLeft = true, + tmpBool; + GISTENTRY entryL, + entryR, + entrySL, + entrySR; + + gistentryinit(entryL, oldL, r, NULL, 0, FALSE); + gistentryinit(entryR, oldR, r, NULL, 0, FALSE); + gistentryinit(entrySL, sv->spl_ldatum, r, NULL, 0, FALSE); + gistentryinit(entrySR, sv->spl_rdatum, r, NULL, 0, FALSE); + + if (sv->spl_ldatum_exists && sv->spl_rdatum_exists) + { + float penalty1, + penalty2; penalty1 = gistpenalty(giststate, attno, &entryL, false, &entrySL, false) + - gistpenalty(giststate, attno, &entryR, false, &entrySR, false); + gistpenalty(giststate, attno, &entryR, false, &entrySR, false); penalty2 = gistpenalty(giststate, attno, &entryL, false, &entrySR, false) + - gistpenalty(giststate, attno, &entryR, false, &entrySL, false); + gistpenalty(giststate, attno, &entryR, false, &entrySL, false); - if ( penalty1 > penalty2 ) + if (penalty1 > penalty2) leaveOnLeft = false; - } else { - GISTENTRY *entry1 = (sv->spl_ldatum_exists) ? &entryL : &entryR; - float penalty1, penalty2; + } + else + { + GISTENTRY *entry1 = (sv->spl_ldatum_exists) ? &entryL : &entryR; + float penalty1, + penalty2; /* - * there is only one previously defined union, - * so we just choose swap or not by lowest penalty + * there is only one previously defined union, so we just choose swap + * or not by lowest penalty */ penalty1 = gistpenalty(giststate, attno, entry1, false, &entrySL, false); penalty2 = gistpenalty(giststate, attno, entry1, false, &entrySR, false); - if ( penalty1 < penalty2 ) - leaveOnLeft = ( sv->spl_ldatum_exists ) ? true : false; + if (penalty1 < penalty2) + leaveOnLeft = (sv->spl_ldatum_exists) ? true : false; else - leaveOnLeft = ( sv->spl_rdatum_exists ) ? true : false; + leaveOnLeft = (sv->spl_rdatum_exists) ? true : false; } - if ( leaveOnLeft == false ) { + if (leaveOnLeft == false) + { /* - * swap left and right + * swap left and right */ - OffsetNumber *off, noff; - Datum datum; - - SWAPVAR( sv->spl_left, sv->spl_right, off ); - SWAPVAR( sv->spl_nleft, sv->spl_nright, noff ); - SWAPVAR( sv->spl_ldatum, sv->spl_rdatum, datum ); - gistentryinit(entrySL, sv->spl_ldatum , r, NULL, 0, FALSE); - gistentryinit(entrySR, sv->spl_rdatum , r, NULL, 0, FALSE); + OffsetNumber *off, + noff; + Datum datum; + + SWAPVAR(sv->spl_left, sv->spl_right, off); + SWAPVAR(sv->spl_nleft, sv->spl_nright, noff); + SWAPVAR(sv->spl_ldatum, sv->spl_rdatum, datum); + gistentryinit(entrySL, sv->spl_ldatum, r, NULL, 0, FALSE); + gistentryinit(entrySR, sv->spl_rdatum, r, NULL, 0, FALSE); } - if ( sv->spl_ldatum_exists ) + if (sv->spl_ldatum_exists) gistMakeUnionKey(giststate, attno, &entryL, false, &entrySL, false, - &sv->spl_ldatum, &tmpBool); + &sv->spl_ldatum, &tmpBool); - if ( sv->spl_rdatum_exists ) + if (sv->spl_rdatum_exists) gistMakeUnionKey(giststate, attno, &entryR, false, &entrySR, false, - &sv->spl_rdatum, &tmpBool); + &sv->spl_rdatum, &tmpBool); sv->spl_ldatum_exists = sv->spl_rdatum_exists = false; } @@ -251,20 +285,21 @@ supportSecondarySplit( Relation r, GISTSTATE *giststate, int attno, GIST_SPLITVE * get better split. * Returns TRUE and v->spl_equiv = NULL if left and right unions of attno columns are the same, * so caller may find better split - * Returns TRUE and v->spl_equiv != NULL if there is tuples which may be freely moved + * Returns TRUE and v->spl_equiv != NULL if there is tuples which may be freely moved */ static bool gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVector *v, IndexTuple *itup, int len, GISTSTATE *giststate) { GIST_SPLITVEC *sv = &v->splitVector; + /* * now let the user-defined picksplit function set up the split vector; in * entryvec have no null value!! */ - sv->spl_ldatum_exists = ( v->spl_lisnull[ attno ] ) ? false : true; - sv->spl_rdatum_exists = ( v->spl_risnull[ attno ] ) ? false : true; + sv->spl_ldatum_exists = (v->spl_lisnull[attno]) ? false : true; + sv->spl_rdatum_exists = (v->spl_risnull[attno]) ? false : true; sv->spl_ldatum = v->spl_lattr[attno]; sv->spl_rdatum = v->spl_rattr[attno]; @@ -278,11 +313,12 @@ gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVec if (sv->spl_right[sv->spl_nright - 1] == InvalidOffsetNumber) sv->spl_right[sv->spl_nright - 1] = (OffsetNumber) (entryvec->n - 1); - if( sv->spl_ldatum_exists || sv->spl_rdatum_exists ) { - elog(LOG,"PickSplit method of %d columns of index '%s' doesn't support secondary split", - attno + 1, RelationGetRelationName(r) ); + if (sv->spl_ldatum_exists || sv->spl_rdatum_exists) + { + elog(LOG, "PickSplit method of %d columns of index '%s' doesn't support secondary split", + attno + 1, RelationGetRelationName(r)); - supportSecondarySplit( r, giststate, attno, sv, v->spl_lattr[attno], v->spl_rattr[attno] ); + supportSecondarySplit(r, giststate, attno, sv, v->spl_lattr[attno], v->spl_rattr[attno]); } v->spl_lattr[attno] = sv->spl_ldatum; @@ -296,53 +332,64 @@ gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVec */ v->spl_equiv = NULL; - if (giststate->tupdesc->natts > 1 && attno+1 != giststate->tupdesc->natts) + if (giststate->tupdesc->natts > 1 && attno + 1 != giststate->tupdesc->natts) { - if ( gistKeyIsEQ(giststate, attno, sv->spl_ldatum, sv->spl_rdatum) ) { + if (gistKeyIsEQ(giststate, attno, sv->spl_ldatum, sv->spl_rdatum)) + { /* - * Left and right key's unions are equial, so - * we can get better split by following columns. Note, - * unions for attno columns are already done. + * Left and right key's unions are equial, so we can get better + * split by following columns. Note, unions for attno columns are + * already done. */ return true; - } else { + } + else + { int LenEquiv; - v->spl_equiv = (bool *) palloc0(sizeof(bool) * (entryvec->n+1)); + v->spl_equiv = (bool *) palloc0(sizeof(bool) * (entryvec->n + 1)); LenEquiv = gistfindgroup(r, giststate, entryvec->vector, v, attno); /* - * if possible, we should distribute equivalent tuples - */ - if (LenEquiv == 0 ) { + * if possible, we should distribute equivalent tuples + */ + if (LenEquiv == 0) + { gistunionsubkey(giststate, itup, v, attno + 1); - } else { - cleanupOffsets( sv->spl_left, &sv->spl_nleft, v->spl_equiv, &LenEquiv ); - cleanupOffsets( sv->spl_right, &sv->spl_nright, v->spl_equiv, &LenEquiv ); + } + else + { + cleanupOffsets(sv->spl_left, &sv->spl_nleft, v->spl_equiv, &LenEquiv); + cleanupOffsets(sv->spl_right, &sv->spl_nright, v->spl_equiv, &LenEquiv); gistunionsubkey(giststate, itup, v, attno + 1); - if (LenEquiv == 1 ) { + if (LenEquiv == 1) + { /* - * In case with one tuple we just choose left-right - * by penalty. It's simplify user-defined pickSplit + * In case with one tuple we just choose left-right by + * penalty. It's simplify user-defined pickSplit */ OffsetNumber toMove = InvalidOffsetNumber; - for(toMove=FirstOffsetNumber;toMove<entryvec->n;toMove++) - if ( v->spl_equiv[ toMove ] ) + for (toMove = FirstOffsetNumber; toMove < entryvec->n; toMove++) + if (v->spl_equiv[toMove]) break; - Assert( toMove < entryvec->n ); - - placeOne( r, giststate, v, itup[ toMove-1 ], toMove, attno+1 ); - /* redo gistunionsubkey(): it will not degradate performance, - * because it's very rarely */ + Assert(toMove < entryvec->n); + + placeOne(r, giststate, v, itup[toMove - 1], toMove, attno + 1); + + /* + * redo gistunionsubkey(): it will not degradate + * performance, because it's very rarely + */ v->spl_equiv = NULL; gistunionsubkey(giststate, itup, v, attno + 1); return false; - } else if ( LenEquiv > 1 ) + } + else if (LenEquiv > 1) return true; } } @@ -352,60 +399,65 @@ gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVec } /* - * simple split page + * simple split page */ static void -gistSplitHalf(GIST_SPLITVEC *v, int len) { - int i; +gistSplitHalf(GIST_SPLITVEC *v, int len) +{ + int i; - v->spl_nright = v->spl_nleft = 0; + v->spl_nright = v->spl_nleft = 0; v->spl_left = (OffsetNumber *) palloc(len * sizeof(OffsetNumber)); - v->spl_right= (OffsetNumber *) palloc(len * sizeof(OffsetNumber)); - for(i = 1; i <= len; i++) - if ( i<len/2 ) - v->spl_right[ v->spl_nright++ ] = i; + v->spl_right = (OffsetNumber *) palloc(len * sizeof(OffsetNumber)); + for (i = 1; i <= len; i++) + if (i < len / 2) + v->spl_right[v->spl_nright++] = i; else - v->spl_left[ v->spl_nleft++ ] = i; + v->spl_left[v->spl_nleft++] = i; } /* * if it was invalid tuple then we need special processing. - * We move all invalid tuples on right page. + * We move all invalid tuples on right page. * - * if there is no place on left page, gistSplit will be called one more + * if there is no place on left page, gistSplit will be called one more * time for left page. * * Normally, we never exec this code, but after crash replay it's possible * to get 'invalid' tuples (probability is low enough) */ static void -gistSplitByInvalid(GISTSTATE *giststate, GistSplitVector *v, IndexTuple *itup, int len) { - int i; - static OffsetNumber offInvTuples[ MaxOffsetNumber ]; - int nOffInvTuples = 0; +gistSplitByInvalid(GISTSTATE *giststate, GistSplitVector *v, IndexTuple *itup, int len) +{ + int i; + static OffsetNumber offInvTuples[MaxOffsetNumber]; + int nOffInvTuples = 0; for (i = 1; i <= len; i++) - if ( GistTupleIsInvalid(itup[i - 1]) ) - offInvTuples[ nOffInvTuples++ ] = i; + if (GistTupleIsInvalid(itup[i - 1])) + offInvTuples[nOffInvTuples++] = i; - if ( nOffInvTuples == len ) { + if (nOffInvTuples == len) + { /* corner case, all tuples are invalid */ - v->spl_rightvalid= v->spl_leftvalid = false; - gistSplitHalf( &v->splitVector, len ); - } else { - GistSplitUnion gsvp; - + v->spl_rightvalid = v->spl_leftvalid = false; + gistSplitHalf(&v->splitVector, len); + } + else + { + GistSplitUnion gsvp; + v->splitVector.spl_right = offInvTuples; v->splitVector.spl_nright = nOffInvTuples; v->spl_rightvalid = false; v->splitVector.spl_left = (OffsetNumber *) palloc(len * sizeof(OffsetNumber)); v->splitVector.spl_nleft = 0; - for(i = 1; i <= len; i++) - if ( !GistTupleIsInvalid(itup[i - 1]) ) - v->splitVector.spl_left[ v->splitVector.spl_nleft++ ] = i; + for (i = 1; i <= len; i++) + if (!GistTupleIsInvalid(itup[i - 1])) + v->splitVector.spl_left[v->splitVector.spl_nleft++] = i; v->spl_leftvalid = true; - + gsvp.equiv = NULL; gsvp.attr = v->spl_lattr; gsvp.len = v->splitVector.spl_nleft; @@ -418,52 +470,58 @@ gistSplitByInvalid(GISTSTATE *giststate, GistSplitVector *v, IndexTuple *itup, i /* * trys to split page by attno key, in a case of null - * values move its to separate page. + * values move its to separate page. */ void -gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len, GISTSTATE *giststate, - GistSplitVector *v, GistEntryVector *entryvec, int attno) { - int i; - static OffsetNumber offNullTuples[ MaxOffsetNumber ]; - int nOffNullTuples = 0; +gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len, GISTSTATE *giststate, + GistSplitVector *v, GistEntryVector *entryvec, int attno) +{ + int i; + static OffsetNumber offNullTuples[MaxOffsetNumber]; + int nOffNullTuples = 0; - for (i = 1; i <= len; i++) { - Datum datum; - bool IsNull; + for (i = 1; i <= len; i++) + { + Datum datum; + bool IsNull; - if (!GistPageIsLeaf(page) && GistTupleIsInvalid(itup[i - 1])) { + if (!GistPageIsLeaf(page) && GistTupleIsInvalid(itup[i - 1])) + { gistSplitByInvalid(giststate, v, itup, len); return; } - datum = index_getattr(itup[i - 1], attno+1, giststate->tupdesc, &IsNull); + datum = index_getattr(itup[i - 1], attno + 1, giststate->tupdesc, &IsNull); gistdentryinit(giststate, attno, &(entryvec->vector[i]), datum, r, page, i, FALSE, IsNull); - if ( IsNull ) - offNullTuples[ nOffNullTuples++ ] = i; + if (IsNull) + offNullTuples[nOffNullTuples++] = i; } v->spl_leftvalid = v->spl_rightvalid = true; - if ( nOffNullTuples == len ) { - /* + if (nOffNullTuples == len) + { + /* * Corner case: All keys in attno column are null, we should try to - * split by keys in next column. It all keys in all columns - * are NULL just split page half by half + * split by keys in next column. It all keys in all columns are NULL + * just split page half by half */ v->spl_risnull[attno] = v->spl_lisnull[attno] = TRUE; - if ( attno+1 == r->rd_att->natts ) - gistSplitHalf( &v->splitVector, len ); - else - gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno+1); - } else if ( nOffNullTuples > 0 ) { - int j=0; - - /* - * We don't want to mix NULLs and not-NULLs keys - * on one page, so move nulls to right page + if (attno + 1 == r->rd_att->natts) + gistSplitHalf(&v->splitVector, len); + else + gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno + 1); + } + else if (nOffNullTuples > 0) + { + int j = 0; + + /* + * We don't want to mix NULLs and not-NULLs keys on one page, so move + * nulls to right page */ v->splitVector.spl_right = offNullTuples; v->splitVector.spl_nright = nOffNullTuples; @@ -471,61 +529,71 @@ gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len, GISTSTATE *gist v->splitVector.spl_left = (OffsetNumber *) palloc(len * sizeof(OffsetNumber)); v->splitVector.spl_nleft = 0; - for(i = 1; i <= len; i++) - if ( j<v->splitVector.spl_nright && offNullTuples[j] == i ) + for (i = 1; i <= len; i++) + if (j < v->splitVector.spl_nright && offNullTuples[j] == i) j++; else - v->splitVector.spl_left[ v->splitVector.spl_nleft++ ] = i; + v->splitVector.spl_left[v->splitVector.spl_nleft++] = i; v->spl_equiv = NULL; gistunionsubkey(giststate, itup, v, attno); - } else { + } + else + { /* * all keys are not-null */ - entryvec->n = len+1; + entryvec->n = len + 1; - if ( gistUserPicksplit(r, entryvec, attno, v, itup, len, giststate) && attno+1 != r->rd_att->natts ) { + if (gistUserPicksplit(r, entryvec, attno, v, itup, len, giststate) && attno + 1 != r->rd_att->natts) + { /* - * Splitting on attno column is not optimized: there is a tuples which can be freely - * left or right page, we will try to split page by - * following columns + * Splitting on attno column is not optimized: there is a tuples + * which can be freely left or right page, we will try to split + * page by following columns */ - if ( v->spl_equiv == NULL ) { - /* simple case: left and right keys for attno column are equial */ - gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno+1); - } else { + if (v->spl_equiv == NULL) + { + /* + * simple case: left and right keys for attno column are + * equial + */ + gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno + 1); + } + else + { /* we should clean up vector from already distributed tuples */ - IndexTuple *newitup = (IndexTuple*)palloc((len + 1) * sizeof(IndexTuple)); - OffsetNumber *map = (OffsetNumber*)palloc((len + 1) * sizeof(IndexTuple)); - int newlen = 0; + IndexTuple *newitup = (IndexTuple *) palloc((len + 1) * sizeof(IndexTuple)); + OffsetNumber *map = (OffsetNumber *) palloc((len + 1) * sizeof(IndexTuple)); + int newlen = 0; GIST_SPLITVEC backupSplit = v->splitVector; - for(i=0; i<len; i++) - if ( v->spl_equiv[i+1] ) { - map[ newlen ] = i+1; - newitup[ newlen++ ] = itup[i]; + for (i = 0; i < len; i++) + if (v->spl_equiv[i + 1]) + { + map[newlen] = i + 1; + newitup[newlen++] = itup[i]; } - Assert( newlen>0 ); + Assert(newlen > 0); - backupSplit.spl_left = (OffsetNumber*)palloc(sizeof(OffsetNumber)*len); - memcpy( backupSplit.spl_left, v->splitVector.spl_left, sizeof(OffsetNumber)*v->splitVector.spl_nleft); - backupSplit.spl_right = (OffsetNumber*)palloc(sizeof(OffsetNumber)*len); - memcpy( backupSplit.spl_right, v->splitVector.spl_right, sizeof(OffsetNumber)*v->splitVector.spl_nright); + backupSplit.spl_left = (OffsetNumber *) palloc(sizeof(OffsetNumber) * len); + memcpy(backupSplit.spl_left, v->splitVector.spl_left, sizeof(OffsetNumber) * v->splitVector.spl_nleft); + backupSplit.spl_right = (OffsetNumber *) palloc(sizeof(OffsetNumber) * len); + memcpy(backupSplit.spl_right, v->splitVector.spl_right, sizeof(OffsetNumber) * v->splitVector.spl_nright); - gistSplitByKey(r, page, newitup, newlen, giststate, v, entryvec, attno+1); + gistSplitByKey(r, page, newitup, newlen, giststate, v, entryvec, attno + 1); /* merge result of subsplit */ - for(i=0;i<v->splitVector.spl_nleft;i++) - backupSplit.spl_left[ backupSplit.spl_nleft++ ] = map[ v->splitVector.spl_left[i]-1 ]; - for(i=0;i<v->splitVector.spl_nright;i++) - backupSplit.spl_right[ backupSplit.spl_nright++ ] = map[ v->splitVector.spl_right[i]-1 ]; + for (i = 0; i < v->splitVector.spl_nleft; i++) + backupSplit.spl_left[backupSplit.spl_nleft++] = map[v->splitVector.spl_left[i] - 1]; + for (i = 0; i < v->splitVector.spl_nright; i++) + backupSplit.spl_right[backupSplit.spl_nright++] = map[v->splitVector.spl_right[i] - 1]; v->splitVector = backupSplit; /* reunion left and right datums */ gistunionsubkey(giststate, itup, v, attno); } - } + } } } diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index 9b1cfc0cf65..ff22bd2b652 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.19 2006/07/14 14:52:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.20 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -22,8 +22,8 @@ * static *S used for temrorary storage (saves stack and palloc() call) */ -static Datum attrS[INDEX_MAX_KEYS]; -static bool isnullS[INDEX_MAX_KEYS]; +static Datum attrS[INDEX_MAX_KEYS]; +static bool isnullS[INDEX_MAX_KEYS]; /* * Write itup vector to page, has no control of free space @@ -57,14 +57,17 @@ gistfillbuffer(Relation r, Page page, IndexTuple *itup, bool gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete, Size freespace) { - unsigned int size = freespace, deleted = 0; + unsigned int size = freespace, + deleted = 0; int i; for (i = 0; i < len; i++) size += IndexTupleSize(itvec[i]) + sizeof(ItemIdData); - if ( todelete != InvalidOffsetNumber ) { - IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, todelete)); + if (todelete != InvalidOffsetNumber) + { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, todelete)); + deleted = IndexTupleSize(itup) + sizeof(ItemIdData); } @@ -72,11 +75,12 @@ gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete, Size f } bool -gistfitpage(IndexTuple *itvec, int len) { - int i; - Size size=0; +gistfitpage(IndexTuple *itvec, int len) +{ + int i; + Size size = 0; - for(i=0;i<len;i++) + for (i = 0; i < len; i++) size += IndexTupleSize(itvec[i]) + sizeof(ItemIdData); /* TODO: Consider fillfactor */ @@ -119,56 +123,64 @@ gistjoinvector(IndexTuple *itvec, int *len, IndexTuple *additvec, int addlen) */ IndexTupleData * -gistfillitupvec(IndexTuple *vec, int veclen, int *memlen) { - char *ptr, *ret; - int i; +gistfillitupvec(IndexTuple *vec, int veclen, int *memlen) +{ + char *ptr, + *ret; + int i; + + *memlen = 0; - *memlen=0; - for (i = 0; i < veclen; i++) *memlen += IndexTupleSize(vec[i]); ptr = ret = palloc(*memlen); - for (i = 0; i < veclen; i++) { + for (i = 0; i < veclen; i++) + { memcpy(ptr, vec[i], IndexTupleSize(vec[i])); ptr += IndexTupleSize(vec[i]); } - return (IndexTupleData*)ret; + return (IndexTupleData *) ret; } /* - * Make unions of keys in IndexTuple vector, return FALSE if itvec contains + * Make unions of keys in IndexTuple vector, return FALSE if itvec contains * invalid tuple. Resulting Datums aren't compressed. */ -bool -gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, int startkey, - Datum *attr, bool *isnull ) { +bool +gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, int startkey, + Datum *attr, bool *isnull) +{ int i; GistEntryVector *evec; - int attrsize; + int attrsize; - evec = (GistEntryVector *) palloc( ( len + 2 ) * sizeof(GISTENTRY) + GEVHDRSZ); + evec = (GistEntryVector *) palloc((len + 2) * sizeof(GISTENTRY) + GEVHDRSZ); - for (i = startkey; i < giststate->tupdesc->natts; i++) { - int j; + for (i = startkey; i < giststate->tupdesc->natts; i++) + { + int j; evec->n = 0; - if ( !isnull[i] ) { - gistentryinit( evec->vector[evec->n], attr[i], - NULL, NULL, (OffsetNumber) 0, - FALSE); + if (!isnull[i]) + { + gistentryinit(evec->vector[evec->n], attr[i], + NULL, NULL, (OffsetNumber) 0, + FALSE); evec->n++; } - for (j = 0; j < len; j++) { - Datum datum; - bool IsNull; + for (j = 0; j < len; j++) + { + Datum datum; + bool IsNull; - if (GistTupleIsInvalid(itvec[j])) - return FALSE; /* signals that union with invalid tuple => result is invalid */ + if (GistTupleIsInvalid(itvec[j])) + return FALSE; /* signals that union with invalid tuple => + * result is invalid */ datum = index_getattr(itvec[j], i + 1, giststate->tupdesc, &IsNull); if (IsNull) @@ -183,19 +195,23 @@ gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, int startke } /* If this tuple vector was all NULLs, the union is NULL */ - if ( evec->n == 0 ) { + if (evec->n == 0) + { attr[i] = (Datum) 0; isnull[i] = TRUE; - } else { - if (evec->n == 1) { + } + else + { + if (evec->n == 1) + { evec->n = 2; evec->vector[1] = evec->vector[0]; - } + } /* Make union and store in attr array */ attr[i] = FunctionCall2(&giststate->unionFn[i], - PointerGetDatum(evec), - PointerGetDatum(&attrsize)); + PointerGetDatum(evec), + PointerGetDatum(&attrsize)); isnull[i] = FALSE; } @@ -213,57 +229,67 @@ gistunion(Relation r, IndexTuple *itvec, int len, GISTSTATE *giststate) { memset(isnullS, TRUE, sizeof(bool) * giststate->tupdesc->natts); - if ( !gistMakeUnionItVec(giststate, itvec, len, 0, attrS, isnullS ) ) - return gist_form_invalid_tuple(InvalidBlockNumber); + if (!gistMakeUnionItVec(giststate, itvec, len, 0, attrS, isnullS)) + return gist_form_invalid_tuple(InvalidBlockNumber); - return gistFormTuple(giststate, r, attrS, isnullS, false); + return gistFormTuple(giststate, r, attrS, isnullS, false); } -/* +/* * makes union of two key */ void -gistMakeUnionKey( GISTSTATE *giststate, int attno, - GISTENTRY *entry1, bool isnull1, - GISTENTRY *entry2, bool isnull2, - Datum *dst, bool *dstisnull ) { +gistMakeUnionKey(GISTSTATE *giststate, int attno, + GISTENTRY *entry1, bool isnull1, + GISTENTRY *entry2, bool isnull2, + Datum *dst, bool *dstisnull) +{ - int dstsize; + int dstsize; - static char storage[ 2 * sizeof(GISTENTRY) + GEVHDRSZ ]; - GistEntryVector *evec = (GistEntryVector*)storage; + static char storage[2 * sizeof(GISTENTRY) + GEVHDRSZ]; + GistEntryVector *evec = (GistEntryVector *) storage; evec->n = 2; - if ( isnull1 && isnull2 ) { + if (isnull1 && isnull2) + { *dstisnull = TRUE; - *dst = (Datum)0; - } else { - if ( isnull1 == FALSE && isnull2 == FALSE ) { + *dst = (Datum) 0; + } + else + { + if (isnull1 == FALSE && isnull2 == FALSE) + { evec->vector[0] = *entry1; evec->vector[1] = *entry2; - } else if ( isnull1 == FALSE ) { + } + else if (isnull1 == FALSE) + { evec->vector[0] = *entry1; evec->vector[1] = *entry1; - } else { + } + else + { evec->vector[0] = *entry2; evec->vector[1] = *entry2; } *dstisnull = FALSE; *dst = FunctionCall2(&giststate->unionFn[attno], - PointerGetDatum(evec), - PointerGetDatum(&dstsize)); + PointerGetDatum(evec), + PointerGetDatum(&dstsize)); } } bool -gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b) { - bool result; +gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b) +{ + bool result; FunctionCall3(&giststate->equalFn[attno], - a, b, - PointerGetDatum(&result)); + a, b, + PointerGetDatum(&result)); return result; } @@ -309,22 +335,24 @@ gistgetadjusted(Relation r, IndexTuple oldtup, IndexTuple addtup, GISTSTATE *gis gistDeCompressAtt(giststate, r, addtup, NULL, (OffsetNumber) 0, addentries, addisnull); - for(i = 0; i < r->rd_att->natts; i++) { - gistMakeUnionKey( giststate, i, - oldentries + i, oldisnull[i], - addentries + i, addisnull[i], - attrS + i, isnullS + i ); + for (i = 0; i < r->rd_att->natts; i++) + { + gistMakeUnionKey(giststate, i, + oldentries + i, oldisnull[i], + addentries + i, addisnull[i], + attrS + i, isnullS + i); - if ( neednew ) + if (neednew) /* we already need new key, so we can skip check */ continue; - if ( isnullS[i] ) + if (isnullS[i]) /* union of key may be NULL if and only if both keys are NULL */ continue; - if ( !addisnull[i] ) { - if ( oldisnull[i] || gistKeyIsEQ(giststate, i, oldentries[i].key, attrS[i])==false ) + if (!addisnull[i]) + { + if (oldisnull[i] || gistKeyIsEQ(giststate, i, oldentries[i].key, attrS[i]) == false) neednew = true; } } @@ -363,8 +391,8 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ it, NULL, (OffsetNumber) 0, identry, isnull); - Assert( maxoff >= FirstOffsetNumber ); - Assert( !GistPageIsLeaf(p) ); + Assert(maxoff >= FirstOffsetNumber); + Assert(!GistPageIsLeaf(p)); for (i = FirstOffsetNumber; i <= maxoff && sum_grow; i = OffsetNumberNext(i)) { @@ -484,7 +512,7 @@ gistFormTuple(GISTSTATE *giststate, Relation r, { gistcentryinit(giststate, i, ¢ry[i], attdata[i], r, NULL, (OffsetNumber) 0, - newValues, + newValues, FALSE); compatt[i] = centry[i].key; } @@ -500,18 +528,19 @@ gistpenalty(GISTSTATE *giststate, int attno, GISTENTRY *orig, bool isNullOrig, GISTENTRY *add, bool isNullAdd) { - float penalty = 0.0; + float penalty = 0.0; - if ( giststate->penaltyFn[attno].fn_strict==FALSE || ( isNullOrig == FALSE && isNullAdd == FALSE ) ) + if (giststate->penaltyFn[attno].fn_strict == FALSE || (isNullOrig == FALSE && isNullAdd == FALSE)) FunctionCall3(&giststate->penaltyFn[attno], PointerGetDatum(orig), PointerGetDatum(add), PointerGetDatum(&penalty)); - else if ( isNullOrig && isNullAdd ) + else if (isNullOrig && isNullAdd) penalty = 0.0; else - penalty = 1e10; /* try to prevent to mix null and non-null value */ - + penalty = 1e10; /* try to prevent to mix null and non-null + * value */ + return penalty; } diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index e5c73c8c224..5f5060280dd 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.27 2006/09/21 20:31:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.28 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -45,19 +45,24 @@ typedef struct } ArrayTuple; /* - * Make union of keys on page + * Make union of keys on page */ static IndexTuple -PageMakeUnionKey(GistVacuum *gv, Buffer buffer) { - Page page = BufferGetPage( buffer ); +PageMakeUnionKey(GistVacuum *gv, Buffer buffer) +{ + Page page = BufferGetPage(buffer); IndexTuple *vec, - tmp, res; + tmp, + res; int veclen = 0; MemoryContext oldCtx = MemoryContextSwitchTo(gv->opCtx); vec = gistextractpage(page, &veclen); - /* we call gistunion() in temprorary context because user-defined functions called in gistunion() - may do not free all memory */ + + /* + * we call gistunion() in temprorary context because user-defined + * functions called in gistunion() may do not free all memory + */ tmp = gistunion(gv->index, vec, veclen, &(gv->giststate)); MemoryContextSwitchTo(oldCtx); @@ -73,21 +78,25 @@ PageMakeUnionKey(GistVacuum *gv, Buffer buffer) { } static void -gistDeleteSubtree( GistVacuum *gv, BlockNumber blkno ) { - Buffer buffer; - Page page; +gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno) +{ + Buffer buffer; + Page page; buffer = ReadBuffer(gv->index, blkno); LockBuffer(buffer, GIST_EXCLUSIVE); page = (Page) BufferGetPage(buffer); - if ( !GistPageIsLeaf(page) ) { - int i; + if (!GistPageIsLeaf(page)) + { + int i; + + for (i = FirstOffsetNumber; i <= PageGetMaxOffsetNumber(page); i = OffsetNumberNext(i)) + { + ItemId iid = PageGetItemId(page, i); + IndexTuple idxtuple = (IndexTuple) PageGetItem(page, iid); - for (i = FirstOffsetNumber; i <= PageGetMaxOffsetNumber(page); i = OffsetNumberNext(i)) { - ItemId iid = PageGetItemId(page, i); - IndexTuple idxtuple = (IndexTuple) PageGetItem(page, iid); - gistDeleteSubtree(gv, ItemPointerGetBlockNumber(&(idxtuple->t_tid))); + gistDeleteSubtree(gv, ItemPointerGetBlockNumber(&(idxtuple->t_tid))); } } @@ -103,7 +112,7 @@ gistDeleteSubtree( GistVacuum *gv, BlockNumber blkno ) { { XLogRecData rdata[2]; XLogRecPtr recptr; - gistxlogPageDelete xlrec; + gistxlogPageDelete xlrec; xlrec.node = gv->index->rd_node; xlrec.blkno = blkno; @@ -125,31 +134,34 @@ gistDeleteSubtree( GistVacuum *gv, BlockNumber blkno ) { } else PageSetLSN(page, XLogRecPtrForTemp); - + END_CRIT_SECTION(); UnlockReleaseBuffer(buffer); } -static Page -GistPageGetCopyPage( Page page ) { - Size pageSize = PageGetPageSize( page ); - Page tmppage; +static Page +GistPageGetCopyPage(Page page) +{ + Size pageSize = PageGetPageSize(page); + Page tmppage; - tmppage=(Page)palloc( pageSize ); - memcpy( tmppage, page, pageSize ); + tmppage = (Page) palloc(pageSize); + memcpy(tmppage, page, pageSize); return tmppage; } static ArrayTuple -vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, int curlenaddon) { +vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, int curlenaddon) +{ ArrayTuple res = {NULL, 0, false}; IndexTuple *vec; SplitedPageLayout *dist = NULL, - *ptr; - int i, veclen=0; - BlockNumber blkno = BufferGetBlockNumber(buffer); + *ptr; + int i, + veclen = 0; + BlockNumber blkno = BufferGetBlockNumber(buffer); MemoryContext oldCtx = MemoryContextSwitchTo(gv->opCtx); vec = gistextractpage(tempPage, &veclen); @@ -158,67 +170,73 @@ vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, MemoryContextSwitchTo(oldCtx); - if (blkno != GIST_ROOT_BLKNO) { + if (blkno != GIST_ROOT_BLKNO) + { /* if non-root split then we should not allocate new buffer */ dist->buffer = buffer; dist->page = tempPage; /* during vacuum we never split leaf page */ GistPageGetOpaque(dist->page)->flags = 0; - } else + } + else pfree(tempPage); res.itup = (IndexTuple *) palloc(sizeof(IndexTuple) * veclen); res.ituplen = 0; /* make new pages and fills them */ - for (ptr = dist; ptr; ptr = ptr->next) { - char *data; + for (ptr = dist; ptr; ptr = ptr->next) + { + char *data; - if ( ptr->buffer == InvalidBuffer ) { - ptr->buffer = gistNewBuffer( gv->index ); - GISTInitBuffer( ptr->buffer, 0 ); + if (ptr->buffer == InvalidBuffer) + { + ptr->buffer = gistNewBuffer(gv->index); + GISTInitBuffer(ptr->buffer, 0); ptr->page = BufferGetPage(ptr->buffer); } - ptr->block.blkno = BufferGetBlockNumber( ptr->buffer ); + ptr->block.blkno = BufferGetBlockNumber(ptr->buffer); - data = (char*)(ptr->list); - for(i=0;i<ptr->block.num;i++) { - if ( PageAddItem(ptr->page, (Item)data, IndexTupleSize((IndexTuple)data), i+FirstOffsetNumber, LP_USED) == InvalidOffsetNumber ) + data = (char *) (ptr->list); + for (i = 0; i < ptr->block.num; i++) + { + if (PageAddItem(ptr->page, (Item) data, IndexTupleSize((IndexTuple) data), i + FirstOffsetNumber, LP_USED) == InvalidOffsetNumber) elog(ERROR, "failed to add item to index page in \"%s\"", RelationGetRelationName(gv->index)); - data += IndexTupleSize((IndexTuple)data); + data += IndexTupleSize((IndexTuple) data); } ItemPointerSetBlockNumber(&(ptr->itup->t_tid), ptr->block.blkno); - res.itup[ res.ituplen ] = (IndexTuple)palloc(IndexTupleSize(ptr->itup)); - memcpy( res.itup[ res.ituplen ], ptr->itup, IndexTupleSize(ptr->itup) ); + res.itup[res.ituplen] = (IndexTuple) palloc(IndexTupleSize(ptr->itup)); + memcpy(res.itup[res.ituplen], ptr->itup, IndexTupleSize(ptr->itup)); res.ituplen++; } START_CRIT_SECTION(); - for (ptr = dist; ptr; ptr = ptr->next) { + for (ptr = dist; ptr; ptr = ptr->next) + { MarkBufferDirty(ptr->buffer); GistPageGetOpaque(ptr->page)->rightlink = InvalidBlockNumber; } /* restore splitted non-root page */ - if (blkno != GIST_ROOT_BLKNO) { - PageRestoreTempPage( dist->page, BufferGetPage( dist->buffer ) ); - dist->page = BufferGetPage( dist->buffer ); + if (blkno != GIST_ROOT_BLKNO) + { + PageRestoreTempPage(dist->page, BufferGetPage(dist->buffer)); + dist->page = BufferGetPage(dist->buffer); } if (!gv->index->rd_istemp) { XLogRecPtr recptr; XLogRecData *rdata; - ItemPointerData key; /* set key for incomplete - * insert */ + ItemPointerData key; /* set key for incomplete insert */ char *xlinfo; ItemPointerSet(&key, blkno, TUPLE_IS_VALID); rdata = formSplitRdata(gv->index->rd_node, blkno, - false, &key, dist); + false, &key, dist); xlinfo = rdata->data; recptr = XLogInsert(RM_GIST_ID, XLOG_GIST_PAGE_SPLIT, rdata); @@ -241,13 +259,12 @@ vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, { /* we must keep the buffer pin on the head page */ if (BufferGetBlockNumber(ptr->buffer) != blkno) - UnlockReleaseBuffer( ptr->buffer ); + UnlockReleaseBuffer(ptr->buffer); } if (blkno == GIST_ROOT_BLKNO) { - ItemPointerData key; /* set key for incomplete - * insert */ + ItemPointerData key; /* set key for incomplete insert */ ItemPointerSet(&key, blkno, TUPLE_IS_VALID); @@ -266,7 +283,8 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) { ArrayTuple res = {NULL, 0, false}; Buffer buffer; - Page page, tempPage = NULL; + Page page, + tempPage = NULL; OffsetNumber i, maxoff; ItemId iid; @@ -278,7 +296,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) *addon = NULL; bool needwrite = false; OffsetNumber offToDelete[MaxOffsetNumber]; - BlockNumber blkToDelete[MaxOffsetNumber]; + BlockNumber blkToDelete[MaxOffsetNumber]; ItemPointerData *completed = NULL; int ncompleted = 0, lencompleted = 16; @@ -322,7 +340,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) if (chldtuple.ituplen || chldtuple.emptypage) { /* update tuple or/and inserts new */ - if ( chldtuple.emptypage ) + if (chldtuple.emptypage) blkToDelete[nBlkToDelete++] = ItemPointerGetBlockNumber(&(idxtuple->t_tid)); offToDelete[nOffToDelete++] = i; PageIndexTupleDelete(tempPage, i); @@ -333,7 +351,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) if (chldtuple.ituplen) { - Assert( chldtuple.emptypage == false ); + Assert(chldtuple.emptypage == false); while (curlenaddon + chldtuple.ituplen >= lenaddon) { lenaddon *= 2; @@ -367,56 +385,63 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) } } } - - Assert( maxoff == PageGetMaxOffsetNumber(tempPage) ); + + Assert(maxoff == PageGetMaxOffsetNumber(tempPage)); if (curlenaddon) { /* insert updated tuples */ - if (gistnospace(tempPage, addon, curlenaddon, InvalidOffsetNumber, 0)) { + if (gistnospace(tempPage, addon, curlenaddon, InvalidOffsetNumber, 0)) + { /* there is no space on page to insert tuples */ res = vacuumSplitPage(gv, tempPage, buffer, addon, curlenaddon); - tempPage=NULL; /* vacuumSplitPage() free tempPage */ - needwrite = needunion = false; /* gistSplit already forms unions and writes pages */ - } else + tempPage = NULL; /* vacuumSplitPage() free tempPage */ + needwrite = needunion = false; /* gistSplit already forms + * unions and writes pages */ + } + else /* enough free space */ gistfillbuffer(gv->index, tempPage, addon, curlenaddon, InvalidOffsetNumber); } } - /* - * If page is empty, we should remove pointer to it before - * deleting page (except root) + /* + * If page is empty, we should remove pointer to it before deleting page + * (except root) */ - if ( blkno != GIST_ROOT_BLKNO && ( PageIsEmpty(page) || (tempPage && PageIsEmpty(tempPage)) ) ) { + if (blkno != GIST_ROOT_BLKNO && (PageIsEmpty(page) || (tempPage && PageIsEmpty(tempPage)))) + { /* - * New version of page is empty, so leave it unchanged, - * upper call will mark our page as deleted. - * In case of page split we never will be here... + * New version of page is empty, so leave it unchanged, upper call + * will mark our page as deleted. In case of page split we never will + * be here... * - * If page was empty it can't become non-empty during processing + * If page was empty it can't become non-empty during processing */ res.emptypage = true; UnlockReleaseBuffer(buffer); - } else { + } + else + { /* write page and remove its childs if it need */ START_CRIT_SECTION(); - if ( tempPage && needwrite ) { + if (tempPage && needwrite) + { PageRestoreTempPage(tempPage, page); tempPage = NULL; } - /* Empty index */ - if (PageIsEmpty(page) && blkno == GIST_ROOT_BLKNO ) + /* Empty index */ + if (PageIsEmpty(page) && blkno == GIST_ROOT_BLKNO) { needwrite = true; GistPageSetLeaf(page); } - + if (needwrite) { MarkBufferDirty(buffer); @@ -446,7 +471,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) END_CRIT_SECTION(); - if ( needunion && !PageIsEmpty(page) ) + if (needunion && !PageIsEmpty(page)) { res.itup = (IndexTuple *) palloc(sizeof(IndexTuple)); res.ituplen = 1; @@ -456,7 +481,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) UnlockReleaseBuffer(buffer); /* delete empty children, now we havn't any links to pointed subtrees */ - for(i=0;i<nBlkToDelete;i++) + for (i = 0; i < nBlkToDelete; i++) gistDeleteSubtree(gv, blkToDelete[i]); if (ncompleted && !gv->index->rd_istemp) @@ -506,9 +531,10 @@ gistvacuumcleanup(PG_FUNCTION_ARGS) /* use heap's tuple count */ Assert(info->num_heap_tuples >= 0); stats->std.num_index_tuples = info->num_heap_tuples; + /* - * XXX the above is wrong if index is partial. Would it be OK to - * just return NULL, or is there work we must do below? + * XXX the above is wrong if index is partial. Would it be OK to just + * return NULL, or is there work we must do below? */ } @@ -545,8 +571,8 @@ gistvacuumcleanup(PG_FUNCTION_ARGS) RelationGetRelationName(rel)))); /* - * If vacuum full, we already have exclusive lock on the index. - * Otherwise, need lock unless it's local to this backend. + * If vacuum full, we already have exclusive lock on the index. Otherwise, + * need lock unless it's local to this backend. */ if (info->vacuum_full) needLock = false; @@ -725,7 +751,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) if (callback(&(idxtuple->t_tid), callback_state)) { - todelete[ntodelete] = i-ntodelete; + todelete[ntodelete] = i - ntodelete; ntodelete++; stats->std.tuples_removed += 1; } @@ -739,7 +765,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) MarkBufferDirty(buffer); - for(i=0;i<ntodelete;i++) + for (i = 0; i < ntodelete; i++) PageIndexTupleDelete(page, todelete[i]); GistMarkTuplesDeleted(page); @@ -750,7 +776,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) gistxlogPageUpdate *xlinfo; rdata = formUpdateRdata(rel->rd_node, buffer, - todelete, ntodelete, + todelete, ntodelete, NULL, 0, NULL); xlinfo = (gistxlogPageUpdate *) rdata->next->data; diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index 9680ed96192..7ba2e6d52cc 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.23 2006/08/07 16:57:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.24 2006/10/04 00:29:48 momjian Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -55,11 +55,11 @@ typedef struct gistIncompleteInsert static MemoryContext opCtx; /* working memory for operations */ -static MemoryContext insertCtx; /* holds incomplete_inserts list */ +static MemoryContext insertCtx; /* holds incomplete_inserts list */ static List *incomplete_inserts; -#define ItemPointerEQ(a, b) \ +#define ItemPointerEQ(a, b) \ ( ItemPointerGetOffsetNumber(a) == ItemPointerGetOffsetNumber(b) && \ ItemPointerGetBlockNumber (a) == ItemPointerGetBlockNumber(b) ) @@ -72,8 +72,9 @@ pushIncompleteInsert(RelFileNode node, XLogRecPtr lsn, ItemPointerData key, MemoryContext oldCxt; gistIncompleteInsert *ninsert; - if ( !ItemPointerIsValid(&key) ) - /* + if (!ItemPointerIsValid(&key)) + + /* * if key is null then we should not store insertion as incomplete, * because it's a vacuum operation.. */ @@ -108,8 +109,8 @@ pushIncompleteInsert(RelFileNode node, XLogRecPtr lsn, ItemPointerData key, /* * Stick the new incomplete insert onto the front of the list, not the - * back. This is so that gist_xlog_cleanup will process incompletions - * in last-in-first-out order. + * back. This is so that gist_xlog_cleanup will process incompletions in + * last-in-first-out order. */ incomplete_inserts = lcons(ninsert, incomplete_inserts); @@ -121,10 +122,10 @@ forgetIncompleteInsert(RelFileNode node, ItemPointerData key) { ListCell *l; - if ( !ItemPointerIsValid(&key) ) + if (!ItemPointerIsValid(&key)) return; - if (incomplete_inserts==NIL) + if (incomplete_inserts == NIL) return; foreach(l, incomplete_inserts) @@ -241,9 +242,12 @@ gistRedoPageUpdateRecord(XLogRecPtr lsn, XLogRecord *record, bool isnewroot) if (GistPageIsLeaf(page) && xlrec.len == 0 && xlrec.data->ntodelete == 0) GistClearTuplesDeleted(page); - if ( !GistPageIsLeaf(page) && PageGetMaxOffsetNumber(page) == InvalidOffsetNumber && xldata->blkno == GIST_ROOT_BLKNO ) - /* all links on non-leaf root page was deleted by vacuum full, - so root page becomes a leaf */ + if (!GistPageIsLeaf(page) && PageGetMaxOffsetNumber(page) == InvalidOffsetNumber && xldata->blkno == GIST_ROOT_BLKNO) + + /* + * all links on non-leaf root page was deleted by vacuum full, so root + * page becomes a leaf + */ GistPageSetLeaf(page); GistPageGetOpaque(page)->rightlink = InvalidBlockNumber; @@ -432,11 +436,11 @@ static void out_target(StringInfo buf, RelFileNode node, ItemPointerData key) { appendStringInfo(buf, "rel %u/%u/%u", - node.spcNode, node.dbNode, node.relNode); - if ( ItemPointerIsValid( &key ) ) + node.spcNode, node.dbNode, node.relNode); + if (ItemPointerIsValid(&key)) appendStringInfo(buf, "; tid %u/%u", - ItemPointerGetBlockNumber(&key), - ItemPointerGetOffsetNumber(&key)); + ItemPointerGetBlockNumber(&key), + ItemPointerGetOffsetNumber(&key)); } static void @@ -450,8 +454,8 @@ static void out_gistxlogPageDelete(StringInfo buf, gistxlogPageDelete *xlrec) { appendStringInfo(buf, "page_delete: rel %u/%u/%u; blkno %u", - xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode, - xlrec->blkno); + xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode, + xlrec->blkno); } static void @@ -460,7 +464,7 @@ out_gistxlogPageSplit(StringInfo buf, gistxlogPageSplit *xlrec) appendStringInfo(buf, "page_split: "); out_target(buf, xlrec->node, xlrec->key); appendStringInfo(buf, "; block number %u splits to %d pages", - xlrec->origblkno, xlrec->npage); + xlrec->origblkno, xlrec->npage); } void @@ -486,15 +490,15 @@ gist_desc(StringInfo buf, uint8 xl_info, char *rec) break; case XLOG_GIST_CREATE_INDEX: appendStringInfo(buf, "create_index: rel %u/%u/%u", - ((RelFileNode *) rec)->spcNode, - ((RelFileNode *) rec)->dbNode, - ((RelFileNode *) rec)->relNode); + ((RelFileNode *) rec)->spcNode, + ((RelFileNode *) rec)->dbNode, + ((RelFileNode *) rec)->relNode); break; case XLOG_GIST_INSERT_COMPLETE: appendStringInfo(buf, "complete_insert: rel %u/%u/%u", - ((gistxlogInsertComplete *) rec)->node.spcNode, - ((gistxlogInsertComplete *) rec)->node.dbNode, - ((gistxlogInsertComplete *) rec)->node.relNode); + ((gistxlogInsertComplete *) rec)->node.spcNode, + ((gistxlogInsertComplete *) rec)->node.dbNode, + ((gistxlogInsertComplete *) rec)->node.relNode); break; default: appendStringInfo(buf, "unknown gist op code %u", info); @@ -547,22 +551,25 @@ gistxlogFindPath(Relation index, gistIncompleteInsert *insert) elog(ERROR, "lost parent for block %u", insert->origblkno); } -static SplitedPageLayout* -gistMakePageLayout(Buffer *buffers, int nbuffers) { - SplitedPageLayout *res=NULL, *resptr; +static SplitedPageLayout * +gistMakePageLayout(Buffer *buffers, int nbuffers) +{ + SplitedPageLayout *res = NULL, + *resptr; - while( nbuffers-- > 0 ) { - Page page = BufferGetPage( buffers[ nbuffers ] ); - IndexTuple* vec; - int veclen; + while (nbuffers-- > 0) + { + Page page = BufferGetPage(buffers[nbuffers]); + IndexTuple *vec; + int veclen; - resptr = (SplitedPageLayout*)palloc0( sizeof(SplitedPageLayout) ); + resptr = (SplitedPageLayout *) palloc0(sizeof(SplitedPageLayout)); - resptr->block.blkno = BufferGetBlockNumber( buffers[ nbuffers ] ); - resptr->block.num = PageGetMaxOffsetNumber( page ); + resptr->block.blkno = BufferGetBlockNumber(buffers[nbuffers]); + resptr->block.num = PageGetMaxOffsetNumber(page); - vec = gistextractpage( page, &veclen ); - resptr->list = gistfillitupvec( vec, veclen, &(resptr->lenlist) ); + vec = gistextractpage(page, &veclen); + resptr->list = gistfillitupvec(vec, veclen, &(resptr->lenlist)); resptr->next = res; res = resptr; @@ -580,7 +587,7 @@ gistMakePageLayout(Buffer *buffers, int nbuffers) { * Note that we assume the index is now in a valid state, except for the * unfinished insertion. In particular it's safe to invoke gistFindPath(); * there shouldn't be any garbage pages for it to run into. - * + * * To complete insert we can't use basic insertion algorithm because * during insertion we can't call user-defined support functions of opclass. * So, we insert 'invalid' tuples without real key and do it by separate algorithm. @@ -607,7 +614,7 @@ gistContinueInsert(gistIncompleteInsert *insert) itup[i] = gist_form_invalid_tuple(insert->blkno[i]); /* - * any insertion of itup[] should make LOG message about + * any insertion of itup[] should make LOG message about */ if (insert->origblkno == GIST_ROOT_BLKNO) @@ -626,7 +633,7 @@ gistContinueInsert(gistIncompleteInsert *insert) Buffer *buffers; Page *pages; int numbuffer; - OffsetNumber *todelete; + OffsetNumber *todelete; /* construct path */ gistxlogFindPath(index, insert); @@ -642,21 +649,22 @@ gistContinueInsert(gistIncompleteInsert *insert) int j, k, pituplen = 0; - XLogRecData *rdata; - XLogRecPtr recptr; - Buffer tempbuffer = InvalidBuffer; - int ntodelete = 0; + XLogRecData *rdata; + XLogRecPtr recptr; + Buffer tempbuffer = InvalidBuffer; + int ntodelete = 0; numbuffer = 1; buffers[0] = ReadBuffer(index, insert->path[i]); LockBuffer(buffers[0], GIST_EXCLUSIVE); + /* * we check buffer, because we restored page earlier */ gistcheckpage(index, buffers[0]); pages[0] = BufferGetPage(buffers[0]); - Assert( !GistPageIsLeaf(pages[0]) ); + Assert(!GistPageIsLeaf(pages[0])); pituplen = PageGetMaxOffsetNumber(pages[0]); @@ -678,12 +686,12 @@ gistContinueInsert(gistIncompleteInsert *insert) } } - if ( ntodelete == 0 ) - elog(PANIC,"gistContinueInsert: can't find pointer to page(s)"); + if (ntodelete == 0) + elog(PANIC, "gistContinueInsert: can't find pointer to page(s)"); /* - * we check space with subtraction only first tuple to delete, hope, - * that wiil be enough space.... + * we check space with subtraction only first tuple to delete, + * hope, that wiil be enough space.... */ if (gistnospace(pages[0], itup, lenitup, *todelete, 0)) @@ -699,7 +707,7 @@ gistContinueInsert(gistIncompleteInsert *insert) if (BufferGetBlockNumber(buffers[0]) == GIST_ROOT_BLKNO) { - Buffer tmp; + Buffer tmp; /* * we split root, just copy content from root to new page @@ -713,44 +721,48 @@ gistContinueInsert(gistIncompleteInsert *insert) /* fill new page, root will be changed later */ tempbuffer = ReadBuffer(index, P_NEW); LockBuffer(tempbuffer, GIST_EXCLUSIVE); - memcpy( BufferGetPage(tempbuffer), pages[0], BufferGetPageSize(tempbuffer) ); + memcpy(BufferGetPage(tempbuffer), pages[0], BufferGetPageSize(tempbuffer)); /* swap buffers[0] (was root) and temp buffer */ tmp = buffers[0]; buffers[0] = tempbuffer; - tempbuffer = tmp; /* now in tempbuffer GIST_ROOT_BLKNO, it is still unchanged */ + tempbuffer = tmp; /* now in tempbuffer GIST_ROOT_BLKNO, + * it is still unchanged */ pages[0] = BufferGetPage(buffers[0]); } START_CRIT_SECTION(); - for(j=0;j<ntodelete;j++) + for (j = 0; j < ntodelete; j++) PageIndexTupleDelete(pages[0], todelete[j]); rdata = formSplitRdata(index->rd_node, insert->path[i], - false, &(insert->key), - gistMakePageLayout( buffers, numbuffer ) ); + false, &(insert->key), + gistMakePageLayout(buffers, numbuffer)); - } else { + } + else + { START_CRIT_SECTION(); - for(j=0;j<ntodelete;j++) + for (j = 0; j < ntodelete; j++) PageIndexTupleDelete(pages[0], todelete[j]); gistfillbuffer(index, pages[0], itup, lenitup, InvalidOffsetNumber); - rdata = formUpdateRdata(index->rd_node, buffers[0], - todelete, ntodelete, - itup, lenitup, &(insert->key)); + rdata = formUpdateRdata(index->rd_node, buffers[0], + todelete, ntodelete, + itup, lenitup, &(insert->key)); } - /* - * use insert->key as mark for completion of insert (form*Rdata() above) - * for following possible replays + /* + * use insert->key as mark for completion of insert (form*Rdata() + * above) for following possible replays */ /* write pages, we should mark it dirty befor XLogInsert() */ - for (j = 0; j < numbuffer; j++) { + for (j = 0; j < numbuffer; j++) + { GistPageGetOpaque(pages[j])->rightlink = InvalidBlockNumber; MarkBufferDirty(buffers[j]); } @@ -764,12 +776,14 @@ gistContinueInsert(gistIncompleteInsert *insert) END_CRIT_SECTION(); lenitup = numbuffer; - for (j = 0; j < numbuffer; j++) { + for (j = 0; j < numbuffer; j++) + { itup[j] = gist_form_invalid_tuple(BufferGetBlockNumber(buffers[j])); UnlockReleaseBuffer(buffers[j]); } - if ( tempbuffer != InvalidBuffer ) { + if (tempbuffer != InvalidBuffer) + { /* * it was a root split, so fill it by new values */ @@ -780,9 +794,9 @@ gistContinueInsert(gistIncompleteInsert *insert) } ereport(LOG, - (errmsg("index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery", + (errmsg("index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery", insert->node.spcNode, insert->node.dbNode, insert->node.relNode), - errdetail("Incomplete insertion detected during crash replay."))); + errdetail("Incomplete insertion detected during crash replay."))); } void diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c index 3b05d11ee17..1e2d779a14c 100644 --- a/src/backend/access/hash/hashfunc.c +++ b/src/backend/access/hash/hashfunc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/hash/hashfunc.c,v 1.47 2006/03/05 15:58:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/hash/hashfunc.c,v 1.48 2006/10/04 00:29:48 momjian Exp $ * * NOTES * These functions are stored in pg_amproc. For each operator class @@ -138,9 +138,9 @@ hashtext(PG_FUNCTION_ARGS) Datum result; /* - * Note: this is currently identical in behavior to hashvarlena, but - * keep it as a separate function in case we someday want to do something - * different in non-C locales. (See also hashbpchar, if so.) + * Note: this is currently identical in behavior to hashvarlena, but keep + * it as a separate function in case we someday want to do something + * different in non-C locales. (See also hashbpchar, if so.) */ result = hash_any((unsigned char *) VARDATA(key), VARSIZE(key) - VARHDRSZ); diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c index f5a1fcfd814..696d4bf616a 100644 --- a/src/backend/access/hash/hashpage.c +++ b/src/backend/access/hash/hashpage.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/hash/hashpage.c,v 1.59 2006/07/03 22:45:36 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/hash/hashpage.c,v 1.60 2006/10/04 00:29:48 momjian Exp $ * * NOTES * Postgres hash pages look like ordinary relation pages. The opaque @@ -224,7 +224,7 @@ _hash_metapinit(Relation rel) /* * Determine the target fill factor (in tuples per bucket) for this index. * The idea is to make the fill factor correspond to pages about as full - * as the user-settable fillfactor parameter says. We can compute it + * as the user-settable fillfactor parameter says. We can compute it * exactly if the index datatype is fixed-width, but for var-width there's * some guessing involved. */ diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 759f0b1f13b..57acaf2bb8c 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.219 2006/08/18 16:09:08 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.220 2006/10/04 00:29:48 momjian Exp $ * * * INTERFACE ROUTINES @@ -133,9 +133,9 @@ heapgetpage(HeapScanDesc scan, BlockNumber page) snapshot = scan->rs_snapshot; /* - * We must hold share lock on the buffer content while examining - * tuple visibility. Afterwards, however, the tuples we have found - * to be visible are guaranteed good as long as we hold the buffer pin. + * We must hold share lock on the buffer content while examining tuple + * visibility. Afterwards, however, the tuples we have found to be + * visible are guaranteed good as long as we hold the buffer pin. */ LockBuffer(buffer, BUFFER_LOCK_SHARE); @@ -223,7 +223,7 @@ heapgettup(HeapScanDesc scan, tuple->t_data = NULL; return; } - page = 0; /* first page */ + page = 0; /* first page */ heapgetpage(scan, page); lineoff = FirstOffsetNumber; /* first offnum */ scan->rs_inited = true; @@ -231,8 +231,8 @@ heapgettup(HeapScanDesc scan, else { /* continue from previously returned page/tuple */ - page = scan->rs_cblock; /* current page */ - lineoff = /* next offnum */ + page = scan->rs_cblock; /* current page */ + lineoff = /* next offnum */ OffsetNumberNext(ItemPointerGetOffsetNumber(&(tuple->t_self))); } @@ -263,7 +263,7 @@ heapgettup(HeapScanDesc scan, else { /* continue from previously returned page/tuple */ - page = scan->rs_cblock; /* current page */ + page = scan->rs_cblock; /* current page */ } LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE); @@ -273,12 +273,12 @@ heapgettup(HeapScanDesc scan, if (!scan->rs_inited) { - lineoff = lines; /* final offnum */ + lineoff = lines; /* final offnum */ scan->rs_inited = true; } else { - lineoff = /* previous offnum */ + lineoff = /* previous offnum */ OffsetNumberPrev(ItemPointerGetOffsetNumber(&(tuple->t_self))); } /* page and lineoff now reference the physically previous tid */ @@ -450,7 +450,7 @@ heapgettup_pagemode(HeapScanDesc scan, tuple->t_data = NULL; return; } - page = 0; /* first page */ + page = 0; /* first page */ heapgetpage(scan, page); lineindex = 0; scan->rs_inited = true; @@ -458,7 +458,7 @@ heapgettup_pagemode(HeapScanDesc scan, else { /* continue from previously returned page/tuple */ - page = scan->rs_cblock; /* current page */ + page = scan->rs_cblock; /* current page */ lineindex = scan->rs_cindex + 1; } @@ -487,7 +487,7 @@ heapgettup_pagemode(HeapScanDesc scan, else { /* continue from previously returned page/tuple */ - page = scan->rs_cblock; /* current page */ + page = scan->rs_cblock; /* current page */ } dp = (Page) BufferGetPage(scan->rs_cbuf); @@ -721,8 +721,8 @@ try_relation_open(Oid relationId, LOCKMODE lockmode) LockRelationOid(relationId, lockmode); /* - * Now that we have the lock, probe to see if the relation really - * exists or not. + * Now that we have the lock, probe to see if the relation really exists + * or not. */ if (!SearchSysCacheExists(RELOID, ObjectIdGetDatum(relationId), @@ -764,7 +764,7 @@ relation_open_nowait(Oid relationId, LOCKMODE lockmode) if (!ConditionalLockRelationOid(relationId, lockmode)) { /* try to throw error by name; relation could be deleted... */ - char *relname = get_rel_name(relationId); + char *relname = get_rel_name(relationId); if (relname) ereport(ERROR, @@ -774,8 +774,8 @@ relation_open_nowait(Oid relationId, LOCKMODE lockmode) else ereport(ERROR, (errcode(ERRCODE_LOCK_NOT_AVAILABLE), - errmsg("could not obtain lock on relation with OID %u", - relationId))); + errmsg("could not obtain lock on relation with OID %u", + relationId))); } } @@ -801,8 +801,8 @@ relation_openrv(const RangeVar *relation, LOCKMODE lockmode) /* * Check for shared-cache-inval messages before trying to open the - * relation. This is needed to cover the case where the name identifies - * a rel that has been dropped and recreated since the start of our + * relation. This is needed to cover the case where the name identifies a + * rel that has been dropped and recreated since the start of our * transaction: if we don't flush the old syscache entry then we'll latch * onto that entry and suffer an error when we do RelationIdGetRelation. * Note that relation_open does not need to do this, since a relation's @@ -2723,7 +2723,7 @@ l3: * heap_inplace_update - update a tuple "in place" (ie, overwrite it) * * Overwriting violates both MVCC and transactional safety, so the uses - * of this function in Postgres are extremely limited. Nonetheless we + * of this function in Postgres are extremely limited. Nonetheless we * find some places to use it. * * The tuple cannot change size, and therefore it's reasonable to assume @@ -2840,6 +2840,7 @@ heap_restrpos(HeapScanDesc scan) if (!ItemPointerIsValid(&scan->rs_mctid)) { scan->rs_ctup.t_data = NULL; + /* * unpin scan buffers */ @@ -2852,7 +2853,7 @@ heap_restrpos(HeapScanDesc scan) else { /* - * If we reached end of scan, rs_inited will now be false. We must + * If we reached end of scan, rs_inited will now be false. We must * reset it to true to keep heapgettup from doing the wrong thing. */ scan->rs_inited = true; @@ -2862,13 +2863,13 @@ heap_restrpos(HeapScanDesc scan) scan->rs_cindex = scan->rs_mindex; heapgettup_pagemode(scan, NoMovementScanDirection, - 0, /* needn't recheck scan keys */ + 0, /* needn't recheck scan keys */ NULL); } else heapgettup(scan, NoMovementScanDirection, - 0, /* needn't recheck scan keys */ + 0, /* needn't recheck scan keys */ NULL); } } @@ -2920,7 +2921,7 @@ log_heap_clean(Relation reln, Buffer buffer, OffsetNumber *unused, int uncnt) } /* - * Perform XLogInsert for a heap-update operation. Caller must already + * Perform XLogInsert for a heap-update operation. Caller must already * have modified the buffer(s) and marked them dirty. */ static XLogRecPtr @@ -3173,8 +3174,8 @@ heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record) if (record->xl_info & XLOG_HEAP_INIT_PAGE) { buffer = XLogReadBuffer(reln, - ItemPointerGetBlockNumber(&(xlrec->target.tid)), - true); + ItemPointerGetBlockNumber(&(xlrec->target.tid)), + true); Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); @@ -3183,13 +3184,13 @@ heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record) else { buffer = XLogReadBuffer(reln, - ItemPointerGetBlockNumber(&(xlrec->target.tid)), - false); + ItemPointerGetBlockNumber(&(xlrec->target.tid)), + false); if (!BufferIsValid(buffer)) return; page = (Page) BufferGetPage(buffer); - if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ + if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ { UnlockReleaseBuffer(buffer); return; @@ -3308,6 +3309,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool move) /* Set forward chain link in t_ctid */ htup->t_ctid = xlrec->newtid; } + /* * this test is ugly, but necessary to avoid thinking that insert change * is already applied @@ -3345,7 +3347,7 @@ newt:; return; page = (Page) BufferGetPage(buffer); - if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ + if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ { UnlockReleaseBuffer(buffer); return; @@ -3548,9 +3550,9 @@ static void out_target(StringInfo buf, xl_heaptid *target) { appendStringInfo(buf, "rel %u/%u/%u; tid %u/%u", - target->node.spcNode, target->node.dbNode, target->node.relNode, - ItemPointerGetBlockNumber(&(target->tid)), - ItemPointerGetOffsetNumber(&(target->tid))); + target->node.spcNode, target->node.dbNode, target->node.relNode, + ItemPointerGetBlockNumber(&(target->tid)), + ItemPointerGetOffsetNumber(&(target->tid))); } void @@ -3586,8 +3588,8 @@ heap_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "update: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; new %u/%u", - ItemPointerGetBlockNumber(&(xlrec->newtid)), - ItemPointerGetOffsetNumber(&(xlrec->newtid))); + ItemPointerGetBlockNumber(&(xlrec->newtid)), + ItemPointerGetOffsetNumber(&(xlrec->newtid))); } else if (info == XLOG_HEAP_MOVE) { @@ -3599,24 +3601,24 @@ heap_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "move: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; new %u/%u", - ItemPointerGetBlockNumber(&(xlrec->newtid)), - ItemPointerGetOffsetNumber(&(xlrec->newtid))); + ItemPointerGetBlockNumber(&(xlrec->newtid)), + ItemPointerGetOffsetNumber(&(xlrec->newtid))); } else if (info == XLOG_HEAP_CLEAN) { xl_heap_clean *xlrec = (xl_heap_clean *) rec; appendStringInfo(buf, "clean: rel %u/%u/%u; blk %u", - xlrec->node.spcNode, xlrec->node.dbNode, - xlrec->node.relNode, xlrec->block); + xlrec->node.spcNode, xlrec->node.dbNode, + xlrec->node.relNode, xlrec->block); } else if (info == XLOG_HEAP_NEWPAGE) { xl_heap_newpage *xlrec = (xl_heap_newpage *) rec; appendStringInfo(buf, "newpage: rel %u/%u/%u; blk %u", - xlrec->node.spcNode, xlrec->node.dbNode, - xlrec->node.relNode, xlrec->blkno); + xlrec->node.spcNode, xlrec->node.dbNode, + xlrec->node.relNode, xlrec->blkno); } else if (info == XLOG_HEAP_LOCK) { diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 31386de167b..07c0a52990d 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.64 2006/09/10 23:33:22 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.65 2006/10/04 00:29:48 momjian Exp $ * * * INTERFACE ROUTINES @@ -1331,7 +1331,7 @@ toast_fetch_datum_slice(varattrib *attr, int32 sliceoffset, int32 length) VARATT_SIZEP(result) |= VARATT_FLAG_COMPRESSED; if (length == 0) - return result; /* Can save a lot of work at this point! */ + return result; /* Can save a lot of work at this point! */ startchunk = sliceoffset / TOAST_MAX_CHUNK_SIZE; endchunk = (sliceoffset + length - 1) / TOAST_MAX_CHUNK_SIZE; diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c index 347d2b5365a..26758cc1973 100644 --- a/src/backend/access/index/genam.c +++ b/src/backend/access/index/genam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.58 2006/07/31 20:08:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.59 2006/10/04 00:29:48 momjian Exp $ * * NOTES * many of the old access method routines have been turned into @@ -86,7 +86,7 @@ RelationGetIndexScan(Relation indexRelation, else scan->keyData = NULL; - scan->is_multiscan = false; /* caller may change this */ + scan->is_multiscan = false; /* caller may change this */ scan->kill_prior_tuple = false; scan->ignore_killed_tuples = true; /* default setting */ diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index 2663876f494..493e9f0ad00 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.94 2006/07/31 20:08:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.95 2006/10/04 00:29:48 momjian Exp $ * * INTERFACE ROUTINES * index_open - open an index relation by relation OID @@ -122,7 +122,7 @@ static IndexScanDesc index_beginscan_internal(Relation indexRelation, * index_open - open an index relation by relation OID * * If lockmode is not "NoLock", the specified kind of lock is - * obtained on the index. (Generally, NoLock should only be + * obtained on the index. (Generally, NoLock should only be * used if the caller knows it has some appropriate lock on the * index already.) * @@ -209,7 +209,7 @@ index_insert(Relation indexRelation, * index_getnext on this scan; index_getnext_indexitem will not use the * heapRelation link (nor the snapshot). However, the caller had better * be holding some kind of lock on the heap relation in any case, to ensure - * no one deletes it (or the index) out from under us. Caller must also + * no one deletes it (or the index) out from under us. Caller must also * be holding a lock on the index. */ IndexScanDesc @@ -553,7 +553,7 @@ index_getmulti(IndexScanDesc scan, * * callback routine tells whether a given main-heap tuple is * to be deleted - * + * * return value is an optional palloc'd struct of statistics * ---------------- */ diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 910d6544433..d74f1a336ae 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.143 2006/08/25 04:06:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.144 2006/10/04 00:29:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -252,7 +252,7 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel, */ htup.t_self = itup->t_tid; if (heap_fetch(heapRel, SnapshotSelf, &htup, &hbuffer, - false, NULL)) + false, NULL)) { /* Normal case --- it's still live */ ReleaseBuffer(hbuffer); @@ -355,7 +355,7 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel, * + updates the metapage if a true root or fast root is split. * * On entry, we must have the right buffer in which to do the - * insertion, and the buffer must be pinned and write-locked. On return, + * insertion, and the buffer must be pinned and write-locked. On return, * we will have dropped both the pin and the lock on the buffer. * * If 'afteritem' is >0 then the new tuple must be inserted after the @@ -608,7 +608,7 @@ _bt_insertonpg(Relation rel, if (!rel->rd_istemp) { xl_btree_insert xlrec; - BlockNumber xldownlink; + BlockNumber xldownlink; xl_btree_metadata xlmeta; uint8 xlinfo; XLogRecPtr recptr; @@ -888,16 +888,17 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, sopaque = (BTPageOpaque) PageGetSpecialPointer(spage); if (sopaque->btpo_prev != ropaque->btpo_prev) elog(PANIC, "right sibling's left-link doesn't match"); + /* * Check to see if we can set the SPLIT_END flag in the right-hand * split page; this can save some I/O for vacuum since it need not * proceed to the right sibling. We can set the flag if the right - * sibling has a different cycleid: that means it could not be part - * of a group of pages that were all split off from the same ancestor + * sibling has a different cycleid: that means it could not be part of + * a group of pages that were all split off from the same ancestor * page. If you're confused, imagine that page A splits to A B and * then again, yielding A C B, while vacuum is in progress. Tuples * originally in A could now be in either B or C, hence vacuum must - * examine both pages. But if D, our right sibling, has a different + * examine both pages. But if D, our right sibling, has a different * cycleid then it could not contain any tuples that were in A when * the vacuum started. */ @@ -911,8 +912,8 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, * * NO EREPORT(ERROR) till right sibling is updated. We can get away with * not starting the critical section till here because we haven't been - * scribbling on the original page yet, and we don't care about the - * new sibling until it's linked into the btree. + * scribbling on the original page yet, and we don't care about the new + * sibling until it's linked into the btree. */ START_CRIT_SECTION(); @@ -947,8 +948,8 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, * Direct access to page is not good but faster - we should implement * some new func in page API. Note we only store the tuples * themselves, knowing that the item pointers are in the same order - * and can be reconstructed by scanning the tuples. See comments - * for _bt_restore_page(). + * and can be reconstructed by scanning the tuples. See comments for + * _bt_restore_page(). */ xlrec.leftlen = ((PageHeader) leftpage)->pd_special - ((PageHeader) leftpage)->pd_upper; @@ -1708,17 +1709,17 @@ _bt_isequal(TupleDesc itupdesc, Page page, OffsetNumber offnum, static void _bt_vacuum_one_page(Relation rel, Buffer buffer) { - OffsetNumber deletable[MaxOffsetNumber]; - int ndeletable = 0; - OffsetNumber offnum, - minoff, - maxoff; - Page page = BufferGetPage(buffer); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + OffsetNumber deletable[MaxOffsetNumber]; + int ndeletable = 0; + OffsetNumber offnum, + minoff, + maxoff; + Page page = BufferGetPage(buffer); + BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); /* - * Scan over all items to see which ones need deleted - * according to LP_DELETE flags. + * Scan over all items to see which ones need deleted according to + * LP_DELETE flags. */ minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); @@ -1726,7 +1727,7 @@ _bt_vacuum_one_page(Relation rel, Buffer buffer) offnum <= maxoff; offnum = OffsetNumberNext(offnum)) { - ItemId itemId = PageGetItemId(page, offnum); + ItemId itemId = PageGetItemId(page, offnum); if (ItemIdDeleted(itemId)) deletable[ndeletable++] = offnum; @@ -1734,10 +1735,11 @@ _bt_vacuum_one_page(Relation rel, Buffer buffer) if (ndeletable > 0) _bt_delitems(rel, buffer, deletable, ndeletable); + /* * Note: if we didn't find any LP_DELETE items, then the page's - * BTP_HAS_GARBAGE hint bit is falsely set. We do not bother - * expending a separate write to clear it, however. We will clear - * it when we split the page. + * BTP_HAS_GARBAGE hint bit is falsely set. We do not bother expending a + * separate write to clear it, however. We will clear it when we split + * the page. */ } diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 080e10c88cf..def14adf1f5 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.99 2006/07/25 19:13:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.100 2006/10/04 00:29:49 momjian Exp $ * * NOTES * Postgres btree pages look like ordinary relation pages. The opaque @@ -124,10 +124,10 @@ _bt_getroot(Relation rel, int access) /* * Since the cache might be stale, we check the page more carefully - * here than normal. We *must* check that it's not deleted. - * If it's not alone on its level, then we reject too --- this - * may be overly paranoid but better safe than sorry. Note we - * don't check P_ISROOT, because that's not set in a "fast root". + * here than normal. We *must* check that it's not deleted. If it's + * not alone on its level, then we reject too --- this may be overly + * paranoid but better safe than sorry. Note we don't check P_ISROOT, + * because that's not set in a "fast root". */ if (!P_IGNORE(rootopaque) && rootopaque->btpo.level == rootlevel && @@ -662,18 +662,18 @@ _bt_delitems(Relation rel, Buffer buf, PageIndexMultiDelete(page, itemnos, nitems); /* - * We can clear the vacuum cycle ID since this page has certainly - * been processed by the current vacuum scan. + * We can clear the vacuum cycle ID since this page has certainly been + * processed by the current vacuum scan. */ opaque = (BTPageOpaque) PageGetSpecialPointer(page); opaque->btpo_cycleid = 0; /* * Mark the page as not containing any LP_DELETE items. This is not - * certainly true (there might be some that have recently been marked, - * but weren't included in our target-item list), but it will almost - * always be true and it doesn't seem worth an additional page scan - * to check it. Remember that BTP_HAS_GARBAGE is only a hint anyway. + * certainly true (there might be some that have recently been marked, but + * weren't included in our target-item list), but it will almost always be + * true and it doesn't seem worth an additional page scan to check it. + * Remember that BTP_HAS_GARBAGE is only a hint anyway. */ opaque->btpo_flags &= ~BTP_HAS_GARBAGE; diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index fa5b162c908..c9a7a8b5b29 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.151 2006/09/21 20:31:22 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.152 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -55,7 +55,7 @@ typedef struct BlockNumber *freePages; int nFreePages; /* number of entries in freePages[] */ int maxFreePages; /* allocated size of freePages[] */ - BlockNumber totFreePages; /* true total # of free pages */ + BlockNumber totFreePages; /* true total # of free pages */ MemoryContext pagedelcontext; } BTVacState; @@ -70,7 +70,7 @@ static void btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state, BTCycleId cycleid); static void btvacuumpage(BTVacState *vstate, BlockNumber blkno, - BlockNumber orig_blkno); + BlockNumber orig_blkno); /* @@ -109,8 +109,8 @@ btbuild(PG_FUNCTION_ARGS) buildstate.spool = _bt_spoolinit(index, indexInfo->ii_Unique, false); /* - * If building a unique index, put dead tuples in a second spool to - * keep them out of the uniqueness check. + * If building a unique index, put dead tuples in a second spool to keep + * them out of the uniqueness check. */ if (indexInfo->ii_Unique) buildstate.spool2 = _bt_spoolinit(index, false, true); @@ -146,11 +146,11 @@ btbuild(PG_FUNCTION_ARGS) #endif /* BTREE_BUILD_STATS */ /* - * If we are reindexing a pre-existing index, it is critical to send out - * a relcache invalidation SI message to ensure all backends re-read the - * index metapage. We expect that the caller will ensure that happens - * (typically as a side effect of updating index stats, but it must - * happen even if the stats don't change!) + * If we are reindexing a pre-existing index, it is critical to send out a + * relcache invalidation SI message to ensure all backends re-read the + * index metapage. We expect that the caller will ensure that happens + * (typically as a side effect of updating index stats, but it must happen + * even if the stats don't change!) */ /* @@ -252,11 +252,11 @@ btgettuple(PG_FUNCTION_ARGS) if (scan->kill_prior_tuple) { /* - * Yes, remember it for later. (We'll deal with all such tuples + * Yes, remember it for later. (We'll deal with all such tuples * at once right before leaving the index page.) The test for * numKilled overrun is not just paranoia: if the caller reverses * direction in the indexscan then the same item might get entered - * multiple times. It's not worth trying to optimize that, so we + * multiple times. It's not worth trying to optimize that, so we * don't detect it, but instead just forget any excess entries. */ if (so->killedItems == NULL) @@ -316,8 +316,8 @@ btgetmulti(PG_FUNCTION_ARGS) while (ntids < max_tids) { /* - * Advance to next tuple within page. This is the same as the - * easy case in _bt_next(). + * Advance to next tuple within page. This is the same as the easy + * case in _bt_next(). */ if (++so->currPos.itemIndex > so->currPos.lastItem) { @@ -373,7 +373,7 @@ btrescan(PG_FUNCTION_ARGS) so->keyData = (ScanKey) palloc(scan->numberOfKeys * sizeof(ScanKeyData)); else so->keyData = NULL; - so->killedItems = NULL; /* until needed */ + so->killedItems = NULL; /* until needed */ so->numKilled = 0; scan->opaque = so; } @@ -461,9 +461,9 @@ btmarkpos(PG_FUNCTION_ARGS) /* * Just record the current itemIndex. If we later step to next page - * before releasing the marked position, _bt_steppage makes a full copy - * of the currPos struct in markPos. If (as often happens) the mark is - * moved before we leave the page, we don't have to do that work. + * before releasing the marked position, _bt_steppage makes a full copy of + * the currPos struct in markPos. If (as often happens) the mark is moved + * before we leave the page, we don't have to do that work. */ if (BTScanPosIsValid(so->currPos)) so->markItemIndex = so->currPos.itemIndex; @@ -485,11 +485,11 @@ btrestrpos(PG_FUNCTION_ARGS) if (so->markItemIndex >= 0) { /* - * The mark position is on the same page we are currently on. - * Just restore the itemIndex. + * The mark position is on the same page we are currently on. Just + * restore the itemIndex. */ so->currPos.itemIndex = so->markItemIndex; - } + } else { /* we aren't holding any read locks, but gotta drop the pin */ @@ -527,7 +527,7 @@ Datum btbulkdelete(PG_FUNCTION_ARGS) { IndexVacuumInfo *info = (IndexVacuumInfo *) PG_GETARG_POINTER(0); - IndexBulkDeleteResult * volatile stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1); + IndexBulkDeleteResult *volatile stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1); IndexBulkDeleteCallback callback = (IndexBulkDeleteCallback) PG_GETARG_POINTER(2); void *callback_state = (void *) PG_GETARG_POINTER(3); Relation rel = info->index; @@ -569,10 +569,10 @@ btvacuumcleanup(PG_FUNCTION_ARGS) IndexBulkDeleteResult *stats = (IndexBulkDeleteResult *) PG_GETARG_POINTER(1); /* - * If btbulkdelete was called, we need not do anything, just return - * the stats from the latest btbulkdelete call. If it wasn't called, - * we must still do a pass over the index, to recycle any newly-recyclable - * pages and to obtain index statistics. + * If btbulkdelete was called, we need not do anything, just return the + * stats from the latest btbulkdelete call. If it wasn't called, we must + * still do a pass over the index, to recycle any newly-recyclable pages + * and to obtain index statistics. * * Since we aren't going to actually delete any leaf items, there's no * need to go through all the vacuum-cycle-ID pushups. @@ -586,8 +586,8 @@ btvacuumcleanup(PG_FUNCTION_ARGS) /* * During a non-FULL vacuum it's quite possible for us to be fooled by * concurrent page splits into double-counting some index tuples, so - * disbelieve any total that exceeds the underlying heap's count. - * (We can't check this during btbulkdelete.) + * disbelieve any total that exceeds the underlying heap's count. (We + * can't check this during btbulkdelete.) */ if (!info->vacuum_full) { @@ -622,8 +622,8 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, bool needLock; /* - * Reset counts that will be incremented during the scan; needed in - * case of multiple scans during a single VACUUM command + * Reset counts that will be incremented during the scan; needed in case + * of multiple scans during a single VACUUM command */ stats->num_index_tuples = 0; stats->pages_deleted = 0; @@ -647,24 +647,24 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, ALLOCSET_DEFAULT_MAXSIZE); /* - * The outer loop iterates over all index pages except the metapage, - * in physical order (we hope the kernel will cooperate in providing + * The outer loop iterates over all index pages except the metapage, in + * physical order (we hope the kernel will cooperate in providing * read-ahead for speed). It is critical that we visit all leaf pages, * including ones added after we start the scan, else we might fail to * delete some deletable tuples. Hence, we must repeatedly check the * relation length. We must acquire the relation-extension lock while * doing so to avoid a race condition: if someone else is extending the * relation, there is a window where bufmgr/smgr have created a new - * all-zero page but it hasn't yet been write-locked by _bt_getbuf(). - * If we manage to scan such a page here, we'll improperly assume it can - * be recycled. Taking the lock synchronizes things enough to prevent a + * all-zero page but it hasn't yet been write-locked by _bt_getbuf(). If + * we manage to scan such a page here, we'll improperly assume it can be + * recycled. Taking the lock synchronizes things enough to prevent a * problem: either num_pages won't include the new page, or _bt_getbuf * already has write lock on the buffer and it will be fully initialized * before we can examine it. (See also vacuumlazy.c, which has the same - * issue.) Also, we need not worry if a page is added immediately after + * issue.) Also, we need not worry if a page is added immediately after * we look; the page splitting code already has write-lock on the left - * page before it adds a right page, so we must already have processed - * any tuples due to be moved into such a page. + * page before it adds a right page, so we must already have processed any + * tuples due to be moved into such a page. * * We can skip locking for new or temp relations, however, since no one * else could be accessing them. @@ -771,7 +771,7 @@ btvacuumpage(BTVacState *vstate, BlockNumber blkno, BlockNumber orig_blkno) void *callback_state = vstate->callback_state; Relation rel = info->index; bool delete_now; - BlockNumber recurse_to; + BlockNumber recurse_to; Buffer buf; Page page; BTPageOpaque opaque; @@ -796,10 +796,10 @@ restart: _bt_checkpage(rel, buf); /* - * If we are recursing, the only case we want to do anything with is - * a live leaf page having the current vacuum cycle ID. Any other state - * implies we already saw the page (eg, deleted it as being empty). - * In particular, we don't want to risk adding it to freePages twice. + * If we are recursing, the only case we want to do anything with is a + * live leaf page having the current vacuum cycle ID. Any other state + * implies we already saw the page (eg, deleted it as being empty). In + * particular, we don't want to risk adding it to freePages twice. */ if (blkno != orig_blkno) { @@ -838,25 +838,24 @@ restart: OffsetNumber deletable[MaxOffsetNumber]; int ndeletable; OffsetNumber offnum, - minoff, - maxoff; + minoff, + maxoff; /* - * Trade in the initial read lock for a super-exclusive write - * lock on this page. We must get such a lock on every leaf page - * over the course of the vacuum scan, whether or not it actually - * contains any deletable tuples --- see nbtree/README. + * Trade in the initial read lock for a super-exclusive write lock on + * this page. We must get such a lock on every leaf page over the + * course of the vacuum scan, whether or not it actually contains any + * deletable tuples --- see nbtree/README. */ LockBuffer(buf, BUFFER_LOCK_UNLOCK); LockBufferForCleanup(buf); /* - * Check whether we need to recurse back to earlier pages. What - * we are concerned about is a page split that happened since we - * started the vacuum scan. If the split moved some tuples to a - * lower page then we might have missed 'em. If so, set up for - * tail recursion. (Must do this before possibly clearing - * btpo_cycleid below!) + * Check whether we need to recurse back to earlier pages. What we + * are concerned about is a page split that happened since we started + * the vacuum scan. If the split moved some tuples to a lower page + * then we might have missed 'em. If so, set up for tail recursion. + * (Must do this before possibly clearing btpo_cycleid below!) */ if (vstate->cycleid != 0 && opaque->btpo_cycleid == vstate->cycleid && @@ -866,8 +865,8 @@ restart: recurse_to = opaque->btpo_next; /* - * Scan over all items to see which ones need deleted - * according to the callback function. + * Scan over all items to see which ones need deleted according to the + * callback function. */ ndeletable = 0; minoff = P_FIRSTDATAKEY(opaque); @@ -890,8 +889,8 @@ restart: } /* - * Apply any needed deletes. We issue just one _bt_delitems() - * call per page, so as to minimize WAL traffic. + * Apply any needed deletes. We issue just one _bt_delitems() call + * per page, so as to minimize WAL traffic. */ if (ndeletable > 0) { @@ -908,8 +907,8 @@ restart: * have any deletions to do. (If we do, _bt_delitems takes care * of this.) This ensures we won't process the page again. * - * We treat this like a hint-bit update because there's no need - * to WAL-log it. + * We treat this like a hint-bit update because there's no need to + * WAL-log it. */ if (vstate->cycleid != 0 && opaque->btpo_cycleid == vstate->cycleid) @@ -920,10 +919,10 @@ restart: } /* - * If it's now empty, try to delete; else count the live tuples. - * We don't delete when recursing, though, to avoid putting entries - * into freePages out-of-order (doesn't seem worth any extra code to - * handle the case). + * If it's now empty, try to delete; else count the live tuples. We + * don't delete when recursing, though, to avoid putting entries into + * freePages out-of-order (doesn't seem worth any extra code to handle + * the case). */ if (minoff > maxoff) delete_now = (blkno == orig_blkno); @@ -947,13 +946,12 @@ restart: stats->pages_deleted++; /* - * During VACUUM FULL it's okay to recycle deleted pages - * immediately, since there can be no other transactions scanning - * the index. Note that we will only recycle the current page and - * not any parent pages that _bt_pagedel might have recursed to; - * this seems reasonable in the name of simplicity. (Trying to do - * otherwise would mean we'd have to sort the list of recyclable - * pages we're building.) + * During VACUUM FULL it's okay to recycle deleted pages immediately, + * since there can be no other transactions scanning the index. Note + * that we will only recycle the current page and not any parent pages + * that _bt_pagedel might have recursed to; this seems reasonable in + * the name of simplicity. (Trying to do otherwise would mean we'd + * have to sort the list of recyclable pages we're building.) */ if (ndel && info->vacuum_full) { @@ -969,11 +967,11 @@ restart: _bt_relbuf(rel, buf); /* - * This is really tail recursion, but if the compiler is too stupid - * to optimize it as such, we'd eat an uncomfortably large amount of - * stack space per recursion level (due to the deletable[] array). - * A failure is improbable since the number of levels isn't likely to be - * large ... but just in case, let's hand-optimize into a loop. + * This is really tail recursion, but if the compiler is too stupid to + * optimize it as such, we'd eat an uncomfortably large amount of stack + * space per recursion level (due to the deletable[] array). A failure is + * improbable since the number of levels isn't likely to be large ... but + * just in case, let's hand-optimize into a loop. */ if (recurse_to != P_NONE) { diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 07bc076e49b..6d9be1b0176 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.106 2006/08/24 01:18:34 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.107 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -22,7 +22,7 @@ static bool _bt_readpage(IndexScanDesc scan, ScanDirection dir, - OffsetNumber offnum); + OffsetNumber offnum); static bool _bt_steppage(IndexScanDesc scan, ScanDirection dir); static Buffer _bt_walk_left(Relation rel, Buffer buf); static bool _bt_endpoint(IndexScanDesc scan, ScanDirection dir); @@ -417,7 +417,7 @@ _bt_compare(Relation rel, * _bt_first() -- Find the first item in a scan. * * We need to be clever about the direction of scan, the search - * conditions, and the tree ordering. We find the first item (or, + * conditions, and the tree ordering. We find the first item (or, * if backwards scan, the last item) in the tree that satisfies the * qualifications in the scan key. On success exit, the page containing * the current index tuple is pinned but not locked, and data about @@ -604,7 +604,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) { ScanKey cur = startKeys[i]; - Assert(cur->sk_attno == i+1); + Assert(cur->sk_attno == i + 1); if (cur->sk_flags & SK_ROW_HEADER) { @@ -612,16 +612,17 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * Row comparison header: look to the first row member instead. * * The member scankeys are already in insertion format (ie, they - * have sk_func = 3-way-comparison function), but we have to - * watch out for nulls, which _bt_preprocess_keys didn't check. - * A null in the first row member makes the condition unmatchable, - * just like qual_ok = false. + * have sk_func = 3-way-comparison function), but we have to watch + * out for nulls, which _bt_preprocess_keys didn't check. A null + * in the first row member makes the condition unmatchable, just + * like qual_ok = false. */ cur = (ScanKey) DatumGetPointer(cur->sk_argument); Assert(cur->sk_flags & SK_ROW_MEMBER); if (cur->sk_flags & SK_ISNULL) return false; memcpy(scankeys + i, cur, sizeof(ScanKeyData)); + /* * If the row comparison is the last positioning key we accepted, * try to add additional keys from the lower-order row members. @@ -833,10 +834,10 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * * The actually desired starting point is either this item or the prior * one, or in the end-of-page case it's the first item on the next page or - * the last item on this page. Adjust the starting offset if needed. - * (If this results in an offset before the first item or after the last - * one, _bt_readpage will report no items found, and then we'll step to - * the next page as needed.) + * the last item on this page. Adjust the starting offset if needed. (If + * this results in an offset before the first item or after the last one, + * _bt_readpage will report no items found, and then we'll step to the + * next page as needed.) */ if (goback) offnum = OffsetNumberPrev(offnum); @@ -882,8 +883,8 @@ _bt_next(IndexScanDesc scan, ScanDirection dir) BTScanOpaque so = (BTScanOpaque) scan->opaque; /* - * Advance to next tuple on current page; or if there's no more, - * try to step to the next page with data. + * Advance to next tuple on current page; or if there's no more, try to + * step to the next page with data. */ if (ScanDirectionIsForward(dir)) { @@ -954,8 +955,8 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) /* * we must save the page's right-link while scanning it; this tells us - * where to step right to after we're done with these items. There is - * no corresponding need for the left-link, since splits always go right. + * where to step right to after we're done with these items. There is no + * corresponding need for the left-link, since splits always go right. */ so->currPos.nextPage = opaque->btpo_next; @@ -1055,8 +1056,8 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) _bt_killitems(scan, true); /* - * Before we modify currPos, make a copy of the page data if there - * was a mark position that needs it. + * Before we modify currPos, make a copy of the page data if there was a + * mark position that needs it. */ if (so->markItemIndex >= 0) { @@ -1112,11 +1113,11 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) so->currPos.moreRight = true; /* - * Walk left to the next page with data. This is much more - * complex than the walk-right case because of the possibility - * that the page to our left splits while we are in flight to it, - * plus the possibility that the page we were on gets deleted - * after we leave it. See nbtree/README for details. + * Walk left to the next page with data. This is much more complex + * than the walk-right case because of the possibility that the page + * to our left splits while we are in flight to it, plus the + * possibility that the page we were on gets deleted after we leave + * it. See nbtree/README for details. */ for (;;) { @@ -1136,9 +1137,9 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) return false; /* - * Okay, we managed to move left to a non-deleted page. - * Done if it's not half-dead and contains matching tuples. - * Else loop back and do it all again. + * Okay, we managed to move left to a non-deleted page. Done if + * it's not half-dead and contains matching tuples. Else loop back + * and do it all again. */ page = BufferGetPage(so->currPos.buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index da2b191d5c6..4951dca2182 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -57,7 +57,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsort.c,v 1.106 2006/07/14 14:52:17 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsort.c,v 1.107 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -125,7 +125,7 @@ static void _bt_slideleft(Page page); static void _bt_sortaddtup(Page page, Size itemsize, IndexTuple itup, OffsetNumber itup_off); static void _bt_buildadd(BTWriteState *wstate, BTPageState *state, - IndexTuple itup); + IndexTuple itup); static void _bt_uppershutdown(BTWriteState *wstate, BTPageState *state); static void _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2); @@ -351,7 +351,7 @@ _bt_pagestate(BTWriteState *wstate, uint32 level) state->btps_full = (BLCKSZ * (100 - BTREE_NONLEAF_FILLFACTOR) / 100); else state->btps_full = RelationGetTargetPageFreeSpace(wstate->index, - BTREE_DEFAULT_FILLFACTOR); + BTREE_DEFAULT_FILLFACTOR); /* no parent level, yet */ state->btps_next = NULL; @@ -464,8 +464,8 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup) Size itupsz; /* - * This is a handy place to check for cancel interrupts during the - * btree load phase of index creation. + * This is a handy place to check for cancel interrupts during the btree + * load phase of index creation. */ CHECK_FOR_INTERRUPTS(); @@ -499,10 +499,10 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup) "or use full text indexing."))); /* - * Check to see if page is "full". It's definitely full if the item - * won't fit. Otherwise, compare to the target freespace derived from - * the fillfactor. However, we must put at least two items on each - * page, so disregard fillfactor if we don't have that many. + * Check to see if page is "full". It's definitely full if the item won't + * fit. Otherwise, compare to the target freespace derived from the + * fillfactor. However, we must put at least two items on each page, so + * disregard fillfactor if we don't have that many. */ if (pgspc < itupsz || (pgspc < state->btps_full && last_off > P_FIRSTKEY)) { diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 8b680541121..a562ee6cbd2 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtutils.c,v 1.78 2006/07/25 19:13:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtutils.c,v 1.79 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -28,8 +28,8 @@ static void _bt_mark_scankey_required(ScanKey skey); static bool _bt_check_rowcompare(ScanKey skey, - IndexTuple tuple, TupleDesc tupdesc, - ScanDirection dir, bool *continuescan); + IndexTuple tuple, TupleDesc tupdesc, + ScanDirection dir, bool *continuescan); /* @@ -83,7 +83,7 @@ _bt_mkscankey(Relation rel, IndexTuple itup) * comparison data ultimately used must match the key datatypes. * * The result cannot be used with _bt_compare(), unless comparison - * data is first stored into the key entries. Currently this + * data is first stored into the key entries. Currently this * routine is only called by nbtsort.c and tuplesort.c, which have * their own comparison routines. */ @@ -388,7 +388,7 @@ _bt_preprocess_keys(IndexScanDesc scan) /* * Emit the cleaned-up keys into the outkeys[] array, and then - * mark them if they are required. They are required (possibly + * mark them if they are required. They are required (possibly * only in one direction) if all attrs before this one had "=". */ for (j = BTMaxStrategyNumber; --j >= 0;) @@ -461,7 +461,7 @@ _bt_preprocess_keys(IndexScanDesc scan) * Mark a scankey as "required to continue the scan". * * Depending on the operator type, the key may be required for both scan - * directions or just one. Also, if the key is a row comparison header, + * directions or just one. Also, if the key is a row comparison header, * we have to mark the appropriate subsidiary ScanKeys as required. In * such cases, the first subsidiary key is required, but subsequent ones * are required only as long as they correspond to successive index columns. @@ -472,12 +472,12 @@ _bt_preprocess_keys(IndexScanDesc scan) * scribbling on a data structure belonging to the index AM's caller, not on * our private copy. This should be OK because the marking will not change * from scan to scan within a query, and so we'd just re-mark the same way - * anyway on a rescan. Something to keep an eye on though. + * anyway on a rescan. Something to keep an eye on though. */ static void _bt_mark_scankey_required(ScanKey skey) { - int addflags; + int addflags; switch (skey->sk_strategy) { @@ -503,8 +503,8 @@ _bt_mark_scankey_required(ScanKey skey) if (skey->sk_flags & SK_ROW_HEADER) { - ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); - AttrNumber attno = skey->sk_attno; + ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); + AttrNumber attno = skey->sk_attno; /* First subkey should be same as the header says */ Assert(subkey->sk_attno == attno); @@ -558,12 +558,12 @@ _bt_checkkeys(IndexScanDesc scan, *continuescan = true; /* default assumption */ /* - * If the scan specifies not to return killed tuples, then we treat - * a killed tuple as not passing the qual. Most of the time, it's a - * win to not bother examining the tuple's index keys, but just return + * If the scan specifies not to return killed tuples, then we treat a + * killed tuple as not passing the qual. Most of the time, it's a win to + * not bother examining the tuple's index keys, but just return * immediately with continuescan = true to proceed to the next tuple. - * However, if this is the last tuple on the page, we should check - * the index keys to prevent uselessly advancing to the next page. + * However, if this is the last tuple on the page, we should check the + * index keys to prevent uselessly advancing to the next page. */ if (scan->ignore_killed_tuples && ItemIdDeleted(iid)) { @@ -580,9 +580,10 @@ _bt_checkkeys(IndexScanDesc scan, if (offnum > P_FIRSTDATAKEY(opaque)) return false; } + /* - * OK, we want to check the keys, but we'll return FALSE even - * if the tuple passes the key tests. + * OK, we want to check the keys, but we'll return FALSE even if the + * tuple passes the key tests. */ tuple_valid = false; } @@ -734,10 +735,9 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, TupleDesc tupdesc, { /* * Unlike the simple-scankey case, this isn't a disallowed case. - * But it can never match. If all the earlier row comparison - * columns are required for the scan direction, we can stop - * the scan, because there can't be another tuple that will - * succeed. + * But it can never match. If all the earlier row comparison + * columns are required for the scan direction, we can stop the + * scan, because there can't be another tuple that will succeed. */ if (subkey != (ScanKey) DatumGetPointer(skey->sk_argument)) subkey--; @@ -771,7 +771,7 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, TupleDesc tupdesc, */ switch (subkey->sk_strategy) { - /* EQ and NE cases aren't allowed here */ + /* EQ and NE cases aren't allowed here */ case BTLessStrategyNumber: result = (cmpresult < 0); break; @@ -795,8 +795,8 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, TupleDesc tupdesc, { /* * Tuple fails this qual. If it's a required qual for the current - * scan direction, then we can conclude no further tuples will - * pass, either. Note we have to look at the deciding column, not + * scan direction, then we can conclude no further tuples will pass, + * either. Note we have to look at the deciding column, not * necessarily the first or last column of the row condition. */ if ((subkey->sk_flags & SK_BT_REQFWD) && @@ -822,7 +822,7 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, TupleDesc tupdesc, * is sufficient for setting LP_DELETE hint bits. * * We match items by heap TID before assuming they are the right ones to - * delete. We cope with cases where items have moved right due to insertions. + * delete. We cope with cases where items have moved right due to insertions. * If an item has moved off the current page due to a split, we'll fail to * find it and do nothing (this is not an error case --- we assume the item * will eventually get marked in a future indexscan). Note that because we @@ -856,9 +856,9 @@ _bt_killitems(IndexScanDesc scan, bool haveLock) for (i = 0; i < so->numKilled; i++) { - int itemIndex = so->killedItems[i]; - BTScanPosItem *kitem = &so->currPos.items[itemIndex]; - OffsetNumber offnum = kitem->indexOffset; + int itemIndex = so->killedItems[i]; + BTScanPosItem *kitem = &so->currPos.items[itemIndex]; + OffsetNumber offnum = kitem->indexOffset; Assert(itemIndex >= so->currPos.firstItem && itemIndex <= so->currPos.lastItem); @@ -881,9 +881,9 @@ _bt_killitems(IndexScanDesc scan, bool haveLock) } /* - * Since this can be redone later if needed, it's treated the same - * as a commit-hint-bit status update for heap tuples: we mark the - * buffer dirty but don't make a WAL log entry. + * Since this can be redone later if needed, it's treated the same as a + * commit-hint-bit status update for heap tuples: we mark the buffer dirty + * but don't make a WAL log entry. * * Whenever we mark anything LP_DELETEd, we also set the page's * BTP_HAS_GARBAGE flag, which is likewise just a hint. @@ -898,8 +898,8 @@ _bt_killitems(IndexScanDesc scan, bool haveLock) LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); /* - * Always reset the scan state, so we don't look for same items - * on other pages. + * Always reset the scan state, so we don't look for same items on other + * pages. */ so->numKilled = 0; } @@ -908,8 +908,8 @@ _bt_killitems(IndexScanDesc scan, bool haveLock) /* * The following routines manage a shared-memory area in which we track * assignment of "vacuum cycle IDs" to currently-active btree vacuuming - * operations. There is a single counter which increments each time we - * start a vacuum to assign it a cycle ID. Since multiple vacuums could + * operations. There is a single counter which increments each time we + * start a vacuum to assign it a cycle ID. Since multiple vacuums could * be active concurrently, we have to track the cycle ID for each active * vacuum; this requires at most MaxBackends entries (usually far fewer). * We assume at most one vacuum can be active for a given index. @@ -987,7 +987,8 @@ _bt_start_vacuum(Relation rel) LWLockAcquire(BtreeVacuumLock, LW_EXCLUSIVE); /* Assign the next cycle ID, being careful to avoid zero */ - do { + do + { result = ++(btvacinfo->cycle_ctr); } while (result == 0); diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 88962ccfcec..e22ce04bbc1 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.37 2006/08/07 16:57:56 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.38 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -82,7 +82,7 @@ forget_matching_split(RelFileNode node, BlockNumber downlink, bool is_root) * in correct itemno sequence, but physically the opposite order from the * original, because we insert them in the opposite of itemno order. This * does not matter in any current btree code, but it's something to keep an - * eye on. Is it worth changing just on general principles? + * eye on. Is it worth changing just on general principles? */ static void _bt_restore_page(Page page, char *from, int len) @@ -155,7 +155,7 @@ btree_xlog_insert(bool isleaf, bool ismeta, char *datapos; int datalen; xl_btree_metadata md; - BlockNumber downlink = 0; + BlockNumber downlink = 0; datapos = (char *) xlrec + SizeOfBtreeInsert; datalen = record->xl_len - SizeOfBtreeInsert; @@ -180,7 +180,7 @@ btree_xlog_insert(bool isleaf, bool ismeta, if (!(record->xl_info & XLR_BKP_BLOCK_1)) { buffer = XLogReadBuffer(reln, - ItemPointerGetBlockNumber(&(xlrec->target.tid)), + ItemPointerGetBlockNumber(&(xlrec->target.tid)), false); if (BufferIsValid(buffer)) { @@ -193,7 +193,7 @@ btree_xlog_insert(bool isleaf, bool ismeta, else { if (PageAddItem(page, (Item) datapos, datalen, - ItemPointerGetOffsetNumber(&(xlrec->target.tid)), + ItemPointerGetOffsetNumber(&(xlrec->target.tid)), LP_USED) == InvalidOffsetNumber) elog(PANIC, "btree_insert_redo: failed to add item"); @@ -225,7 +225,7 @@ btree_xlog_split(bool onleft, bool isroot, OffsetNumber targetoff; BlockNumber leftsib; BlockNumber rightsib; - BlockNumber downlink = 0; + BlockNumber downlink = 0; Buffer buffer; Page page; BTPageOpaque pageop; @@ -376,8 +376,8 @@ btree_xlog_delete(XLogRecPtr lsn, XLogRecord *record) } /* - * Mark the page as not containing any LP_DELETE items --- see comments - * in _bt_delitems(). + * Mark the page as not containing any LP_DELETE items --- see comments in + * _bt_delitems(). */ opaque = (BTPageOpaque) PageGetSpecialPointer(page); opaque->btpo_flags &= ~BTP_HAS_GARBAGE; @@ -543,7 +543,7 @@ btree_xlog_newroot(XLogRecPtr lsn, XLogRecord *record) Buffer buffer; Page page; BTPageOpaque pageop; - BlockNumber downlink = 0; + BlockNumber downlink = 0; reln = XLogOpenRelation(xlrec->node); buffer = XLogReadBuffer(reln, xlrec->rootblk, true); @@ -637,9 +637,9 @@ static void out_target(StringInfo buf, xl_btreetid *target) { appendStringInfo(buf, "rel %u/%u/%u; tid %u/%u", - target->node.spcNode, target->node.dbNode, target->node.relNode, - ItemPointerGetBlockNumber(&(target->tid)), - ItemPointerGetOffsetNumber(&(target->tid))); + target->node.spcNode, target->node.dbNode, target->node.relNode, + ItemPointerGetBlockNumber(&(target->tid)), + ItemPointerGetOffsetNumber(&(target->tid))); } void @@ -680,7 +680,7 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "split_l: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; oth %u; rgh %u", - xlrec->otherblk, xlrec->rightblk); + xlrec->otherblk, xlrec->rightblk); break; } case XLOG_BTREE_SPLIT_R: @@ -690,7 +690,7 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "split_r: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; oth %u; rgh %u", - xlrec->otherblk, xlrec->rightblk); + xlrec->otherblk, xlrec->rightblk); break; } case XLOG_BTREE_SPLIT_L_ROOT: @@ -700,7 +700,7 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "split_l_root: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; oth %u; rgh %u", - xlrec->otherblk, xlrec->rightblk); + xlrec->otherblk, xlrec->rightblk); break; } case XLOG_BTREE_SPLIT_R_ROOT: @@ -710,7 +710,7 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "split_r_root: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; oth %u; rgh %u", - xlrec->otherblk, xlrec->rightblk); + xlrec->otherblk, xlrec->rightblk); break; } case XLOG_BTREE_DELETE: @@ -718,8 +718,8 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) xl_btree_delete *xlrec = (xl_btree_delete *) rec; appendStringInfo(buf, "delete: rel %u/%u/%u; blk %u", - xlrec->node.spcNode, xlrec->node.dbNode, - xlrec->node.relNode, xlrec->block); + xlrec->node.spcNode, xlrec->node.dbNode, + xlrec->node.relNode, xlrec->block); break; } case XLOG_BTREE_DELETE_PAGE: @@ -730,7 +730,7 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) appendStringInfo(buf, "delete_page: "); out_target(buf, &(xlrec->target)); appendStringInfo(buf, "; dead %u; left %u; right %u", - xlrec->deadblk, xlrec->leftblk, xlrec->rightblk); + xlrec->deadblk, xlrec->leftblk, xlrec->rightblk); break; } case XLOG_BTREE_NEWROOT: @@ -738,9 +738,9 @@ btree_desc(StringInfo buf, uint8 xl_info, char *rec) xl_btree_newroot *xlrec = (xl_btree_newroot *) rec; appendStringInfo(buf, "newroot: rel %u/%u/%u; root %u lev %u", - xlrec->node.spcNode, xlrec->node.dbNode, - xlrec->node.relNode, - xlrec->rootblk, xlrec->level); + xlrec->node.spcNode, xlrec->node.dbNode, + xlrec->node.relNode, + xlrec->rootblk, xlrec->level); break; } default: diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 0621d3bc604..f57bdefa3a0 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -24,7 +24,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.39 2006/07/13 16:49:12 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.40 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -414,7 +414,7 @@ clog_redo(XLogRecPtr lsn, XLogRecord *record) void clog_desc(StringInfo buf, uint8 xl_info, char *rec) { - uint8 info = xl_info & ~XLR_INFO_MASK; + uint8 info = xl_info & ~XLR_INFO_MASK; if (info == CLOG_ZEROPAGE) { diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index ae5272286a2..167d65fd2d7 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -42,7 +42,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/multixact.c,v 1.20 2006/07/20 00:46:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/multixact.c,v 1.21 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1493,10 +1493,10 @@ CheckPointMultiXact(void) /* * Truncate the SLRU files. This could be done at any time, but - * checkpoint seems a reasonable place for it. There is one exception: - * if we are called during xlog recovery, then shared->latest_page_number - * isn't valid (because StartupMultiXact hasn't been called yet) and - * so SimpleLruTruncate would get confused. It seems best not to risk + * checkpoint seems a reasonable place for it. There is one exception: if + * we are called during xlog recovery, then shared->latest_page_number + * isn't valid (because StartupMultiXact hasn't been called yet) and so + * SimpleLruTruncate would get confused. It seems best not to risk * removing any data during recovery anyway, so don't truncate. */ if (!InRecovery) @@ -1917,7 +1917,7 @@ multixact_desc(StringInfo buf, uint8 xl_info, char *rec) int i; appendStringInfo(buf, "create multixact %u offset %u:", - xlrec->mid, xlrec->moff); + xlrec->mid, xlrec->moff); for (i = 0; i < xlrec->nxids; i++) appendStringInfo(buf, " %u", xlrec->xids[i]); } diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 7c3884628be..08bb3598ac9 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -41,7 +41,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/slru.c,v 1.38 2006/07/14 14:52:17 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/slru.c,v 1.39 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -92,8 +92,8 @@ typedef struct SlruFlushData { - int num_files; /* # files actually open */ - int fd[MAX_FLUSH_BUFFERS]; /* their FD's */ + int num_files; /* # files actually open */ + int fd[MAX_FLUSH_BUFFERS]; /* their FD's */ int segno[MAX_FLUSH_BUFFERS]; /* their log seg#s */ } SlruFlushData; @@ -113,7 +113,7 @@ typedef struct SlruFlushData * page_lru_count entries to be "reset" to lower values than they should have, * in case a process is delayed while it executes this macro. With care in * SlruSelectLRUPage(), this does little harm, and in any case the absolute - * worst possible consequence is a nonoptimal choice of page to evict. The + * worst possible consequence is a nonoptimal choice of page to evict. The * gain from allowing concurrent reads of SLRU pages seems worth it. */ #define SlruRecentlyUsed(shared, slotno) \ @@ -158,13 +158,13 @@ SimpleLruShmemSize(int nslots) /* we assume nslots isn't so large as to risk overflow */ sz = MAXALIGN(sizeof(SlruSharedData)); - sz += MAXALIGN(nslots * sizeof(char *)); /* page_buffer[] */ + sz += MAXALIGN(nslots * sizeof(char *)); /* page_buffer[] */ sz += MAXALIGN(nslots * sizeof(SlruPageStatus)); /* page_status[] */ - sz += MAXALIGN(nslots * sizeof(bool)); /* page_dirty[] */ - sz += MAXALIGN(nslots * sizeof(int)); /* page_number[] */ - sz += MAXALIGN(nslots * sizeof(int)); /* page_lru_count[] */ - sz += MAXALIGN(nslots * sizeof(LWLockId)); /* buffer_locks[] */ - + sz += MAXALIGN(nslots * sizeof(bool)); /* page_dirty[] */ + sz += MAXALIGN(nslots * sizeof(int)); /* page_number[] */ + sz += MAXALIGN(nslots * sizeof(int)); /* page_lru_count[] */ + sz += MAXALIGN(nslots * sizeof(LWLockId)); /* buffer_locks[] */ + return BUFFERALIGN(sz) + BLCKSZ * nslots; } @@ -653,9 +653,9 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruFlush fdata) * Easiest way to deal with that is to accept references to * nonexistent files here and in SlruPhysicalReadPage.) * - * Note: it is possible for more than one backend to be executing - * this code simultaneously for different pages of the same file. - * Hence, don't use O_EXCL or O_TRUNC or anything like that. + * Note: it is possible for more than one backend to be executing this + * code simultaneously for different pages of the same file. Hence, + * don't use O_EXCL or O_TRUNC or anything like that. */ SlruFileName(ctl, path, segno); fd = BasicOpenFile(path, O_RDWR | O_CREAT | PG_BINARY, @@ -759,22 +759,22 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not seek in file \"%s\" to offset %u: %m.", - path, offset))); + errdetail("Could not seek in file \"%s\" to offset %u: %m.", + path, offset))); break; case SLRU_READ_FAILED: ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not read from file \"%s\" at offset %u: %m.", - path, offset))); + errdetail("Could not read from file \"%s\" at offset %u: %m.", + path, offset))); break; case SLRU_WRITE_FAILED: ereport(ERROR, (errcode_for_file_access(), errmsg("could not access status of transaction %u", xid), - errdetail("Could not write to file \"%s\" at offset %u: %m.", - path, offset))); + errdetail("Could not write to file \"%s\" at offset %u: %m.", + path, offset))); break; case SLRU_FSYNC_FAILED: ereport(ERROR, diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 6c37d097fc2..bd0b9b131e6 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.23 2006/10/03 21:21:35 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.24 2006/10/04 00:29:49 momjian Exp $ * * NOTES * Each global transaction is associated with a global transaction @@ -1250,8 +1250,8 @@ RemoveTwoPhaseFile(TransactionId xid, bool giveWarning) if (errno != ENOENT || giveWarning) ereport(WARNING, (errcode_for_file_access(), - errmsg("could not remove twophase state file \"%s\": %m", - path))); + errmsg("could not remove twophase state file \"%s\": %m", + path))); } /* diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index 101f065489f..04e9840cb5d 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -6,7 +6,7 @@ * Copyright (c) 2000-2006, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/varsup.c,v 1.74 2006/09/26 17:21:39 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/varsup.c,v 1.75 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -133,10 +133,10 @@ GetNewTransactionId(bool isSubXact) { /* * Use volatile pointer to prevent code rearrangement; other backends - * could be examining my subxids info concurrently, and we don't - * want them to see an invalid intermediate state, such as - * incrementing nxids before filling the array entry. Note we are - * assuming that TransactionId and int fetch/store are atomic. + * could be examining my subxids info concurrently, and we don't want + * them to see an invalid intermediate state, such as incrementing + * nxids before filling the array entry. Note we are assuming that + * TransactionId and int fetch/store are atomic. */ volatile PGPROC *myproc = MyProc; @@ -144,7 +144,7 @@ GetNewTransactionId(bool isSubXact) myproc->xid = xid; else { - int nxids = myproc->subxids.nxids; + int nxids = myproc->subxids.nxids; if (nxids < PGPROC_MAX_CACHED_SUBXIDS) { @@ -196,7 +196,7 @@ SetTransactionIdLimit(TransactionId oldest_datminxid, * The place where we actually get into deep trouble is halfway around * from the oldest existing XID. (This calculation is probably off by one * or two counts, because the special XIDs reduce the size of the loop a - * little bit. But we throw in plenty of slop below, so it doesn't + * little bit. But we throw in plenty of slop below, so it doesn't * matter.) */ xidWrapLimit = oldest_datminxid + (MaxTransactionId >> 1); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 6fda0ce1f97..8e1724989cb 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.226 2006/08/27 19:11:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.227 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1376,12 +1376,12 @@ StartTransaction(void) XactLockTableInsert(s->transactionId); - PG_TRACE1 (transaction__start, s->transactionId); + PG_TRACE1(transaction__start, s->transactionId); /* - * set transaction_timestamp() (a/k/a now()). We want this to be the - * same as the first command's statement_timestamp(), so don't do a - * fresh GetCurrentTimestamp() call (which'd be expensive anyway). + * set transaction_timestamp() (a/k/a now()). We want this to be the same + * as the first command's statement_timestamp(), so don't do a fresh + * GetCurrentTimestamp() call (which'd be expensive anyway). */ xactStartTimestamp = stmtStartTimestamp; @@ -1521,7 +1521,7 @@ CommitTransaction(void) LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); MyProc->xid = InvalidTransactionId; MyProc->xmin = InvalidTransactionId; - MyProc->inVacuum = false; /* must be cleared with xid/xmin */ + MyProc->inVacuum = false; /* must be cleared with xid/xmin */ /* Clear the subtransaction-XID cache too while holding the lock */ MyProc->subxids.nxids = 0; @@ -1530,7 +1530,7 @@ CommitTransaction(void) LWLockRelease(ProcArrayLock); } - PG_TRACE1 (transaction__commit, s->transactionId); + PG_TRACE1(transaction__commit, s->transactionId); /* * This is all post-commit cleanup. Note that if an error is raised here, @@ -1921,7 +1921,7 @@ AbortTransaction(void) LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); MyProc->xid = InvalidTransactionId; MyProc->xmin = InvalidTransactionId; - MyProc->inVacuum = false; /* must be cleared with xid/xmin */ + MyProc->inVacuum = false; /* must be cleared with xid/xmin */ /* Clear the subtransaction-XID cache too while holding the lock */ MyProc->subxids.nxids = 0; @@ -1930,7 +1930,7 @@ AbortTransaction(void) LWLockRelease(ProcArrayLock); } - PG_TRACE1 (transaction__abort, s->transactionId); + PG_TRACE1(transaction__abort, s->transactionId); /* * Post-abort cleanup. See notes in CommitTransaction() concerning @@ -4206,8 +4206,8 @@ xact_desc_commit(StringInfo buf, xl_xact_commit *xlrec) int i; appendStringInfo(buf, "%04u-%02u-%02u %02u:%02u:%02u", - tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); if (xlrec->nrels > 0) { appendStringInfo(buf, "; rels:"); @@ -4216,7 +4216,7 @@ xact_desc_commit(StringInfo buf, xl_xact_commit *xlrec) RelFileNode rnode = xlrec->xnodes[i]; appendStringInfo(buf, " %u/%u/%u", - rnode.spcNode, rnode.dbNode, rnode.relNode); + rnode.spcNode, rnode.dbNode, rnode.relNode); } } if (xlrec->nsubxacts > 0) @@ -4237,8 +4237,8 @@ xact_desc_abort(StringInfo buf, xl_xact_abort *xlrec) int i; appendStringInfo(buf, "%04u-%02u-%02u %02u:%02u:%02u", - tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); if (xlrec->nrels > 0) { appendStringInfo(buf, "; rels:"); @@ -4247,7 +4247,7 @@ xact_desc_abort(StringInfo buf, xl_xact_abort *xlrec) RelFileNode rnode = xlrec->xnodes[i]; appendStringInfo(buf, " %u/%u/%u", - rnode.spcNode, rnode.dbNode, rnode.relNode); + rnode.spcNode, rnode.dbNode, rnode.relNode); } } if (xlrec->nsubxacts > 0) @@ -4264,7 +4264,7 @@ xact_desc_abort(StringInfo buf, xl_xact_abort *xlrec) void xact_desc(StringInfo buf, uint8 xl_info, char *rec) { - uint8 info = xl_info & ~XLR_INFO_MASK; + uint8 info = xl_info & ~XLR_INFO_MASK; if (info == XLOG_XACT_COMMIT) { diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 16fb6b5e5e8..7b5780b66da 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.249 2006/08/21 16:16:31 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.250 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -349,9 +349,9 @@ typedef struct XLogCtlInsert */ typedef struct XLogCtlWrite { - XLogwrtResult LogwrtResult; /* current value of LogwrtResult */ - int curridx; /* cache index of next block to write */ - time_t lastSegSwitchTime; /* time of last xlog segment switch */ + XLogwrtResult LogwrtResult; /* current value of LogwrtResult */ + int curridx; /* cache index of next block to write */ + time_t lastSegSwitchTime; /* time of last xlog segment switch */ } XLogCtlWrite; /* @@ -481,7 +481,7 @@ static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath, bool use_lock); static int XLogFileOpen(uint32 log, uint32 seg); static int XLogFileRead(uint32 log, uint32 seg, int emode); -static void XLogFileClose(void); +static void XLogFileClose(void); static bool RestoreArchivedFile(char *path, const char *xlogfname, const char *recovername, off_t expectedSize); static int PreallocXlogFiles(XLogRecPtr endptr); @@ -506,7 +506,7 @@ static void issue_xlog_fsync(void); static void xlog_outrec(StringInfo buf, XLogRecord *record); #endif static bool read_backup_label(XLogRecPtr *checkPointLoc, - XLogRecPtr *minRecoveryLoc); + XLogRecPtr *minRecoveryLoc); static void rm_redo_error_callback(void *arg); @@ -697,9 +697,9 @@ begin:; /* * NOTE: We disallow len == 0 because it provides a useful bit of extra * error checking in ReadRecord. This means that all callers of - * XLogInsert must supply at least some not-in-a-buffer data. However, - * we make an exception for XLOG SWITCH records because we don't want - * them to ever cross a segment boundary. + * XLogInsert must supply at least some not-in-a-buffer data. However, we + * make an exception for XLOG SWITCH records because we don't want them to + * ever cross a segment boundary. */ if (len == 0 && !isLogSwitch) elog(PANIC, "invalid xlog record length %u", len); @@ -752,8 +752,8 @@ begin:; * checkpoint, so it's better to be slow in this case and fast otherwise. * * If we aren't doing full-page writes then RedoRecPtr doesn't actually - * affect the contents of the XLOG record, so we'll update our local - * copy but not force a recomputation. + * affect the contents of the XLOG record, so we'll update our local copy + * but not force a recomputation. */ if (!XLByteEQ(RedoRecPtr, Insert->RedoRecPtr)) { @@ -782,10 +782,10 @@ begin:; } /* - * Also check to see if forcePageWrites was just turned on; if we - * weren't already doing full-page writes then go back and recompute. - * (If it was just turned off, we could recompute the record without - * full pages, but we choose not to bother.) + * Also check to see if forcePageWrites was just turned on; if we weren't + * already doing full-page writes then go back and recompute. (If it was + * just turned off, we could recompute the record without full pages, but + * we choose not to bother.) */ if (Insert->forcePageWrites && !doPageWrites) { @@ -870,11 +870,11 @@ begin:; INSERT_RECPTR(RecPtr, Insert, curridx); /* - * If the record is an XLOG_SWITCH, and we are exactly at the start - * of a segment, we need not insert it (and don't want to because - * we'd like consecutive switch requests to be no-ops). Instead, - * make sure everything is written and flushed through the end of - * the prior segment, and return the prior segment's end address. + * If the record is an XLOG_SWITCH, and we are exactly at the start of a + * segment, we need not insert it (and don't want to because we'd like + * consecutive switch requests to be no-ops). Instead, make sure + * everything is written and flushed through the end of the prior segment, + * and return the prior segment's end address. */ if (isLogSwitch && (RecPtr.xrecoff % XLogSegSize) == SizeOfXLogLongPHD) @@ -926,7 +926,7 @@ begin:; #ifdef WAL_DEBUG if (XLOG_DEBUG) { - StringInfoData buf; + StringInfoData buf; initStringInfo(&buf); appendStringInfo(&buf, "INSERT @ %X/%X: ", @@ -1019,8 +1019,8 @@ begin:; LWLockAcquire(WALWriteLock, LW_EXCLUSIVE); /* - * Flush through the end of the page containing XLOG_SWITCH, - * and perform end-of-segment actions (eg, notifying archiver). + * Flush through the end of the page containing XLOG_SWITCH, and + * perform end-of-segment actions (eg, notifying archiver). */ WriteRqst = XLogCtl->xlblocks[curridx]; FlushRqst.Write = WriteRqst; @@ -1667,8 +1667,8 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible, bool xlog_switch) * switch. * * This is also the right place to notify the Archiver that the - * segment is ready to copy to archival storage, and to update - * the timer for archive_timeout. + * segment is ready to copy to archival storage, and to update the + * timer for archive_timeout. */ if (finishing_seg || (xlog_switch && last_iteration)) { @@ -2300,36 +2300,35 @@ XLogFileClose(void) Assert(openLogFile >= 0); /* - * posix_fadvise is problematic on many platforms: on older x86 Linux - * it just dumps core, and there are reports of problems on PPC platforms - * as well. The following is therefore disabled for the time being. - * We could consider some kind of configure test to see if it's safe to - * use, but since we lack hard evidence that there's any useful performance - * gain to be had, spending time on that seems unprofitable for now. + * posix_fadvise is problematic on many platforms: on older x86 Linux it + * just dumps core, and there are reports of problems on PPC platforms as + * well. The following is therefore disabled for the time being. We could + * consider some kind of configure test to see if it's safe to use, but + * since we lack hard evidence that there's any useful performance gain to + * be had, spending time on that seems unprofitable for now. */ #ifdef NOT_USED /* * WAL segment files will not be re-read in normal operation, so we advise - * OS to release any cached pages. But do not do so if WAL archiving is + * OS to release any cached pages. But do not do so if WAL archiving is * active, because archiver process could use the cache to read the WAL * segment. * - * While O_DIRECT works for O_SYNC, posix_fadvise() works for fsync() - * and O_SYNC, and some platforms only have posix_fadvise(). + * While O_DIRECT works for O_SYNC, posix_fadvise() works for fsync() and + * O_SYNC, and some platforms only have posix_fadvise(). */ #if defined(HAVE_DECL_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) if (!XLogArchivingActive()) posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED); #endif - -#endif /* NOT_USED */ +#endif /* NOT_USED */ if (close(openLogFile)) ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not close log file %u, segment %u: %m", - openLogId, openLogSeg))); + (errcode_for_file_access(), + errmsg("could not close log file %u, segment %u: %m", + openLogId, openLogSeg))); openLogFile = -1; } @@ -2978,8 +2977,8 @@ ReadRecord(XLogRecPtr *RecPtr, int emode) got_record:; /* - * xl_len == 0 is bad data for everything except XLOG SWITCH, where - * it is required. + * xl_len == 0 is bad data for everything except XLOG SWITCH, where it is + * required. */ if (record->xl_rmid == RM_XLOG_ID && record->xl_info == XLOG_SWITCH) { @@ -3168,6 +3167,7 @@ got_record:; EndRecPtr.xrecoff = RecPtr->xrecoff + MAXALIGN(total_len); ReadRecPtr = *RecPtr; memcpy(buffer, record, total_len); + /* * Special processing if it's an XLOG SWITCH record */ @@ -3177,10 +3177,11 @@ got_record:; EndRecPtr.xrecoff += XLogSegSize - 1; EndRecPtr.xrecoff -= EndRecPtr.xrecoff % XLogSegSize; nextRecord = NULL; /* definitely not on same page */ + /* - * Pretend that readBuf contains the last page of the segment. - * This is just to avoid Assert failure in StartupXLOG if XLOG - * ends with this segment. + * Pretend that readBuf contains the last page of the segment. This is + * just to avoid Assert failure in StartupXLOG if XLOG ends with this + * segment. */ readOff = XLogSegSize - XLOG_BLCKSZ; } @@ -3661,7 +3662,7 @@ static void WriteControlFile(void) { int fd; - char buffer[PG_CONTROL_SIZE]; /* need not be aligned */ + char buffer[PG_CONTROL_SIZE]; /* need not be aligned */ char *localeptr; /* @@ -3846,9 +3847,9 @@ ReadControlFile(void) if (ControlFile->xlog_blcksz != XLOG_BLCKSZ) ereport(FATAL, (errmsg("database files are incompatible with server"), - errdetail("The database cluster was initialized with XLOG_BLCKSZ %d," - " but the server was compiled with XLOG_BLCKSZ %d.", - ControlFile->xlog_blcksz, XLOG_BLCKSZ), + errdetail("The database cluster was initialized with XLOG_BLCKSZ %d," + " but the server was compiled with XLOG_BLCKSZ %d.", + ControlFile->xlog_blcksz, XLOG_BLCKSZ), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->xlog_seg_size != XLOG_SEG_SIZE) ereport(FATAL, @@ -4027,7 +4028,7 @@ XLOGShmemInit(void) * Do basic initialization of XLogCtl shared data. (StartupXLOG will fill * in additional info.) */ - XLogCtl->XLogCacheByte = (Size) XLOG_BLCKSZ * XLOGbuffers; + XLogCtl->XLogCacheByte = (Size) XLOG_BLCKSZ *XLOGbuffers; XLogCtl->XLogCacheBlck = XLOGbuffers - 1; XLogCtl->Insert.currpage = (XLogPageHeader) (XLogCtl->pages); @@ -4649,10 +4650,10 @@ StartupXLOG(void) " you will have to use the last backup for recovery."))); else if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY) ereport(LOG, - (errmsg("database system was interrupted while in recovery at log time %s", - str_time(ControlFile->checkPointCopy.time)), - errhint("If this has occurred more than once some data may be corrupted" - " and you may need to choose an earlier recovery target."))); + (errmsg("database system was interrupted while in recovery at log time %s", + str_time(ControlFile->checkPointCopy.time)), + errhint("If this has occurred more than once some data may be corrupted" + " and you may need to choose an earlier recovery target."))); else if (ControlFile->state == DB_IN_PRODUCTION) ereport(LOG, (errmsg("database system was interrupted at %s", @@ -4812,10 +4813,10 @@ StartupXLOG(void) int rmid; /* - * Update pg_control to show that we are recovering and to show - * the selected checkpoint as the place we are starting from. - * We also mark pg_control with any minimum recovery stop point - * obtained from a backup history file. + * Update pg_control to show that we are recovering and to show the + * selected checkpoint as the place we are starting from. We also mark + * pg_control with any minimum recovery stop point obtained from a + * backup history file. */ if (InArchiveRecovery) { @@ -4839,12 +4840,12 @@ StartupXLOG(void) UpdateControlFile(); /* - * If there was a backup label file, it's done its job and the - * info has now been propagated into pg_control. We must get rid of - * the label file so that if we crash during recovery, we'll pick up - * at the latest recovery restartpoint instead of going all the way - * back to the backup start point. It seems prudent though to just - * rename the file out of the way rather than delete it completely. + * If there was a backup label file, it's done its job and the info + * has now been propagated into pg_control. We must get rid of the + * label file so that if we crash during recovery, we'll pick up at + * the latest recovery restartpoint instead of going all the way back + * to the backup start point. It seems prudent though to just rename + * the file out of the way rather than delete it completely. */ if (haveBackupLabel) { @@ -4884,7 +4885,7 @@ StartupXLOG(void) { bool recoveryContinue = true; bool recoveryApply = true; - ErrorContextCallback errcontext; + ErrorContextCallback errcontext; InRedo = true; ereport(LOG, @@ -4899,17 +4900,17 @@ StartupXLOG(void) #ifdef WAL_DEBUG if (XLOG_DEBUG) { - StringInfoData buf; + StringInfoData buf; initStringInfo(&buf); appendStringInfo(&buf, "REDO @ %X/%X; LSN %X/%X: ", - ReadRecPtr.xlogid, ReadRecPtr.xrecoff, - EndRecPtr.xlogid, EndRecPtr.xrecoff); + ReadRecPtr.xlogid, ReadRecPtr.xrecoff, + EndRecPtr.xlogid, EndRecPtr.xrecoff); xlog_outrec(&buf, record); appendStringInfo(&buf, " - "); RmgrTable[record->xl_rmid].rm_desc(&buf, record->xl_info, - XLogRecGetData(record)); + XLogRecGetData(record)); elog(LOG, "%s", buf.data); pfree(buf.data); } @@ -5383,9 +5384,9 @@ GetRecentNextXid(void) void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch) { - uint32 ckptXidEpoch; - TransactionId ckptXid; - TransactionId nextXid; + uint32 ckptXidEpoch; + TransactionId ckptXid; + TransactionId nextXid; /* Must read checkpoint info first, else have race condition */ { @@ -5718,7 +5719,7 @@ CheckPointGuts(XLogRecPtr checkPointRedo) CheckPointCLOG(); CheckPointSUBTRANS(); CheckPointMultiXact(); - FlushBufferPool(); /* performs all required fsyncs */ + FlushBufferPool(); /* performs all required fsyncs */ /* We deliberately delay 2PC checkpointing as long as possible */ CheckPointTwoPhase(checkPointRedo); } @@ -5735,12 +5736,12 @@ CheckPointGuts(XLogRecPtr checkPointRedo) static void RecoveryRestartPoint(const CheckPoint *checkPoint) { - int elapsed_secs; - int rmid; + int elapsed_secs; + int rmid; /* - * Do nothing if the elapsed time since the last restartpoint is less - * than half of checkpoint_timeout. (We use a value less than + * Do nothing if the elapsed time since the last restartpoint is less than + * half of checkpoint_timeout. (We use a value less than * checkpoint_timeout so that variations in the timing of checkpoints on * the master, or speed of transmission of WAL segments to a slave, won't * make the slave skip a restartpoint once it's synced with the master.) @@ -5770,9 +5771,9 @@ RecoveryRestartPoint(const CheckPoint *checkPoint) CheckPointGuts(checkPoint->redo); /* - * Update pg_control so that any subsequent crash will restart from - * this checkpoint. Note: ReadRecPtr gives the XLOG address of the - * checkpoint record itself. + * Update pg_control so that any subsequent crash will restart from this + * checkpoint. Note: ReadRecPtr gives the XLOG address of the checkpoint + * record itself. */ ControlFile->prevCheckPoint = ControlFile->checkPoint; ControlFile->checkPoint = ReadRecPtr; @@ -5926,7 +5927,7 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) void xlog_desc(StringInfo buf, uint8 xl_info, char *rec) { - uint8 info = xl_info & ~XLR_INFO_MASK; + uint8 info = xl_info & ~XLR_INFO_MASK; if (info == XLOG_CHECKPOINT_SHUTDOWN || info == XLOG_CHECKPOINT_ONLINE) @@ -5934,15 +5935,15 @@ xlog_desc(StringInfo buf, uint8 xl_info, char *rec) CheckPoint *checkpoint = (CheckPoint *) rec; appendStringInfo(buf, "checkpoint: redo %X/%X; undo %X/%X; " - "tli %u; xid %u/%u; oid %u; multi %u; offset %u; %s", - checkpoint->redo.xlogid, checkpoint->redo.xrecoff, - checkpoint->undo.xlogid, checkpoint->undo.xrecoff, - checkpoint->ThisTimeLineID, - checkpoint->nextXidEpoch, checkpoint->nextXid, - checkpoint->nextOid, - checkpoint->nextMulti, - checkpoint->nextMultiOffset, - (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online"); + "tli %u; xid %u/%u; oid %u; multi %u; offset %u; %s", + checkpoint->redo.xlogid, checkpoint->redo.xrecoff, + checkpoint->undo.xlogid, checkpoint->undo.xrecoff, + checkpoint->ThisTimeLineID, + checkpoint->nextXidEpoch, checkpoint->nextXid, + checkpoint->nextOid, + checkpoint->nextMulti, + checkpoint->nextMultiOffset, + (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online"); } else if (info == XLOG_NEXTOID) { @@ -5973,7 +5974,7 @@ xlog_outrec(StringInfo buf, XLogRecord *record) for (i = 0; i < XLR_MAX_BKP_BLOCKS; i++) { if (record->xl_info & XLR_SET_BKP_BLOCK(i)) - appendStringInfo(buf, "; bkpb%d", i+1); + appendStringInfo(buf, "; bkpb%d", i + 1); } appendStringInfo(buf, ": %s", RmgrTable[record->xl_rmid].rm_name); @@ -6142,18 +6143,18 @@ pg_start_backup(PG_FUNCTION_ARGS) * Mark backup active in shared memory. We must do full-page WAL writes * during an on-line backup even if not doing so at other times, because * it's quite possible for the backup dump to obtain a "torn" (partially - * written) copy of a database page if it reads the page concurrently - * with our write to the same page. This can be fixed as long as the - * first write to the page in the WAL sequence is a full-page write. - * Hence, we turn on forcePageWrites and then force a CHECKPOINT, to - * ensure there are no dirty pages in shared memory that might get - * dumped while the backup is in progress without having a corresponding - * WAL record. (Once the backup is complete, we need not force full-page - * writes anymore, since we expect that any pages not modified during - * the backup interval must have been correctly captured by the backup.) + * written) copy of a database page if it reads the page concurrently with + * our write to the same page. This can be fixed as long as the first + * write to the page in the WAL sequence is a full-page write. Hence, we + * turn on forcePageWrites and then force a CHECKPOINT, to ensure there + * are no dirty pages in shared memory that might get dumped while the + * backup is in progress without having a corresponding WAL record. (Once + * the backup is complete, we need not force full-page writes anymore, + * since we expect that any pages not modified during the backup interval + * must have been correctly captured by the backup.) * - * We must hold WALInsertLock to change the value of forcePageWrites, - * to ensure adequate interlocking against XLogInsert(). + * We must hold WALInsertLock to change the value of forcePageWrites, to + * ensure adequate interlocking against XLogInsert(). */ LWLockAcquire(WALInsertLock, LW_EXCLUSIVE); if (XLogCtl->Insert.forcePageWrites) @@ -6171,7 +6172,7 @@ pg_start_backup(PG_FUNCTION_ARGS) PG_TRY(); { /* - * Force a CHECKPOINT. Aside from being necessary to prevent torn + * Force a CHECKPOINT. Aside from being necessary to prevent torn * page problems, this guarantees that two successive backup runs will * have different checkpoint positions and hence different history * file names, even if nothing happened in between. @@ -6303,10 +6304,9 @@ pg_stop_backup(PG_FUNCTION_ARGS) LWLockRelease(WALInsertLock); /* - * Force a switch to a new xlog segment file, so that the backup - * is valid as soon as archiver moves out the current segment file. - * We'll report the end address of the XLOG SWITCH record as the backup - * stopping point. + * Force a switch to a new xlog segment file, so that the backup is valid + * as soon as archiver moves out the current segment file. We'll report + * the end address of the XLOG SWITCH record as the backup stopping point. */ stoppoint = RequestXLogSwitch(); @@ -6392,9 +6392,9 @@ pg_stop_backup(PG_FUNCTION_ARGS) BACKUP_LABEL_FILE))); /* - * Clean out any no-longer-needed history files. As a side effect, - * this will post a .ready file for the newly created history file, - * notifying the archiver that history file may be archived immediately. + * Clean out any no-longer-needed history files. As a side effect, this + * will post a .ready file for the newly created history file, notifying + * the archiver that history file may be archived immediately. */ CleanupBackupHistory(); @@ -6415,7 +6415,7 @@ Datum pg_switch_xlog(PG_FUNCTION_ARGS) { text *result; - XLogRecPtr switchpoint; + XLogRecPtr switchpoint; char location[MAXFNAMELEN]; if (!superuser()) @@ -6514,17 +6514,17 @@ pg_xlogfile_name_offset(PG_FUNCTION_ARGS) uint32 xrecoff; XLogRecPtr locationpoint; char xlogfilename[MAXFNAMELEN]; - Datum values[2]; - bool isnull[2]; - TupleDesc resultTupleDesc; - HeapTuple resultHeapTuple; - Datum result; + Datum values[2]; + bool isnull[2]; + TupleDesc resultTupleDesc; + HeapTuple resultHeapTuple; + Datum result; /* * Read input and parse */ locationstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(location))); + PointerGetDatum(location))); if (sscanf(locationstr, "%X/%X", &uxlogid, &uxrecoff) != 2) ereport(ERROR, @@ -6536,8 +6536,8 @@ pg_xlogfile_name_offset(PG_FUNCTION_ARGS) locationpoint.xrecoff = uxrecoff; /* - * Construct a tuple descriptor for the result row. This must match - * this function's pg_proc entry! + * Construct a tuple descriptor for the result row. This must match this + * function's pg_proc entry! */ resultTupleDesc = CreateTemplateTupleDesc(2, false); TupleDescInitEntry(resultTupleDesc, (AttrNumber) 1, "file_name", @@ -6593,7 +6593,7 @@ pg_xlogfile_name(PG_FUNCTION_ARGS) char xlogfilename[MAXFNAMELEN]; locationstr = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(location))); + PointerGetDatum(location))); if (sscanf(locationstr, "%X/%X", &uxlogid, &uxrecoff) != 2) ereport(ERROR, @@ -6608,7 +6608,7 @@ pg_xlogfile_name(PG_FUNCTION_ARGS) XLogFileName(xlogfilename, ThisTimeLineID, xlogid, xlogseg); result = DatumGetTextP(DirectFunctionCall1(textin, - CStringGetDatum(xlogfilename))); + CStringGetDatum(xlogfilename))); PG_RETURN_TEXT_P(result); } @@ -6734,8 +6734,8 @@ read_backup_label(XLogRecPtr *checkPointLoc, XLogRecPtr *minRecoveryLoc) static void rm_redo_error_callback(void *arg) { - XLogRecord *record = (XLogRecord *) arg; - StringInfoData buf; + XLogRecord *record = (XLogRecord *) arg; + StringInfoData buf; initStringInfo(&buf); RmgrTable[record->xl_rmid].rm_desc(&buf, diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index d7fb9359dec..e1d3b700011 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.47 2006/07/14 14:52:17 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.48 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -172,8 +172,8 @@ XLogCheckInvalidPages(void) hash_seq_init(&status, invalid_page_tab); /* - * Our strategy is to emit WARNING messages for all remaining entries - * and only PANIC after we've dumped all the available info. + * Our strategy is to emit WARNING messages for all remaining entries and + * only PANIC after we've dumped all the available info. */ while ((hentry = (xl_invalid_page *) hash_seq_search(&status)) != NULL) { @@ -255,7 +255,7 @@ XLogReadBuffer(Relation reln, BlockNumber blkno, bool init) if (!init) { /* check that page has been initialized */ - Page page = (Page) BufferGetPage(buffer); + Page page = (Page) BufferGetPage(buffer); if (PageIsNew((PageHeader) page)) { diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 06d8a5ca4fc..70b9172cd7f 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.224 2006/08/15 22:36:17 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.225 2006/10/04 00:29:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -381,8 +381,8 @@ BootstrapMain(int argc, char *argv[]) /* * When we are a dummy process, we aren't going to do the full - * InitPostgres pushups, but there are a couple of things that need - * to get lit up even in a dummy process. + * InitPostgres pushups, but there are a couple of things that need to get + * lit up even in a dummy process. */ if (IsUnderPostmaster) { @@ -421,6 +421,7 @@ BootstrapMain(int argc, char *argv[]) case BS_XLOG_STARTUP: bootstrap_signals(); StartupXLOG(); + /* * These next two functions don't consider themselves critical, * but we'd best PANIC anyway if they fail. @@ -1229,7 +1230,7 @@ AddStr(char *str, int strlength, int mderef) * We postpone actually building the indexes until just before we're * finished with initialization, however. This is because the indexes * themselves have catalog entries, and those have to be included in the - * indexes on those catalogs. Doing it in two phases is the simplest + * indexes on those catalogs. Doing it in two phases is the simplest * way of making sure the indexes have the right contents at the end. */ void diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index e74c9b4410e..27ca6e011aa 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.131 2006/09/05 21:08:35 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.132 2006/10/04 00:29:50 momjian Exp $ * * NOTES * See acl.h. @@ -53,9 +53,9 @@ static List *objectNamesToOids(GrantObjectType objtype, List *objnames); static AclMode string_to_privilege(const char *privname); static const char *privilege_to_string(AclMode privilege); static AclMode restrict_and_check_grant(bool is_grant, AclMode avail_goptions, - bool all_privs, AclMode privileges, - Oid objectId, Oid grantorId, - AclObjectKind objkind, char *objname); + bool all_privs, AclMode privileges, + Oid objectId, Oid grantorId, + AclObjectKind objkind, char *objname); static AclMode pg_aclmask(AclObjectKind objkind, Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how); @@ -156,8 +156,8 @@ restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, AclMode privileges, Oid objectId, Oid grantorId, AclObjectKind objkind, char *objname) { - AclMode this_privileges; - AclMode whole_mask; + AclMode this_privileges; + AclMode whole_mask; switch (objkind) { @@ -189,9 +189,9 @@ restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, } /* - * If we found no grant options, consider whether to issue a hard - * error. Per spec, having any privilege at all on the object will - * get you by here. + * If we found no grant options, consider whether to issue a hard error. + * Per spec, having any privilege at all on the object will get you by + * here. */ if (avail_goptions == ACL_NO_RIGHTS) { @@ -203,11 +203,10 @@ restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, /* * Restrict the operation to what we can actually grant or revoke, and - * issue a warning if appropriate. (For REVOKE this isn't quite what - * the spec says to do: the spec seems to want a warning only if no - * privilege bits actually change in the ACL. In practice that - * behavior seems much too noisy, as well as inconsistent with the - * GRANT case.) + * issue a warning if appropriate. (For REVOKE this isn't quite what the + * spec says to do: the spec seems to want a warning only if no privilege + * bits actually change in the ACL. In practice that behavior seems much + * too noisy, as well as inconsistent with the GRANT case.) */ this_privileges = privileges & ACL_OPTION_TO_PRIVS(avail_goptions); if (is_grant) @@ -215,18 +214,18 @@ restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, if (this_privileges == 0) ereport(WARNING, (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED), - errmsg("no privileges were granted for \"%s\"", objname))); + errmsg("no privileges were granted for \"%s\"", objname))); else if (!all_privs && this_privileges != privileges) ereport(WARNING, (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED), - errmsg("not all privileges were granted for \"%s\"", objname))); + errmsg("not all privileges were granted for \"%s\"", objname))); } else { if (this_privileges == 0) ereport(WARNING, (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED), - errmsg("no privileges could be revoked for \"%s\"", objname))); + errmsg("no privileges could be revoked for \"%s\"", objname))); else if (!all_privs && this_privileges != privileges) ereport(WARNING, (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED), @@ -285,11 +284,11 @@ ExecuteGrantStmt(GrantStmt *stmt) */ switch (stmt->objtype) { - /* - * Because this might be a sequence, we test both relation - * and sequence bits, and later do a more limited test - * when we know the object type. - */ + /* + * Because this might be a sequence, we test both relation and + * sequence bits, and later do a more limited test when we know + * the object type. + */ case ACL_OBJECT_RELATION: all_privileges = ACL_ALL_RIGHTS_RELATION | ACL_ALL_RIGHTS_SEQUENCE; errormsg = _("invalid privilege type %s for relation"); @@ -329,6 +328,7 @@ ExecuteGrantStmt(GrantStmt *stmt) if (stmt->privileges == NIL) { istmt.all_privs = true; + /* * will be turned into ACL_ALL_RIGHTS_* by the internal routines * depending on the object type @@ -595,28 +595,28 @@ ExecGrant_Relation(InternalGrant *istmt) } else this_privileges = istmt->privileges; - + /* - * The GRANT TABLE syntax can be used for sequences and - * non-sequences, so we have to look at the relkind to - * determine the supported permissions. The OR of - * table and sequence permissions were already checked. + * The GRANT TABLE syntax can be used for sequences and non-sequences, + * so we have to look at the relkind to determine the supported + * permissions. The OR of table and sequence permissions were already + * checked. */ if (istmt->objtype == ACL_OBJECT_RELATION) { if (pg_class_tuple->relkind == RELKIND_SEQUENCE) { /* - * For backward compatibility, throw just a warning - * for invalid sequence permissions when using the - * non-sequence GRANT syntax is used. + * For backward compatibility, throw just a warning for + * invalid sequence permissions when using the non-sequence + * GRANT syntax is used. */ if (this_privileges & ~((AclMode) ACL_ALL_RIGHTS_SEQUENCE)) { /* - * Mention the object name because the user needs to - * know which operations succeeded. This is required - * because WARNING allows the command to continue. + * Mention the object name because the user needs to know + * which operations succeeded. This is required because + * WARNING allows the command to continue. */ ereport(WARNING, (errcode(ERRCODE_INVALID_GRANT_OPERATION), @@ -628,15 +628,16 @@ ExecGrant_Relation(InternalGrant *istmt) else { if (this_privileges & ~((AclMode) ACL_ALL_RIGHTS_RELATION)) + /* - * USAGE is the only permission supported by sequences - * but not by non-sequences. Don't mention the object - * name because we didn't in the combined TABLE | - * SEQUENCE check. + * USAGE is the only permission supported by sequences but + * not by non-sequences. Don't mention the object name + * because we didn't in the combined TABLE | SEQUENCE + * check. */ ereport(ERROR, (errcode(ERRCODE_INVALID_GRANT_OPERATION), - errmsg("invalid privilege type USAGE for table"))); + errmsg("invalid privilege type USAGE for table"))); } } @@ -660,15 +661,15 @@ ExecGrant_Relation(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, istmt->all_privs, this_privileges, relOid, grantorId, - pg_class_tuple->relkind == RELKIND_SEQUENCE - ? ACL_KIND_SEQUENCE : ACL_KIND_CLASS, + pg_class_tuple->relkind == RELKIND_SEQUENCE + ? ACL_KIND_SEQUENCE : ACL_KIND_CLASS, NameStr(pg_class_tuple->relname)); /* @@ -777,8 +778,8 @@ ExecGrant_Database(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, @@ -893,8 +894,8 @@ ExecGrant_Function(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, @@ -1019,8 +1020,8 @@ ExecGrant_Language(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, @@ -1136,8 +1137,8 @@ ExecGrant_Namespace(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, @@ -1259,8 +1260,8 @@ ExecGrant_Tablespace(InternalGrant *istmt) &grantorId, &avail_goptions); /* - * Restrict the privileges to what we can actually grant, and emit - * the standards-mandated warning and error messages. + * Restrict the privileges to what we can actually grant, and emit the + * standards-mandated warning and error messages. */ this_privileges = restrict_and_check_grant(istmt->is_grant, avail_goptions, @@ -1565,7 +1566,7 @@ pg_class_aclmask(Oid table_oid, Oid roleid, * * As of 7.4 we have some updatable system views; those shouldn't be * protected in this way. Assume the view rules can take care of - * themselves. ACL_USAGE is if we ever have system sequences. + * themselves. ACL_USAGE is if we ever have system sequences. */ if ((mask & (ACL_INSERT | ACL_UPDATE | ACL_DELETE | ACL_USAGE)) && IsSystemClass(classForm) && @@ -1602,7 +1603,7 @@ pg_class_aclmask(Oid table_oid, Oid roleid, { /* No ACL, so build default ACL */ acl = acldefault(classForm->relkind == RELKIND_SEQUENCE ? - ACL_OBJECT_SEQUENCE : ACL_OBJECT_RELATION, + ACL_OBJECT_SEQUENCE : ACL_OBJECT_RELATION, ownerId); aclDatum = (Datum) 0; } diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index 5d99acafc95..d302f023a9c 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.67 2006/07/31 20:09:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.68 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -233,7 +233,7 @@ IsReservedName(const char *name) * * Hard-wiring this list is pretty grotty, but we really need it so that * we can compute the locktag for a relation (and then lock it) without - * having already read its pg_class entry. If we try to retrieve relisshared + * having already read its pg_class entry. If we try to retrieve relisshared * from pg_class with no pre-existing lock, there is a race condition against * anyone who is concurrently committing a change to the pg_class entry: * since we read system catalog entries under SnapshotNow, it's possible diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 7007e838734..cab4f1006bc 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.59 2006/08/20 21:56:16 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.60 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -63,6 +63,7 @@ struct ObjectAddresses int numrefs; /* current number of references */ int maxrefs; /* current size of palloc'd array */ }; + /* typedef ObjectAddresses appears in dependency.h */ /* for find_expr_references_walker */ @@ -244,8 +245,8 @@ performMultipleDeletions(const ObjectAddresses *objects, { ObjectAddresses *implicit; ObjectAddresses *alreadyDeleted; - Relation depRel; - int i; + Relation depRel; + int i; implicit = new_object_addresses(); alreadyDeleted = new_object_addresses(); @@ -271,8 +272,8 @@ performMultipleDeletions(const ObjectAddresses *objects, continue; /* - * Add the objects dependent on this one to the global list of implicit - * objects. + * Add the objects dependent on this one to the global list of + * implicit objects. */ findAutoDeletableObjects(&obj, implicit, depRel, false); } @@ -707,8 +708,8 @@ recursiveDeletion(const ObjectAddress *object, */ /* - * Step 3: delete the object itself, and save it to the list of - * deleted objects if appropiate. + * Step 3: delete the object itself, and save it to the list of deleted + * objects if appropiate. */ doDeletion(object); if (alreadyDeleted != NULL) @@ -1284,7 +1285,7 @@ find_expr_references_walker(Node *node, } if (IsA(node, RelabelType)) { - RelabelType *relab = (RelabelType *) node; + RelabelType *relab = (RelabelType *) node; /* since there is no function dependency, need to depend on type */ add_object_address(OCLASS_TYPE, relab->resulttype, 0, @@ -1300,7 +1301,7 @@ find_expr_references_walker(Node *node, } if (IsA(node, RowExpr)) { - RowExpr *rowexpr = (RowExpr *) node; + RowExpr *rowexpr = (RowExpr *) node; add_object_address(OCLASS_TYPE, rowexpr->row_typeid, 0, context->addrs); @@ -1471,7 +1472,7 @@ object_address_comparator(const void *a, const void *b) ObjectAddresses * new_object_addresses(void) { - ObjectAddresses *addrs; + ObjectAddresses *addrs; addrs = palloc(sizeof(ObjectAddresses)); diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index e1f3e194b63..d30556d48c1 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.312 2006/08/02 01:59:44 joe Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.313 2006/10/04 00:29:50 momjian Exp $ * * * INTERFACE ROUTINES @@ -607,8 +607,8 @@ InsertPgClassTuple(Relation pg_class_desc, tup = heap_formtuple(RelationGetDescr(pg_class_desc), values, nulls); /* - * The new tuple must have the oid already chosen for the rel. Sure - * would be embarrassing to do this sort of thing in polite company. + * The new tuple must have the oid already chosen for the rel. Sure would + * be embarrassing to do this sort of thing in polite company. */ HeapTupleSetOid(tup, new_rel_oid); @@ -666,8 +666,8 @@ AddNewRelationTuple(Relation pg_class_desc, else { /* - * Other relations will not have Xids in them, so set the initial value - * to InvalidTransactionId. + * Other relations will not have Xids in them, so set the initial + * value to InvalidTransactionId. */ new_rel_reltup->relminxid = InvalidTransactionId; new_rel_reltup->relvacuumxid = InvalidTransactionId; @@ -1975,7 +1975,7 @@ RemoveStatistics(Oid relid, AttrNumber attnum) * with the heap relation to zero tuples. * * The routine will truncate and then reconstruct the indexes on - * the specified relation. Caller must hold exclusive lock on rel. + * the specified relation. Caller must hold exclusive lock on rel. */ static void RelationTruncateIndexes(Relation heapRelation) @@ -2103,7 +2103,7 @@ heap_truncate_check_FKs(List *relations, bool tempTables) return; /* - * Otherwise, must scan pg_constraint. We make one pass with all the + * Otherwise, must scan pg_constraint. We make one pass with all the * relations considered; if this finds nothing, then all is well. */ dependents = heap_truncate_find_FKs(oids); @@ -2119,19 +2119,19 @@ heap_truncate_check_FKs(List *relations, bool tempTables) */ foreach(cell, oids) { - Oid relid = lfirst_oid(cell); - ListCell *cell2; + Oid relid = lfirst_oid(cell); + ListCell *cell2; dependents = heap_truncate_find_FKs(list_make1_oid(relid)); foreach(cell2, dependents) { - Oid relid2 = lfirst_oid(cell2); + Oid relid2 = lfirst_oid(cell2); if (!list_member_oid(oids, relid2)) { - char *relname = get_rel_name(relid); - char *relname2 = get_rel_name(relid2); + char *relname = get_rel_name(relid); + char *relname2 = get_rel_name(relid2); if (tempTables) ereport(ERROR, @@ -2145,9 +2145,9 @@ heap_truncate_check_FKs(List *relations, bool tempTables) errmsg("cannot truncate a table referenced in a foreign key constraint"), errdetail("Table \"%s\" references \"%s\".", relname2, relname), - errhint("Truncate table \"%s\" at the same time, " - "or use TRUNCATE ... CASCADE.", - relname2))); + errhint("Truncate table \"%s\" at the same time, " + "or use TRUNCATE ... CASCADE.", + relname2))); } } } @@ -2164,7 +2164,7 @@ heap_truncate_check_FKs(List *relations, bool tempTables) * behavior to change depending on chance locations of rows in pg_constraint.) * * Note: caller should already have appropriate lock on all rels mentioned - * in relationIds. Since adding or dropping an FK requires exclusive lock + * in relationIds. Since adding or dropping an FK requires exclusive lock * on both rels, this ensures that the answer will be stable. */ List * @@ -2176,8 +2176,8 @@ heap_truncate_find_FKs(List *relationIds) HeapTuple tuple; /* - * Must scan pg_constraint. Right now, it is a seqscan because - * there is no available index on confrelid. + * Must scan pg_constraint. Right now, it is a seqscan because there is + * no available index on confrelid. */ fkeyRel = heap_open(ConstraintRelationId, AccessShareLock); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 60a30ce3727..290cd276881 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.273 2006/08/25 04:06:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.274 2006/10/04 00:29:50 momjian Exp $ * * * INTERFACE ROUTINES @@ -58,7 +58,9 @@ typedef struct { Tuplesortstate *tuplesort; /* for sorting the index TIDs */ /* statistics (for debug purposes only): */ - double htups, itups, tups_inserted; + double htups, + itups, + tups_inserted; } v_i_state; /* non-export function prototypes */ @@ -449,7 +451,7 @@ UpdateIndexRelation(Oid indexoid, * allow_system_table_mods: allow table to be a system catalog * skip_build: true to skip the index_build() step for the moment; caller * must do it later (typically via reindex_index()) - * concurrent: if true, do not lock the table against writers. The index + * concurrent: if true, do not lock the table against writers. The index * will be marked "invalid" and the caller must take additional steps * to fix it up. * @@ -486,7 +488,7 @@ index_create(Oid heapRelationId, * (but not VACUUM). */ heapRelation = heap_open(heapRelationId, - (concurrent ? ShareUpdateExclusiveLock : ShareLock)); + (concurrent ? ShareUpdateExclusiveLock : ShareLock)); /* * The index will be in the same namespace as its parent table, and is @@ -509,8 +511,8 @@ index_create(Oid heapRelationId, errmsg("user-defined indexes on system catalog tables are not supported"))); /* - * concurrent index build on a system catalog is unsafe because we tend - * to release locks before committing in catalogs + * concurrent index build on a system catalog is unsafe because we tend to + * release locks before committing in catalogs */ if (concurrent && IsSystemRelation(heapRelation)) @@ -766,8 +768,8 @@ index_create(Oid heapRelationId, { /* * Caller is responsible for filling the index later on. However, - * we'd better make sure that the heap relation is correctly marked - * as having an index. + * we'd better make sure that the heap relation is correctly marked as + * having an index. */ index_update_stats(heapRelation, true, @@ -932,7 +934,7 @@ BuildIndexInfo(Relation index) /* other info */ ii->ii_Unique = indexStruct->indisunique; - ii->ii_Concurrent = false; /* assume normal case */ + ii->ii_Concurrent = false; /* assume normal case */ return ii; } @@ -1018,7 +1020,7 @@ FormIndexDatum(IndexInfo *indexInfo, * index_update_stats --- update pg_class entry after CREATE INDEX or REINDEX * * This routine updates the pg_class row of either an index or its parent - * relation after CREATE INDEX or REINDEX. Its rather bizarre API is designed + * relation after CREATE INDEX or REINDEX. Its rather bizarre API is designed * to ensure we can do all the necessary work in just one update. * * hasindex: set relhasindex to this value @@ -1031,7 +1033,7 @@ FormIndexDatum(IndexInfo *indexInfo, * * NOTE: an important side-effect of this operation is that an SI invalidation * message is sent out to all backends --- including me --- causing relcache - * entries to be flushed or updated with the new data. This must happen even + * entries to be flushed or updated with the new data. This must happen even * if we find that no change is needed in the pg_class row. When updating * a heap entry, this ensures that other backends find out about the new * index. When updating an index, it's important because some index AMs @@ -1041,7 +1043,7 @@ static void index_update_stats(Relation rel, bool hasindex, bool isprimary, Oid reltoastidxid, double reltuples) { - BlockNumber relpages = RelationGetNumberOfBlocks(rel); + BlockNumber relpages = RelationGetNumberOfBlocks(rel); Oid relid = RelationGetRelid(rel); Relation pg_class; HeapTuple tuple; @@ -1054,9 +1056,9 @@ index_update_stats(Relation rel, bool hasindex, bool isprimary, * * 1. In bootstrap mode, we have no choice --- UPDATE wouldn't work. * - * 2. We could be reindexing pg_class itself, in which case we can't - * move its pg_class row because CatalogUpdateIndexes might not know - * about all the indexes yet (see reindex_relation). + * 2. We could be reindexing pg_class itself, in which case we can't move + * its pg_class row because CatalogUpdateIndexes might not know about all + * the indexes yet (see reindex_relation). * * 3. Because we execute CREATE INDEX with just share lock on the parent * rel (to allow concurrent index creations), an ordinary update could @@ -1069,24 +1071,24 @@ index_update_stats(Relation rel, bool hasindex, bool isprimary, * 4. Even with just a single CREATE INDEX, there's a risk factor because * someone else might be trying to open the rel while we commit, and this * creates a race condition as to whether he will see both or neither of - * the pg_class row versions as valid. Again, a non-transactional update + * the pg_class row versions as valid. Again, a non-transactional update * avoids the risk. It is indeterminate which state of the row the other * process will see, but it doesn't matter (if he's only taking * AccessShareLock, then it's not critical that he see relhasindex true). * * It is safe to use a non-transactional update even though our - * transaction could still fail before committing. Setting relhasindex + * transaction could still fail before committing. Setting relhasindex * true is safe even if there are no indexes (VACUUM will eventually fix - * it), and of course the relpages and reltuples counts are correct (or - * at least more so than the old values) regardless. + * it), and of course the relpages and reltuples counts are correct (or at + * least more so than the old values) regardless. */ pg_class = heap_open(RelationRelationId, RowExclusiveLock); /* - * Make a copy of the tuple to update. Normally we use the syscache, - * but we can't rely on that during bootstrap or while reindexing - * pg_class itself. + * Make a copy of the tuple to update. Normally we use the syscache, but + * we can't rely on that during bootstrap or while reindexing pg_class + * itself. */ if (IsBootstrapProcessingMode() || ReindexIsProcessingHeap(RelationRelationId)) @@ -1245,7 +1247,7 @@ setNewRelfilenode(Relation relation) * index_build - invoke access-method-specific index build procedure * * On entry, the index's catalog entries are valid, and its physical disk - * file has been created but is empty. We call the AM-specific build + * file has been created but is empty. We call the AM-specific build * procedure to fill in the index contents. We then update the pg_class * entries of the index and heap relation as needed, using statistics * returned by ambuild as well as data passed by the caller. @@ -1365,22 +1367,21 @@ IndexBuildHeapScan(Relation heapRelation, estate); /* - * Prepare for scan of the base relation. In a normal index build, - * we use SnapshotAny because we must retrieve all tuples and do our own - * time qual checks (because we have to index RECENTLY_DEAD tuples). - * In a concurrent build, we take a regular MVCC snapshot and index - * whatever's live according to that. During bootstrap we just use - * SnapshotNow. + * Prepare for scan of the base relation. In a normal index build, we use + * SnapshotAny because we must retrieve all tuples and do our own time + * qual checks (because we have to index RECENTLY_DEAD tuples). In a + * concurrent build, we take a regular MVCC snapshot and index whatever's + * live according to that. During bootstrap we just use SnapshotNow. */ if (IsBootstrapProcessingMode()) { snapshot = SnapshotNow; - OldestXmin = InvalidTransactionId; /* not used */ + OldestXmin = InvalidTransactionId; /* not used */ } else if (indexInfo->ii_Concurrent) { snapshot = CopySnapshot(GetTransactionSnapshot()); - OldestXmin = InvalidTransactionId; /* not used */ + OldestXmin = InvalidTransactionId; /* not used */ } else { @@ -1391,8 +1392,8 @@ IndexBuildHeapScan(Relation heapRelation, scan = heap_beginscan(heapRelation, /* relation */ snapshot, /* seeself */ - 0, /* number of keys */ - NULL); /* scan key */ + 0, /* number of keys */ + NULL); /* scan key */ reltuples = 0; @@ -1435,9 +1436,9 @@ IndexBuildHeapScan(Relation heapRelation, /* * If tuple is recently deleted then we must index it * anyway to preserve MVCC semantics. (Pre-existing - * transactions could try to use the index after we - * finish building it, and may need to see such tuples.) - * Exclude it from unique-checking, however. + * transactions could try to use the index after we finish + * building it, and may need to see such tuples.) Exclude + * it from unique-checking, however. */ indexIt = true; tupleIsAlive = false; @@ -1573,7 +1574,7 @@ IndexBuildHeapScan(Relation heapRelation, * which is passed to validate_index(). Any tuples that are valid according * to this snap, but are not in the index, must be added to the index. * (Any tuples committed live after the snap will be inserted into the - * index by their originating transaction. Any tuples committed dead before + * index by their originating transaction. Any tuples committed dead before * the snap need not be indexed, because we will wait out all transactions * that might care about them before we mark the index valid.) * @@ -1582,7 +1583,7 @@ IndexBuildHeapScan(Relation heapRelation, * ever say "delete it". (This should be faster than a plain indexscan; * also, not all index AMs support full-index indexscan.) Then we sort the * TIDs, and finally scan the table doing a "merge join" against the TID list - * to see which tuples are missing from the index. Thus we will ensure that + * to see which tuples are missing from the index. Thus we will ensure that * all tuples valid according to the reference snapshot are in the index. * * Building a unique index this way is tricky: we might try to insert a @@ -1598,7 +1599,7 @@ IndexBuildHeapScan(Relation heapRelation, * were alive at the time of the reference snapshot are gone; this is * necessary to be sure there are none left with a serializable snapshot * older than the reference (and hence possibly able to see tuples we did - * not index). Then we mark the index valid and commit. + * not index). Then we mark the index valid and commit. * * Doing two full table scans is a brute-force strategy. We could try to be * cleverer, eg storing new tuples in a special area of the table (perhaps @@ -1608,10 +1609,11 @@ IndexBuildHeapScan(Relation heapRelation, void validate_index(Oid heapId, Oid indexId, Snapshot snapshot) { - Relation heapRelation, indexRelation; - IndexInfo *indexInfo; + Relation heapRelation, + indexRelation; + IndexInfo *indexInfo; IndexVacuumInfo ivinfo; - v_i_state state; + v_i_state state; /* Open and lock the parent heap relation */ heapRelation = heap_open(heapId, ShareUpdateExclusiveLock); @@ -1619,9 +1621,9 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) indexRelation = index_open(indexId, RowExclusiveLock); /* - * Fetch info needed for index_insert. (You might think this should - * be passed in from DefineIndex, but its copy is long gone due to - * having been built in a previous transaction.) + * Fetch info needed for index_insert. (You might think this should be + * passed in from DefineIndex, but its copy is long gone due to having + * been built in a previous transaction.) */ indexInfo = BuildIndexInfo(indexRelation); @@ -1675,7 +1677,7 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) static bool validate_index_callback(ItemPointer itemptr, void *opaque) { - v_i_state *state = (v_i_state *) opaque; + v_i_state *state = (v_i_state *) opaque; tuplesort_putdatum(state->tuplesort, PointerGetDatum(itemptr), false); state->itups += 1; @@ -1703,9 +1705,10 @@ validate_index_heapscan(Relation heapRelation, TupleTableSlot *slot; EState *estate; ExprContext *econtext; + /* state variables for the merge */ ItemPointer indexcursor = NULL; - bool tuplesort_empty = false; + bool tuplesort_empty = false; /* * sanity checks @@ -1734,8 +1737,8 @@ validate_index_heapscan(Relation heapRelation, */ scan = heap_beginscan(heapRelation, /* relation */ snapshot, /* seeself */ - 0, /* number of keys */ - NULL); /* scan key */ + 0, /* number of keys */ + NULL); /* scan key */ /* * Scan all tuples matching the snapshot. @@ -1749,15 +1752,15 @@ validate_index_heapscan(Relation heapRelation, state->htups += 1; /* - * "merge" by skipping through the index tuples until we find or - * pass the current heap tuple. + * "merge" by skipping through the index tuples until we find or pass + * the current heap tuple. */ while (!tuplesort_empty && (!indexcursor || ItemPointerCompare(indexcursor, heapcursor) < 0)) { - Datum ts_val; - bool ts_isnull; + Datum ts_val; + bool ts_isnull; if (indexcursor) pfree(indexcursor); @@ -1774,7 +1777,7 @@ validate_index_heapscan(Relation heapRelation, * We've overshot which means this heap tuple is missing from the * index, so insert it. */ - bool check_unique; + bool check_unique; MemoryContextReset(econtext->ecxt_per_tuple_memory); @@ -1793,7 +1796,7 @@ validate_index_heapscan(Relation heapRelation, /* * For the current heap tuple, extract all the attributes we use - * in this index, and note which are null. This also performs + * in this index, and note which are null. This also performs * evaluation of any expressions needed. */ FormIndexDatum(indexInfo, @@ -1803,11 +1806,11 @@ validate_index_heapscan(Relation heapRelation, isnull); /* - * If the tuple is already committed dead, we still have to - * put it in the index (because some xacts might be able to - * see it), but we might as well suppress uniqueness checking. - * This is just an optimization because the index AM is not - * supposed to raise a uniqueness failure anyway. + * If the tuple is already committed dead, we still have to put it + * in the index (because some xacts might be able to see it), but + * we might as well suppress uniqueness checking. This is just an + * optimization because the index AM is not supposed to raise a + * uniqueness failure anyway. */ if (indexInfo->ii_Unique) { diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index abd3547e5e6..1d6162ca12e 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.87 2006/09/14 22:05:06 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.88 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -718,7 +718,7 @@ OpernameGetOprid(List *names, Oid oprleft, Oid oprright) ObjectIdGetDatum(namespaceId)); if (HeapTupleIsValid(opertup)) { - Oid result = HeapTupleGetOid(opertup); + Oid result = HeapTupleGetOid(opertup); ReleaseSysCache(opertup); return result; @@ -741,9 +741,9 @@ OpernameGetOprid(List *names, Oid oprleft, Oid oprright) } /* - * We have to find the list member that is first in the search path, - * if there's more than one. This doubly-nested loop looks ugly, - * but in practice there should usually be few catlist members. + * We have to find the list member that is first in the search path, if + * there's more than one. This doubly-nested loop looks ugly, but in + * practice there should usually be few catlist members. */ recomputeNamespacePath(); @@ -759,7 +759,7 @@ OpernameGetOprid(List *names, Oid oprleft, Oid oprright) if (operform->oprnamespace == namespaceId) { - Oid result = HeapTupleGetOid(opertup); + Oid result = HeapTupleGetOid(opertup); ReleaseSysCacheList(catlist); return result; diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 747543e077d..6420defe4fb 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.82 2006/07/27 19:52:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.83 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -89,15 +89,15 @@ AggregateCreate(const char *aggName, } /* - * If transtype is polymorphic, must have polymorphic argument also; - * else we will have no way to deduce the actual transtype. + * If transtype is polymorphic, must have polymorphic argument also; else + * we will have no way to deduce the actual transtype. */ if (!hasPolyArg && (aggTransType == ANYARRAYOID || aggTransType == ANYELEMENTOID)) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("cannot determine transition data type"), - errdetail("An aggregate using \"anyarray\" or \"anyelement\" as transition type must have at least one argument of either type."))); + errdetail("An aggregate using \"anyarray\" or \"anyelement\" as transition type must have at least one argument of either type."))); /* find the transfn */ nargs_transfn = numArgs + 1; @@ -133,8 +133,8 @@ AggregateCreate(const char *aggName, /* * If the transfn is strict and the initval is NULL, make sure first input - * type and transtype are the same (or at least binary-compatible), so that - * it's OK to use the first input value as the initial transValue. + * type and transtype are the same (or at least binary-compatible), so + * that it's OK to use the first input value as the initial transValue. */ if (proc->proisstrict && agginitval == NULL) { @@ -211,7 +211,7 @@ AggregateCreate(const char *aggName, PROVOLATILE_IMMUTABLE, /* volatility (not * needed for agg) */ buildoidvector(aggArgTypes, - numArgs), /* paramTypes */ + numArgs), /* paramTypes */ PointerGetDatum(NULL), /* allParamTypes */ PointerGetDatum(NULL), /* parameterModes */ PointerGetDatum(NULL)); /* parameterNames */ @@ -355,7 +355,7 @@ lookup_agg_function(List *fnName, ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("function %s requires run-time type coercion", - func_signature_string(fnName, nargs, true_oid_array)))); + func_signature_string(fnName, nargs, true_oid_array)))); } /* Check aggregate creator has permission to call the function */ diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index 99cdf5e7e6a..b0c59862512 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_depend.c,v 1.22 2006/08/21 00:57:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_depend.c,v 1.23 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -264,7 +264,7 @@ changeDependencyFor(Oid classId, Oid objectId, * Detect whether a sequence is marked as "owned" by a column * * An ownership marker is an AUTO dependency from the sequence to the - * column. If we find one, store the identity of the owning column + * column. If we find one, store the identity of the owning column * into *tableId and *colId and return TRUE; else return FALSE. * * Note: if there's more than one such pg_depend entry then you get diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c index 85e3d968d48..5195cb06be9 100644 --- a/src/backend/catalog/pg_shdepend.c +++ b/src/backend/catalog/pg_shdepend.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.14 2006/08/21 00:57:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.15 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1101,9 +1101,9 @@ shdepDropOwned(List *roleids, DropBehavior behavior) while ((tuple = systable_getnext(scan)) != NULL) { - ObjectAddress obj; - GrantObjectType objtype; - InternalGrant istmt; + ObjectAddress obj; + GrantObjectType objtype; + InternalGrant istmt; Form_pg_shdepend sdepForm = (Form_pg_shdepend) GETSTRUCT(tuple); /* We only operate on objects in the current database */ @@ -1112,7 +1112,7 @@ shdepDropOwned(List *roleids, DropBehavior behavior) switch (sdepForm->deptype) { - /* Shouldn't happen */ + /* Shouldn't happen */ case SHARED_DEPENDENCY_PIN: case SHARED_DEPENDENCY_INVALID: elog(ERROR, "unexpected dependency type"); @@ -1267,10 +1267,11 @@ shdepReassignOwned(List *roleids, Oid newrole) break; case RelationRelationId: + /* - * Pass recursing = true so that we don't fail on - * indexes, owned sequences, etc when we happen - * to visit them before their parent table. + * Pass recursing = true so that we don't fail on indexes, + * owned sequences, etc when we happen to visit them + * before their parent table. */ ATExecChangeOwner(sdepForm->objid, newrole, true); break; diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 1b9eea29dcc..32de0b90dc1 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.107 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.108 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -73,34 +73,34 @@ TypeShellMake(const char *typeName, Oid typeNamespace) /* * initialize *values with the type name and dummy values * - * The representational details are the same as int4 ... it doesn't - * really matter what they are so long as they are consistent. Also - * note that we give it typtype = 'p' (pseudotype) as extra insurance - * that it won't be mistaken for a usable type. + * The representational details are the same as int4 ... it doesn't really + * matter what they are so long as they are consistent. Also note that we + * give it typtype = 'p' (pseudotype) as extra insurance that it won't be + * mistaken for a usable type. */ i = 0; namestrcpy(&name, typeName); values[i++] = NameGetDatum(&name); /* typname */ values[i++] = ObjectIdGetDatum(typeNamespace); /* typnamespace */ values[i++] = ObjectIdGetDatum(GetUserId()); /* typowner */ - values[i++] = Int16GetDatum(sizeof(int4)); /* typlen */ - values[i++] = BoolGetDatum(true); /* typbyval */ - values[i++] = CharGetDatum('p'); /* typtype */ - values[i++] = BoolGetDatum(false); /* typisdefined */ + values[i++] = Int16GetDatum(sizeof(int4)); /* typlen */ + values[i++] = BoolGetDatum(true); /* typbyval */ + values[i++] = CharGetDatum('p'); /* typtype */ + values[i++] = BoolGetDatum(false); /* typisdefined */ values[i++] = CharGetDatum(DEFAULT_TYPDELIM); /* typdelim */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typrelid */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typelem */ - values[i++] = ObjectIdGetDatum(F_SHELL_IN); /* typinput */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typrelid */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typelem */ + values[i++] = ObjectIdGetDatum(F_SHELL_IN); /* typinput */ values[i++] = ObjectIdGetDatum(F_SHELL_OUT); /* typoutput */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typreceive */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typsend */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typanalyze */ - values[i++] = CharGetDatum('i'); /* typalign */ - values[i++] = CharGetDatum('p'); /* typstorage */ - values[i++] = BoolGetDatum(false); /* typnotnull */ - values[i++] = ObjectIdGetDatum(InvalidOid); /* typbasetype */ - values[i++] = Int32GetDatum(-1); /* typtypmod */ - values[i++] = Int32GetDatum(0); /* typndims */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typreceive */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typsend */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typanalyze */ + values[i++] = CharGetDatum('i'); /* typalign */ + values[i++] = CharGetDatum('p'); /* typstorage */ + values[i++] = BoolGetDatum(false); /* typnotnull */ + values[i++] = ObjectIdGetDatum(InvalidOid); /* typbasetype */ + values[i++] = Int32GetDatum(-1); /* typtypmod */ + values[i++] = Int32GetDatum(0); /* typndims */ nulls[i++] = 'n'; /* typdefaultbin */ nulls[i++] = 'n'; /* typdefault */ diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c index aa3e7b8feff..c4416d5e019 100644 --- a/src/backend/catalog/toasting.c +++ b/src/backend/catalog/toasting.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/toasting.c,v 1.2 2006/08/25 04:06:47 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/toasting.c,v 1.3 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -70,7 +70,7 @@ AlterTableCreateToastTable(Oid relOid) void BootstrapToastTable(char *relName, Oid toastOid, Oid toastIndexOid) { - Relation rel; + Relation rel; rel = heap_openrv(makeRangeVar(NULL, relName), AccessExclusiveLock); diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index 7923199f638..e072a23f270 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.40 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.41 2006/10/04 00:29:50 momjian Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -58,7 +58,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) TypeName *transType = NULL; char *initval = NULL; Oid *aggArgTypes; - int numArgs; + int numArgs; Oid transTypeId; ListCell *pl; @@ -122,8 +122,8 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) if (oldstyle) { /* - * Old style: use basetype parameter. This supports aggregates - * of zero or one input, with input type ANY meaning zero inputs. + * Old style: use basetype parameter. This supports aggregates of + * zero or one input, with input type ANY meaning zero inputs. * * Historically we allowed the command to look like basetype = 'ANY' * so we must do a case-insensitive comparison for the name ANY. Ugh. @@ -150,8 +150,8 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) /* * New style: args is a list of TypeNames (possibly zero of 'em). */ - ListCell *lc; - int i = 0; + ListCell *lc; + int i = 0; if (baseType != NULL) ereport(ERROR, @@ -162,7 +162,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) aggArgTypes = (Oid *) palloc(sizeof(Oid) * numArgs); foreach(lc, args) { - TypeName *curTypeName = (TypeName *) lfirst(lc); + TypeName *curTypeName = (TypeName *) lfirst(lc); aggArgTypes[i++] = typenameTypeId(NULL, curTypeName); } @@ -171,9 +171,9 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) /* * look up the aggregate's transtype. * - * transtype can't be a pseudo-type, since we need to be - * able to store values of the transtype. However, we can allow - * polymorphic transtype in some cases (AggregateCreate will check). + * transtype can't be a pseudo-type, since we need to be able to store + * values of the transtype. However, we can allow polymorphic transtype + * in some cases (AggregateCreate will check). */ transTypeId = typenameTypeId(NULL, transType); if (get_typtype(transTypeId) == 'p' && @@ -189,7 +189,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters) */ AggregateCreate(aggName, /* aggregate name */ aggNamespace, /* namespace */ - aggArgTypes, /* input data type(s) */ + aggArgTypes, /* input data type(s) */ numArgs, transfuncName, /* step function name */ finalfuncName, /* final function name */ @@ -289,7 +289,7 @@ RenameAggregate(List *name, List *args, const char *newname) errmsg("function %s already exists in schema \"%s\"", funcname_signature_string(newname, procForm->pronargs, - procForm->proargtypes.values), + procForm->proargtypes.values), get_namespace_name(namespaceOid)))); /* must be owner */ diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index f9e41e3531b..1ce768f0463 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.98 2006/09/17 22:50:31 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.99 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -129,12 +129,11 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) CHECK_FOR_INTERRUPTS(); /* - * Open the relation, getting ShareUpdateExclusiveLock to ensure that - * two ANALYZEs don't run on it concurrently. (This also locks out - * a concurrent VACUUM, which doesn't matter much at the moment but - * might matter if we ever try to accumulate stats on dead tuples.) - * If the rel has been dropped since we last saw it, we don't need - * to process it. + * Open the relation, getting ShareUpdateExclusiveLock to ensure that two + * ANALYZEs don't run on it concurrently. (This also locks out a + * concurrent VACUUM, which doesn't matter much at the moment but might + * matter if we ever try to accumulate stats on dead tuples.) If the rel + * has been dropped since we last saw it, we don't need to process it. */ onerel = try_relation_open(relid, ShareUpdateExclusiveLock); if (!onerel) @@ -216,8 +215,8 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) if (i == InvalidAttrNumber) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" of relation \"%s\" does not exist", - col, RelationGetRelationName(onerel)))); + errmsg("column \"%s\" of relation \"%s\" does not exist", + col, RelationGetRelationName(onerel)))); vacattrstats[tcnt] = examine_attribute(onerel, i); if (vacattrstats[tcnt] != NULL) tcnt++; diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index bd2301dd62e..665c66cad5e 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.153 2006/08/18 16:09:08 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.154 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -288,7 +288,7 @@ cluster_rel(RelToCluster *rvtc, bool recheck) tuple = SearchSysCache(INDEXRELID, ObjectIdGetDatum(rvtc->indexOid), 0, 0, 0); - if (!HeapTupleIsValid(tuple)) /* probably can't happen */ + if (!HeapTupleIsValid(tuple)) /* probably can't happen */ { relation_close(OldHeap, AccessExclusiveLock); return; @@ -350,7 +350,7 @@ check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck) errmsg("cannot cluster on partial index \"%s\"", RelationGetRelationName(OldIndex)))); - if (!OldIndex->rd_am->amclusterable) + if (!OldIndex->rd_am->amclusterable) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot cluster on index \"%s\" because access method does not support clustering", diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index f54243a4955..df4416d37c2 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -7,7 +7,7 @@ * Copyright (c) 1996-2006, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.91 2006/09/05 21:08:35 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.92 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -261,11 +261,12 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment) * If the comment given is null or an empty string, instead delete any * existing comment for the specified key. */ -void CreateSharedComments(Oid oid, Oid classoid, char *comment) +void +CreateSharedComments(Oid oid, Oid classoid, char *comment) { Relation shdescription; - ScanKeyData skey[2]; - SysScanDesc sd; + ScanKeyData skey[2]; + SysScanDesc sd; HeapTuple oldtuple; HeapTuple newtuple = NULL; Datum values[Natts_pg_shdescription]; @@ -294,18 +295,18 @@ void CreateSharedComments(Oid oid, Oid classoid, char *comment) /* Use the index to search for a matching old tuple */ ScanKeyInit(&skey[0], - Anum_pg_shdescription_objoid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(oid)); + Anum_pg_shdescription_objoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(oid)); ScanKeyInit(&skey[1], - Anum_pg_shdescription_classoid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(classoid)); + Anum_pg_shdescription_classoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(classoid)); shdescription = heap_open(SharedDescriptionRelationId, RowExclusiveLock); sd = systable_beginscan(shdescription, SharedDescriptionObjIndexId, true, - SnapshotNow, 2, skey); + SnapshotNow, 2, skey); while ((oldtuple = systable_getnext(sd)) != NULL) { @@ -316,11 +317,11 @@ void CreateSharedComments(Oid oid, Oid classoid, char *comment) else { newtuple = heap_modifytuple(oldtuple, RelationGetDescr(shdescription), - values, nulls, replaces); + values, nulls, replaces); simple_heap_update(shdescription, &oldtuple->t_self, newtuple); } - break; /* Assume there can be only one match */ + break; /* Assume there can be only one match */ } systable_endscan(sd); @@ -330,7 +331,7 @@ void CreateSharedComments(Oid oid, Oid classoid, char *comment) if (newtuple == NULL && comment != NULL) { newtuple = heap_formtuple(RelationGetDescr(shdescription), - values, nulls); + values, nulls); simple_heap_insert(shdescription, newtuple); } @@ -405,25 +406,25 @@ void DeleteSharedComments(Oid oid, Oid classoid) { Relation shdescription; - ScanKeyData skey[2]; - SysScanDesc sd; + ScanKeyData skey[2]; + SysScanDesc sd; HeapTuple oldtuple; /* Use the index to search for all matching old tuples */ ScanKeyInit(&skey[0], - Anum_pg_shdescription_objoid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(oid)); + Anum_pg_shdescription_objoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(oid)); ScanKeyInit(&skey[1], - Anum_pg_shdescription_classoid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(classoid)); + Anum_pg_shdescription_classoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(classoid)); shdescription = heap_open(SharedDescriptionRelationId, RowExclusiveLock); sd = systable_beginscan(shdescription, SharedDescriptionObjIndexId, true, - SnapshotNow, 2, skey); + SnapshotNow, 2, skey); while ((oldtuple = systable_getnext(sd)) != NULL) simple_heap_delete(shdescription, &oldtuple->t_self); @@ -620,8 +621,8 @@ CommentDatabase(List *qualname, char *comment) static void CommentTablespace(List *qualname, char *comment) { - char *tablespace; - Oid oid; + char *tablespace; + Oid oid; if (list_length(qualname) != 1) ereport(ERROR, @@ -657,8 +658,8 @@ CommentTablespace(List *qualname, char *comment) static void CommentRole(List *qualname, char *comment) { - char *role; - Oid oid; + char *role; + Oid oid; if (list_length(qualname) != 1) ereport(ERROR, @@ -672,7 +673,7 @@ CommentRole(List *qualname, char *comment) if (!has_privs_of_role(GetUserId(), oid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be member of role \"%s\" to comment upon it", role))); + errmsg("must be member of role \"%s\" to comment upon it", role))); /* Call CreateSharedComments() to create/drop the comments */ CreateSharedComments(oid, AuthIdRelationId, comment); diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 23d9742234d..0cbfc237ff2 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.271 2006/08/31 03:17:50 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.272 2006/10/04 00:29:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -88,8 +88,8 @@ typedef struct CopyStateData /* low-level state data */ CopyDest copy_dest; /* type of copy source/destination */ FILE *copy_file; /* used if copy_dest == COPY_FILE */ - StringInfo fe_msgbuf; /* used for all dests during COPY TO, only - * for dest == COPY_NEW_FE in COPY FROM */ + StringInfo fe_msgbuf; /* used for all dests during COPY TO, only for + * dest == COPY_NEW_FE in COPY FROM */ bool fe_copy; /* true for all FE copy dests */ bool fe_eof; /* true if detected end of copy data */ EolType eol_type; /* EOL type of input */ @@ -109,7 +109,7 @@ typedef struct CopyStateData bool header_line; /* CSV header line? */ char *null_print; /* NULL marker string (server encoding!) */ int null_print_len; /* length of same */ - char *null_print_client; /* same converted to client encoding */ + char *null_print_client; /* same converted to client encoding */ char *delim; /* column delimiter (must be 1 byte) */ char *quote; /* CSV quote char (must be 1 byte) */ char *escape; /* CSV escape char (must be 1 byte) */ @@ -125,8 +125,8 @@ typedef struct CopyStateData /* * Working state for COPY TO */ - FmgrInfo *out_functions; /* lookup info for output functions */ - MemoryContext rowcontext; /* per-row evaluation context */ + FmgrInfo *out_functions; /* lookup info for output functions */ + MemoryContext rowcontext; /* per-row evaluation context */ /* * These variables are used to reduce overhead in textual COPY FROM. @@ -177,7 +177,7 @@ typedef struct * function call overhead in tight COPY loops. * * We must use "if (1)" because "do {} while(0)" overrides the continue/break - * processing. See http://www.cit.gu.edu.au/~anthony/info/C/C.macros. + * processing. See http://www.cit.gu.edu.au/~anthony/info/C/C.macros. */ /* @@ -243,7 +243,7 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0"; static void DoCopyTo(CopyState cstate); static void CopyTo(CopyState cstate); static void CopyOneRowTo(CopyState cstate, Oid tupleOid, - Datum *values, bool *nulls); + Datum *values, bool *nulls); static void CopyFrom(CopyState cstate); static bool CopyReadLine(CopyState cstate); static bool CopyReadLineText(CopyState cstate); @@ -259,7 +259,7 @@ static void CopyAttributeOutText(CopyState cstate, char *string); static void CopyAttributeOutCSV(CopyState cstate, char *string, bool use_quote, bool single_attr); static List *CopyGetAttnums(TupleDesc tupDesc, Relation rel, - List *attnamelist); + List *attnamelist); static char *limit_printout_length(const char *str); /* Low-level communications functions */ @@ -863,10 +863,10 @@ DoCopy(const CopyStmt *stmt) /* Disallow end-of-line characters */ if (strchr(cstate->delim, '\r') != NULL || - strchr(cstate->delim, '\n') != NULL) + strchr(cstate->delim, '\n') != NULL) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("COPY delimiter cannot be newline or carriage return"))); + errmsg("COPY delimiter cannot be newline or carriage return"))); if (strchr(cstate->null_print, '\r') != NULL || strchr(cstate->null_print, '\n') != NULL) @@ -956,7 +956,7 @@ DoCopy(const CopyStmt *stmt) /* Open and lock the relation, using the appropriate lock type. */ cstate->rel = heap_openrv(stmt->relation, - (is_from ? RowExclusiveLock : AccessShareLock)); + (is_from ? RowExclusiveLock : AccessShareLock)); /* Check relation permissions. */ aclresult = pg_class_aclcheck(RelationGetRelid(cstate->rel), @@ -1009,7 +1009,7 @@ DoCopy(const CopyStmt *stmt) * rewriting or planning. Do that now. * * Because the planner is not cool about not scribbling on its input, - * we make a preliminary copy of the source querytree. This prevents + * we make a preliminary copy of the source querytree. This prevents * problems in the case that the COPY is in a portal or plpgsql * function and is executed repeatedly. (See also the same hack in * EXPLAIN, DECLARE CURSOR and PREPARE.) XXX the planner really @@ -1124,8 +1124,8 @@ DoCopy(const CopyStmt *stmt) /* * Set up encoding conversion info. Even if the client and server - * encodings are the same, we must apply pg_client_to_server() to - * validate data in multibyte encodings. + * encodings are the same, we must apply pg_client_to_server() to validate + * data in multibyte encodings. */ cstate->client_encoding = pg_get_client_encoding(); cstate->need_transcoding = @@ -1139,7 +1139,8 @@ DoCopy(const CopyStmt *stmt) if (is_from) /* copy from file to database */ CopyFrom(cstate); - else /* copy from database to file */ + else + /* copy from database to file */ DoCopyTo(cstate); /* @@ -1210,12 +1211,12 @@ DoCopyTo(CopyState cstate) } else { - mode_t oumask; /* Pre-existing umask value */ + mode_t oumask; /* Pre-existing umask value */ struct stat st; /* - * Prevent write to relative path ... too easy to shoot oneself in - * the foot by overwriting a database file ... + * Prevent write to relative path ... too easy to shoot oneself in the + * foot by overwriting a database file ... */ if (!is_absolute_path(cstate->filename)) ereport(ERROR, @@ -1351,7 +1352,7 @@ CopyTo(CopyState cstate) */ if (cstate->need_transcoding) cstate->null_print_client = pg_server_to_client(cstate->null_print, - cstate->null_print_len); + cstate->null_print_len); /* if a header has been requested send the line */ if (cstate->header_line) @@ -1508,7 +1509,7 @@ CopyOneRowTo(CopyState cstate, Oid tupleOid, Datum *values, bool *nulls) CopySendEndOfRow(cstate); MemoryContextSwitchTo(oldcontext); - + cstate->processed++; } @@ -2237,6 +2238,7 @@ CopyReadLineText(CopyState cstate) bool hit_eof = false; bool result = false; char mblen_str[2]; + /* CSV variables */ bool first_char_in_line = true; bool in_quote = false, @@ -2268,10 +2270,10 @@ CopyReadLineText(CopyState cstate) * assumed the same in frontend and backend encodings. * * For speed, we try to move data from raw_buf to line_buf in chunks - * rather than one character at a time. raw_buf_ptr points to the next + * rather than one character at a time. raw_buf_ptr points to the next * character to examine; any characters from raw_buf_index to raw_buf_ptr - * have been determined to be part of the line, but not yet transferred - * to line_buf. + * have been determined to be part of the line, but not yet transferred to + * line_buf. * * For a little extra speed within the loop, we copy raw_buf and * raw_buf_len into local variables. @@ -2286,14 +2288,14 @@ CopyReadLineText(CopyState cstate) char c; /* - * Load more data if needed. Ideally we would just force four bytes - * of read-ahead and avoid the many calls to - * IF_NEED_REFILL_AND_NOT_EOF_CONTINUE(), but the COPY_OLD_FE - * protocol does not allow us to read too far ahead or we might - * read into the next data, so we read-ahead only as far we know - * we can. One optimization would be to read-ahead four byte here - * if cstate->copy_dest != COPY_OLD_FE, but it hardly seems worth it, - * considering the size of the buffer. + * Load more data if needed. Ideally we would just force four bytes + * of read-ahead and avoid the many calls to + * IF_NEED_REFILL_AND_NOT_EOF_CONTINUE(), but the COPY_OLD_FE protocol + * does not allow us to read too far ahead or we might read into the + * next data, so we read-ahead only as far we know we can. One + * optimization would be to read-ahead four byte here if + * cstate->copy_dest != COPY_OLD_FE, but it hardly seems worth it, + * considering the size of the buffer. */ if (raw_buf_ptr >= copy_buf_len || need_data) { @@ -2328,12 +2330,12 @@ CopyReadLineText(CopyState cstate) { /* * If character is '\\' or '\r', we may need to look ahead below. - * Force fetch of the next character if we don't already have it. We - * need to do this before changing CSV state, in case one of these - * characters is also the quote or escape character. + * Force fetch of the next character if we don't already have it. + * We need to do this before changing CSV state, in case one of + * these characters is also the quote or escape character. * - * Note: old-protocol does not like forced prefetch, but it's OK here - * since we cannot validly be at EOF. + * Note: old-protocol does not like forced prefetch, but it's OK + * here since we cannot validly be at EOF. */ if (c == '\\' || c == '\r') { @@ -2341,12 +2343,12 @@ CopyReadLineText(CopyState cstate) } /* - * Dealing with quotes and escapes here is mildly tricky. If the quote - * char is also the escape char, there's no problem - we just use the - * char as a toggle. If they are different, we need to ensure that we - * only take account of an escape inside a quoted field and - * immediately preceding a quote char, and not the second in a - * escape-escape sequence. + * Dealing with quotes and escapes here is mildly tricky. If the + * quote char is also the escape char, there's no problem - we + * just use the char as a toggle. If they are different, we need + * to ensure that we only take account of an escape inside a + * quoted field and immediately preceding a quote char, and not + * the second in a escape-escape sequence. */ if (in_quote && c == escapec) last_was_esc = !last_was_esc; @@ -2357,9 +2359,9 @@ CopyReadLineText(CopyState cstate) /* * Updating the line count for embedded CR and/or LF chars is - * necessarily a little fragile - this test is probably about the best - * we can do. (XXX it's arguable whether we should do this at all --- - * is cur_lineno a physical or logical count?) + * necessarily a little fragile - this test is probably about the + * best we can do. (XXX it's arguable whether we should do this + * at all --- is cur_lineno a physical or logical count?) */ if (in_quote && c == (cstate->eol_type == EOL_NL ? '\n' : '\r')) cstate->cur_lineno++; @@ -2394,12 +2396,13 @@ CopyReadLineText(CopyState cstate) if (cstate->eol_type == EOL_CRNL) ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg(!cstate->csv_mode ? + errmsg(!cstate->csv_mode ? "literal carriage return found in data" : - "unquoted carriage return found in data"), + "unquoted carriage return found in data"), errhint(!cstate->csv_mode ? - "Use \"\\r\" to represent carriage return." : - "Use quoted CSV field to represent carriage return."))); + "Use \"\\r\" to represent carriage return." : + "Use quoted CSV field to represent carriage return."))); + /* * if we got here, it is the first line and we didn't find * \n, so don't consume the peeked character @@ -2410,12 +2413,12 @@ CopyReadLineText(CopyState cstate) else if (cstate->eol_type == EOL_NL) ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg(!cstate->csv_mode ? + errmsg(!cstate->csv_mode ? "literal carriage return found in data" : "unquoted carriage return found in data"), errhint(!cstate->csv_mode ? - "Use \"\\r\" to represent carriage return." : - "Use quoted CSV field to represent carriage return."))); + "Use \"\\r\" to represent carriage return." : + "Use quoted CSV field to represent carriage return."))); /* If reach here, we have found the line terminator */ break; } @@ -2431,15 +2434,15 @@ CopyReadLineText(CopyState cstate) "unquoted newline found in data"), errhint(!cstate->csv_mode ? "Use \"\\n\" to represent newline." : - "Use quoted CSV field to represent newline."))); + "Use quoted CSV field to represent newline."))); cstate->eol_type = EOL_NL; /* in case not set yet */ /* If reach here, we have found the line terminator */ break; } /* - * In CSV mode, we only recognize \. alone on a line. This is - * because \. is a valid CSV data value. + * In CSV mode, we only recognize \. alone on a line. This is because + * \. is a valid CSV data value. */ if (c == '\\' && (!cstate->csv_mode || first_char_in_line)) { @@ -2529,23 +2532,24 @@ CopyReadLineText(CopyState cstate) break; } else if (!cstate->csv_mode) + /* - * If we are here, it means we found a backslash followed by - * something other than a period. In non-CSV mode, anything - * after a backslash is special, so we skip over that second - * character too. If we didn't do that \\. would be - * considered an eof-of copy, while in non-CVS mode it is a - * literal backslash followed by a period. In CSV mode, - * backslashes are not special, so we want to process the - * character after the backslash just like a normal character, - * so we don't increment in those cases. + * If we are here, it means we found a backslash followed by + * something other than a period. In non-CSV mode, anything + * after a backslash is special, so we skip over that second + * character too. If we didn't do that \\. would be + * considered an eof-of copy, while in non-CVS mode it is a + * literal backslash followed by a period. In CSV mode, + * backslashes are not special, so we want to process the + * character after the backslash just like a normal character, + * so we don't increment in those cases. */ raw_buf_ptr++; } /* - * This label is for CSV cases where \. appears at the start of a line, - * but there is more text after it, meaning it was a data value. + * This label is for CSV cases where \. appears at the start of a + * line, but there is more text after it, meaning it was a data value. * We are more strict for \. in CSV mode because \. could be a data * value, while in non-CSV mode, \. cannot be a data value. */ @@ -2554,9 +2558,9 @@ not_end_of_copy: /* * Process all bytes of a multi-byte character as a group. * - * We only support multi-byte sequences where the first byte - * has the high-bit set, so as an optimization we can avoid - * this block entirely if it is not set. + * We only support multi-byte sequences where the first byte has the + * high-bit set, so as an optimization we can avoid this block + * entirely if it is not set. */ if (cstate->encoding_embeds_ascii && IS_HIGHBIT_SET(c)) { @@ -3040,10 +3044,10 @@ CopyAttributeOutText(CopyState cstate, char *string) /* * We have to grovel through the string searching for control characters * and instances of the delimiter character. In most cases, though, these - * are infrequent. To avoid overhead from calling CopySendData once per - * character, we dump out all characters between replaceable characters - * in a single call. The loop invariant is that the data from "start" - * to "ptr" can be sent literally, but hasn't yet been. + * are infrequent. To avoid overhead from calling CopySendData once per + * character, we dump out all characters between replaceable characters in + * a single call. The loop invariant is that the data from "start" to + * "ptr" can be sent literally, but hasn't yet been. */ start = ptr; while ((c = *ptr) != '\0') @@ -3090,7 +3094,7 @@ CopyAttributeOutText(CopyState cstate, char *string) { DUMPSOFAR(); CopySendChar(cstate, '\\'); - start = ptr; /* we include char in next run */ + start = ptr; /* we include char in next run */ } /* @@ -3139,14 +3143,13 @@ CopyAttributeOutCSV(CopyState cstate, char *string, if (!use_quote) { /* - * Because '\.' can be a data value, quote it if it appears - * alone on a line so it is not interpreted as the end-of-data - * marker. + * Because '\.' can be a data value, quote it if it appears alone on a + * line so it is not interpreted as the end-of-data marker. */ if (single_attr && strcmp(ptr, "\\.") == 0) - use_quote = true; - else - { + use_quote = true; + else + { char *tptr = ptr; while ((c = *tptr) != '\0') @@ -3251,14 +3254,14 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist) { if (rel != NULL) ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" of relation \"%s\" does not exist", - name, RelationGetRelationName(rel)))); + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + name, RelationGetRelationName(rel)))); else ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" does not exist", - name))); + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" does not exist", + name))); } /* Check for duplicates */ if (list_member_int(attnums, attnum)) @@ -3289,7 +3292,7 @@ copy_dest_startup(DestReceiver *self, int operation, TupleDesc typeinfo) static void copy_dest_receive(TupleTableSlot *slot, DestReceiver *self) { - DR_copy *myState = (DR_copy *) self; + DR_copy *myState = (DR_copy *) self; CopyState cstate = myState->cstate; /* Make sure the tuple is fully deconstructed */ @@ -3323,7 +3326,7 @@ copy_dest_destroy(DestReceiver *self) DestReceiver * CreateCopyDestReceiver(void) { - DR_copy *self = (DR_copy *) palloc(sizeof(DR_copy)); + DR_copy *self = (DR_copy *) palloc(sizeof(DR_copy)); self->pub.receiveSlot = copy_dest_receive; self->pub.rStartup = copy_dest_startup; diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 853c7e66268..d7d4cdbfbc4 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.184 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.185 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -326,9 +326,9 @@ createdb(const CreatedbStmt *stmt) } /* - * Check for db name conflict. This is just to give a more friendly - * error message than "unique index violation". There's a race condition - * but we're willing to accept the less friendly message in that case. + * Check for db name conflict. This is just to give a more friendly error + * message than "unique index violation". There's a race condition but + * we're willing to accept the less friendly message in that case. */ if (OidIsValid(get_database_oid(dbname))) ereport(ERROR, @@ -336,10 +336,10 @@ createdb(const CreatedbStmt *stmt) errmsg("database \"%s\" already exists", dbname))); /* - * Insert a new tuple into pg_database. This establishes our ownership - * of the new database name (anyone else trying to insert the same name - * will block on the unique index, and fail after we commit). It also - * assigns the OID that the new database will have. + * Insert a new tuple into pg_database. This establishes our ownership of + * the new database name (anyone else trying to insert the same name will + * block on the unique index, and fail after we commit). It also assigns + * the OID that the new database will have. */ pg_database_rel = heap_open(DatabaseRelationId, RowExclusiveLock); @@ -361,9 +361,9 @@ createdb(const CreatedbStmt *stmt) /* * We deliberately set datconfig and datacl to defaults (NULL), rather - * than copying them from the template database. Copying datacl would - * be a bad idea when the owner is not the same as the template's - * owner. It's more debatable whether datconfig should be copied. + * than copying them from the template database. Copying datacl would be + * a bad idea when the owner is not the same as the template's owner. It's + * more debatable whether datconfig should be copied. */ new_record_nulls[Anum_pg_database_datconfig - 1] = 'n'; new_record_nulls[Anum_pg_database_datacl - 1] = 'n'; @@ -497,8 +497,8 @@ createdb(const CreatedbStmt *stmt) RequestCheckpoint(true, false); /* - * Close pg_database, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_database, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_database_rel, NoLock); @@ -543,8 +543,8 @@ dropdb(const char *dbname, bool missing_ok) errmsg("cannot drop the currently open database"))); /* - * Look up the target database's OID, and get exclusive lock on it. - * We need this to ensure that no new backend starts up in the target + * Look up the target database's OID, and get exclusive lock on it. We + * need this to ensure that no new backend starts up in the target * database while we are deleting it (see postinit.c), and that no one is * using it as a CREATE DATABASE template or trying to delete it for * themselves. @@ -589,8 +589,8 @@ dropdb(const char *dbname, bool missing_ok) errmsg("cannot drop a template database"))); /* - * Check for active backends in the target database. (Because we hold - * the database lock, no new ones can start after this.) + * Check for active backends in the target database. (Because we hold the + * database lock, no new ones can start after this.) */ if (DatabaseHasActiveBackends(db_id, false)) ereport(ERROR, @@ -647,8 +647,8 @@ dropdb(const char *dbname, bool missing_ok) remove_dbtablespaces(db_id); /* - * Close pg_database, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_database, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pgdbrel, NoLock); @@ -670,8 +670,8 @@ RenameDatabase(const char *oldname, const char *newname) Relation rel; /* - * Look up the target database's OID, and get exclusive lock on it. - * We need this for the same reasons as DROP DATABASE. + * Look up the target database's OID, and get exclusive lock on it. We + * need this for the same reasons as DROP DATABASE. */ rel = heap_open(DatabaseRelationId, RowExclusiveLock); @@ -693,8 +693,8 @@ RenameDatabase(const char *oldname, const char *newname) errmsg("current database may not be renamed"))); /* - * Make sure the database does not have active sessions. This is the - * same concern as above, but applied to other sessions. + * Make sure the database does not have active sessions. This is the same + * concern as above, but applied to other sessions. */ if (DatabaseHasActiveBackends(db_id, false)) ereport(ERROR, @@ -730,8 +730,8 @@ RenameDatabase(const char *oldname, const char *newname) CatalogUpdateIndexes(rel, newtup); /* - * Close pg_database, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_database, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(rel, NoLock); @@ -1067,9 +1067,9 @@ get_db_info(const char *name, LOCKMODE lockmode, relation = heap_open(DatabaseRelationId, AccessShareLock); /* - * Loop covers the rare case where the database is renamed before we - * can lock it. We try again just in case we can find a new one of - * the same name. + * Loop covers the rare case where the database is renamed before we can + * lock it. We try again just in case we can find a new one of the same + * name. */ for (;;) { @@ -1079,8 +1079,8 @@ get_db_info(const char *name, LOCKMODE lockmode, Oid dbOid; /* - * there's no syscache for database-indexed-by-name, - * so must do it the hard way + * there's no syscache for database-indexed-by-name, so must do it the + * hard way */ ScanKeyInit(&scanKey, Anum_pg_database_datname, @@ -1110,9 +1110,9 @@ get_db_info(const char *name, LOCKMODE lockmode, LockSharedObject(DatabaseRelationId, dbOid, 0, lockmode); /* - * And now, re-fetch the tuple by OID. If it's still there and - * still the same name, we win; else, drop the lock and loop - * back to try again. + * And now, re-fetch the tuple by OID. If it's still there and still + * the same name, we win; else, drop the lock and loop back to try + * again. */ tuple = SearchSysCache(DATABASEOID, ObjectIdGetDatum(dbOid), @@ -1267,8 +1267,8 @@ get_database_oid(const char *dbname) Oid oid; /* - * There's no syscache for pg_database indexed by name, - * so we must look the hard way. + * There's no syscache for pg_database indexed by name, so we must look + * the hard way. */ pg_database = heap_open(DatabaseRelationId, AccessShareLock); ScanKeyInit(&entry[0], @@ -1399,15 +1399,15 @@ dbase_desc(StringInfo buf, uint8 xl_info, char *rec) xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) rec; appendStringInfo(buf, "create db: copy dir %u/%u to %u/%u", - xlrec->src_db_id, xlrec->src_tablespace_id, - xlrec->db_id, xlrec->tablespace_id); + xlrec->src_db_id, xlrec->src_tablespace_id, + xlrec->db_id, xlrec->tablespace_id); } else if (info == XLOG_DBASE_DROP) { xl_dbase_drop_rec *xlrec = (xl_dbase_drop_rec *) rec; appendStringInfo(buf, "drop db: dir %u/%u", - xlrec->db_id, xlrec->tablespace_id); + xlrec->db_id, xlrec->tablespace_id); } else appendStringInfo(buf, "UNKNOWN"); diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c index 149e1b6dae0..697678c4aa8 100644 --- a/src/backend/commands/define.c +++ b/src/backend/commands/define.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.97 2006/07/03 22:45:38 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.98 2006/10/04 00:29:51 momjian Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -131,6 +131,7 @@ defGetBoolean(DefElem *def) */ if (def->arg == NULL) return true; + /* * Allow 0, 1, "true", "false" */ @@ -150,7 +151,7 @@ defGetBoolean(DefElem *def) break; default: { - char *sval = defGetString(def); + char *sval = defGetString(def); if (pg_strcasecmp(sval, "true") == 0) return true; @@ -310,9 +311,9 @@ defGetTypeLength(DefElem *def) DefElem * defWithOids(bool value) { - DefElem *f = makeNode(DefElem); + DefElem *f = makeNode(DefElem); f->defname = "oids"; - f->arg = (Node *)makeInteger(value); + f->arg = (Node *) makeInteger(value); return f; } diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 48db000ea9b..00ada3fc722 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.151 2006/09/06 20:40:47 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.152 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -41,7 +41,7 @@ typedef struct ExplainState } ExplainState; static void ExplainOneQuery(Query *query, ExplainStmt *stmt, - ParamListInfo params, TupOutputState *tstate); + ParamListInfo params, TupOutputState *tstate); static double elapsed_time(instr_time *starttime); static void explain_outNode(StringInfo str, Plan *plan, PlanState *planstate, @@ -760,7 +760,7 @@ explain_outNode(StringInfo str, * The tidquals list has OR semantics, so be sure to show it * as an OR condition. */ - List *tidquals = ((TidScan *) plan)->tidquals; + List *tidquals = ((TidScan *) plan)->tidquals; if (list_length(tidquals) > 1) tidquals = list_make1(make_orclause(tidquals)); @@ -928,8 +928,8 @@ explain_outNode(StringInfo str, /* * Ordinarily we don't pass down our own outer_plan value to our * child nodes, but in an Append we must, since we might be - * looking at an appendrel indexscan with outer references - * from the member scans. + * looking at an appendrel indexscan with outer references from + * the member scans. */ explain_outNode(str, subnode, appendstate->appendplans[j], diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 615d4c93b29..29954a27a82 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.78 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.79 2006/10/04 00:29:51 momjian Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -686,7 +686,7 @@ RemoveFunction(RemoveFuncStmt *stmt) * Find the function, do permissions and validity checks */ funcOid = LookupFuncNameTypeNames(functionName, argTypes, stmt->missing_ok); - if (!OidIsValid(funcOid)) + if (!OidIsValid(funcOid)) { /* can only get here if stmt->missing_ok */ ereport(NOTICE, @@ -1394,7 +1394,7 @@ DropCast(DropCastStmt *stmt) 0, 0); if (!HeapTupleIsValid(tuple)) { - if (! stmt->missing_ok) + if (!stmt->missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("cast from type %s to type %s does not exist", @@ -1402,7 +1402,7 @@ DropCast(DropCastStmt *stmt) TypeNameToString(stmt->targettype)))); else ereport(NOTICE, - (errmsg("cast from type %s to type %s does not exist ... skipping", + (errmsg("cast from type %s to type %s does not exist ... skipping", TypeNameToString(stmt->sourcetype), TypeNameToString(stmt->targettype)))); diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 81246768bc9..5f54f66f591 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.148 2006/08/27 19:14:34 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.149 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -125,8 +125,8 @@ DefineIndex(RangeVar *heapRelation, LockRelId heaprelid; LOCKTAG heaplocktag; Snapshot snapshot; - Relation pg_index; - HeapTuple indexTuple; + Relation pg_index; + HeapTuple indexTuple; Form_pg_index indexForm; /* @@ -450,18 +450,18 @@ DefineIndex(RangeVar *heapRelation, * for an overview of how this works) * * We must commit our current transaction so that the index becomes - * visible; then start another. Note that all the data structures - * we just built are lost in the commit. The only data we keep past - * here are the relation IDs. + * visible; then start another. Note that all the data structures we just + * built are lost in the commit. The only data we keep past here are the + * relation IDs. * * Before committing, get a session-level lock on the table, to ensure - * that neither it nor the index can be dropped before we finish. - * This cannot block, even if someone else is waiting for access, because - * we already have the same lock within our transaction. + * that neither it nor the index can be dropped before we finish. This + * cannot block, even if someone else is waiting for access, because we + * already have the same lock within our transaction. * * Note: we don't currently bother with a session lock on the index, - * because there are no operations that could change its state while - * we hold lock on the parent table. This might need to change later. + * because there are no operations that could change its state while we + * hold lock on the parent table. This might need to change later. */ heaprelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&heaprelid, ShareUpdateExclusiveLock); @@ -471,15 +471,15 @@ DefineIndex(RangeVar *heapRelation, /* * Now we must wait until no running transaction could have the table open - * with the old list of indexes. To do this, inquire which xacts currently - * would conflict with ShareLock on the table -- ie, which ones have - * a lock that permits writing the table. Then wait for each of these - * xacts to commit or abort. Note we do not need to worry about xacts - * that open the table for writing after this point; they will see the - * new index when they open it. + * with the old list of indexes. To do this, inquire which xacts + * currently would conflict with ShareLock on the table -- ie, which ones + * have a lock that permits writing the table. Then wait for each of + * these xacts to commit or abort. Note we do not need to worry about + * xacts that open the table for writing after this point; they will see + * the new index when they open it. * - * Note: GetLockConflicts() never reports our own xid, - * hence we need not check for that. + * Note: GetLockConflicts() never reports our own xid, hence we need not + * check for that. */ SET_LOCKTAG_RELATION(heaplocktag, heaprelid.dbId, heaprelid.relId); old_xact_list = GetLockConflicts(&heaplocktag, ShareLock); @@ -493,12 +493,12 @@ DefineIndex(RangeVar *heapRelation, /* * Now take the "reference snapshot" that will be used by validate_index() - * to filter candidate tuples. All other transactions running at this + * to filter candidate tuples. All other transactions running at this * time will have to be out-waited before we can commit, because we can't * guarantee that tuples deleted just before this will be in the index. * - * We also set ActiveSnapshot to this snap, since functions in indexes - * may need a snapshot. + * We also set ActiveSnapshot to this snap, since functions in indexes may + * need a snapshot. */ snapshot = CopySnapshot(GetTransactionSnapshot()); ActiveSnapshot = snapshot; @@ -510,13 +510,13 @@ DefineIndex(RangeVar *heapRelation, /* * The index is now valid in the sense that it contains all currently - * interesting tuples. But since it might not contain tuples deleted - * just before the reference snap was taken, we have to wait out any - * transactions older than the reference snap. We can do this by - * waiting for each xact explicitly listed in the snap. + * interesting tuples. But since it might not contain tuples deleted just + * before the reference snap was taken, we have to wait out any + * transactions older than the reference snap. We can do this by waiting + * for each xact explicitly listed in the snap. * - * Note: GetSnapshotData() never stores our own xid into a snap, - * hence we need not check for that. + * Note: GetSnapshotData() never stores our own xid into a snap, hence we + * need not check for that. */ for (ixcnt = 0; ixcnt < snapshot->xcnt; ixcnt++) XactLockTableWait(snapshot->xip[ixcnt]); diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 5d77e056e13..4407e2785c0 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.48 2006/07/18 17:42:00 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.49 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -128,7 +128,7 @@ DefineOpClass(CreateOpClassStmt *stmt) * A minimum expectation therefore is that the caller have execute * privilege with grant option. Since we don't have a way to make the * opclass go away if the grant option is revoked, we choose instead to - * require ownership of the functions. It's also not entirely clear what + * require ownership of the functions. It's also not entirely clear what * permissions should be required on the datatype, but ownership seems * like a safe choice. * @@ -699,7 +699,7 @@ RemoveOpClass(RemoveOpClassStmt *stmt) opcID = OpclassnameGetOpcid(amID, opcname); if (!OidIsValid(opcID)) { - if (! stmt -> missing_ok ) + if (!stmt->missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("operator class \"%s\" does not exist for access method \"%s\"", @@ -708,10 +708,10 @@ RemoveOpClass(RemoveOpClassStmt *stmt) ereport(NOTICE, (errmsg("operator class \"%s\" does not exist for access method \"%s\"", opcname, stmt->amname))); - + return; } - + tuple = SearchSysCache(CLAOID, ObjectIdGetDatum(opcID), 0, 0, 0); @@ -719,19 +719,19 @@ RemoveOpClass(RemoveOpClassStmt *stmt) if (!HeapTupleIsValid(tuple)) { - - if (! stmt->missing_ok ) + + if (!stmt->missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("operator class \"%s\" does not exist for access method \"%s\"", - NameListToString(stmt->opclassname), stmt->amname))); + NameListToString(stmt->opclassname), stmt->amname))); else ereport(NOTICE, (errmsg("operator class \"%s\" does not exist for access method \"%s\"", - NameListToString(stmt->opclassname), stmt->amname))); + NameListToString(stmt->opclassname), stmt->amname))); return; } - + opcID = HeapTupleGetOid(tuple); /* Permission check: must own opclass or its namespace */ diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index 2aed55ed453..76884e8cd82 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.32 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.33 2006/10/04 00:29:51 momjian Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -214,14 +214,14 @@ RemoveOperator(RemoveFuncStmt *stmt) operOid = LookupOperNameTypeNames(NULL, operatorName, typeName1, typeName2, stmt->missing_ok, -1); - - if (stmt->missing_ok &&!OidIsValid(operOid) ) - { - ereport(NOTICE, - (errmsg("operator %s does not exist, skipping", - NameListToString(operatorName)))); - return; - } + + if (stmt->missing_ok && !OidIsValid(operOid)) + { + ereport(NOTICE, + (errmsg("operator %s does not exist, skipping", + NameListToString(operatorName)))); + return; + } tup = SearchSysCache(OPEROID, ObjectIdGetDatum(operOid), diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 48833e7dc04..8907aac8a95 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.55 2006/09/07 22:52:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.56 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -108,8 +108,8 @@ PerformCursorOpen(DeclareCursorStmt *stmt, ParamListInfo params) plan = copyObject(plan); /* - * XXX: debug_query_string is wrong here: the user might have - * submitted multiple semicolon delimited queries. + * XXX: debug_query_string is wrong here: the user might have submitted + * multiple semicolon delimited queries. */ PortalDefineQuery(portal, NULL, diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 46824a48e5d..6b7c11a1894 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2006, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.65 2006/09/27 18:40:09 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.66 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -162,7 +162,7 @@ ExecuteQuery(ExecuteStmt *stmt, ParamListInfo params, portal = CreateNewPortal(); /* Don't display the portal in pg_cursors, it is for internal use only */ portal->visible = false; - + /* * For CREATE TABLE / AS EXECUTE, make a copy of the stored query so that * we can modify its destination (yech, but this has always been ugly). @@ -251,7 +251,7 @@ EvaluateParams(EState *estate, List *params, List *argtypes) /* sizeof(ParamListInfoData) includes the first array element */ paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + - (nargs - 1) * sizeof(ParamExternData)); + (nargs - 1) *sizeof(ParamExternData)); paramLI->numParams = nargs; forboth(le, exprstates, la, argtypes) @@ -674,22 +674,21 @@ ExplainExecuteQuery(ExplainStmt *stmt, ParamListInfo params, Datum pg_prepared_statement(PG_FUNCTION_ARGS) { - FuncCallContext *funcctx; - HASH_SEQ_STATUS *hash_seq; - PreparedStatement *prep_stmt; + FuncCallContext *funcctx; + HASH_SEQ_STATUS *hash_seq; + PreparedStatement *prep_stmt; /* stuff done only on the first call of the function */ if (SRF_IS_FIRSTCALL()) { - TupleDesc tupdesc; - MemoryContext oldcontext; + TupleDesc tupdesc; + MemoryContext oldcontext; /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); /* - * switch to memory context appropriate for multiple function - * calls + * switch to memory context appropriate for multiple function calls */ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); @@ -704,9 +703,8 @@ pg_prepared_statement(PG_FUNCTION_ARGS) funcctx->user_fctx = NULL; /* - * build tupdesc for result tuples. This must match the - * definition of the pg_prepared_statements view in - * system_views.sql + * build tupdesc for result tuples. This must match the definition of + * the pg_prepared_statements view in system_views.sql */ tupdesc = CreateTemplateTupleDesc(5, false); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "name", @@ -735,21 +733,21 @@ pg_prepared_statement(PG_FUNCTION_ARGS) prep_stmt = hash_seq_search(hash_seq); if (prep_stmt) { - Datum result; - HeapTuple tuple; - Datum values[5]; - bool nulls[5]; + Datum result; + HeapTuple tuple; + Datum values[5]; + bool nulls[5]; MemSet(nulls, 0, sizeof(nulls)); values[0] = DirectFunctionCall1(textin, - CStringGetDatum(prep_stmt->stmt_name)); + CStringGetDatum(prep_stmt->stmt_name)); if (prep_stmt->query_string == NULL) nulls[1] = true; else values[1] = DirectFunctionCall1(textin, - CStringGetDatum(prep_stmt->query_string)); + CStringGetDatum(prep_stmt->query_string)); values[2] = TimestampTzGetDatum(prep_stmt->prepare_time); values[3] = build_regtype_array(prep_stmt->argtype_list); @@ -783,8 +781,8 @@ build_regtype_array(List *oid_list) i = 0; foreach(lc, oid_list) { - Oid oid; - Datum oid_str; + Oid oid; + Datum oid_str; oid = lfirst_oid(lc); oid_str = DirectFunctionCall1(oidout, ObjectIdGetDatum(oid)); diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index f91242470a1..7906f587b78 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.68 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.69 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -395,15 +395,15 @@ DropProceduralLanguage(DropPLangStmt *stmt) 0, 0, 0); if (!HeapTupleIsValid(langTup)) { - if (! stmt->missing_ok) + if (!stmt->missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("language \"%s\" does not exist", languageName))); - else + else ereport(NOTICE, - (errmsg("language \"%s\" does not exist, skipping", + (errmsg("language \"%s\" does not exist, skipping", languageName))); - + return; } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 865c2f60fe5..9d769cb052c 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.139 2006/08/21 00:57:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.140 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -85,7 +85,7 @@ static Relation open_share_lock(SeqTable seq); static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel); static Form_pg_sequence read_info(SeqTable elm, Relation rel, Buffer *buf); static void init_params(List *options, bool isInit, - Form_pg_sequence new, List **owned_by); + Form_pg_sequence new, List **owned_by); static void do_setval(Oid relid, int64 next, bool iscalled); static void process_owned_by(Relation seqrel, List *owned_by); @@ -862,7 +862,7 @@ open_share_lock(SeqTable seq) static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel) { - SeqTable elm; + SeqTable elm; Relation seqrel; /* Look to see if we already have a seqtable entry for relation */ @@ -1180,7 +1180,7 @@ process_owned_by(Relation seqrel, List *owned_by) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid OWNED BY option"), - errhint("Specify OWNED BY table.column or OWNED BY NONE."))); + errhint("Specify OWNED BY table.column or OWNED BY NONE."))); tablerel = NULL; attnum = 0; } @@ -1209,7 +1209,7 @@ process_owned_by(Relation seqrel, List *owned_by) if (seqrel->rd_rel->relowner != tablerel->rd_rel->relowner) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("sequence must have same owner as table it is owned by"))); + errmsg("sequence must have same owner as table it is owned by"))); if (RelationGetNamespace(seqrel) != RelationGetNamespace(tablerel)) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), @@ -1225,8 +1225,8 @@ process_owned_by(Relation seqrel, List *owned_by) } /* - * OK, we are ready to update pg_depend. First remove any existing - * AUTO dependencies for the sequence, then optionally add a new one. + * OK, we are ready to update pg_depend. First remove any existing AUTO + * dependencies for the sequence, then optionally add a new one. */ markSequenceUnowned(RelationGetRelid(seqrel)); @@ -1304,5 +1304,5 @@ seq_desc(StringInfo buf, uint8 xl_info, char *rec) } appendStringInfo(buf, "rel %u/%u/%u", - xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode); + xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode); } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 45167b816af..04c2a03aa8a 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.202 2006/09/04 21:15:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.203 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -166,7 +166,7 @@ static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) static bool change_varattnos_walker(Node *node, const AttrNumber *newattno); static void StoreCatalogInheritance(Oid relationId, List *supers); static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, - int16 seqNumber, Relation catalogRelation); + int16 seqNumber, Relation catalogRelation); static int findAttrByName(const char *attributeName, List *schema); static void setRelhassubclassInRelation(Oid relationId, bool relhassubclass); static void AlterIndexNamespaces(Relation classRel, Relation rel, @@ -566,18 +566,18 @@ ExecuteTruncate(TruncateStmt *stmt) } /* - * In CASCADE mode, suck in all referencing relations as well. This - * requires multiple iterations to find indirectly-dependent relations. - * At each phase, we need to exclusive-lock new rels before looking - * for their dependencies, else we might miss something. Also, we - * check each rel as soon as we open it, to avoid a faux pas such as - * holding lock for a long time on a rel we have no permissions for. + * In CASCADE mode, suck in all referencing relations as well. This + * requires multiple iterations to find indirectly-dependent relations. At + * each phase, we need to exclusive-lock new rels before looking for their + * dependencies, else we might miss something. Also, we check each rel as + * soon as we open it, to avoid a faux pas such as holding lock for a long + * time on a rel we have no permissions for. */ if (stmt->behavior == DROP_CASCADE) { for (;;) { - List *newrelids; + List *newrelids; newrelids = heap_truncate_find_FKs(relids); if (newrelids == NIL) @@ -585,7 +585,7 @@ ExecuteTruncate(TruncateStmt *stmt) foreach(cell, newrelids) { - Oid relid = lfirst_oid(cell); + Oid relid = lfirst_oid(cell); Relation rel; rel = heap_open(relid, AccessExclusiveLock); @@ -601,8 +601,8 @@ ExecuteTruncate(TruncateStmt *stmt) /* * Check foreign key references. In CASCADE mode, this should be - * unnecessary since we just pulled in all the references; but as - * a cross-check, do it anyway if in an Assert-enabled build. + * unnecessary since we just pulled in all the references; but as a + * cross-check, do it anyway if in an Assert-enabled build. */ #ifdef USE_ASSERT_CHECKING heap_truncate_check_FKs(rels, false); @@ -612,9 +612,9 @@ ExecuteTruncate(TruncateStmt *stmt) #endif /* - * Also check for pending AFTER trigger events on the target relations. - * We can't just leave those be, since they will try to fetch tuples - * that the TRUNCATE removes. + * Also check for pending AFTER trigger events on the target relations. We + * can't just leave those be, since they will try to fetch tuples that the + * TRUNCATE removes. */ AfterTriggerCheckTruncate(relids); @@ -657,7 +657,7 @@ ExecuteTruncate(TruncateStmt *stmt) } /* - * Check that a given rel is safe to truncate. Subroutine for ExecuteTruncate + * Check that a given rel is safe to truncate. Subroutine for ExecuteTruncate */ static void truncate_check_rel(Relation rel) @@ -681,9 +681,8 @@ truncate_check_rel(Relation rel) RelationGetRelationName(rel)))); /* - * We can never allow truncation of shared or nailed-in-cache - * relations, because we can't support changing their relfilenode - * values. + * We can never allow truncation of shared or nailed-in-cache relations, + * because we can't support changing their relfilenode values. */ if (rel->rd_rel->relisshared || rel->rd_isnailed) ereport(ERROR, @@ -692,13 +691,13 @@ truncate_check_rel(Relation rel) RelationGetRelationName(rel)))); /* - * Don't allow truncate on temp tables of other backends ... their - * local buffer manager is not going to cope. + * Don't allow truncate on temp tables of other backends ... their local + * buffer manager is not going to cope. */ if (isOtherTempNamespace(RelationGetNamespace(rel))) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot truncate temporary tables of other sessions"))); + errmsg("cannot truncate temporary tables of other sessions"))); } /*---------- @@ -1141,16 +1140,20 @@ change_varattnos_of_a_node(Node *node, const AttrNumber *newattno) AttrNumber * varattnos_map(TupleDesc old, TupleDesc new) { - int i,j; - AttrNumber *attmap = palloc0(sizeof(AttrNumber)*old->natts); - for (i=1; i <= old->natts; i++) { - if (old->attrs[i-1]->attisdropped) { - attmap[i-1] = 0; + int i, + j; + AttrNumber *attmap = palloc0(sizeof(AttrNumber) * old->natts); + + for (i = 1; i <= old->natts; i++) + { + if (old->attrs[i - 1]->attisdropped) + { + attmap[i - 1] = 0; continue; } - for (j=1; j<= new->natts; j++) - if (!strcmp(NameStr(old->attrs[i-1]->attname), NameStr(new->attrs[j-1]->attname))) - attmap[i-1] = j; + for (j = 1; j <= new->natts; j++) + if (!strcmp(NameStr(old->attrs[i - 1]->attname), NameStr(new->attrs[j - 1]->attname))) + attmap[i - 1] = j; } return attmap; } @@ -1160,16 +1163,19 @@ varattnos_map(TupleDesc old, TupleDesc new) * ColumnDefs */ AttrNumber * -varattnos_map_schema(TupleDesc old, List *schema) +varattnos_map_schema(TupleDesc old, List *schema) { - int i; - AttrNumber *attmap = palloc0(sizeof(AttrNumber)*old->natts); - for (i=1; i <= old->natts; i++) { - if (old->attrs[i-1]->attisdropped) { - attmap[i-1] = 0; + int i; + AttrNumber *attmap = palloc0(sizeof(AttrNumber) * old->natts); + + for (i = 1; i <= old->natts; i++) + { + if (old->attrs[i - 1]->attisdropped) + { + attmap[i - 1] = 0; continue; } - attmap[i-1] = findAttrByName(NameStr(old->attrs[i-1]->attname), schema); + attmap[i - 1] = findAttrByName(NameStr(old->attrs[i - 1]->attname), schema); } return attmap; } @@ -1244,14 +1250,14 @@ StoreCatalogInheritance(Oid relationId, List *supers) static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, - int16 seqNumber, Relation relation) + int16 seqNumber, Relation relation) { - Datum datum[Natts_pg_inherits]; - char nullarr[Natts_pg_inherits]; - ObjectAddress childobject, - parentobject; - HeapTuple tuple; - TupleDesc desc = RelationGetDescr(relation); + Datum datum[Natts_pg_inherits]; + char nullarr[Natts_pg_inherits]; + ObjectAddress childobject, + parentobject; + HeapTuple tuple; + TupleDesc desc = RelationGetDescr(relation); datum[0] = ObjectIdGetDatum(relationId); /* inhrel */ datum[1] = ObjectIdGetDatum(parentOid); /* inhparent */ @@ -2100,8 +2106,8 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, ATPrepSetTableSpace(tab, rel, cmd->name); pass = AT_PASS_MISC; /* doesn't actually matter */ break; - case AT_SetRelOptions: /* SET (...) */ - case AT_ResetRelOptions: /* RESET (...) */ + case AT_SetRelOptions: /* SET (...) */ + case AT_ResetRelOptions: /* RESET (...) */ ATSimplePermissionsRelationOrIndex(rel); /* This command never recurses */ /* No command-specific prep needed */ @@ -2274,10 +2280,10 @@ ATExecCmd(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd) * Nothing to do here; Phase 3 does the work */ break; - case AT_SetRelOptions: /* SET (...) */ + case AT_SetRelOptions: /* SET (...) */ ATExecSetRelOptions(rel, (List *) cmd->def, false); break; - case AT_ResetRelOptions: /* RESET (...) */ + case AT_ResetRelOptions: /* RESET (...) */ ATExecSetRelOptions(rel, (List *) cmd->def, true); break; case AT_EnableTrig: /* ENABLE TRIGGER name */ @@ -2564,8 +2570,8 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) /* * If we are rebuilding the tuples OR if we added any new NOT NULL * constraints, check all not-null constraints. This is a bit of - * overkill but it minimizes risk of bugs, and heap_attisnull is - * a pretty cheap test anyway. + * overkill but it minimizes risk of bugs, and heap_attisnull is a + * pretty cheap test anyway. */ for (i = 0; i < newTupDesc->natts; i++) { @@ -2679,13 +2685,13 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) foreach(l, notnull_attrs) { - int attn = lfirst_int(l); + int attn = lfirst_int(l); - if (heap_attisnull(tuple, attn+1)) + if (heap_attisnull(tuple, attn + 1)) ereport(ERROR, (errcode(ERRCODE_NOT_NULL_VIOLATION), errmsg("column \"%s\" contains null values", - NameStr(newTupDesc->attrs[attn]->attname)))); + NameStr(newTupDesc->attrs[attn]->attname)))); } foreach(l, tab->constraints) @@ -5105,7 +5111,7 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, if (!list_member_oid(tab->changedConstraintOids, foundObject.objectId)) { - char *defstring = pg_get_constraintdef_string(foundObject.objectId); + char *defstring = pg_get_constraintdef_string(foundObject.objectId); /* * Put NORMAL dependencies at the front of the list and @@ -5302,10 +5308,10 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab) /* * Now we can drop the existing constraints and indexes --- constraints * first, since some of them might depend on the indexes. In fact, we - * have to delete FOREIGN KEY constraints before UNIQUE constraints, - * but we already ordered the constraint list to ensure that would happen. - * It should be okay to use DROP_RESTRICT here, since nothing else should - * be depending on these objects. + * have to delete FOREIGN KEY constraints before UNIQUE constraints, but + * we already ordered the constraint list to ensure that would happen. It + * should be okay to use DROP_RESTRICT here, since nothing else should be + * depending on these objects. */ foreach(l, tab->changedConstraintOids) { @@ -5482,17 +5488,17 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing) tuple_class->relowner != newOwnerId) { /* if it's an owned sequence, disallow changing it by itself */ - Oid tableId; - int32 colId; + Oid tableId; + int32 colId; if (sequenceIsOwned(relationOid, &tableId, &colId)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot change owner of sequence \"%s\"", NameStr(tuple_class->relname)), - errdetail("Sequence \"%s\" is linked to table \"%s\".", - NameStr(tuple_class->relname), - get_rel_name(tableId)))); + errdetail("Sequence \"%s\" is linked to table \"%s\".", + NameStr(tuple_class->relname), + get_rel_name(tableId)))); } break; case RELKIND_TOASTVALUE: @@ -6051,12 +6057,12 @@ ATExecEnableDisableTrigger(Relation rel, char *trigname, } static char * -decompile_conbin(HeapTuple contup, TupleDesc tupdesc) +decompile_conbin(HeapTuple contup, TupleDesc tupdesc) { - Form_pg_constraint con; - bool isnull; - Datum attr; - Datum expr; + Form_pg_constraint con; + bool isnull; + Datum attr; + Datum expr; con = (Form_pg_constraint) GETSTRUCT(contup); attr = heap_getattr(contup, Anum_pg_constraint_conbin, tupdesc, &isnull); @@ -6107,7 +6113,7 @@ ATExecAddInherits(Relation child_rel, RangeVar *parent) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs", - RelationGetRelationName(child_rel), parent->relname))); + RelationGetRelationName(child_rel), parent->relname))); /* * Don't allow any duplicates in the list of parents. We scan through the @@ -6140,8 +6146,8 @@ ATExecAddInherits(Relation child_rel, RangeVar *parent) heap_close(catalogRelation, RowExclusiveLock); /* - * If the new parent is found in our list of inheritors, we have a circular - * structure + * If the new parent is found in our list of inheritors, we have a + * circular structure */ children = find_all_inheritors(RelationGetRelid(child_rel)); @@ -6183,12 +6189,12 @@ ATExecAddInherits(Relation child_rel, RangeVar *parent) static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) { - Relation attrdesc; - AttrNumber parent_attno; - int parent_natts; - TupleDesc tupleDesc; + Relation attrdesc; + AttrNumber parent_attno; + int parent_natts; + TupleDesc tupleDesc; TupleConstr *constr; - HeapTuple tuple; + HeapTuple tuple; tupleDesc = RelationGetDescr(parent_rel); parent_natts = tupleDesc->natts; @@ -6221,13 +6227,13 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("child table \"%s\" has different type for column \"%s\"", - RelationGetRelationName(child_rel), NameStr(attribute->attname)))); + RelationGetRelationName(child_rel), NameStr(attribute->attname)))); if (attribute->attnotnull && !childatt->attnotnull) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" in child table must be NOT NULL", - NameStr(attribute->attname)))); + errmsg("column \"%s\" in child table must be NOT NULL", + NameStr(attribute->attname)))); childatt->attinhcount++; simple_heap_update(attrdesc, &tuple->t_self, tuple); @@ -6555,13 +6561,13 @@ AlterTableNamespace(RangeVar *relation, const char *newschema) /* if it's an owned sequence, disallow moving it by itself */ if (rel->rd_rel->relkind == RELKIND_SEQUENCE) { - Oid tableId; - int32 colId; + Oid tableId; + int32 colId; if (sequenceIsOwned(relid, &tableId, &colId)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move an owned sequence into another schema"), + errmsg("cannot move an owned sequence into another schema"), errdetail("Sequence \"%s\" is linked to table \"%s\".", RelationGetRelationName(rel), get_rel_name(tableId)))); diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index e53ae3b61bd..50d5e7d84e8 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.38 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.39 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -402,7 +402,7 @@ DropTableSpace(DropTableSpaceStmt *stmt) if (!HeapTupleIsValid(tuple)) { - if ( ! stmt->missing_ok ) + if (!stmt->missing_ok) { ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -481,8 +481,8 @@ DropTableSpace(DropTableSpaceStmt *stmt) } /* - * Note: because we checked that the tablespace was empty, there should - * be no need to worry about flushing shared buffers or free space map + * Note: because we checked that the tablespace was empty, there should be + * no need to worry about flushing shared buffers or free space map * entries for relations in the tablespace. */ @@ -1069,7 +1069,7 @@ tblspc_desc(StringInfo buf, uint8 xl_info, char *rec) xl_tblspc_create_rec *xlrec = (xl_tblspc_create_rec *) rec; appendStringInfo(buf, "create ts: %u \"%s\"", - xlrec->ts_id, xlrec->ts_path); + xlrec->ts_id, xlrec->ts_path); } else if (info == XLOG_TBLSPC_DROP) { diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 6d63356e100..1ed15614ce4 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.208 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.209 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -480,7 +480,7 @@ DropTrigger(Oid relid, const char *trigname, DropBehavior behavior, if (!HeapTupleIsValid(tup)) { - if (! missing_ok) + if (!missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("trigger \"%s\" for table \"%s\" does not exist", @@ -856,8 +856,8 @@ RelationBuildTriggers(Relation relation) /* * Note: since we scan the triggers using TriggerRelidNameIndexId, we will * be reading the triggers in name order, except possibly during - * emergency-recovery operations (ie, IgnoreSystemIndexes). This in - * turn ensures that triggers will be fired in name order. + * emergency-recovery operations (ie, IgnoreSystemIndexes). This in turn + * ensures that triggers will be fired in name order. */ ScanKeyInit(&skey, Anum_pg_trigger_tgrelid, @@ -2940,26 +2940,30 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cross-database references are not implemented: \"%s.%s.%s\"", - constraint->catalogname, constraint->schemaname, + constraint->catalogname, constraint->schemaname, constraint->relname))); } - /* + /* * If we're given the schema name with the constraint, look only - * in that schema. If given a bare constraint name, use the + * in that schema. If given a bare constraint name, use the * search path to find the first matching constraint. */ - if (constraint->schemaname) { - Oid namespaceId = LookupExplicitNamespace(constraint->schemaname); + if (constraint->schemaname) + { + Oid namespaceId = LookupExplicitNamespace(constraint->schemaname); + namespaceSearchList = list_make1_oid(namespaceId); - } else { + } + else + { namespaceSearchList = fetch_search_path(true); } found = false; foreach(namespaceSearchCell, namespaceSearchList) { - Oid searchNamespaceId = lfirst_oid(namespaceSearchCell); + Oid searchNamespaceId = lfirst_oid(namespaceSearchCell); /* * Setup to scan pg_trigger by tgconstrname ... @@ -2978,18 +2982,18 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) while (HeapTupleIsValid(htup = systable_getnext(tgscan))) { Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(htup); - Oid constraintNamespaceId; + Oid constraintNamespaceId; /* * Foreign key constraints have triggers on both the - * parent and child tables. Since these tables may be - * in different schemas we must pick the child table - * because that table "owns" the constraint. + * parent and child tables. Since these tables may be in + * different schemas we must pick the child table because + * that table "owns" the constraint. * * Referential triggers on the parent table other than - * NOACTION_DEL and NOACTION_UPD are ignored below, so - * it is possible to not check them here, but it seems - * safer to always check. + * NOACTION_DEL and NOACTION_UPD are ignored below, so it + * is possible to not check them here, but it seems safer + * to always check. */ if (pg_trigger->tgfoid == F_RI_FKEY_NOACTION_DEL || pg_trigger->tgfoid == F_RI_FKEY_NOACTION_UPD || @@ -3006,16 +3010,16 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) constraintNamespaceId = get_rel_namespace(pg_trigger->tgrelid); /* - * If this constraint is not in the schema we're - * currently searching for, keep looking. + * If this constraint is not in the schema we're currently + * searching for, keep looking. */ if (constraintNamespaceId != searchNamespaceId) continue; /* - * If we found some, check that they fit the deferrability but - * skip referential action ones, since they are silently never - * deferrable. + * If we found some, check that they fit the deferrability + * but skip referential action ones, since they are + * silently never deferrable. */ if (pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_UPD && pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_DEL && @@ -3029,8 +3033,8 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) if (stmt->deferred && !pg_trigger->tgdeferrable) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("constraint \"%s\" is not deferrable", - constraint->relname))); + errmsg("constraint \"%s\" is not deferrable", + constraint->relname))); oidlist = lappend_oid(oidlist, HeapTupleGetOid(htup)); } found = true; @@ -3147,9 +3151,9 @@ AfterTriggerCheckTruncate(List *relids) event = event->ate_next) { /* - * We can ignore completed events. (Even if a DONE flag is rolled - * back by subxact abort, it's OK because the effects of the - * TRUNCATE must get rolled back too.) + * We can ignore completed events. (Even if a DONE flag is rolled + * back by subxact abort, it's OK because the effects of the TRUNCATE + * must get rolled back too.) */ if (event->ate_event & AFTER_TRIGGER_DONE) continue; @@ -3162,10 +3166,9 @@ AfterTriggerCheckTruncate(List *relids) } /* - * Also scan events queued by incomplete queries. This could only - * matter if a TRUNCATE is executed by a function or trigger within - * an updating query on the same relation, which is pretty perverse, - * but let's check. + * Also scan events queued by incomplete queries. This could only matter + * if a TRUNCATE is executed by a function or trigger within an updating + * query on the same relation, which is pretty perverse, but let's check. */ for (depth = 0; depth <= afterTriggers->query_depth; depth++) { diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 6dfa6296d5a..53cca73a9dd 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.96 2006/07/31 20:09:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.97 2006/10/04 00:29:51 momjian Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -343,12 +343,12 @@ DefineType(List *names, List *parameters) analyzeOid = findTypeAnalyzeFunction(analyzeName, typoid); /* - * Check permissions on functions. We choose to require the creator/owner - * of a type to also own the underlying functions. Since creating a type + * Check permissions on functions. We choose to require the creator/owner + * of a type to also own the underlying functions. Since creating a type * is tantamount to granting public execute access on the functions, the - * minimum sane check would be for execute-with-grant-option. But we don't - * have a way to make the type go away if the grant option is revoked, so - * ownership seems better. + * minimum sane check would be for execute-with-grant-option. But we + * don't have a way to make the type go away if the grant option is + * revoked, so ownership seems better. */ if (inputOid && !pg_proc_ownercheck(inputOid, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC, @@ -587,8 +587,8 @@ DefineDomain(CreateDomainStmt *stmt) /* * Base type must be a plain base type or another domain. Domains over - * pseudotypes would create a security hole. Domains over composite - * types might be made to work in the future, but not today. + * pseudotypes would create a security hole. Domains over composite types + * might be made to work in the future, but not today. */ typtype = baseType->typtype; if (typtype != 'b' && typtype != 'd') @@ -1840,7 +1840,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, if (pstate->p_hasAggs) ereport(ERROR, (errcode(ERRCODE_GROUPING_ERROR), - errmsg("cannot use aggregate function in check constraint"))); + errmsg("cannot use aggregate function in check constraint"))); /* * Convert to string form for storage. diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 589111713b1..2e9b27a5988 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.173 2006/07/13 16:49:14 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.174 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -377,8 +377,8 @@ CreateRole(CreateRoleStmt *stmt) GetUserId(), false); /* - * Close pg_authid, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authid, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_authid_rel, NoLock); @@ -696,8 +696,8 @@ AlterRole(AlterRoleStmt *stmt) false); /* - * Close pg_authid, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authid, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_authid_rel, NoLock); @@ -845,7 +845,7 @@ DropRole(DropRoleStmt *stmt) else { ereport(NOTICE, - (errmsg("role \"%s\" does not exist, skipping", + (errmsg("role \"%s\" does not exist, skipping", role))); } @@ -1075,8 +1075,8 @@ RenameRole(const char *oldname, const char *newname) ReleaseSysCache(oldtuple); /* - * Close pg_authid, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authid, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(rel, NoLock); @@ -1132,8 +1132,8 @@ GrantRole(GrantRoleStmt *stmt) } /* - * Close pg_authid, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authid, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_authid_rel, NoLock); @@ -1149,7 +1149,7 @@ GrantRole(GrantRoleStmt *stmt) * Drop the objects owned by a given list of roles. */ void -DropOwnedObjects(DropOwnedStmt * stmt) +DropOwnedObjects(DropOwnedStmt *stmt) { List *role_ids = roleNamesToIds(stmt->roles); ListCell *cell; @@ -1175,7 +1175,7 @@ DropOwnedObjects(DropOwnedStmt * stmt) * Give the objects owned by a given list of roles away to another user. */ void -ReassignOwnedObjects(ReassignOwnedStmt * stmt) +ReassignOwnedObjects(ReassignOwnedStmt *stmt) { List *role_ids = roleNamesToIds(stmt->roles); ListCell *cell; @@ -1360,8 +1360,8 @@ AddRoleMems(const char *rolename, Oid roleid, } /* - * Close pg_authmem, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authmem, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_authmem_rel, NoLock); } @@ -1473,8 +1473,8 @@ DelRoleMems(const char *rolename, Oid roleid, } /* - * Close pg_authmem, but keep lock till commit (this is important - * to prevent any risk of deadlock failure while updating flat file) + * Close pg_authmem, but keep lock till commit (this is important to + * prevent any risk of deadlock failure while updating flat file) */ heap_close(pg_authmem_rel, NoLock); } diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 5a6d5a04b02..e9f0bf363ea 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.340 2006/09/21 20:31:22 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.341 2006/10/04 00:29:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -125,7 +125,7 @@ typedef struct VRelStats Size min_tlen; Size max_tlen; bool hasindex; - TransactionId minxid; /* Minimum Xid present anywhere on table */ + TransactionId minxid; /* Minimum Xid present anywhere on table */ /* vtlinks array for tuple chain following - sorted by new_tid */ int num_vtlinks; VTupleLink vtlinks; @@ -238,7 +238,7 @@ static int vac_cmp_blk(const void *left, const void *right); static int vac_cmp_offno(const void *left, const void *right); static int vac_cmp_vtlinks(const void *left, const void *right); static bool enough_space(VacPage vacpage, Size len); -static Size PageGetFreeSpaceWithFillFactor(Relation relation, Page page); +static Size PageGetFreeSpaceWithFillFactor(Relation relation, Page page); /**************************************************************************** @@ -320,8 +320,8 @@ vacuum(VacuumStmt *vacstmt, List *relids) errhint("Use VACUUM FULL, then VACUUM FREEZE."))); /* - * Send info about dead objects to the statistics collector, unless - * we are in autovacuum --- autovacuum.c does this for itself. + * Send info about dead objects to the statistics collector, unless we are + * in autovacuum --- autovacuum.c does this for itself. */ if (vacstmt->vacuum && !IsAutoVacuumProcess()) pgstat_vacuum_tabstat(); @@ -481,20 +481,21 @@ vacuum(VacuumStmt *vacstmt, List *relids) * PostgresMain(). */ StartTransactionCommand(); + /* - * Re-establish the transaction snapshot. This is wasted effort - * when we are called as a normal utility command, because the - * new transaction will be dropped immediately by PostgresMain(); - * but it's necessary if we are called from autovacuum because - * autovacuum might continue on to do an ANALYZE-only call. + * Re-establish the transaction snapshot. This is wasted effort when + * we are called as a normal utility command, because the new + * transaction will be dropped immediately by PostgresMain(); but it's + * necessary if we are called from autovacuum because autovacuum might + * continue on to do an ANALYZE-only call. */ ActiveSnapshot = CopySnapshot(GetTransactionSnapshot()); } if (vacstmt->vacuum) { - TransactionId minxid, - vacuumxid; + TransactionId minxid, + vacuumxid; /* * If it was a database-wide VACUUM, print FSM usage statistics (we @@ -593,9 +594,9 @@ vacuum_set_xid_limits(VacuumStmt *vacstmt, bool sharedRel, TransactionId limit; /* - * We can always ignore processes running lazy vacuum. This is because we + * We can always ignore processes running lazy vacuum. This is because we * use these values only for deciding which tuples we must keep in the - * tables. Since lazy vacuum doesn't write its xid to the table, it's + * tables. Since lazy vacuum doesn't write its xid to the table, it's * safe to ignore it. In theory it could be problematic to ignore lazy * vacuums on a full vacuum, but keep in mind that only one vacuum process * can be working on a particular table at any time, and that each vacuum @@ -704,6 +705,7 @@ vac_update_relstats(Oid relid, BlockNumber num_pages, double num_tuples, pgcform->relhasindex = hasindex; dirty = true; } + /* * If we have discovered that there are no indexes, then there's no * primary key either. This could be done more thoroughly... @@ -740,11 +742,11 @@ vac_update_relstats(Oid relid, BlockNumber num_pages, double num_tuples, /* * vac_update_dbminxid() -- update the minimum Xid present in one database * - * Update pg_database's datminxid and datvacuumxid, and the flat-file copy - * of it. datminxid is updated to the minimum of all relminxid found in - * pg_class. datvacuumxid is updated to the minimum of all relvacuumxid - * found in pg_class. The values are also returned in minxid and - * vacuumxid, respectively. + * Update pg_database's datminxid and datvacuumxid, and the flat-file copy + * of it. datminxid is updated to the minimum of all relminxid found in + * pg_class. datvacuumxid is updated to the minimum of all relvacuumxid + * found in pg_class. The values are also returned in minxid and + * vacuumxid, respectively. * * We violate transaction semantics here by overwriting the database's * existing pg_database tuple with the new values. This is reasonably @@ -760,15 +762,15 @@ vac_update_dbminxid(Oid dbid, TransactionId *minxid, TransactionId *vacuumxid) HeapTuple tuple; Form_pg_database dbform; Relation relation; - SysScanDesc scan; + SysScanDesc scan; HeapTuple classTup; - TransactionId newMinXid = InvalidTransactionId; - TransactionId newVacXid = InvalidTransactionId; + TransactionId newMinXid = InvalidTransactionId; + TransactionId newVacXid = InvalidTransactionId; bool dirty = false; - /* - * We must seqscan pg_class to find the minimum Xid, because there - * is no index that can help us here. + /* + * We must seqscan pg_class to find the minimum Xid, because there is no + * index that can help us here. */ relation = heap_open(RelationRelationId, AccessShareLock); @@ -845,7 +847,7 @@ vac_update_dbminxid(Oid dbid, TransactionId *minxid, TransactionId *vacuumxid) *vacuumxid = newVacXid; /* Mark the flat-file copy of pg_database for update at commit */ - database_file_update_needed(); + database_file_update_needed(); } @@ -970,14 +972,14 @@ vac_truncate_clog(TransactionId myminxid, TransactionId myvacxid) * XXX -- the test we use here is fairly arbitrary. Note that in the * autovacuum database-wide code, a template database is always processed * with VACUUM FREEZE, so we can be sure that it will be truly frozen so - * it won't be need to be processed here again soon. + * it won't be need to be processed here again soon. * * FIXME -- here we could get into a kind of loop if the database being * chosen is not actually a template database, because we'll not freeze * it, so its age may not really decrease if there are any live * non-freezable tuples. Consider forcing a vacuum freeze if autovacuum - * is invoked by a backend. On the other hand, forcing a vacuum freeze - * on a user database may not a be a very polite thing to do. + * is invoked by a backend. On the other hand, forcing a vacuum freeze on + * a user database may not a be a very polite thing to do. */ if (!AutoVacuumingActive() && age > (int32) ((MaxTransactionId >> 3) * 3)) SendPostmasterSignal(PMSIGNAL_START_AUTOVAC); @@ -1022,18 +1024,18 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind) else { /* - * During a lazy VACUUM we do not run any user-supplied functions, - * and so it should be safe to not create a transaction snapshot. + * During a lazy VACUUM we do not run any user-supplied functions, and + * so it should be safe to not create a transaction snapshot. * * We can furthermore set the inVacuum flag, which lets other * concurrent VACUUMs know that they can ignore this one while * determining their OldestXmin. (The reason we don't set inVacuum * during a full VACUUM is exactly that we may have to run user- - * defined functions for functional indexes, and we want to make - * sure that if they use the snapshot set above, any tuples it - * requires can't get removed from other tables. An index function - * that depends on the contents of other tables is arguably broken, - * but we won't break it here by violating transaction semantics.) + * defined functions for functional indexes, and we want to make sure + * that if they use the snapshot set above, any tuples it requires + * can't get removed from other tables. An index function that + * depends on the contents of other tables is arguably broken, but we + * won't break it here by violating transaction semantics.) * * Note: the inVacuum flag remains set until CommitTransaction or * AbortTransaction. We don't want to clear it until we reset @@ -1059,8 +1061,8 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind) /* * Open the relation and get the appropriate lock on it. * - * There's a race condition here: the rel may have gone away since - * the last time we saw it. If so, we don't need to vacuum it. + * There's a race condition here: the rel may have gone away since the + * last time we saw it. If so, we don't need to vacuum it. */ onerel = try_relation_open(relid, lmode); @@ -1116,7 +1118,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind) { relation_close(onerel, lmode); CommitTransactionCommand(); - return; /* assume no long-lived data in temp tables */ + return; /* assume no long-lived data in temp tables */ } /* @@ -1207,7 +1209,7 @@ full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) i; VRelStats *vacrelstats; TransactionId FreezeLimit, - OldestXmin; + OldestXmin; vacuum_set_xid_limits(vacstmt, onerel->rd_rel->relisshared, &OldestXmin, &FreezeLimit); @@ -1221,13 +1223,13 @@ full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) vacrelstats->hasindex = false; /* - * Set initial minimum Xid, which will be updated if a smaller Xid is found - * in the relation by scan_heap. + * Set initial minimum Xid, which will be updated if a smaller Xid is + * found in the relation by scan_heap. * * We use RecentXmin here (the minimum Xid that belongs to a transaction * that is still open according to our snapshot), because it is the - * earliest transaction that could insert new tuples in the table after our - * VACUUM is done. + * earliest transaction that could insert new tuples in the table after + * our VACUUM is done. */ vacrelstats->minxid = RecentXmin; @@ -1557,7 +1559,7 @@ scan_heap(VRelStats *vacrelstats, Relation onerel, } else { - TransactionId min; + TransactionId min; num_tuples += 1; notup = false; @@ -1566,7 +1568,7 @@ scan_heap(VRelStats *vacrelstats, Relation onerel, if (tuple.t_len > max_tlen) max_tlen = tuple.t_len; - /* + /* * If the tuple is alive, we consider it for the "minxid" * calculations. */ @@ -1710,23 +1712,23 @@ scan_heap(VRelStats *vacrelstats, Relation onerel, TransactionId vactuple_get_minxid(HeapTuple tuple) { - TransactionId min = InvalidTransactionId; + TransactionId min = InvalidTransactionId; - /* - * Initialize calculations with Xmin. NB -- may be FrozenXid and - * we don't want that one. + /* + * Initialize calculations with Xmin. NB -- may be FrozenXid and we don't + * want that one. */ if (TransactionIdIsNormal(HeapTupleHeaderGetXmin(tuple->t_data))) min = HeapTupleHeaderGetXmin(tuple->t_data); /* * If Xmax is not marked INVALID, we assume it's valid without making - * further checks on it --- it must be recently obsoleted or still running, - * else HeapTupleSatisfiesVacuum would have deemed it removable. + * further checks on it --- it must be recently obsoleted or still + * running, else HeapTupleSatisfiesVacuum would have deemed it removable. */ if (!(tuple->t_data->t_infomask | HEAP_XMAX_INVALID)) { - TransactionId xmax = HeapTupleHeaderGetXmax(tuple->t_data); + TransactionId xmax = HeapTupleHeaderGetXmax(tuple->t_data); /* If xmax is a plain Xid, consider it by itself */ if (!(tuple->t_data->t_infomask | HEAP_XMAX_IS_MULTI)) diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index c839b951d98..c89dc20404c 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -36,7 +36,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.79 2006/09/21 20:31:22 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.80 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -90,7 +90,7 @@ typedef struct LVRelStats int num_free_pages; /* current # of entries */ int max_free_pages; /* # slots allocated in array */ PageFreeSpaceInfo *free_pages; /* array or heap of blkno/avail */ - BlockNumber tot_free_pages; /* total pages with >= threshold space */ + BlockNumber tot_free_pages; /* total pages with >= threshold space */ } LVRelStats; @@ -103,15 +103,15 @@ static void lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, TransactionId OldestXmin); static void lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats); static void lazy_vacuum_index(Relation indrel, - IndexBulkDeleteResult **stats, - LVRelStats *vacrelstats); + IndexBulkDeleteResult **stats, + LVRelStats *vacrelstats); static void lazy_cleanup_index(Relation indrel, - IndexBulkDeleteResult *stats, - LVRelStats *vacrelstats); + IndexBulkDeleteResult *stats, + LVRelStats *vacrelstats); static int lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer, int tupindex, LVRelStats *vacrelstats); static void lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats, - TransactionId OldestXmin); + TransactionId OldestXmin); static BlockNumber count_nondeletable_pages(Relation onerel, LVRelStats *vacrelstats, TransactionId OldestXmin); static void lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks); @@ -143,7 +143,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) int nindexes; BlockNumber possibly_freeable; TransactionId OldestXmin, - FreezeLimit; + FreezeLimit; if (vacstmt->verbose) elevel = INFO; @@ -160,8 +160,8 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) vacrelstats->threshold = GetAvgFSMRequestSize(&onerel->rd_node); /* - * Set initial minimum Xid, which will be updated if a smaller Xid is found - * in the relation by lazy_scan_heap. + * Set initial minimum Xid, which will be updated if a smaller Xid is + * found in the relation by lazy_scan_heap. * * We use RecentXmin here (the minimum Xid that belongs to a transaction * that is still open according to our snapshot), because it is the @@ -440,7 +440,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, num_tuples += 1; hastup = true; - /* + /* * If the tuple is alive, we consider it for the "minxid" * calculations. */ @@ -472,8 +472,8 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, * If we remembered any tuples for deletion, then the page will be * visited again by lazy_vacuum_heap, which will compute and record * its post-compaction free space. If not, then we're done with this - * page, so remember its free space as-is. (This path will always - * be taken if there are no indexes.) + * page, so remember its free space as-is. (This path will always be + * taken if there are no indexes.) */ if (vacrelstats->num_dead_tuples == prev_dead_count) { @@ -803,11 +803,12 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats, } } vacrelstats->num_free_pages = j; + /* * If tot_free_pages was more than num_free_pages, we can't tell for sure * what its correct value is now, because we don't know which of the - * forgotten pages are getting truncated. Conservatively set it equal - * to num_free_pages. + * forgotten pages are getting truncated. Conservatively set it equal to + * num_free_pages. */ vacrelstats->tot_free_pages = j; diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 2e270cde56f..c910f6376fd 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.118 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.119 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -585,7 +585,7 @@ assign_client_encoding(const char *value, bool doit, GucSource source) * limit on names, so we can tell whether we're being passed an initial * role name or a saved/restored value. (NOTE: we rely on guc.c to have * properly truncated any incoming value, but not to truncate already-stored - * values. See GUC_IS_NAME processing.) + * values. See GUC_IS_NAME processing.) */ extern char *session_authorization_string; /* in guc.c */ diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index df7f479f316..a79bd3cd4f2 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.97 2006/08/21 00:57:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.98 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -119,7 +119,7 @@ DefineVirtualRelation(const RangeVar *relation, List *tlist, bool replace) def->colname = pstrdup(tle->resname); def->typename = makeTypeNameFromOid(exprType((Node *) tle->expr), - exprTypmod((Node *) tle->expr)); + exprTypmod((Node *) tle->expr)); def->inhcount = 0; def->is_local = true; def->is_not_null = false; diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 4b8a166ffae..5e5ca085ba4 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.279 2006/08/12 20:05:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.280 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -76,17 +76,17 @@ static TupleTableSlot *ExecutePlan(EState *estate, PlanState *planstate, ScanDirection direction, DestReceiver *dest); static void ExecSelect(TupleTableSlot *slot, - DestReceiver *dest, EState *estate); + DestReceiver *dest, EState *estate); static void ExecInsert(TupleTableSlot *slot, ItemPointer tupleid, - TupleTableSlot *planSlot, - DestReceiver *dest, EState *estate); + TupleTableSlot *planSlot, + DestReceiver *dest, EState *estate); static void ExecDelete(ItemPointer tupleid, - TupleTableSlot *planSlot, - DestReceiver *dest, EState *estate); + TupleTableSlot *planSlot, + DestReceiver *dest, EState *estate); static void ExecUpdate(TupleTableSlot *slot, ItemPointer tupleid, - TupleTableSlot *planSlot, - DestReceiver *dest, EState *estate); -static void ExecProcessReturning(ProjectionInfo *projectReturning, + TupleTableSlot *planSlot, + DestReceiver *dest, EState *estate); +static void ExecProcessReturning(ProjectionInfo *projectReturning, TupleTableSlot *tupleSlot, TupleTableSlot *planSlot, DestReceiver *dest); @@ -758,32 +758,33 @@ InitPlan(QueryDesc *queryDesc, int eflags) econtext = CreateExprContext(estate); /* - * Build a projection for each result rel. Note that any SubPlans - * in the RETURNING lists get attached to the topmost plan node. + * Build a projection for each result rel. Note that any SubPlans in + * the RETURNING lists get attached to the topmost plan node. */ Assert(list_length(parseTree->returningLists) == estate->es_num_result_relations); resultRelInfo = estate->es_result_relations; foreach(l, parseTree->returningLists) { - List *rlist = (List *) lfirst(l); - List *rliststate; + List *rlist = (List *) lfirst(l); + List *rliststate; rliststate = (List *) ExecInitExpr((Expr *) rlist, planstate); resultRelInfo->ri_projectReturning = ExecBuildProjectionInfo(rliststate, econtext, slot); resultRelInfo++; } + /* - * Because we already ran ExecInitNode() for the top plan node, - * any subplans we just attached to it won't have been initialized; - * so we have to do it here. (Ugly, but the alternatives seem worse.) + * Because we already ran ExecInitNode() for the top plan node, any + * subplans we just attached to it won't have been initialized; so we + * have to do it here. (Ugly, but the alternatives seem worse.) */ foreach(l, planstate->subPlan) { SubPlanState *sstate = (SubPlanState *) lfirst(l); Assert(IsA(sstate, SubPlanState)); - if (sstate->planstate == NULL) /* already inited? */ + if (sstate->planstate == NULL) /* already inited? */ ExecInitSubPlan(sstate, estate, eflags); } } @@ -1191,7 +1192,7 @@ lnext: ; erm->rti, &update_ctid, update_xmax, - estate->es_snapshot->curcid); + estate->es_snapshot->curcid); if (!TupIsNull(newSlot)) { slot = planSlot = newSlot; @@ -1215,9 +1216,9 @@ lnext: ; } /* - * Create a new "clean" tuple with all junk attributes removed. - * We don't need to do this for DELETE, however (there will - * in fact be no non-junk attributes in a DELETE!) + * Create a new "clean" tuple with all junk attributes removed. We + * don't need to do this for DELETE, however (there will in fact + * be no non-junk attributes in a DELETE!) */ if (operation != CMD_DELETE) slot = ExecFilterJunk(junkfilter, slot); @@ -1515,8 +1516,8 @@ ldelete:; if (resultRelInfo->ri_projectReturning) { /* - * We have to put the target tuple into a slot, which means - * first we gotta fetch it. We can use the trigger tuple slot. + * We have to put the target tuple into a slot, which means first we + * gotta fetch it. We can use the trigger tuple slot. */ TupleTableSlot *slot = estate->es_trig_tuple_slot; HeapTupleData deltuple; @@ -1815,13 +1816,13 @@ ExecConstraints(ResultRelInfo *resultRelInfo, * dest: where to send the output */ static void -ExecProcessReturning(ProjectionInfo *projectReturning, +ExecProcessReturning(ProjectionInfo *projectReturning, TupleTableSlot *tupleSlot, TupleTableSlot *planSlot, DestReceiver *dest) { - ExprContext *econtext = projectReturning->pi_exprContext; - TupleTableSlot *retSlot; + ExprContext *econtext = projectReturning->pi_exprContext; + TupleTableSlot *retSlot; /* * Reset per-tuple memory context to free any expression evaluation @@ -1942,12 +1943,12 @@ EvalPlanQual(EState *estate, Index rti, * If tuple was inserted by our own transaction, we have to check * cmin against curCid: cmin >= curCid means our command cannot * see the tuple, so we should ignore it. Without this we are - * open to the "Halloween problem" of indefinitely re-updating - * the same tuple. (We need not check cmax because - * HeapTupleSatisfiesDirty will consider a tuple deleted by - * our transaction dead, regardless of cmax.) We just checked - * that priorXmax == xmin, so we can test that variable instead - * of doing HeapTupleHeaderGetXmin again. + * open to the "Halloween problem" of indefinitely re-updating the + * same tuple. (We need not check cmax because + * HeapTupleSatisfiesDirty will consider a tuple deleted by our + * transaction dead, regardless of cmax.) We just checked that + * priorXmax == xmin, so we can test that variable instead of + * doing HeapTupleHeaderGetXmin again. */ if (TransactionIdIsCurrentTransactionId(priorXmax) && HeapTupleHeaderGetCmin(tuple.t_data) >= curCid) @@ -2379,7 +2380,8 @@ OpenIntoRel(QueryDesc *queryDesc) (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("tablespace \"%s\" does not exist", parseTree->intoTableSpaceName))); - } else + } + else { tablespaceId = GetDefaultTablespace(); /* note InvalidOid is OK in this case */ @@ -2426,15 +2428,15 @@ OpenIntoRel(QueryDesc *queryDesc) FreeTupleDesc(tupdesc); /* - * Advance command counter so that the newly-created relation's - * catalog tuples will be visible to heap_open. + * Advance command counter so that the newly-created relation's catalog + * tuples will be visible to heap_open. */ CommandCounterIncrement(); /* * If necessary, create a TOAST table for the INTO relation. Note that - * AlterTableCreateToastTable ends with CommandCounterIncrement(), so - * that the TOAST table will be visible for insertion. + * AlterTableCreateToastTable ends with CommandCounterIncrement(), so that + * the TOAST table will be visible for insertion. */ AlterTableCreateToastTable(intoRelationId); @@ -2449,11 +2451,11 @@ OpenIntoRel(QueryDesc *queryDesc) /* * We can skip WAL-logging the insertions, unless PITR is in use. * - * Note that for a non-temp INTO table, this is safe only because we - * know that the catalog changes above will have been WAL-logged, and - * so RecordTransactionCommit will think it needs to WAL-log the - * eventual transaction commit. Else the commit might be lost, even - * though all the data is safely fsync'd ... + * Note that for a non-temp INTO table, this is safe only because we know + * that the catalog changes above will have been WAL-logged, and so + * RecordTransactionCommit will think it needs to WAL-log the eventual + * transaction commit. Else the commit might be lost, even though all the + * data is safely fsync'd ... */ estate->es_into_relation_use_wal = XLogArchivingActive(); estate->es_into_relation_descriptor = intoRelationDesc; diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 9f1fd54a8e5..cd13bc65972 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.58 2006/08/02 01:59:45 joe Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.59 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -197,7 +197,7 @@ ExecInitNode(Plan *node, EState *estate, int eflags) case T_ValuesScan: result = (PlanState *) ExecInitValuesScan((ValuesScan *) node, - estate, eflags); + estate, eflags); break; /* diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 7e9e51f1391..3f9c0907257 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.194 2006/09/28 20:51:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.195 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -108,8 +108,8 @@ static Datum ExecEvalRow(RowExprState *rstate, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); static Datum ExecEvalRowCompare(RowCompareExprState *rstate, - ExprContext *econtext, - bool *isNull, ExprDoneCond *isDone); + ExprContext *econtext, + bool *isNull, ExprDoneCond *isDone); static Datum ExecEvalCoalesce(CoalesceExprState *coalesceExpr, ExprContext *econtext, bool *isNull, ExprDoneCond *isDone); @@ -882,7 +882,7 @@ get_cached_rowtype(Oid type_id, int32 typmod, static void ShutdownTupleDescRef(Datum arg) { - TupleDesc *cache_field = (TupleDesc *) DatumGetPointer(arg); + TupleDesc *cache_field = (TupleDesc *) DatumGetPointer(arg); if (*cache_field) ReleaseTupleDesc(*cache_field); @@ -2015,8 +2015,8 @@ ExecEvalConvertRowtype(ConvertRowtypeExprState *cstate, /* if first time through, initialize */ if (cstate->attrMap == NULL) { - MemoryContext old_cxt; - int n; + MemoryContext old_cxt; + int n; /* allocate state in long-lived memory context */ old_cxt = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); @@ -2502,7 +2502,7 @@ ExecEvalRowCompare(RowCompareExprState *rstate, switch (rctype) { - /* EQ and NE cases aren't allowed here */ + /* EQ and NE cases aren't allowed here */ case ROWCOMPARE_LT: result = (cmpresult < 0); break; @@ -2722,7 +2722,7 @@ ExecEvalNullTest(NullTestState *nstate, for (att = 1; att <= tupDesc->natts; att++) { /* ignore dropped columns */ - if (tupDesc->attrs[att-1]->attisdropped) + if (tupDesc->attrs[att - 1]->attisdropped) continue; if (heap_attisnull(&tmptup, att)) { @@ -2764,7 +2764,7 @@ ExecEvalNullTest(NullTestState *nstate, default: elog(ERROR, "unrecognized nulltesttype: %d", (int) ntest->nulltesttype); - return (Datum) 0; /* keep compiler quiet */ + return (Datum) 0; /* keep compiler quiet */ } } } @@ -3564,16 +3564,17 @@ ExecInitExpr(Expr *node, PlanState *parent) i = 0; forboth(l, rcexpr->opnos, l2, rcexpr->opclasses) { - Oid opno = lfirst_oid(l); - Oid opclass = lfirst_oid(l2); - int strategy; - Oid subtype; - bool recheck; - Oid proc; + Oid opno = lfirst_oid(l); + Oid opclass = lfirst_oid(l2); + int strategy; + Oid subtype; + bool recheck; + Oid proc; get_op_opclass_properties(opno, opclass, &strategy, &subtype, &recheck); proc = get_opclass_proc(opclass, subtype, BTORDER_PROC); + /* * If we enforced permissions checks on index support * functions, we'd need to make a check here. But the @@ -3632,11 +3633,12 @@ ExecInitExpr(Expr *node, PlanState *parent) (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("could not identify a comparison function for type %s", format_type_be(minmaxexpr->minmaxtype)))); + /* * If we enforced permissions checks on index support - * functions, we'd need to make a check here. But the - * index support machinery doesn't do that, and neither - * does this code. + * functions, we'd need to make a check here. But the index + * support machinery doesn't do that, and neither does this + * code. */ fmgr_info(typentry->cmp_proc, &(mstate->cfunc)); state = (ExprState *) mstate; diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 6e5f30bde4a..fb1fdf9e723 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.97 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.98 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -722,7 +722,7 @@ ExecFetchSlotTuple(TupleTableSlot *slot) * Fetch the slot's minimal physical tuple. * * If the slot contains a virtual tuple, we convert it to minimal - * physical form. The slot retains ownership of the physical tuple. + * physical form. The slot retains ownership of the physical tuple. * Likewise, if it contains a regular tuple we convert to minimal form. * * As above, the result must be treated as read-only. @@ -792,8 +792,8 @@ ExecMaterializeSlot(TupleTableSlot *slot) Assert(!slot->tts_isempty); /* - * If we have a regular physical tuple, and it's locally palloc'd, - * we have nothing to do. + * If we have a regular physical tuple, and it's locally palloc'd, we have + * nothing to do. */ if (slot->tts_tuple && slot->tts_shouldFree && slot->tts_mintuple == NULL) return slot->tts_tuple; diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index aa5aeb57f36..d8290b3b5be 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.139 2006/08/04 21:33:36 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.140 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -898,8 +898,8 @@ ExecOpenIndices(ResultRelInfo *resultRelInfo) resultRelInfo->ri_IndexRelationInfo = indexInfoArray; /* - * For each index, open the index relation and save pg_index info. - * We acquire RowExclusiveLock, signifying we will update the index. + * For each index, open the index relation and save pg_index info. We + * acquire RowExclusiveLock, signifying we will update the index. */ i = 0; foreach(l, indexoidlist) diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index e2e56543839..f9b8067109b 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.106 2006/09/06 20:40:47 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.107 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -433,7 +433,7 @@ postquel_sub_params(SQLFunctionCachePtr fcache, /* sizeof(ParamListInfoData) includes the first array element */ paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + - (nargs - 1) * sizeof(ParamExternData)); + (nargs - 1) *sizeof(ParamExternData)); paramLI->numParams = nargs; for (i = 0; i < nargs; i++) @@ -897,8 +897,8 @@ check_sql_fn_retval(Oid func_id, Oid rettype, List *queryTreeList, parse = (Query *) lfirst(list_tail(queryTreeList)); /* - * Note: eventually replace this with QueryReturnsTuples? We'd need - * a more general method of determining the output type, though. + * Note: eventually replace this with QueryReturnsTuples? We'd need a + * more general method of determining the output type, though. */ isSelect = (parse->commandType == CMD_SELECT && parse->into == NULL); diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 19410997b2c..44609bb40b7 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -61,7 +61,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.145 2006/07/27 19:52:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.146 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -331,16 +331,16 @@ advance_transition_function(AggState *aggstate, AggStatePerGroup pergroupstate, FunctionCallInfoData *fcinfo) { - int numArguments = peraggstate->numArguments; + int numArguments = peraggstate->numArguments; MemoryContext oldContext; - Datum newVal; - int i; + Datum newVal; + int i; if (peraggstate->transfn.fn_strict) { /* - * For a strict transfn, nothing happens when there's a NULL input; - * we just keep the prior transValue. + * For a strict transfn, nothing happens when there's a NULL input; we + * just keep the prior transValue. */ for (i = 1; i <= numArguments; i++) { @@ -434,14 +434,14 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup) for (aggno = 0; aggno < aggstate->numaggs; aggno++) { - AggStatePerAgg peraggstate = &aggstate->peragg[aggno]; - AggStatePerGroup pergroupstate = &pergroup[aggno]; - AggrefExprState *aggrefstate = peraggstate->aggrefstate; - Aggref *aggref = peraggstate->aggref; + AggStatePerAgg peraggstate = &aggstate->peragg[aggno]; + AggStatePerGroup pergroupstate = &pergroup[aggno]; + AggrefExprState *aggrefstate = peraggstate->aggrefstate; + Aggref *aggref = peraggstate->aggref; FunctionCallInfoData fcinfo; - int i; - ListCell *arg; - MemoryContext oldContext; + int i; + ListCell *arg; + MemoryContext oldContext; /* Switch memory context just once for all args */ oldContext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); @@ -495,8 +495,8 @@ process_sorted_aggregate(AggState *aggstate, bool haveOldVal = false; MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory; MemoryContext oldContext; - Datum *newVal; - bool *isNull; + Datum *newVal; + bool *isNull; FunctionCallInfoData fcinfo; tuplesort_performsort(peraggstate->sortstate); @@ -624,7 +624,7 @@ static Bitmapset * find_unaggregated_cols(AggState *aggstate) { Agg *node = (Agg *) aggstate->ss.ps.plan; - Bitmapset *colnos; + Bitmapset *colnos; colnos = NULL; (void) find_unaggregated_cols_walker((Node *) node->plan.targetlist, @@ -686,20 +686,20 @@ build_hash_table(AggState *aggstate) tmpmem); /* - * Create a list of the tuple columns that actually need to be stored - * in hashtable entries. The incoming tuples from the child plan node - * will contain grouping columns, other columns referenced in our - * targetlist and qual, columns used to compute the aggregate functions, - * and perhaps just junk columns we don't use at all. Only columns of the - * first two types need to be stored in the hashtable, and getting rid of - * the others can make the table entries significantly smaller. To avoid - * messing up Var numbering, we keep the same tuple descriptor for - * hashtable entries as the incoming tuples have, but set unwanted columns - * to NULL in the tuples that go into the table. + * Create a list of the tuple columns that actually need to be stored in + * hashtable entries. The incoming tuples from the child plan node will + * contain grouping columns, other columns referenced in our targetlist + * and qual, columns used to compute the aggregate functions, and perhaps + * just junk columns we don't use at all. Only columns of the first two + * types need to be stored in the hashtable, and getting rid of the others + * can make the table entries significantly smaller. To avoid messing up + * Var numbering, we keep the same tuple descriptor for hashtable entries + * as the incoming tuples have, but set unwanted columns to NULL in the + * tuples that go into the table. * * To eliminate duplicates, we build a bitmapset of the needed columns, - * then convert it to an integer list (cheaper to scan at runtime). - * The list is in decreasing order so that the first entry is the largest; + * then convert it to an integer list (cheaper to scan at runtime). The + * list is in decreasing order so that the first entry is the largest; * lookup_hash_entry depends on this to use slot_getsomeattrs correctly. * * Note: at present, searching the tlist/qual is not really necessary @@ -767,7 +767,7 @@ lookup_hash_entry(AggState *aggstate, TupleTableSlot *inputslot) slot_getsomeattrs(inputslot, linitial_int(aggstate->hash_needed)); foreach(l, aggstate->hash_needed) { - int varNumber = lfirst_int(l) - 1; + int varNumber = lfirst_int(l) - 1; hashslot->tts_values[varNumber] = inputslot->tts_values[varNumber]; hashslot->tts_isnull[varNumber] = inputslot->tts_isnull[varNumber]; @@ -968,10 +968,10 @@ agg_retrieve_direct(AggState *aggstate) /* * Use the representative input tuple for any references to - * non-aggregated input columns in the qual and tlist. (If we are - * not grouping, and there are no input rows at all, we will come - * here with an empty firstSlot ... but if not grouping, there can't - * be any references to non-aggregated input columns, so no problem.) + * non-aggregated input columns in the qual and tlist. (If we are not + * grouping, and there are no input rows at all, we will come here + * with an empty firstSlot ... but if not grouping, there can't be any + * references to non-aggregated input columns, so no problem.) */ econtext->ecxt_scantuple = firstSlot; @@ -1226,8 +1226,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) /* * initialize child nodes * - * If we are doing a hashed aggregation then the child plan does not - * need to handle REWIND efficiently; see ExecReScanAgg. + * If we are doing a hashed aggregation then the child plan does not need + * to handle REWIND efficiently; see ExecReScanAgg. */ if (node->aggstrategy == AGG_HASHED) eflags &= ~EXEC_FLAG_REWIND; @@ -1321,7 +1321,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) Aggref *aggref = (Aggref *) aggrefstate->xprstate.expr; AggStatePerAgg peraggstate; Oid inputTypes[FUNC_MAX_ARGS]; - int numArguments; + int numArguments; HeapTuple aggTuple; Form_pg_aggregate aggform; Oid aggtranstype; @@ -1332,7 +1332,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) *finalfnexpr; Datum textInitVal; int i; - ListCell *lc; + ListCell *lc; /* Planner should have assigned aggregate to correct level */ Assert(aggref->agglevelsup == 0); @@ -1364,9 +1364,9 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) peraggstate->numArguments = numArguments; /* - * Get actual datatypes of the inputs. These could be different - * from the agg's declared input types, when the agg accepts ANY, - * ANYARRAY or ANYELEMENT. + * Get actual datatypes of the inputs. These could be different from + * the agg's declared input types, when the agg accepts ANY, ANYARRAY + * or ANYELEMENT. */ i = 0; foreach(lc, aggref->args) @@ -1481,8 +1481,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) /* * If the transfn is strict and the initval is NULL, make sure input - * type and transtype are the same (or at least binary-compatible), - * so that it's OK to use the first input value as the initial + * type and transtype are the same (or at least binary-compatible), so + * that it's OK to use the first input value as the initial * transValue. This should have been checked at agg definition time, * but just in case... */ @@ -1504,9 +1504,9 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) Assert(node->aggstrategy != AGG_HASHED); /* - * We don't currently implement DISTINCT aggs for aggs having - * more than one argument. This isn't required for anything - * in the SQL spec, but really it ought to be implemented for + * We don't currently implement DISTINCT aggs for aggs having more + * than one argument. This isn't required for anything in the SQL + * spec, but really it ought to be implemented for * feature-completeness. FIXME someday. */ if (numArguments != 1) diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 719381f10b0..1034f96b6ef 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeAppend.c,v 1.70 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeAppend.c,v 1.71 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -345,9 +345,9 @@ ExecReScanAppend(AppendState *node, ExprContext *exprCtxt) /* * If chgParam of subnode is not null then plan will be re-scanned by - * first ExecProcNode. However, if caller is passing us an exprCtxt - * then forcibly rescan all the subnodes now, so that we can pass - * the exprCtxt down to the subnodes (needed for appendrel indexscan). + * first ExecProcNode. However, if caller is passing us an exprCtxt + * then forcibly rescan all the subnodes now, so that we can pass the + * exprCtxt down to the subnodes (needed for appendrel indexscan). */ if (subnode->chgParam == NULL || exprCtxt != NULL) { diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 62f166cdebe..e1e00622690 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -21,7 +21,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.13 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.14 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -192,8 +192,8 @@ BitmapHeapNext(BitmapHeapScanState *node) pgstat_count_heap_fetch(&scan->rs_pgstat_info); /* - * Set up the result slot to point to this tuple. Note that the - * slot acquires a pin on the buffer. + * Set up the result slot to point to this tuple. Note that the slot + * acquires a pin on the buffer. */ ExecStoreTuple(&scan->rs_ctup, slot, @@ -201,8 +201,8 @@ BitmapHeapNext(BitmapHeapScanState *node) false); /* - * If we are using lossy info, we have to recheck the qual - * conditions at every tuple. + * If we are using lossy info, we have to recheck the qual conditions + * at every tuple. */ if (tbmres->ntuples < 0) { @@ -237,7 +237,7 @@ BitmapHeapNext(BitmapHeapScanState *node) static void bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres) { - BlockNumber page = tbmres->blockno; + BlockNumber page = tbmres->blockno; Buffer buffer; Snapshot snapshot; Page dp; @@ -259,9 +259,9 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres) snapshot = scan->rs_snapshot; /* - * We must hold share lock on the buffer content while examining - * tuple visibility. Afterwards, however, the tuples we have found - * to be visible are guaranteed good as long as we hold the buffer pin. + * We must hold share lock on the buffer content while examining tuple + * visibility. Afterwards, however, the tuples we have found to be + * visible are guaranteed good as long as we hold the buffer pin. */ LockBuffer(buffer, BUFFER_LOCK_SHARE); @@ -269,10 +269,9 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres) maxoff = PageGetMaxOffsetNumber(dp); /* - * Determine how many entries we need to look at on this page. If - * the bitmap is lossy then we need to look at each physical item - * pointer; otherwise we just look through the offsets listed in - * tbmres. + * Determine how many entries we need to look at on this page. If the + * bitmap is lossy then we need to look at each physical item pointer; + * otherwise we just look through the offsets listed in tbmres. */ if (tbmres->ntuples >= 0) { @@ -467,8 +466,8 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags) Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK))); /* - * Assert caller didn't ask for an unsafe snapshot --- see comments - * at head of file. + * Assert caller didn't ask for an unsafe snapshot --- see comments at + * head of file. */ Assert(IsMVCCSnapshot(estate->es_snapshot)); @@ -549,8 +548,8 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags) * initialize child nodes * * We do this last because the child nodes will open indexscans on our - * relation's indexes, and we want to be sure we have acquired a lock - * on the relation first. + * relation's indexes, and we want to be sure we have acquired a lock on + * the relation first. */ outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate, eflags); diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c index 6a0303cddd1..1b2e5a7652d 100644 --- a/src/backend/executor/nodeBitmapIndexscan.c +++ b/src/backend/executor/nodeBitmapIndexscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapIndexscan.c,v 1.20 2006/07/31 20:09:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeBitmapIndexscan.c,v 1.21 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -57,8 +57,8 @@ MultiExecBitmapIndexScan(BitmapIndexScanState *node) /* * If we have runtime keys and they've not already been set up, do it now. * Array keys are also treated as runtime keys; note that if ExecReScan - * returns with biss_RuntimeKeysReady still false, then there is an - * empty array key so we should do nothing. + * returns with biss_RuntimeKeysReady still false, then there is an empty + * array key so we should do nothing. */ if (!node->biss_RuntimeKeysReady && (node->biss_NumRuntimeKeys != 0 || node->biss_NumArrayKeys != 0)) @@ -152,9 +152,9 @@ ExecBitmapIndexReScan(BitmapIndexScanState *node, ExprContext *exprCtxt) * If we are doing runtime key calculations (ie, the index keys depend on * data from an outer scan), compute the new key values. * - * Array keys are also treated as runtime keys; note that if we - * return with biss_RuntimeKeysReady still false, then there is an - * empty array key so no index scan is needed. + * Array keys are also treated as runtime keys; note that if we return + * with biss_RuntimeKeysReady still false, then there is an empty array + * key so no index scan is needed. */ if (node->biss_NumRuntimeKeys != 0) ExecIndexEvalRuntimeKeys(econtext, @@ -249,8 +249,8 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags) /* * We do not open or lock the base relation here. We assume that an - * ancestor BitmapHeapScan node is holding AccessShareLock (or better) - * on the heap relation throughout the execution of the plan tree. + * ancestor BitmapHeapScan node is holding AccessShareLock (or better) on + * the heap relation throughout the execution of the plan tree. */ indexstate->ss.ss_currentRelation = NULL; @@ -265,7 +265,7 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags) */ relistarget = ExecRelationIsTargetRelation(estate, node->scan.scanrelid); indexstate->biss_RelationDesc = index_open(node->indexid, - relistarget ? NoLock : AccessShareLock); + relistarget ? NoLock : AccessShareLock); /* * Initialize index-specific scan state diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 43084ed05bb..14fd016e5a5 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.84 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.85 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -119,11 +119,11 @@ ExecHashJoin(HashJoinState *node) * since we aren't going to be able to skip the join on the strength * of an empty inner relation anyway.) * - * If we are rescanning the join, we make use of information gained - * on the previous scan: don't bother to try the prefetch if the - * previous scan found the outer relation nonempty. This is not - * 100% reliable since with new parameters the outer relation might - * yield different results, but it's a good heuristic. + * If we are rescanning the join, we make use of information gained on + * the previous scan: don't bother to try the prefetch if the previous + * scan found the outer relation nonempty. This is not 100% reliable + * since with new parameters the outer relation might yield different + * results, but it's a good heuristic. * * The only way to make the check is to try to fetch a tuple from the * outer plan node. If we succeed, we have to stash it away for later @@ -173,8 +173,8 @@ ExecHashJoin(HashJoinState *node) /* * Reset OuterNotEmpty for scan. (It's OK if we fetched a tuple - * above, because ExecHashJoinOuterGetTuple will immediately - * set it again.) + * above, because ExecHashJoinOuterGetTuple will immediately set it + * again.) */ node->hj_OuterNotEmpty = false; } @@ -788,12 +788,12 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate, MinimalTuple tuple; /* - * Since both the hash value and the MinimalTuple length word are - * uint32, we can read them both in one BufFileRead() call without - * any type cheating. + * Since both the hash value and the MinimalTuple length word are uint32, + * we can read them both in one BufFileRead() call without any type + * cheating. */ nread = BufFileRead(file, (void *) header, sizeof(header)); - if (nread == 0) /* end of file */ + if (nread == 0) /* end of file */ { ExecClearTuple(tupleSlot); return NULL; @@ -834,8 +834,8 @@ ExecReScanHashJoin(HashJoinState *node, ExprContext *exprCtxt) /* * okay to reuse the hash table; needn't rescan inner, either. * - * What we do need to do is reset our state about the emptiness - * of the outer relation, so that the new scan of the outer will + * What we do need to do is reset our state about the emptiness of + * the outer relation, so that the new scan of the outer will * update it correctly if it turns out to be empty this time. * (There's no harm in clearing it now because ExecHashJoin won't * need the info. In the other cases, where the hash table diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 84ee56beb0f..9773f2341ec 100644 --- a/src/backend/executor/nodeIndexscan.c +++ b/src/backend/executor/nodeIndexscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeIndexscan.c,v 1.116 2006/07/31 20:09:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeIndexscan.c,v 1.117 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -233,9 +233,9 @@ ExecIndexEvalRuntimeKeys(ExprContext *econtext, bool isNull; /* - * For each run-time key, extract the run-time expression and - * evaluate it with respect to the current outer tuple. We then stick - * the result into the proper scan key. + * For each run-time key, extract the run-time expression and evaluate + * it with respect to the current outer tuple. We then stick the + * result into the proper scan key. * * Note: the result of the eval could be a pass-by-ref value that's * stored in the outer scan's tuple, not in @@ -290,8 +290,8 @@ ExecIndexEvalArrayKeys(ExprContext *econtext, bool *elem_nulls; /* - * Compute and deconstruct the array expression. - * (Notes in ExecIndexEvalRuntimeKeys() apply here too.) + * Compute and deconstruct the array expression. (Notes in + * ExecIndexEvalRuntimeKeys() apply here too.) */ arraydatum = ExecEvalExpr(array_expr, econtext, @@ -317,8 +317,9 @@ ExecIndexEvalArrayKeys(ExprContext *econtext, } /* - * Note: we expect the previous array data, if any, to be automatically - * freed by resetting the per-tuple context; hence no pfree's here. + * Note: we expect the previous array data, if any, to be + * automatically freed by resetting the per-tuple context; hence no + * pfree's here. */ arrayKeys[j].elem_values = elem_values; arrayKeys[j].elem_nulls = elem_nulls; @@ -524,7 +525,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags) */ relistarget = ExecRelationIsTargetRelation(estate, node->scan.scanrelid); indexstate->iss_RelationDesc = index_open(node->indexid, - relistarget ? NoLock : AccessShareLock); + relistarget ? NoLock : AccessShareLock); /* * Initialize index-specific scan state @@ -543,7 +544,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags) &indexstate->iss_NumScanKeys, &indexstate->iss_RuntimeKeys, &indexstate->iss_NumRuntimeKeys, - NULL, /* no ArrayKeys */ + NULL, /* no ArrayKeys */ NULL); /* @@ -661,7 +662,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, /* * If there are any RowCompareExpr quals, we need extra ScanKey entries * for them, and possibly extra runtime-key entries. Count up what's - * needed. (The subsidiary ScanKey arrays for the RowCompareExprs could + * needed. (The subsidiary ScanKey arrays for the RowCompareExprs could * be allocated as separate chunks, but we have to count anyway to make * runtime_keys large enough, so might as well just do one palloc.) */ @@ -784,9 +785,9 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, { /* (indexkey, indexkey, ...) op (expression, expression, ...) */ RowCompareExpr *rc = (RowCompareExpr *) clause; - ListCell *largs_cell = list_head(rc->largs); - ListCell *rargs_cell = list_head(rc->rargs); - ListCell *opnos_cell = list_head(rc->opnos); + ListCell *largs_cell = list_head(rc->largs); + ListCell *rargs_cell = list_head(rc->rargs); + ListCell *opnos_cell = list_head(rc->opnos); ScanKey first_sub_key = &scan_keys[extra_scan_keys]; /* Scan RowCompare columns and generate subsidiary ScanKey items */ @@ -859,7 +860,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, opclass = index->rd_indclass->values[varattno - 1]; get_op_opclass_properties(opno, opclass, - &op_strategy, &op_subtype, &op_recheck); + &op_strategy, &op_subtype, &op_recheck); if (op_strategy != rc->rctype) elog(ERROR, "RowCompare index qualification contains wrong operator"); @@ -871,11 +872,11 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, */ ScanKeyEntryInitialize(this_sub_key, flags, - varattno, /* attribute number */ - op_strategy, /* op's strategy */ - op_subtype, /* strategy subtype */ - opfuncid, /* reg proc to use */ - scanvalue); /* constant */ + varattno, /* attribute number */ + op_strategy, /* op's strategy */ + op_subtype, /* strategy subtype */ + opfuncid, /* reg proc to use */ + scanvalue); /* constant */ extra_scan_keys++; } @@ -883,8 +884,8 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, scan_keys[extra_scan_keys - 1].sk_flags |= SK_ROW_END; /* - * We don't use ScanKeyEntryInitialize for the header because - * it isn't going to contain a valid sk_func pointer. + * We don't use ScanKeyEntryInitialize for the header because it + * isn't going to contain a valid sk_func pointer. */ MemSet(this_scan_key, 0, sizeof(ScanKeyData)); this_scan_key->sk_flags = SK_ROW_HEADER; @@ -937,7 +938,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation index, * initialize the scan key's fields appropriately */ ScanKeyEntryInitialize(this_scan_key, - 0, /* flags */ + 0, /* flags */ varattno, /* attribute number to scan */ strategy, /* op's strategy */ subtype, /* strategy subtype */ diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 84a494cf0da..3774edc6120 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeMaterial.c,v 1.56 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeMaterial.c,v 1.57 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -124,16 +124,16 @@ ExecMaterial(MaterialState *node) } /* - * Append returned tuple to tuplestore. NOTE: because the - * tuplestore is certainly in EOF state, its read position will move - * forward over the added tuple. This is what we want. + * Append returned tuple to tuplestore. NOTE: because the tuplestore + * is certainly in EOF state, its read position will move forward over + * the added tuple. This is what we want. */ if (tuplestorestate) tuplestore_puttupleslot(tuplestorestate, outerslot); /* - * And return a copy of the tuple. (XXX couldn't we just return - * the outerslot?) + * And return a copy of the tuple. (XXX couldn't we just return the + * outerslot?) */ return ExecCopySlot(slot, outerslot); } @@ -162,10 +162,10 @@ ExecInitMaterial(Material *node, EState *estate, int eflags) matstate->ss.ps.state = estate; /* - * We must have random access to the subplan output to do backward scan - * or mark/restore. We also prefer to materialize the subplan output - * if we might be called on to rewind and replay it many times. - * However, if none of these cases apply, we can skip storing the data. + * We must have random access to the subplan output to do backward scan or + * mark/restore. We also prefer to materialize the subplan output if we + * might be called on to rewind and replay it many times. However, if none + * of these cases apply, we can skip storing the data. */ matstate->randomAccess = (eflags & (EXEC_FLAG_REWIND | EXEC_FLAG_BACKWARD | @@ -194,8 +194,8 @@ ExecInitMaterial(Material *node, EState *estate, int eflags) /* * initialize child nodes * - * We shield the child node from the need to support REWIND, BACKWARD, - * or MARK/RESTORE. + * We shield the child node from the need to support REWIND, BACKWARD, or + * MARK/RESTORE. */ eflags &= ~(EXEC_FLAG_REWIND | EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK); diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 75403dfa717..8a9f6fe2300 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.81 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.82 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -957,10 +957,10 @@ ExecMergeJoin(MergeJoinState *node) } /* - * Load up the new inner tuple's comparison values. If we - * see that it contains a NULL and hence can't match any - * outer tuple, we can skip the comparison and assume the - * new tuple is greater than current outer. + * Load up the new inner tuple's comparison values. If we see + * that it contains a NULL and hence can't match any outer + * tuple, we can skip the comparison and assume the new tuple + * is greater than current outer. */ if (!MJEvalInnerValues(node, innerTupleSlot)) { @@ -1377,8 +1377,8 @@ ExecMergeJoin(MergeJoinState *node) else { /* - * current inner can't possibly match any outer; - * better to advance the inner scan than the outer. + * current inner can't possibly match any outer; better to + * advance the inner scan than the outer. */ node->mj_JoinState = EXEC_MJ_SKIPINNER_ADVANCE; } diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c index f12f2f624f6..1c0a696f533 100644 --- a/src/backend/executor/nodeNestloop.c +++ b/src/backend/executor/nodeNestloop.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeNestloop.c,v 1.42 2006/03/05 15:58:26 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeNestloop.c,v 1.43 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -314,10 +314,10 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags) * initialize child nodes * * Tell the inner child that cheap rescans would be good. (This is - * unnecessary if we are doing nestloop with inner indexscan, because - * the rescan will always be with a fresh parameter --- but since - * nodeIndexscan doesn't actually care about REWIND, there's no point - * in dealing with that refinement.) + * unnecessary if we are doing nestloop with inner indexscan, because the + * rescan will always be with a fresh parameter --- but since + * nodeIndexscan doesn't actually care about REWIND, there's no point in + * dealing with that refinement.) */ outerPlanState(nlstate) = ExecInitNode(outerPlan(node), estate, eflags); innerPlanState(nlstate) = ExecInitNode(innerPlan(node), estate, diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c index c2ed276e56e..a6287793d44 100644 --- a/src/backend/executor/nodeSeqscan.c +++ b/src/backend/executor/nodeSeqscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeSeqscan.c,v 1.60 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeSeqscan.c,v 1.61 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -148,7 +148,7 @@ InitScanRelation(SeqScanState *node, EState *estate) * open that relation and acquire appropriate lock on it. */ currentRelation = ExecOpenScanRelation(estate, - ((SeqScan *) node->ps.plan)->scanrelid); + ((SeqScan *) node->ps.plan)->scanrelid); currentScanDesc = heap_beginscan(currentRelation, estate->es_snapshot, diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index b586a37a642..dd473489974 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeSort.c,v 1.57 2006/06/27 16:53:02 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeSort.c,v 1.58 2006/10/04 00:29:52 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -158,9 +158,9 @@ ExecInitSort(Sort *node, EState *estate, int eflags) sortstate->ss.ps.state = estate; /* - * We must have random access to the sort output to do backward scan - * or mark/restore. We also prefer to materialize the sort output - * if we might be called on to rewind and replay it many times. + * We must have random access to the sort output to do backward scan or + * mark/restore. We also prefer to materialize the sort output if we + * might be called on to rewind and replay it many times. */ sortstate->randomAccess = (eflags & (EXEC_FLAG_REWIND | EXEC_FLAG_BACKWARD | @@ -189,8 +189,8 @@ ExecInitSort(Sort *node, EState *estate, int eflags) /* * initialize child nodes * - * We shield the child node from the need to support REWIND, BACKWARD, - * or MARK/RESTORE. + * We shield the child node from the need to support REWIND, BACKWARD, or + * MARK/RESTORE. */ eflags &= ~(EXEC_FLAG_REWIND | EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK); @@ -316,6 +316,7 @@ ExecReScanSort(SortState *node, ExprContext *exprCtxt) node->sort_Done = false; tuplesort_end((Tuplesortstate *) node->tuplesortstate); node->tuplesortstate = NULL; + /* * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 600a39d4ee8..2a5fd6d955d 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.79 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.80 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -332,8 +332,8 @@ ExecScanSubPlan(SubPlanState *node, /* * For ALL, ANY, and ROWCOMPARE sublinks, load up the Params - * representing the columns of the sub-select, and then evaluate - * the combining expression. + * representing the columns of the sub-select, and then evaluate the + * combining expression. */ col = 1; foreach(plst, subplan->paramIds) @@ -434,8 +434,8 @@ buildSubPlanHash(SubPlanState *node) * NULL) results of the IN operation, then we have to store subplan output * rows that are partly or wholly NULL. We store such rows in a separate * hash table that we expect will be much smaller than the main table. (We - * can use hashing to eliminate partly-null rows that are not distinct. - * We keep them separate to minimize the cost of the inevitable full-table + * can use hashing to eliminate partly-null rows that are not distinct. We + * keep them separate to minimize the cost of the inevitable full-table * searches; see findPartialMatch.) * * If it's not necessary to distinguish FALSE and UNKNOWN, then we don't @@ -682,9 +682,9 @@ ExecInitSubPlan(SubPlanState *node, EState *estate, int eflags) /* * Start up the subplan (this is a very cut-down form of InitPlan()) * - * The subplan will never need to do BACKWARD scan or MARK/RESTORE. - * If it is a parameterless subplan (not initplan), we suggest that it - * be prepared to handle REWIND efficiently; otherwise there is no need. + * The subplan will never need to do BACKWARD scan or MARK/RESTORE. If it + * is a parameterless subplan (not initplan), we suggest that it be + * prepared to handle REWIND efficiently; otherwise there is no need. */ eflags &= EXEC_FLAG_EXPLAIN_ONLY; if (subplan->parParam == NIL && subplan->setParam == NIL) diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c index 0436ea82be2..22e148ec6c9 100644 --- a/src/backend/executor/nodeSubqueryscan.c +++ b/src/backend/executor/nodeSubqueryscan.c @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.31 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeSubqueryscan.c,v 1.32 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -204,7 +204,7 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags) * too soon during shutdown. */ ExecAssignScanType(&subquerystate->ss, - CreateTupleDescCopy(ExecGetResultType(subquerystate->subplan))); + CreateTupleDescCopy(ExecGetResultType(subquerystate->subplan))); /* * Initialize result tuple type and projection info. diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index b59ff9ca8ec..52d92904577 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.50 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.51 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -60,9 +60,9 @@ TidListCreate(TidScanState *tidstate) ListCell *l; /* - * We initialize the array with enough slots for the case that all - * quals are simple OpExprs. If there's any ScalarArrayOpExprs, - * we may have to enlarge the array. + * We initialize the array with enough slots for the case that all quals + * are simple OpExprs. If there's any ScalarArrayOpExprs, we may have to + * enlarge the array. */ numAllocTids = list_length(evalList); tidList = (ItemPointerData *) @@ -78,9 +78,9 @@ TidListCreate(TidScanState *tidstate) if (is_opclause(expr)) { - FuncExprState *fexstate = (FuncExprState *) exstate; - Node *arg1; - Node *arg2; + FuncExprState *fexstate = (FuncExprState *) exstate; + Node *arg1; + Node *arg2; arg1 = get_leftop(expr); arg2 = get_rightop(expr); @@ -154,15 +154,14 @@ TidListCreate(TidScanState *tidstate) /* * Sort the array of TIDs into order, and eliminate duplicates. - * Eliminating duplicates is necessary since we want OR semantics - * across the list. Sorting makes it easier to detect duplicates, - * and as a bonus ensures that we will visit the heap in the most - * efficient way. + * Eliminating duplicates is necessary since we want OR semantics across + * the list. Sorting makes it easier to detect duplicates, and as a bonus + * ensures that we will visit the heap in the most efficient way. */ if (numTids > 1) { - int lastTid; - int i; + int lastTid; + int i; qsort((void *) tidList, numTids, sizeof(ItemPointerData), itemptr_comparator); @@ -188,8 +187,8 @@ itemptr_comparator(const void *a, const void *b) { const ItemPointerData *ipa = (const ItemPointerData *) a; const ItemPointerData *ipb = (const ItemPointerData *) b; - BlockNumber ba = ItemPointerGetBlockNumber(ipa); - BlockNumber bb = ItemPointerGetBlockNumber(ipb); + BlockNumber ba = ItemPointerGetBlockNumber(ipa); + BlockNumber bb = ItemPointerGetBlockNumber(ipb); OffsetNumber oa = ItemPointerGetOffsetNumber(ipa); OffsetNumber ob = ItemPointerGetOffsetNumber(ipb); diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c index 1d4bb08d4dd..c6a1a940389 100644 --- a/src/backend/executor/nodeValuesscan.c +++ b/src/backend/executor/nodeValuesscan.c @@ -2,14 +2,14 @@ * * nodeValuesscan.c * Support routines for scanning Values lists - * ("VALUES (...), (...), ..." in rangetable). + * ("VALUES (...), (...), ..." in rangetable). * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeValuesscan.c,v 1.2 2006/08/02 18:58:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeValuesscan.c,v 1.3 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -47,10 +47,10 @@ static TupleTableSlot * ValuesNext(ValuesScanState *node) { TupleTableSlot *slot; - EState *estate; - ExprContext *econtext; - ScanDirection direction; - List *exprlist; + EState *estate; + ExprContext *econtext; + ScanDirection direction; + List *exprlist; /* * get information from the estate and scan state @@ -83,9 +83,9 @@ ValuesNext(ValuesScanState *node) } /* - * Always clear the result slot; this is appropriate if we are at the - * end of the data, and if we're not, we still need it as the first step - * of the store-virtual-tuple protocol. It seems wise to clear the slot + * Always clear the result slot; this is appropriate if we are at the end + * of the data, and if we're not, we still need it as the first step of + * the store-virtual-tuple protocol. It seems wise to clear the slot * before we reset the context it might have pointers into. */ ExecClearTuple(slot); @@ -107,18 +107,18 @@ ValuesNext(ValuesScanState *node) ReScanExprContext(econtext); /* - * Build the expression eval state in the econtext's per-tuple - * memory. This is a tad unusual, but we want to delete the eval - * state again when we move to the next row, to avoid growth of - * memory requirements over a long values list. + * Build the expression eval state in the econtext's per-tuple memory. + * This is a tad unusual, but we want to delete the eval state again + * when we move to the next row, to avoid growth of memory + * requirements over a long values list. */ oldContext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); /* - * Pass NULL, not my plan node, because we don't want anything - * in this transient state linking into permanent state. The - * only possibility is a SubPlan, and there shouldn't be any - * (any subselects in the VALUES list should be InitPlans). + * Pass NULL, not my plan node, because we don't want anything in this + * transient state linking into permanent state. The only possibility + * is a SubPlan, and there shouldn't be any (any subselects in the + * VALUES list should be InitPlans). */ exprstatelist = (List *) ExecInitExpr((Expr *) exprlist, NULL); @@ -126,8 +126,8 @@ ValuesNext(ValuesScanState *node) Assert(list_length(exprstatelist) == slot->tts_tupleDescriptor->natts); /* - * Compute the expressions and build a virtual result tuple. - * We already did ExecClearTuple(slot). + * Compute the expressions and build a virtual result tuple. We + * already did ExecClearTuple(slot). */ values = slot->tts_values; isnull = slot->tts_isnull; @@ -135,7 +135,7 @@ ValuesNext(ValuesScanState *node) resind = 0; foreach(lc, exprstatelist) { - ExprState *estate = (ExprState *) lfirst(lc); + ExprState *estate = (ExprState *) lfirst(lc); values[resind] = ExecEvalExpr(estate, econtext, @@ -181,12 +181,12 @@ ExecValuesScan(ValuesScanState *node) ValuesScanState * ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) { - ValuesScanState *scanstate; - RangeTblEntry *rte; - TupleDesc tupdesc; - ListCell *vtl; - int i; - PlanState *planstate; + ValuesScanState *scanstate; + RangeTblEntry *rte; + TupleDesc tupdesc; + ListCell *vtl; + int i; + PlanState *planstate; /* * ValuesScan should not have any children. @@ -208,8 +208,8 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) /* * Create expression contexts. We need two, one for per-sublist - * processing and one for execScan.c to use for quals and projections. - * We cheat a little by using ExecAssignExprContext() to build both. + * processing and one for execScan.c to use for quals and projections. We + * cheat a little by using ExecAssignExprContext() to build both. */ ExecAssignExprContext(estate, planstate); scanstate->rowcontext = planstate->ps_ExprContext; diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index eb8d11fed9f..5410c364e0a 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.163 2006/09/07 22:52:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.164 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -827,8 +827,8 @@ SPI_cursor_open(const char *name, void *plan, int k; /* - * Check that the plan is something the Portal code will special-case - * as returning one tupleset. + * Check that the plan is something the Portal code will special-case as + * returning one tupleset. */ if (!SPI_is_cursor_plan(spiplan)) { @@ -846,7 +846,7 @@ SPI_cursor_open(const char *name, void *plan, errmsg("cannot open empty query as cursor"))); ereport(ERROR, (errcode(ERRCODE_INVALID_CURSOR_DEFINITION), - /* translator: %s is name of a SQL command, eg INSERT */ + /* translator: %s is name of a SQL command, eg INSERT */ errmsg("cannot open %s query as cursor", CreateQueryTag(queryTree)))); } @@ -885,7 +885,7 @@ SPI_cursor_open(const char *name, void *plan, { /* sizeof(ParamListInfoData) includes the first array element */ paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + - (spiplan->nargs - 1) * sizeof(ParamExternData)); + (spiplan->nargs - 1) *sizeof(ParamExternData)); paramLI->numParams = spiplan->nargs; for (k = 0; k < spiplan->nargs; k++) @@ -1348,7 +1348,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls, /* sizeof(ParamListInfoData) includes the first array element */ paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) + - (nargs - 1) * sizeof(ParamExternData)); + (nargs - 1) *sizeof(ParamExternData)); paramLI->numParams = nargs; for (k = 0; k < nargs; k++) @@ -1482,9 +1482,9 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls, ActiveSnapshot = NULL; /* - * The last canSetTag query sets the status values returned - * to the caller. Be careful to free any tuptables not - * returned, to avoid intratransaction memory leak. + * The last canSetTag query sets the status values returned to + * the caller. Be careful to free any tuptables not returned, + * to avoid intratransaction memory leak. */ if (queryTree->canSetTag) { diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index defe45334c7..6e3ef149f3a 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.143 2006/10/03 21:21:36 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.144 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -75,16 +75,17 @@ static Port *pam_port_cludge; /* Workaround for passing "Port *port" into #include <winldap.h> /* Correct header from the Platform SDK */ -typedef ULONG (*__ldap_start_tls_sA)( - IN PLDAP ExternalHandle, - OUT PULONG ServerReturnValue, - OUT LDAPMessage **result, - IN PLDAPControlA *ServerControls, - IN PLDAPControlA *ClientControls +typedef +ULONG(*__ldap_start_tls_sA) ( + IN PLDAP ExternalHandle, + OUT PULONG ServerReturnValue, + OUT LDAPMessage ** result, + IN PLDAPControlA * ServerControls, + IN PLDAPControlA * ClientControls ); #endif -static int CheckLDAPAuth(Port *port); +static int CheckLDAPAuth(Port *port); #endif @@ -347,9 +348,9 @@ auth_failed(Port *port, int status) break; #endif /* USE_PAM */ #ifdef USE_LDAP - case uaLDAP: - errstr = gettext_noop("LDAP authentication failed for user \"%s\""); - break; + case uaLDAP: + errstr = gettext_noop("LDAP authentication failed for user \"%s\""); + break; #endif /* USE_LDAP */ default: errstr = gettext_noop("authentication failed for user \"%s\": invalid authentication method"); @@ -480,9 +481,9 @@ ClientAuthentication(Port *port) #endif /* USE_PAM */ #ifdef USE_LDAP - case uaLDAP: - status = CheckLDAPAuth(port); - break; + case uaLDAP: + status = CheckLDAPAuth(port); + break; #endif case uaTrust: @@ -709,100 +710,102 @@ CheckPAMAuth(Port *port, char *user, char *password) static int CheckLDAPAuth(Port *port) { - char *passwd; - char server[128]; - char basedn[128]; - char prefix[128]; - char suffix[128]; - LDAP *ldap; - int ssl = 0; - int r; - int ldapversion = LDAP_VERSION3; - int ldapport = LDAP_PORT; - char fulluser[128]; - - if (!port->auth_arg || port->auth_arg[0] == '\0') - { - ereport(LOG, - (errmsg("LDAP configuration URL not specified"))); - return STATUS_ERROR; - } - - /* - * Crack the LDAP url. We do a very trivial parse.. - * ldap[s]://<server>[:<port>]/<basedn>[;prefix[;suffix]] - */ - - server[0] = '\0'; - basedn[0] = '\0'; - prefix[0] = '\0'; - suffix[0] = '\0'; - - /* ldap, including port number */ - r = sscanf(port->auth_arg, - "ldap://%127[^:]:%i/%127[^;];%127[^;];%127s", - server, &ldapport, basedn, prefix, suffix); - if (r < 3) - { - /* ldaps, including port number */ - r = sscanf(port->auth_arg, - "ldaps://%127[^:]:%i/%127[^;];%127[^;];%127s", - server, &ldapport, basedn, prefix, suffix); - if (r >=3) ssl = 1; - } - if (r < 3) - { - /* ldap, no port number */ - r = sscanf(port->auth_arg, - "ldap://%127[^/]/%127[^;];%127[^;];%127s", - server, basedn, prefix, suffix); - } - if (r < 2) - { - /* ldaps, no port number */ - r = sscanf(port->auth_arg, - "ldaps://%127[^/]/%127[^;];%127[^;];%127s", - server, basedn, prefix, suffix); - if (r >= 2) ssl = 1; - } - if (r < 2) - { - ereport(LOG, - (errmsg("invalid LDAP URL: \"%s\"", + char *passwd; + char server[128]; + char basedn[128]; + char prefix[128]; + char suffix[128]; + LDAP *ldap; + int ssl = 0; + int r; + int ldapversion = LDAP_VERSION3; + int ldapport = LDAP_PORT; + char fulluser[128]; + + if (!port->auth_arg || port->auth_arg[0] == '\0') + { + ereport(LOG, + (errmsg("LDAP configuration URL not specified"))); + return STATUS_ERROR; + } + + /* + * Crack the LDAP url. We do a very trivial parse.. + * ldap[s]://<server>[:<port>]/<basedn>[;prefix[;suffix]] + */ + + server[0] = '\0'; + basedn[0] = '\0'; + prefix[0] = '\0'; + suffix[0] = '\0'; + + /* ldap, including port number */ + r = sscanf(port->auth_arg, + "ldap://%127[^:]:%i/%127[^;];%127[^;];%127s", + server, &ldapport, basedn, prefix, suffix); + if (r < 3) + { + /* ldaps, including port number */ + r = sscanf(port->auth_arg, + "ldaps://%127[^:]:%i/%127[^;];%127[^;];%127s", + server, &ldapport, basedn, prefix, suffix); + if (r >= 3) + ssl = 1; + } + if (r < 3) + { + /* ldap, no port number */ + r = sscanf(port->auth_arg, + "ldap://%127[^/]/%127[^;];%127[^;];%127s", + server, basedn, prefix, suffix); + } + if (r < 2) + { + /* ldaps, no port number */ + r = sscanf(port->auth_arg, + "ldaps://%127[^/]/%127[^;];%127[^;];%127s", + server, basedn, prefix, suffix); + if (r >= 2) + ssl = 1; + } + if (r < 2) + { + ereport(LOG, + (errmsg("invalid LDAP URL: \"%s\"", port->auth_arg))); - return STATUS_ERROR; - } - - sendAuthRequest(port, AUTH_REQ_PASSWORD); - - passwd = recv_password_packet(port); - if (passwd == NULL) - return STATUS_EOF; /* client wouldn't send password */ - - ldap = ldap_init(server, ldapport); - if (!ldap) - { + return STATUS_ERROR; + } + + sendAuthRequest(port, AUTH_REQ_PASSWORD); + + passwd = recv_password_packet(port); + if (passwd == NULL) + return STATUS_EOF; /* client wouldn't send password */ + + ldap = ldap_init(server, ldapport); + if (!ldap) + { #ifndef WIN32 - ereport(LOG, - (errmsg("could not initialize LDAP: error code %d", - errno))); + ereport(LOG, + (errmsg("could not initialize LDAP: error code %d", + errno))); #else - ereport(LOG, - (errmsg("could not initialize LDAP: error code %d", - (int) LdapGetLastError()))); + ereport(LOG, + (errmsg("could not initialize LDAP: error code %d", + (int) LdapGetLastError()))); #endif - return STATUS_ERROR; - } - - if ((r = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldapversion)) != LDAP_SUCCESS) - { - ereport(LOG, - (errmsg("could not set LDAP protocol version: error code %d", r))); - return STATUS_ERROR; - } - - if (ssl) - { + return STATUS_ERROR; + } + + if ((r = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldapversion)) != LDAP_SUCCESS) + { + ereport(LOG, + (errmsg("could not set LDAP protocol version: error code %d", r))); + return STATUS_ERROR; + } + + if (ssl) + { #ifndef WIN32 if ((r = ldap_start_tls_s(ldap, NULL, NULL)) != LDAP_SUCCESS) #else @@ -815,17 +818,20 @@ CheckLDAPAuth(Port *port) * exist on Windows 2000, and causes a load error for the whole * exe if referenced. */ - HANDLE ldaphandle; - + HANDLE ldaphandle; + ldaphandle = LoadLibrary("WLDAP32.DLL"); if (ldaphandle == NULL) { - /* should never happen since we import other files from wldap32, but check anyway */ + /* + * should never happen since we import other files from + * wldap32, but check anyway + */ ereport(LOG, (errmsg("could not load wldap32.dll"))); return STATUS_ERROR; } - _ldap_start_tls_sA = (__ldap_start_tls_sA)GetProcAddress(ldaphandle, "ldap_start_tls_sA"); + _ldap_start_tls_sA = (__ldap_start_tls_sA) GetProcAddress(ldaphandle, "ldap_start_tls_sA"); if (_ldap_start_tls_sA == NULL) { ereport(LOG, @@ -839,33 +845,32 @@ CheckLDAPAuth(Port *port) * process and is automatically cleaned up on process exit. */ } - if ((r = _ldap_start_tls_sA(ldap, NULL, NULL, NULL, NULL)) != LDAP_SUCCESS) + if ((r = _ldap_start_tls_sA(ldap, NULL, NULL, NULL, NULL)) != LDAP_SUCCESS) #endif - { - ereport(LOG, - (errmsg("could not start LDAP TLS session: error code %d", r))); - return STATUS_ERROR; - } - } - - snprintf(fulluser, sizeof(fulluser)-1, "%s%s%s", + { + ereport(LOG, + (errmsg("could not start LDAP TLS session: error code %d", r))); + return STATUS_ERROR; + } + } + + snprintf(fulluser, sizeof(fulluser) - 1, "%s%s%s", prefix, port->user_name, suffix); - fulluser[sizeof(fulluser)-1] = '\0'; + fulluser[sizeof(fulluser) - 1] = '\0'; - r = ldap_simple_bind_s(ldap, fulluser, passwd); - ldap_unbind(ldap); + r = ldap_simple_bind_s(ldap, fulluser, passwd); + ldap_unbind(ldap); - if (r != LDAP_SUCCESS) - { - ereport(LOG, - (errmsg("LDAP login failed for user \"%s\" on server \"%s\": error code %d", + if (r != LDAP_SUCCESS) + { + ereport(LOG, + (errmsg("LDAP login failed for user \"%s\" on server \"%s\": error code %d", fulluser, server, r))); - return STATUS_ERROR; - } - - return STATUS_OK; -} + return STATUS_ERROR; + } + return STATUS_OK; +} #endif /* USE_LDAP */ /* diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c index 20c2cc7a3b5..06a5b9a6c05 100644 --- a/src/backend/libpq/be-secure.c +++ b/src/backend/libpq/be-secure.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/be-secure.c,v 1.72 2006/09/04 14:57:27 petere Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/be-secure.c,v 1.73 2006/10/04 00:29:53 momjian Exp $ * * Since the server static private key ($DataDir/server.key) * will normally be stored unencrypted so that the database @@ -110,7 +110,7 @@ static DH *load_dh_buffer(const char *, size_t); static DH *tmp_dh_cb(SSL *s, int is_export, int keylength); static int verify_cb(int, X509_STORE_CTX *); static void info_cb(const SSL *ssl, int type, int args); -static void initialize_SSL(void); +static void initialize_SSL(void); static void destroy_SSL(void); static int open_server_SSL(Port *); static void close_SSL(Port *); @@ -795,8 +795,9 @@ initialize_SSL(void) else { /* - * Check the Certificate Revocation List (CRL) if file exists. - * http://searchsecurity.techtarget.com/sDefinition/0,,sid14_gci803160,00.html + * Check the Certificate Revocation List (CRL) if file exists. + * http://searchsecurity.techtarget.com/sDefinition/0,,sid14_gci803160, + * 00.html */ X509_STORE *cvstore = SSL_CTX_get_cert_store(SSL_context); @@ -807,19 +808,19 @@ initialize_SSL(void) /* OpenSSL 0.96 does not support X509_V_FLAG_CRL_CHECK */ #ifdef X509_V_FLAG_CRL_CHECK X509_STORE_set_flags(cvstore, - X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL); + X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); #else ereport(LOG, - (errmsg("SSL Certificate Revocation List (CRL) file \"%s\" ignored", - ROOT_CRL_FILE), - errdetail("Installed SSL library does not support CRL."))); + (errmsg("SSL Certificate Revocation List (CRL) file \"%s\" ignored", + ROOT_CRL_FILE), + errdetail("Installed SSL library does not support CRL."))); #endif else { /* Not fatal - we do not require CRL */ ereport(LOG, - (errmsg("SSL Certificate Revocation List (CRL) file \"%s\" not found, skipping: %s", - ROOT_CRL_FILE, SSLerrmessage()), + (errmsg("SSL Certificate Revocation List (CRL) file \"%s\" not found, skipping: %s", + ROOT_CRL_FILE, SSLerrmessage()), errdetail("Will not check certificates against CRL."))); } } diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index e2f1f6c869e..776d167ff2e 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.155 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.156 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -613,8 +613,8 @@ parse_hba_auth(ListCell **line_item, UserAuth *userauth_p, *userauth_p = uaPAM; #endif #ifdef USE_LDAP - else if (strcmp(token,"ldap") == 0) - *userauth_p = uaLDAP; + else if (strcmp(token, "ldap") == 0) + *userauth_p = uaLDAP; #endif else { diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 3a4c74b0a84..9bf244410e0 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -30,7 +30,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.187 2006/08/11 20:44:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.188 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -594,13 +594,14 @@ StreamConnection(int server_fd, Port *port) } #ifdef WIN32 + /* - * This is a Win32 socket optimization. The ideal size is 32k. - * http://support.microsoft.com/kb/823764/EN-US/ + * This is a Win32 socket optimization. The ideal size is 32k. + * http://support.microsoft.com/kb/823764/EN-US/ */ on = PQ_BUFFER_SIZE * 4; if (setsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &on, - sizeof(on)) < 0) + sizeof(on)) < 0) { elog(LOG, "setsockopt(SO_SNDBUF) failed: %m"); return STATUS_ERROR; diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 150d28b44fd..a750cfe9fd9 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.104 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.105 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -90,6 +90,7 @@ main(int argc, char *argv[]) set_pglocale_pgservice(argv[0], "postgres"); #ifdef WIN32 + /* * Windows uses codepages rather than the environment, so we work around * that by querying the environment explicitly first for LC_COLLATE and @@ -156,8 +157,7 @@ main(int argc, char *argv[]) check_root(progname); /* - * Dispatch to one of various subprograms depending on first - * argument. + * Dispatch to one of various subprograms depending on first argument. */ #ifdef EXEC_BACKEND @@ -166,6 +166,7 @@ main(int argc, char *argv[]) #endif #ifdef WIN32 + /* * Start our win32 signal implementation * @@ -190,7 +191,7 @@ main(int argc, char *argv[]) /* - * Place platform-specific startup hacks here. This is the right + * Place platform-specific startup hacks here. This is the right * place to put code that must be executed early in launch of either a * postmaster, a standalone backend, or a standalone bootstrap run. * Note that this code will NOT be executed when a backend or @@ -211,12 +212,11 @@ startup_hacks(const char *progname) /* - * On some platforms, unaligned memory accesses result in a kernel - * trap; the default kernel behavior is to emulate the memory - * access, but this results in a significant performance penalty. - * We ought to fix PG not to make such unaligned memory accesses, - * so this code disables the kernel emulation: unaligned accesses - * will result in SIGBUS instead. + * On some platforms, unaligned memory accesses result in a kernel trap; + * the default kernel behavior is to emulate the memory access, but this + * results in a significant performance penalty. We ought to fix PG not to + * make such unaligned memory accesses, so this code disables the kernel + * emulation: unaligned accesses will result in SIGBUS instead. */ #ifdef NOFIXADE @@ -230,8 +230,7 @@ startup_hacks(const char *progname) write_stderr("%s: setsysinfo failed: %s\n", progname, strerror(errno)); #endif - -#endif /* NOFIXADE */ +#endif /* NOFIXADE */ #ifdef WIN32 @@ -253,9 +252,9 @@ startup_hacks(const char *progname) } /* In case of general protection fault, don't show GUI popup box */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); } -#endif /* WIN32 */ +#endif /* WIN32 */ } @@ -315,7 +314,7 @@ help(const char *progname) printf(_(" -x NUM internal use\n")); printf(_("\nPlease read the documentation for the complete list of run-time\n" - "configuration settings and how to set them on the command line or in\n" + "configuration settings and how to set them on the command line or in\n" "the configuration file.\n\n" "Report bugs to <[email protected]>.\n")); } @@ -330,19 +329,18 @@ check_root(const char *progname) { write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n" "The server must be started under an unprivileged user ID to prevent\n" - "possible system security compromise. See the documentation for\n" - "more information on how to properly start the server.\n"); + "possible system security compromise. See the documentation for\n" + "more information on how to properly start the server.\n"); exit(1); } /* - * Also make sure that real and effective uids are the same. - * Executing as a setuid program from a root shell is a security - * hole, since on many platforms a nefarious subroutine could - * setuid back to root if real uid is root. (Since nobody - * actually uses postgres as a setuid program, trying to - * actively fix this situation seems more trouble than it's worth; - * we'll just expend the effort to check for it.) + * Also make sure that real and effective uids are the same. Executing as + * a setuid program from a root shell is a security hole, since on many + * platforms a nefarious subroutine could setuid back to root if real uid + * is root. (Since nobody actually uses postgres as a setuid program, + * trying to actively fix this situation seems more trouble than it's + * worth; we'll just expend the effort to check for it.) */ if (getuid() != geteuid()) { @@ -350,17 +348,17 @@ check_root(const char *progname) progname); exit(1); } -#else /* WIN32 */ +#else /* WIN32 */ if (pgwin32_is_admin()) { write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n" "permitted.\n" "The server must be started under an unprivileged user ID to prevent\n" - "possible system security compromises. See the documentation for\n" - "more information on how to properly start the server.\n"); + "possible system security compromises. See the documentation for\n" + "more information on how to properly start the server.\n"); exit(1); } -#endif /* WIN32 */ +#endif /* WIN32 */ } diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index fb1037f1704..f58a2ad3ec4 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -15,7 +15,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.350 2006/08/30 23:34:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.351 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1050,7 +1050,7 @@ _copyRowExpr(RowExpr *from) static RowCompareExpr * _copyRowCompareExpr(RowCompareExpr *from) { - RowCompareExpr *newnode = makeNode(RowCompareExpr); + RowCompareExpr *newnode = makeNode(RowCompareExpr); COPY_SCALAR_FIELD(rctype); COPY_NODE_FIELD(opnos); @@ -2682,7 +2682,7 @@ _copyDeallocateStmt(DeallocateStmt *from) } static DropOwnedStmt * -_copyDropOwnedStmt(DropOwnedStmt * from) +_copyDropOwnedStmt(DropOwnedStmt *from) { DropOwnedStmt *newnode = makeNode(DropOwnedStmt); @@ -2693,7 +2693,7 @@ _copyDropOwnedStmt(DropOwnedStmt * from) } static ReassignOwnedStmt * -_copyReassignOwnedStmt(ReassignOwnedStmt * from) +_copyReassignOwnedStmt(ReassignOwnedStmt *from) { ReassignOwnedStmt *newnode = makeNode(ReassignOwnedStmt); diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 1912cdd319a..45dc76af9b6 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -18,7 +18,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.284 2006/08/30 23:34:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.285 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1496,7 +1496,7 @@ _equalDeallocateStmt(DeallocateStmt *a, DeallocateStmt *b) } static bool -_equalDropOwnedStmt(DropOwnedStmt * a, DropOwnedStmt * b) +_equalDropOwnedStmt(DropOwnedStmt *a, DropOwnedStmt *b) { COMPARE_NODE_FIELD(roles); COMPARE_SCALAR_FIELD(behavior); @@ -1505,7 +1505,7 @@ _equalDropOwnedStmt(DropOwnedStmt * a, DropOwnedStmt * b) } static bool -_equalReassignOwnedStmt(ReassignOwnedStmt * a, ReassignOwnedStmt * b) +_equalReassignOwnedStmt(ReassignOwnedStmt *a, ReassignOwnedStmt *b) { COMPARE_NODE_FIELD(roles); COMPARE_NODE_FIELD(newrole); diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 7555cbd0dd0..9f6aa22707b 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/makefuncs.c,v 1.51 2006/08/21 00:57:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/makefuncs.c,v 1.52 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -330,7 +330,7 @@ makeFuncExpr(Oid funcid, Oid rettype, List *args, CoercionForm fformat) DefElem * makeDefElem(char *name, Node *arg) { - DefElem *res = makeNode(DefElem); + DefElem *res = makeNode(DefElem); res->defname = name; res->arg = arg; diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c index 1d4e1d48e8b..7274f59788e 100644 --- a/src/backend/nodes/params.c +++ b/src/backend/nodes/params.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/nodes/params.c,v 1.6 2006/04/22 01:25:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/nodes/params.c,v 1.7 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -37,14 +37,14 @@ copyParamList(ParamListInfo from) /* sizeof(ParamListInfoData) includes the first array element */ size = sizeof(ParamListInfoData) + - (from->numParams - 1) * sizeof(ParamExternData); + (from->numParams - 1) *sizeof(ParamExternData); retval = (ParamListInfo) palloc(size); memcpy(retval, from, size); /* - * Flat-copy is not good enough for pass-by-ref data values, so make - * a pass over the array to copy those. + * Flat-copy is not good enough for pass-by-ref data values, so make a + * pass over the array to copy those. */ for (i = 0; i < retval->numParams; i++) { diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 0c2b6920cd1..12da0781a0d 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.153 2006/09/19 22:49:52 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.154 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -43,13 +43,13 @@ static void set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti); static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte); static void set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, - Index rti, RangeTblEntry *rte); + Index rti, RangeTblEntry *rte); static void set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte); static void set_function_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte); static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel, - RangeTblEntry *rte); + RangeTblEntry *rte); static RelOptInfo *make_rel_from_joinlist(PlannerInfo *root, List *joinlist); static RelOptInfo *make_one_rel_by_joins(PlannerInfo *root, int levels_needed, List *initial_rels); @@ -253,7 +253,7 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) * set_append_rel_pathlist * Build access paths for an "append relation" * - * The passed-in rel and RTE represent the entire append relation. The + * The passed-in rel and RTE represent the entire append relation. The * relation's contents are computed by appending together the output of * the individual member relations. Note that in the inheritance case, * the first member relation is actually the same table as is mentioned in @@ -271,8 +271,8 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, /* * XXX for now, can't handle inherited expansion of FOR UPDATE/SHARE; can * we do better? (This will take some redesign because the executor - * currently supposes that every rowMark relation is involved in every - * row returned by the query.) + * currently supposes that every rowMark relation is involved in every row + * returned by the query.) */ if (get_rowmark(root->parse, parentRTindex)) ereport(ERROR, @@ -336,16 +336,16 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, childrel->max_attr); /* - * Compute the child's access paths, and add the cheapest one - * to the Append path we are constructing for the parent. + * Compute the child's access paths, and add the cheapest one to the + * Append path we are constructing for the parent. * - * It's possible that the child is itself an appendrel, in which - * case we can "cut out the middleman" and just add its child - * paths to our own list. (We don't try to do this earlier because - * we need to apply both levels of transformation to the quals.) - * This test also handles the case where the child rel need not - * be scanned because of constraint exclusion: it'll have an - * Append path with no subpaths, and will vanish from our list. + * It's possible that the child is itself an appendrel, in which case + * we can "cut out the middleman" and just add its child paths to our + * own list. (We don't try to do this earlier because we need to + * apply both levels of transformation to the quals.) This test also + * handles the case where the child rel need not be scanned because of + * constraint exclusion: it'll have an Append path with no subpaths, + * and will vanish from our list. */ set_rel_pathlist(root, childrel, childRTindex); diff --git a/src/backend/optimizer/path/clausesel.c b/src/backend/optimizer/path/clausesel.c index 269a6ed7e78..f51bac9b0e8 100644 --- a/src/backend/optimizer/path/clausesel.c +++ b/src/backend/optimizer/path/clausesel.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.81 2006/07/14 14:52:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.82 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -429,16 +429,16 @@ clause_selectivity(PlannerInfo *root, rinfo = (RestrictInfo *) clause; /* - * If the clause is marked pseudoconstant, then it will be used as - * a gating qual and should not affect selectivity estimates; hence - * return 1.0. The only exception is that a constant FALSE may - * be taken as having selectivity 0.0, since it will surely mean - * no rows out of the plan. This case is simple enough that we - * need not bother caching the result. + * If the clause is marked pseudoconstant, then it will be used as a + * gating qual and should not affect selectivity estimates; hence + * return 1.0. The only exception is that a constant FALSE may be + * taken as having selectivity 0.0, since it will surely mean no rows + * out of the plan. This case is simple enough that we need not + * bother caching the result. */ if (rinfo->pseudoconstant) { - if (! IsA(rinfo->clause, Const)) + if (!IsA(rinfo->clause, Const)) return s1; } @@ -529,7 +529,7 @@ clause_selectivity(PlannerInfo *root, else if (IsA(clause, Const)) { /* bool constant is pretty easy... */ - Const *con = (Const *) clause; + Const *con = (Const *) clause; s1 = con->constisnull ? 0.0 : DatumGetBool(con->constvalue) ? 1.0 : 0.0; @@ -542,7 +542,7 @@ clause_selectivity(PlannerInfo *root, if (IsA(subst, Const)) { /* bool constant is pretty easy... */ - Const *con = (Const *) subst; + Const *con = (Const *) subst; s1 = con->constisnull ? 0.0 : DatumGetBool(con->constvalue) ? 1.0 : 0.0; diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index cd289423ecd..f2a6d294ee8 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -54,7 +54,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.166 2006/09/19 22:49:52 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.167 2006/10/04 00:29:53 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -92,7 +92,7 @@ double cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST; double cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST; double cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST; -int effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE; +int effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE; Cost disable_cost = 100000000.0; @@ -276,13 +276,13 @@ cost_index(IndexPath *path, PlannerInfo *root, if (outer_rel != NULL && outer_rel->rows > 1) { /* - * For repeated indexscans, scale up the number of tuples fetched - * in the Mackert and Lohman formula by the number of scans, so - * that we estimate the number of pages fetched by all the scans. - * Then pro-rate the costs for one scan. In this case we assume - * all the fetches are random accesses. XXX it'd be good to - * include correlation in this model, but it's not clear how to do - * that without double-counting cache effects. + * For repeated indexscans, scale up the number of tuples fetched in + * the Mackert and Lohman formula by the number of scans, so that we + * estimate the number of pages fetched by all the scans. Then + * pro-rate the costs for one scan. In this case we assume all the + * fetches are random accesses. XXX it'd be good to include + * correlation in this model, but it's not clear how to do that + * without double-counting cache effects. */ double num_scans = outer_rel->rows; @@ -385,7 +385,7 @@ cost_index(IndexPath *path, PlannerInfo *root, * computed for us by query_planner. * * Caller is expected to have ensured that tuples_fetched is greater than zero - * and rounded to integer (see clamp_row_est). The result will likewise be + * and rounded to integer (see clamp_row_est). The result will likewise be * greater than zero and integral. */ double @@ -406,7 +406,8 @@ index_pages_fetched(double tuples_fetched, BlockNumber pages, Assert(T <= total_pages); /* b is pro-rated share of effective_cache_size */ - b = (double) effective_cache_size * T / total_pages; + b = (double) effective_cache_size *T / total_pages; + /* force it positive and integral */ if (b <= 1.0) b = 1.0; @@ -543,10 +544,10 @@ cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, if (outer_rel != NULL && outer_rel->rows > 1) { /* - * For repeated bitmap scans, scale up the number of tuples fetched - * in the Mackert and Lohman formula by the number of scans, so - * that we estimate the number of pages fetched by all the scans. - * Then pro-rate for one scan. + * For repeated bitmap scans, scale up the number of tuples fetched in + * the Mackert and Lohman formula by the number of scans, so that we + * estimate the number of pages fetched by all the scans. Then + * pro-rate for one scan. */ double num_scans = outer_rel->rows; @@ -573,7 +574,7 @@ cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, /* * For small numbers of pages we should charge random_page_cost apiece, * while if nearly all the table's pages are being read, it's more - * appropriate to charge seq_page_cost apiece. The effect is nonlinear, + * appropriate to charge seq_page_cost apiece. The effect is nonlinear, * too. For lack of a better idea, interpolate like this to determine the * cost per page. */ @@ -748,7 +749,7 @@ cost_tidscan(Path *path, PlannerInfo *root, { /* Each element of the array yields 1 tuple */ ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) lfirst(l); - Node *arraynode = (Node *) lsecond(saop->args); + Node *arraynode = (Node *) lsecond(saop->args); ntuples += estimate_array_length(arraynode); } @@ -849,8 +850,8 @@ cost_valuesscan(Path *path, PlannerInfo *root, RelOptInfo *baserel) Assert(baserel->rtekind == RTE_VALUES); /* - * For now, estimate list evaluation cost at one operator eval per - * list (probably pretty bogus, but is it worth being smarter?) + * For now, estimate list evaluation cost at one operator eval per list + * (probably pretty bogus, but is it worth being smarter?) */ cpu_per_tuple = cpu_operator_cost; @@ -875,7 +876,7 @@ cost_valuesscan(Path *path, PlannerInfo *root, RelOptInfo *baserel) * If the total volume exceeds work_mem, we switch to a tape-style merge * algorithm. There will still be about t*log2(t) tuple comparisons in * total, but we will also need to write and read each tuple once per - * merge pass. We expect about ceil(logM(r)) merge passes where r is the + * merge pass. We expect about ceil(logM(r)) merge passes where r is the * number of initial runs formed and M is the merge order used by tuplesort.c. * Since the average initial run should be about twice work_mem, we have * disk traffic = 2 * relsize * ceil(logM(p / (2*work_mem))) @@ -1745,7 +1746,7 @@ cost_qual_eval_walker(Node *node, QualCost *total) * array elements before the answer is determined. */ ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) node; - Node *arraynode = (Node *) lsecond(saop->args); + Node *arraynode = (Node *) lsecond(saop->args); total->per_tuple += cpu_operator_cost * estimate_array_length(arraynode) * 0.5; @@ -1967,7 +1968,7 @@ set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel, * * If we are doing an outer join, take that into account: the output must * be at least as large as the non-nullable input. (Is there any chance - * of being even smarter?) (XXX this is not really right, because it + * of being even smarter?) (XXX this is not really right, because it * assumes all the restriction clauses are join clauses; we should figure * pushed-down clauses separately.) * @@ -2132,10 +2133,10 @@ set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel) Assert(rte->rtekind == RTE_VALUES); /* - * Estimate number of rows the values list will return. - * We know this precisely based on the list length (well, - * barring set-returning functions in list items, but that's - * a refinement not catered for anywhere else either). + * Estimate number of rows the values list will return. We know this + * precisely based on the list length (well, barring set-returning + * functions in list items, but that's a refinement not catered for + * anywhere else either). */ rel->tuples = list_length(rte->values_lists); diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 7810012b2b0..b15affa54d5 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.211 2006/07/22 15:41:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.212 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -54,10 +54,10 @@ static List *find_saop_paths(PlannerInfo *root, RelOptInfo *rel, List *clauses, List *outer_clauses, bool istoplevel, RelOptInfo *outer_rel); static Path *choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, - List *paths, RelOptInfo *outer_rel); + List *paths, RelOptInfo *outer_rel); static int bitmap_path_comparator(const void *a, const void *b); static Cost bitmap_and_cost_est(PlannerInfo *root, RelOptInfo *rel, - List *paths, RelOptInfo *outer_rel); + List *paths, RelOptInfo *outer_rel); static List *pull_indexpath_quals(Path *bitmapqual); static bool lists_intersect_ptr(List *list1, List *list2); static bool match_clause_to_indexcol(IndexOptInfo *index, @@ -66,7 +66,7 @@ static bool match_clause_to_indexcol(IndexOptInfo *index, Relids outer_relids, SaOpControl saop_control); static bool is_indexable_operator(Oid expr_op, Oid opclass, - bool indexkey_on_left); + bool indexkey_on_left); static bool match_rowcompare_to_indexcol(IndexOptInfo *index, int indexcol, Oid opclass, @@ -324,8 +324,8 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel, /* * 1. Match the index against the available restriction clauses. * found_clause is set true only if at least one of the current - * clauses was used (and, if saop_control is SAOP_REQUIRE, it - * has to have been a ScalarArrayOpExpr clause). + * clauses was used (and, if saop_control is SAOP_REQUIRE, it has to + * have been a ScalarArrayOpExpr clause). */ restrictclauses = group_clauses_by_indexkey(index, clauses, @@ -422,8 +422,8 @@ find_saop_paths(PlannerInfo *root, RelOptInfo *rel, ListCell *l; /* - * Since find_usable_indexes is relatively expensive, don't bother to - * run it unless there are some top-level ScalarArrayOpExpr clauses. + * Since find_usable_indexes is relatively expensive, don't bother to run + * it unless there are some top-level ScalarArrayOpExpr clauses. */ foreach(l, clauses) { @@ -588,15 +588,15 @@ choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, * In theory we should consider every nonempty subset of the given paths. * In practice that seems like overkill, given the crude nature of the * estimates, not to mention the possible effects of higher-level AND and - * OR clauses. As a compromise, we sort the paths by selectivity. We + * OR clauses. As a compromise, we sort the paths by selectivity. We * always take the first, and sequentially add on paths that result in a * lower estimated cost. * * We also make some effort to detect directly redundant input paths, as - * can happen if there are multiple possibly usable indexes. (Another - * way it can happen is that best_inner_indexscan will find the same OR - * join clauses that create_or_index_quals has pulled OR restriction - * clauses out of, and then both versions show up as duplicate paths.) We + * can happen if there are multiple possibly usable indexes. (Another way + * it can happen is that best_inner_indexscan will find the same OR join + * clauses that create_or_index_quals has pulled OR restriction clauses + * out of, and then both versions show up as duplicate paths.) We * consider an index redundant if any of its index conditions were already * used by earlier indexes. (We could use predicate_implied_by to have a * more intelligent, but much more expensive, check --- but in most cases @@ -796,7 +796,7 @@ lists_intersect_ptr(List *list1, List *list2) foreach(cell1, list1) { - void *datum1 = lfirst(cell1); + void *datum1 = lfirst(cell1); ListCell *cell2; foreach(cell2, list2) @@ -963,7 +963,7 @@ group_clauses_by_indexkey(IndexOptInfo *index, * It is also possible to match RowCompareExpr clauses to indexes (but * currently, only btree indexes handle this). In this routine we will * report a match if the first column of the row comparison matches the - * target index column. This is sufficient to guarantee that some index + * target index column. This is sufficient to guarantee that some index * condition can be constructed from the RowCompareExpr --- whether the * remaining columns match the index too is considered in * expand_indexqual_rowcompare(). @@ -1004,10 +1004,10 @@ match_clause_to_indexcol(IndexOptInfo *index, bool plain_op; /* - * Never match pseudoconstants to indexes. (Normally this could not - * happen anyway, since a pseudoconstant clause couldn't contain a - * Var, but what if someone builds an expression index on a constant? - * It's not totally unreasonable to do so with a partial index, either.) + * Never match pseudoconstants to indexes. (Normally this could not + * happen anyway, since a pseudoconstant clause couldn't contain a Var, + * but what if someone builds an expression index on a constant? It's not + * totally unreasonable to do so with a partial index, either.) */ if (rinfo->pseudoconstant) return false; @@ -1421,9 +1421,9 @@ best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel, * NOTE: because we cache on outer_relids rather than outer_rel->relids, * we will report the same path and hence path cost for joins with * different sets of irrelevant rels on the outside. Now that cost_index - * is sensitive to outer_rel->rows, this is not really right. However - * the error is probably not large. Is it worth establishing a separate - * cache entry for each distinct outer_rel->relids set to get this right? + * is sensitive to outer_rel->rows, this is not really right. However the + * error is probably not large. Is it worth establishing a separate cache + * entry for each distinct outer_rel->relids set to get this right? */ foreach(l, rel->index_inner_paths) { @@ -1442,11 +1442,11 @@ best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel, * * Note: because we include restriction clauses, we will find indexscans * that could be plain indexscans, ie, they don't require the join context - * at all. This may seem redundant, but we need to include those scans in + * at all. This may seem redundant, but we need to include those scans in * the input given to choose_bitmap_and() to be sure we find optimal AND - * combinations of join and non-join scans. Also, even if the "best - * inner indexscan" is just a plain indexscan, it will have a different - * cost estimate because of cache effects. + * combinations of join and non-join scans. Also, even if the "best inner + * indexscan" is just a plain indexscan, it will have a different cost + * estimate because of cache effects. */ clause_list = find_clauses_for_join(root, rel, outer_relids, isouterjoin); @@ -2210,7 +2210,7 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups) foreach(l, (List *) lfirst(clausegroup_item)) { RestrictInfo *rinfo = (RestrictInfo *) lfirst(l); - Expr *clause = rinfo->clause; + Expr *clause = rinfo->clause; /* First check for boolean cases */ if (IsBooleanOpclass(curClass)) @@ -2240,7 +2240,7 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups) { resultquals = list_concat(resultquals, expand_indexqual_opclause(rinfo, - curClass)); + curClass)); } else if (IsA(clause, ScalarArrayOpExpr)) { @@ -2340,6 +2340,7 @@ static List * expand_indexqual_opclause(RestrictInfo *rinfo, Oid opclass) { Expr *clause = rinfo->clause; + /* we know these will succeed */ Node *leftop = get_leftop(clause); Node *rightop = get_rightop(clause); @@ -2421,7 +2422,7 @@ expand_indexqual_opclause(RestrictInfo *rinfo, Oid opclass) * column matches) or a simple OpExpr (if the first-column match is all * there is). In these cases the modified clause is always "<=" or ">=" * even when the original was "<" or ">" --- this is necessary to match all - * the rows that could match the original. (We are essentially building a + * the rows that could match the original. (We are essentially building a * lossy version of the row comparison when we do this.) */ static RestrictInfo * @@ -2430,18 +2431,18 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, int indexcol) { RowCompareExpr *clause = (RowCompareExpr *) rinfo->clause; - bool var_on_left; - int op_strategy; - Oid op_subtype; - bool op_recheck; - int matching_cols; - Oid expr_op; - List *opclasses; - List *subtypes; - List *new_ops; - ListCell *largs_cell; - ListCell *rargs_cell; - ListCell *opnos_cell; + bool var_on_left; + int op_strategy; + Oid op_subtype; + bool op_recheck; + int matching_cols; + Oid expr_op; + List *opclasses; + List *subtypes; + List *new_ops; + ListCell *largs_cell; + ListCell *rargs_cell; + ListCell *opnos_cell; /* We have to figure out (again) how the first col matches */ var_on_left = match_index_to_operand((Node *) linitial(clause->largs), @@ -2459,12 +2460,12 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, subtypes = list_make1_oid(op_subtype); /* - * See how many of the remaining columns match some index column - * in the same way. A note about rel membership tests: we assume - * that the clause as a whole is already known to use only Vars from - * the indexed relation and possibly some acceptable outer relations. - * So the "other" side of any potential index condition is OK as long - * as it doesn't use Vars from the indexed relation. + * See how many of the remaining columns match some index column in the + * same way. A note about rel membership tests: we assume that the clause + * as a whole is already known to use only Vars from the indexed relation + * and possibly some acceptable outer relations. So the "other" side of + * any potential index condition is OK as long as it doesn't use Vars from + * the indexed relation. */ matching_cols = 1; largs_cell = lnext(list_head(clause->largs)); @@ -2498,10 +2499,10 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, break; /* no good, volatile comparison value */ /* - * The Var side can match any column of the index. If the user - * does something weird like having multiple identical index - * columns, we insist the match be on the first such column, - * to avoid confusing the executor. + * The Var side can match any column of the index. If the user does + * something weird like having multiple identical index columns, we + * insist the match be on the first such column, to avoid confusing + * the executor. */ for (i = 0; i < index->ncolumns; i++) { @@ -2534,9 +2535,9 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, return rinfo; /* - * We have to generate a subset rowcompare (possibly just one OpExpr). - * The painful part of this is changing < to <= or > to >=, so deal with - * that first. + * We have to generate a subset rowcompare (possibly just one OpExpr). The + * painful part of this is changing < to <= or > to >=, so deal with that + * first. */ if (op_strategy == BTLessEqualStrategyNumber || op_strategy == BTGreaterEqualStrategyNumber) @@ -2546,8 +2547,8 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, } else { - ListCell *opclasses_cell; - ListCell *subtypes_cell; + ListCell *opclasses_cell; + ListCell *subtypes_cell; if (op_strategy == BTLessStrategyNumber) op_strategy = BTLessEqualStrategyNumber; @@ -2561,13 +2562,13 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, expr_op = get_opclass_member(lfirst_oid(opclasses_cell), lfirst_oid(subtypes_cell), op_strategy); - if (!OidIsValid(expr_op)) /* should not happen */ + if (!OidIsValid(expr_op)) /* should not happen */ elog(ERROR, "could not find member %d of opclass %u", op_strategy, lfirst_oid(opclasses_cell)); if (!var_on_left) { expr_op = get_commutator(expr_op); - if (!OidIsValid(expr_op)) /* should not happen */ + if (!OidIsValid(expr_op)) /* should not happen */ elog(ERROR, "could not find commutator of member %d of opclass %u", op_strategy, lfirst_oid(opclasses_cell)); } @@ -2596,7 +2597,7 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo, } else { - Expr *opexpr; + Expr *opexpr; opexpr = make_opclause(linitial_oid(new_ops), BOOLOID, false, copyObject(linitial(clause->largs)), diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index f5e9b1e987e..6882439ca3a 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.106 2006/08/17 17:06:37 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.107 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -33,7 +33,7 @@ static void hash_inner_and_outer(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, List *restrictlist, JoinType jointype); static Path *best_appendrel_indexscan(PlannerInfo *root, RelOptInfo *rel, - RelOptInfo *outer_rel, JoinType jointype); + RelOptInfo *outer_rel, JoinType jointype); static List *select_mergejoin_clauses(RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, @@ -544,9 +544,9 @@ match_unsorted_outer(PlannerInfo *root, * mergejoin using a subset of the merge clauses. Here, we consider * both cheap startup cost and cheap total cost. We can ignore * inner_cheapest_total on the first iteration, since we already made - * a path with it --- but not on later iterations with shorter - * sort keys, because then we are considering a different situation, - * viz using a simpler mergejoin to avoid a sort of the inner rel. + * a path with it --- but not on later iterations with shorter sort + * keys, because then we are considering a different situation, viz + * using a simpler mergejoin to avoid a sort of the inner rel. */ num_sortkeys = list_length(innersortkeys); if (num_sortkeys > 1 && !useallclauses) @@ -792,7 +792,7 @@ hash_inner_and_outer(PlannerInfo *root, * best_appendrel_indexscan * Finds the best available set of inner indexscans for a nestloop join * with the given append relation on the inside and the given outer_rel - * outside. Returns an AppendPath comprising the best inner scans, or + * outside. Returns an AppendPath comprising the best inner scans, or * NULL if there are no possible inner indexscans. */ static Path * @@ -820,9 +820,9 @@ best_appendrel_indexscan(PlannerInfo *root, RelOptInfo *rel, Assert(childrel->reloptkind == RELOPT_OTHER_MEMBER_REL); /* - * Check to see if child was rejected by constraint exclusion. - * If so, it will have a cheapest_total_path that's an Append path - * with no members (see set_plain_rel_pathlist). + * Check to see if child was rejected by constraint exclusion. If so, + * it will have a cheapest_total_path that's an Append path with no + * members (see set_plain_rel_pathlist). */ if (IsA(childrel->cheapest_total_path, AppendPath) && ((AppendPath *) childrel->cheapest_total_path)->subpaths == NIL) @@ -835,10 +835,10 @@ best_appendrel_indexscan(PlannerInfo *root, RelOptInfo *rel, outer_rel, jointype); /* - * If no luck on an indexpath for this rel, we'll still consider - * an Append substituting the cheapest-total inner path. However - * we must find at least one indexpath, else there's not going to - * be any improvement over the base path for the appendrel. + * If no luck on an indexpath for this rel, we'll still consider an + * Append substituting the cheapest-total inner path. However we must + * find at least one indexpath, else there's not going to be any + * improvement over the base path for the appendrel. */ if (bestinnerjoin) found_indexscan = true; diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index ac12bbd5f73..bed9db50430 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.79 2006/03/05 15:58:28 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.80 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -87,11 +87,11 @@ make_rels_by_joins(PlannerInfo *root, int level, List **joinrels) /* * An exception occurs when there is a clauseless join inside a - * construct that restricts join order, i.e., an outer join RHS - * or an IN (sub-SELECT) construct. Here, the rel may well have - * join clauses against stuff outside the OJ RHS or IN sub-SELECT, - * but the clauseless join *must* be done before we can make use - * of those join clauses. So do the clauseless join bit. + * construct that restricts join order, i.e., an outer join RHS or + * an IN (sub-SELECT) construct. Here, the rel may well have join + * clauses against stuff outside the OJ RHS or IN sub-SELECT, but + * the clauseless join *must* be done before we can make use of + * those join clauses. So do the clauseless join bit. * * See also the last-ditch case below. */ @@ -386,9 +386,9 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2) joinrelids = bms_union(rel1->relids, rel2->relids); /* - * If we have any outer joins, the proposed join might be illegal; and - * in any case we have to determine its join type. Scan the OJ list - * for conflicts. + * If we have any outer joins, the proposed join might be illegal; and in + * any case we have to determine its join type. Scan the OJ list for + * conflicts. */ jointype = JOIN_INNER; /* default if no match to an OJ */ is_valid_inner = true; @@ -485,16 +485,16 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2) InClauseInfo *ininfo = (InClauseInfo *) lfirst(l); /* - * This IN clause is not relevant unless its RHS overlaps the - * proposed join. (Check this first as a fast path for dismissing - * most irrelevant INs quickly.) + * This IN clause is not relevant unless its RHS overlaps the proposed + * join. (Check this first as a fast path for dismissing most + * irrelevant INs quickly.) */ if (!bms_overlap(ininfo->righthand, joinrelids)) continue; /* - * If we are still building the IN clause's RHS, then this IN - * clause isn't relevant yet. + * If we are still building the IN clause's RHS, then this IN clause + * isn't relevant yet. */ if (bms_is_subset(joinrelids, ininfo->righthand)) continue; diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c index 0e602a4476d..56142535c13 100644 --- a/src/backend/optimizer/path/orindxpath.c +++ b/src/backend/optimizer/path/orindxpath.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.80 2006/07/14 14:52:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.81 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -106,8 +106,8 @@ create_or_index_quals(PlannerInfo *root, RelOptInfo *rel) * Use the generate_bitmap_or_paths() machinery to estimate the * value of each OR clause. We can use regular restriction * clauses along with the OR clause contents to generate - * indexquals. We pass outer_rel = NULL so that sub-clauses - * that are actually joins will be ignored. + * indexquals. We pass outer_rel = NULL so that sub-clauses that + * are actually joins will be ignored. */ List *orpaths; ListCell *k; diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index fb5d38255db..b254598fcf3 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -11,7 +11,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.78 2006/08/17 17:02:49 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.79 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -909,7 +909,7 @@ get_cheapest_fractional_path_for_pathkeys(List *paths, * representing a backwards scan of the index. Return NIL if can't do it. * * If 'canonical' is TRUE, we remove duplicate pathkeys (which can occur - * if two index columns are equijoined, eg WHERE x = 1 AND y = 1). This + * if two index columns are equijoined, eg WHERE x = 1 AND y = 1). This * is required if the result is to be compared directly to a canonical query * pathkeys list. However, some callers want a list with exactly one entry * per index column, and they must pass FALSE. @@ -1106,8 +1106,8 @@ convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, outer_expr = (Node *) makeRelabelType((Expr *) outer_expr, ((RelabelType *) sub_key)->resulttype, - ((RelabelType *) sub_key)->resulttypmod, - ((RelabelType *) sub_key)->relabelformat); + ((RelabelType *) sub_key)->resulttypmod, + ((RelabelType *) sub_key)->relabelformat); } else continue; diff --git a/src/backend/optimizer/path/tidpath.c b/src/backend/optimizer/path/tidpath.c index a912994987a..a7dd5b262da 100644 --- a/src/backend/optimizer/path/tidpath.c +++ b/src/backend/optimizer/path/tidpath.c @@ -24,7 +24,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.27 2006/03/05 15:58:28 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.28 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -125,7 +125,7 @@ IsTidEqualAnyClause(ScalarArrayOpExpr *node, int varno) /* CTID must be first argument */ if (arg1 && IsA(arg1, Var)) { - Var *var = (Var *) arg1; + Var *var = (Var *) arg1; if (var->varattno == SelfItemPointerAttributeNumber && var->vartype == TIDOID && @@ -187,7 +187,7 @@ TidQualFromExpr(Node *expr, int varno) { foreach(l, ((BoolExpr *) expr)->args) { - List *frtn = TidQualFromExpr((Node *) lfirst(l), varno); + List *frtn = TidQualFromExpr((Node *) lfirst(l), varno); if (frtn) rlst = list_concat(rlst, frtn); diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index ae51505954f..14f1f1a10f4 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.216 2006/08/02 01:59:45 joe Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.217 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -60,7 +60,7 @@ static SubqueryScan *create_subqueryscan_plan(PlannerInfo *root, Path *best_path static FunctionScan *create_functionscan_plan(PlannerInfo *root, Path *best_path, List *tlist, List *scan_clauses); static ValuesScan *create_valuesscan_plan(PlannerInfo *root, Path *best_path, - List *tlist, List *scan_clauses); + List *tlist, List *scan_clauses); static NestLoop *create_nestloop_plan(PlannerInfo *root, NestPath *best_path, Plan *outer_plan, Plan *inner_plan); static MergeJoin *create_mergejoin_plan(PlannerInfo *root, MergePath *best_path, @@ -98,7 +98,7 @@ static TidScan *make_tidscan(List *qptlist, List *qpqual, Index scanrelid, static FunctionScan *make_functionscan(List *qptlist, List *qpqual, Index scanrelid); static ValuesScan *make_valuesscan(List *qptlist, List *qpqual, - Index scanrelid); + Index scanrelid); static BitmapAnd *make_bitmap_and(List *bitmapplans); static BitmapOr *make_bitmap_or(List *bitmapplans); static NestLoop *make_nestloop(List *tlist, @@ -216,9 +216,9 @@ create_scan_plan(PlannerInfo *root, Path *best_path) tlist = build_relation_tlist(rel); /* - * Extract the relevant restriction clauses from the parent relation. - * The executor must apply all these restrictions during the scan, - * except for pseudoconstants which we'll take care of below. + * Extract the relevant restriction clauses from the parent relation. The + * executor must apply all these restrictions during the scan, except for + * pseudoconstants which we'll take care of below. */ scan_clauses = rel->baserestrictinfo; @@ -282,9 +282,9 @@ create_scan_plan(PlannerInfo *root, Path *best_path) } /* - * If there are any pseudoconstant clauses attached to this node, - * insert a gating Result node that evaluates the pseudoconstants - * as one-time quals. + * If there are any pseudoconstant clauses attached to this node, insert a + * gating Result node that evaluates the pseudoconstants as one-time + * quals. */ if (root->hasPseudoConstantQuals) plan = create_gating_plan(root, plan, scan_clauses); @@ -327,8 +327,8 @@ use_physical_tlist(RelOptInfo *rel) int i; /* - * We can do this for real relation scans, subquery scans, function - * scans, and values scans (but not for, eg, joins). + * We can do this for real relation scans, subquery scans, function scans, + * and values scans (but not for, eg, joins). */ if (rel->rtekind != RTE_RELATION && rel->rtekind != RTE_SUBQUERY && @@ -466,9 +466,9 @@ create_join_plan(PlannerInfo *root, JoinPath *best_path) } /* - * If there are any pseudoconstant clauses attached to this node, - * insert a gating Result node that evaluates the pseudoconstants - * as one-time quals. + * If there are any pseudoconstant clauses attached to this node, insert a + * gating Result node that evaluates the pseudoconstants as one-time + * quals. */ if (root->hasPseudoConstantQuals) plan = create_gating_plan(root, plan, best_path->joinrestrictinfo); @@ -991,9 +991,9 @@ create_bitmap_scan_plan(PlannerInfo *root, * * Unlike create_indexscan_plan(), we need take no special thought here * for partial index predicates; this is because the predicate conditions - * are already listed in bitmapqualorig and indexquals. Bitmap scans - * have to do it that way because predicate conditions need to be rechecked - * if the scan becomes lossy. + * are already listed in bitmapqualorig and indexquals. Bitmap scans have + * to do it that way because predicate conditions need to be rechecked if + * the scan becomes lossy. */ qpqual = NIL; foreach(l, scan_clauses) @@ -1137,6 +1137,7 @@ create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual, subindexquals = lappend(subindexquals, make_ands_explicit(subindexqual)); } + /* * In the presence of ScalarArrayOpExpr quals, we might have built * BitmapOrPaths with just one subpath; don't add an OR step. @@ -1152,7 +1153,7 @@ create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual, plan->total_cost = opath->path.total_cost; plan->plan_rows = clamp_row_est(opath->bitmapselectivity * opath->path.parent->tuples); - plan->plan_width = 0; /* meaningless */ + plan->plan_width = 0; /* meaningless */ } /* @@ -1202,10 +1203,10 @@ create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual, Expr *pred = (Expr *) lfirst(l); /* - * We know that the index predicate must have been implied by - * the query condition as a whole, but it may or may not be - * implied by the conditions that got pushed into the - * bitmapqual. Avoid generating redundant conditions. + * We know that the index predicate must have been implied by the + * query condition as a whole, but it may or may not be implied by + * the conditions that got pushed into the bitmapqual. Avoid + * generating redundant conditions. */ if (!predicate_implied_by(list_make1(pred), ipath->indexclauses)) { @@ -1244,8 +1245,8 @@ create_tidscan_plan(PlannerInfo *root, TidPath *best_path, scan_clauses = extract_actual_clauses(scan_clauses, false); /* - * Remove any clauses that are TID quals. This is a bit tricky since - * the tidquals list has implicit OR semantics. + * Remove any clauses that are TID quals. This is a bit tricky since the + * tidquals list has implicit OR semantics. */ ortidquals = best_path->tidquals; if (list_length(ortidquals) > 1) @@ -1333,7 +1334,7 @@ create_functionscan_plan(PlannerInfo *root, Path *best_path, */ static ValuesScan * create_valuesscan_plan(PlannerInfo *root, Path *best_path, - List *tlist, List *scan_clauses) + List *tlist, List *scan_clauses) { ValuesScan *scan_plan; Index scan_relid = best_path->parent->relid; @@ -1411,9 +1412,9 @@ create_nestloop_plan(PlannerInfo *root, * join quals; failing to prove that doesn't result in an incorrect * plan. It is the right way to proceed because adding more quals to * the stuff we got from the original query would just make it harder - * to detect duplication. (Also, to change this we'd have to be - * wary of UPDATE/DELETE/SELECT FOR UPDATE target relations; see - * notes above about EvalPlanQual.) + * to detect duplication. (Also, to change this we'd have to be wary + * of UPDATE/DELETE/SELECT FOR UPDATE target relations; see notes + * above about EvalPlanQual.) */ BitmapHeapPath *innerpath = (BitmapHeapPath *) best_path->innerjoinpath; @@ -1693,7 +1694,7 @@ fix_indexqual_references(List *indexquals, IndexPath *index_path, if (IsA(clause, OpExpr)) { - OpExpr *op = (OpExpr *) clause; + OpExpr *op = (OpExpr *) clause; if (list_length(op->args) != 2) elog(ERROR, "indexqual clause is not binary opclause"); @@ -1718,7 +1719,7 @@ fix_indexqual_references(List *indexquals, IndexPath *index_path, else if (IsA(clause, RowCompareExpr)) { RowCompareExpr *rc = (RowCompareExpr *) clause; - ListCell *lc; + ListCell *lc; /* * Check to see if the indexkey is on the right; if so, commute @@ -1734,13 +1735,13 @@ fix_indexqual_references(List *indexquals, IndexPath *index_path, * attribute this is and change the indexkey operand as needed. * * Save the index opclass for only the first column. We will - * return the operator and opclass info for just the first - * column of the row comparison; the executor will have to - * look up the rest if it needs them. + * return the operator and opclass info for just the first column + * of the row comparison; the executor will have to look up the + * rest if it needs them. */ foreach(lc, rc->largs) { - Oid tmp_opclass; + Oid tmp_opclass; lfirst(lc) = fix_indexqual_operand(lfirst(lc), index, diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 8299f6756b8..2a8e1f528e9 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.122 2006/09/19 22:49:52 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.123 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -40,10 +40,10 @@ int join_collapse_limit; static void add_vars_to_targetlist(PlannerInfo *root, List *vars, Relids where_needed); static List *deconstruct_recurse(PlannerInfo *root, Node *jtnode, - bool below_outer_join, Relids *qualscope); + bool below_outer_join, Relids *qualscope); static OuterJoinInfo *make_outerjoininfo(PlannerInfo *root, - Relids left_rels, Relids right_rels, - bool is_full_join, Node *clause); + Relids left_rels, Relids right_rels, + bool is_full_join, Node *clause); static void distribute_qual_to_rels(PlannerInfo *root, Node *clause, bool is_pushed_down, bool is_deduced, @@ -71,12 +71,12 @@ static void check_hashjoinable(RestrictInfo *restrictinfo); * appearing in the jointree. * * The initial invocation must pass root->parse->jointree as the value of - * jtnode. Internally, the function recurses through the jointree. + * jtnode. Internally, the function recurses through the jointree. * * At the end of this process, there should be one baserel RelOptInfo for * every non-join RTE that is used in the query. Therefore, this routine * is the only place that should call build_simple_rel with reloptkind - * RELOPT_BASEREL. (Note: build_simple_rel recurses internally to build + * RELOPT_BASEREL. (Note: build_simple_rel recurses internally to build * "other rel" RelOptInfos for the members of any appendrels we find here.) */ void @@ -181,7 +181,7 @@ add_vars_to_targetlist(PlannerInfo *root, List *vars, Relids where_needed) * deconstruct_jointree * Recursively scan the query's join tree for WHERE and JOIN/ON qual * clauses, and add these to the appropriate restrictinfo and joininfo - * lists belonging to base RelOptInfos. Also, add OuterJoinInfo nodes + * lists belonging to base RelOptInfos. Also, add OuterJoinInfo nodes * to root->oj_info_list for any outer joins appearing in the query tree. * Return a "joinlist" data structure showing the join order decisions * that need to be made by make_one_rel(). @@ -198,9 +198,9 @@ add_vars_to_targetlist(PlannerInfo *root, List *vars, Relids where_needed) * be evaluated at the lowest level where all the variables it mentions are * available. However, we cannot push a qual down into the nullable side(s) * of an outer join since the qual might eliminate matching rows and cause a - * NULL row to be incorrectly emitted by the join. Therefore, we artificially + * NULL row to be incorrectly emitted by the join. Therefore, we artificially * OR the minimum-relids of such an outer join into the required_relids of - * clauses appearing above it. This forces those clauses to be delayed until + * clauses appearing above it. This forces those clauses to be delayed until * application of the outer join (or maybe even higher in the join tree). */ List * @@ -258,20 +258,19 @@ deconstruct_recurse(PlannerInfo *root, Node *jtnode, bool below_outer_join, ListCell *l; /* - * First, recurse to handle child joins. We collapse subproblems - * into a single joinlist whenever the resulting joinlist wouldn't - * exceed from_collapse_limit members. Also, always collapse - * one-element subproblems, since that won't lengthen the joinlist - * anyway. + * First, recurse to handle child joins. We collapse subproblems into + * a single joinlist whenever the resulting joinlist wouldn't exceed + * from_collapse_limit members. Also, always collapse one-element + * subproblems, since that won't lengthen the joinlist anyway. */ *qualscope = NULL; joinlist = NIL; remaining = list_length(f->fromlist); foreach(l, f->fromlist) { - Relids sub_qualscope; - List *sub_joinlist; - int sub_members; + Relids sub_qualscope; + List *sub_joinlist; + int sub_members; sub_joinlist = deconstruct_recurse(root, lfirst(l), below_outer_join, @@ -407,7 +406,8 @@ deconstruct_recurse(PlannerInfo *root, Node *jtnode, bool below_outer_join, (list_length(leftjoinlist) + list_length(rightjoinlist) <= join_collapse_limit)) joinlist = list_concat(leftjoinlist, rightjoinlist); - else /* force the join order at this node */ + else + /* force the join order at this node */ joinlist = list_make1(list_make2(leftjoinlist, rightjoinlist)); } else @@ -454,9 +454,9 @@ make_outerjoininfo(PlannerInfo *root, * any nullable rel is FOR UPDATE/SHARE. * * You might be wondering why this test isn't made far upstream in the - * parser. It's because the parser hasn't got enough info --- consider - * FOR UPDATE applied to a view. Only after rewriting and flattening - * do we know whether the view contains an outer join. + * parser. It's because the parser hasn't got enough info --- consider + * FOR UPDATE applied to a view. Only after rewriting and flattening do + * we know whether the view contains an outer join. */ foreach(l, root->parse->rowMarks) { @@ -475,7 +475,7 @@ make_outerjoininfo(PlannerInfo *root, { ojinfo->min_lefthand = left_rels; ojinfo->min_righthand = right_rels; - ojinfo->lhs_strict = false; /* don't care about this */ + ojinfo->lhs_strict = false; /* don't care about this */ return ojinfo; } @@ -494,19 +494,19 @@ make_outerjoininfo(PlannerInfo *root, ojinfo->lhs_strict = bms_overlap(strict_relids, left_rels); /* - * Required LHS is basically the LHS rels mentioned in the clause... - * but if there aren't any, punt and make it the full LHS, to avoid - * having an empty min_lefthand which will confuse later processing. - * (We don't try to be smart about such cases, just correct.) - * We may have to add more rels based on lower outer joins; see below. + * Required LHS is basically the LHS rels mentioned in the clause... but + * if there aren't any, punt and make it the full LHS, to avoid having an + * empty min_lefthand which will confuse later processing. (We don't try + * to be smart about such cases, just correct.) We may have to add more + * rels based on lower outer joins; see below. */ ojinfo->min_lefthand = bms_intersect(clause_relids, left_rels); if (bms_is_empty(ojinfo->min_lefthand)) ojinfo->min_lefthand = bms_copy(left_rels); /* - * Required RHS is normally the full set of RHS rels. Sometimes we - * can exclude some, see below. + * Required RHS is normally the full set of RHS rels. Sometimes we can + * exclude some, see below. */ ojinfo->min_righthand = bms_copy(right_rels); @@ -532,6 +532,7 @@ make_outerjoininfo(PlannerInfo *root, ojinfo->min_lefthand = bms_add_members(ojinfo->min_lefthand, otherinfo->min_righthand); } + /* * For a lower OJ in our RHS, if our join condition does not use the * lower join's RHS and the lower OJ's join condition is strict, we @@ -630,23 +631,23 @@ distribute_qual_to_rels(PlannerInfo *root, Node *clause, * If the clause is an outer-join clause, we must force it to the OJ's * semantic level to preserve semantics. * - * Otherwise, when the clause contains volatile functions, we force it - * to be evaluated at its original syntactic level. This preserves the + * Otherwise, when the clause contains volatile functions, we force it to + * be evaluated at its original syntactic level. This preserves the * expected semantics. * - * When the clause contains no volatile functions either, it is actually - * a pseudoconstant clause that will not change value during any one - * execution of the plan, and hence can be used as a one-time qual in - * a gating Result plan node. We put such a clause into the regular + * When the clause contains no volatile functions either, it is actually a + * pseudoconstant clause that will not change value during any one + * execution of the plan, and hence can be used as a one-time qual in a + * gating Result plan node. We put such a clause into the regular * RestrictInfo lists for the moment, but eventually createplan.c will * pull it out and make a gating Result node immediately above whatever - * plan node the pseudoconstant clause is assigned to. It's usually - * best to put a gating node as high in the plan tree as possible. - * If we are not below an outer join, we can actually push the - * pseudoconstant qual all the way to the top of the tree. If we are - * below an outer join, we leave the qual at its original syntactic level - * (we could push it up to just below the outer join, but that seems more - * complex than it's worth). + * plan node the pseudoconstant clause is assigned to. It's usually best + * to put a gating node as high in the plan tree as possible. If we are + * not below an outer join, we can actually push the pseudoconstant qual + * all the way to the top of the tree. If we are below an outer join, we + * leave the qual at its original syntactic level (we could push it up to + * just below the outer join, but that seems more complex than it's + * worth). */ if (bms_is_empty(relids)) { @@ -793,8 +794,8 @@ distribute_qual_to_rels(PlannerInfo *root, Node *clause, * Mark the qual as "pushed down" if it can be applied at a level below * its original syntactic level. This allows us to distinguish original * JOIN/ON quals from higher-level quals pushed down to the same joinrel. - * A qual originating from WHERE is always considered "pushed down". - * Note that for an outer-join qual, we have to compare to ojscope not + * A qual originating from WHERE is always considered "pushed down". Note + * that for an outer-join qual, we have to compare to ojscope not * qualscope. */ if (!is_pushed_down) diff --git a/src/backend/optimizer/plan/planagg.c b/src/backend/optimizer/plan/planagg.c index 2baf8e391d6..e64340ed21c 100644 --- a/src/backend/optimizer/plan/planagg.c +++ b/src/backend/optimizer/plan/planagg.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.21 2006/08/12 02:52:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/planagg.c,v 1.22 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -217,7 +217,7 @@ find_minmax_aggs_walker(Node *node, List **context) { Aggref *aggref = (Aggref *) node; Oid aggsortop; - Expr *curTarget; + Expr *curTarget; MinMaxAggInfo *info; ListCell *l; @@ -464,7 +464,7 @@ make_agg_subplan(PlannerInfo *root, MinMaxAggInfo *info) subparse->limitOffset = NULL; subparse->limitCount = (Node *) makeConst(INT8OID, sizeof(int64), Int64GetDatum(1), - false, false /* not by val */); + false, false /* not by val */ ); /* * Generate the plan for the subquery. We already have a Path for the @@ -478,9 +478,9 @@ make_agg_subplan(PlannerInfo *root, MinMaxAggInfo *info) * in our cost estimates. But that looks painful, and in most cases the * fraction of NULLs isn't high enough to change the decision. * - * The NOT NULL qual has to go on the actual indexscan; create_plan - * might have stuck a gating Result atop that, if there were any - * pseudoconstant quals. + * The NOT NULL qual has to go on the actual indexscan; create_plan might + * have stuck a gating Result atop that, if there were any pseudoconstant + * quals. */ plan = create_plan(&subroot, (Path *) info->path); diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c index ae44e2bc35c..e01379e8e3f 100644 --- a/src/backend/optimizer/plan/planmain.c +++ b/src/backend/optimizer/plan/planmain.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/planmain.c,v 1.96 2006/09/19 22:49:52 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/planmain.c,v 1.97 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -126,8 +126,8 @@ query_planner(PlannerInfo *root, List *tlist, double tuple_fraction, /* * Construct RelOptInfo nodes for all base relations in query, and * indirectly for all appendrel member relations ("other rels"). This - * will give us a RelOptInfo for every "simple" (non-join) rel involved - * in the query. + * will give us a RelOptInfo for every "simple" (non-join) rel involved in + * the query. * * Note: the reason we find the rels by searching the jointree and * appendrel list, rather than just scanning the rangetable, is that the @@ -137,11 +137,11 @@ query_planner(PlannerInfo *root, List *tlist, double tuple_fraction, add_base_rels_to_query(root, (Node *) parse->jointree); /* - * We should now have size estimates for every actual table involved - * in the query, so we can compute total_table_pages. Note that - * appendrels are not double-counted here, even though we don't bother - * to distinguish RelOptInfos for appendrel parents, because the parents - * will still have size zero. + * We should now have size estimates for every actual table involved in + * the query, so we can compute total_table_pages. Note that appendrels + * are not double-counted here, even though we don't bother to distinguish + * RelOptInfos for appendrel parents, because the parents will still have + * size zero. * * XXX if a table is self-joined, we will count it once per appearance, * which perhaps is the wrong thing ... but that's not completely clear, @@ -155,7 +155,7 @@ query_planner(PlannerInfo *root, List *tlist, double tuple_fraction, if (brel == NULL) continue; - Assert(brel->relid == rti); /* sanity check on array */ + Assert(brel->relid == rti); /* sanity check on array */ total_pages += (double) brel->pages; } @@ -165,8 +165,8 @@ query_planner(PlannerInfo *root, List *tlist, double tuple_fraction, * Examine the targetlist and qualifications, adding entries to baserel * targetlists for all referenced Vars. Restrict and join clauses are * added to appropriate lists belonging to the mentioned relations. We - * also build lists of equijoined keys for pathkey construction, and - * form a target joinlist for make_one_rel() to work from. + * also build lists of equijoined keys for pathkey construction, and form + * a target joinlist for make_one_rel() to work from. * * Note: all subplan nodes will have "flat" (var-only) tlists. This * implies that all expression evaluations are done at the root of the diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index f8eb95baf43..da18bc5a6f5 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.208 2006/08/12 02:52:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.209 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -427,9 +427,9 @@ preprocess_expression(PlannerInfo *root, Node *expr, int kind) /* * If the query has any join RTEs, replace join alias variables with * base-relation variables. We must do this before sublink processing, - * else sublinks expanded out from join aliases wouldn't get processed. - * We can skip it in VALUES lists, however, since they can't contain - * any Vars at all. + * else sublinks expanded out from join aliases wouldn't get processed. We + * can skip it in VALUES lists, however, since they can't contain any Vars + * at all. */ if (root->hasJoinRTEs && kind != EXPRKIND_VALUES) expr = flatten_join_alias_vars(root, expr); @@ -450,8 +450,8 @@ preprocess_expression(PlannerInfo *root, Node *expr, int kind) * still must do it for quals (to get AND/OR flatness); and if we are in a * subquery we should not assume it will be done only once. * - * For VALUES lists we never do this at all, again on the grounds that - * we should optimize for one-time evaluation. + * For VALUES lists we never do this at all, again on the grounds that we + * should optimize for one-time evaluation. */ if (kind != EXPRKIND_VALUES && (root->parse->jointree->fromlist != NIL || @@ -593,8 +593,8 @@ inheritance_planner(PlannerInfo *root) subplan = grouping_planner(&subroot, 0.0 /* retrieve all tuples */ ); /* - * If this child rel was excluded by constraint exclusion, exclude - * it from the plan. + * If this child rel was excluded by constraint exclusion, exclude it + * from the plan. */ if (is_dummy_plan(subplan)) continue; @@ -1098,12 +1098,12 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) /* * Deal with the RETURNING clause if any. It's convenient to pass the - * returningList through setrefs.c now rather than at top level (if - * we waited, handling inherited UPDATE/DELETE would be much harder). + * returningList through setrefs.c now rather than at top level (if we + * waited, handling inherited UPDATE/DELETE would be much harder). */ if (parse->returningList) { - List *rlist; + List *rlist; rlist = set_returning_clause_references(parse->returningList, result_plan, @@ -1132,11 +1132,11 @@ is_dummy_plan(Plan *plan) { if (IsA(plan, Result)) { - List *rcqual = (List *) ((Result *) plan)->resconstantqual; + List *rcqual = (List *) ((Result *) plan)->resconstantqual; if (list_length(rcqual) == 1) { - Const *constqual = (Const *) linitial(rcqual); + Const *constqual = (Const *) linitial(rcqual); if (constqual && IsA(constqual, Const)) { diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 3f3a7199417..298c8d1cff6 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.125 2006/08/28 14:32:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.126 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -453,13 +453,13 @@ trivial_subqueryscan(SubqueryScan *plan) return false; /* tlist doesn't match junk status */ /* - * We accept either a Var referencing the corresponding element of - * the subplan tlist, or a Const equaling the subplan element. - * See generate_setop_tlist() for motivation. + * We accept either a Var referencing the corresponding element of the + * subplan tlist, or a Const equaling the subplan element. See + * generate_setop_tlist() for motivation. */ if (ptle->expr && IsA(ptle->expr, Var)) { - Var *var = (Var *) ptle->expr; + Var *var = (Var *) ptle->expr; Assert(var->varno == plan->scan.scanrelid); Assert(var->varlevelsup == 0); @@ -793,7 +793,7 @@ set_join_references(Join *join) * * To handle bitmap-scan plan trees, we have to be able to recurse down * to the bottom BitmapIndexScan nodes; likewise, appendrel indexscans - * require recursing through Append nodes. This is split out as a separate + * require recursing through Append nodes. This is split out as a separate * function so that it can recurse. */ static void @@ -1339,7 +1339,7 @@ replace_vars_with_subplan_refs_mutator(Node *node, * adjust any Vars that refer to other tables to reference junk tlist * entries in the top plan's targetlist. Vars referencing the result * table should be left alone, however (the executor will evaluate them - * using the actual heap tuple, after firing triggers if any). In the + * using the actual heap tuple, after firing triggers if any). In the * adjusted RETURNING list, result-table Vars will still have their * original varno, but Vars for other rels will have varno OUTER. * @@ -1359,8 +1359,8 @@ set_returning_clause_references(List *rlist, /* * We can perform the desired Var fixup by abusing the join_references - * machinery that normally handles inner indexscan fixup. We search - * the top plan's targetlist for Vars of non-result relations, and use + * machinery that normally handles inner indexscan fixup. We search the + * top plan's targetlist for Vars of non-result relations, and use * join_references to convert RETURNING Vars into references to those * tlist entries, while leaving result-rel Vars as-is. */ diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 95e560478d9..94c97a55aa5 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.111 2006/08/02 01:59:46 joe Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.112 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -85,10 +85,10 @@ typedef struct finalize_primnode_context static Node *convert_testexpr(Node *testexpr, - int rtindex, - List **righthandIds); + int rtindex, + List **righthandIds); static Node *convert_testexpr_mutator(Node *node, - convert_testexpr_context *context); + convert_testexpr_context *context); static bool subplan_is_hashable(SubLink *slink, SubPlan *node); static bool hash_ok_operator(OpExpr *expr); static Node *replace_correlation_vars_mutator(Node *node, void *context); @@ -498,13 +498,13 @@ convert_testexpr_mutator(Node *node, return NULL; if (IsA(node, Param)) { - Param *param = (Param *) node; + Param *param = (Param *) node; if (param->paramkind == PARAM_SUBLINK) { /* - * We expect to encounter the Params in column-number sequence. - * We could handle non-sequential order if necessary, but for now + * We expect to encounter the Params in column-number sequence. We + * could handle non-sequential order if necessary, but for now * there's no need. (This is also a useful cross-check that we * aren't finding any unexpected Params.) */ @@ -514,13 +514,14 @@ convert_testexpr_mutator(Node *node, if (context->rtindex) { /* Make the Var node representing the subplan's result */ - Var *newvar; + Var *newvar; newvar = makeVar(context->rtindex, param->paramid, param->paramtype, -1, 0); + /* * Copy it for caller. NB: we need a copy to avoid having * doubly-linked substructure in the modified parse tree. @@ -584,10 +585,10 @@ subplan_is_hashable(SubLink *slink, SubPlan *node) return false; /* - * The estimated size of the subquery result must fit in work_mem. - * (Note: we use sizeof(HeapTupleHeaderData) here even though the tuples - * will actually be stored as MinimalTuples; this provides some fudge - * factor for hashtable overhead.) + * The estimated size of the subquery result must fit in work_mem. (Note: + * we use sizeof(HeapTupleHeaderData) here even though the tuples will + * actually be stored as MinimalTuples; this provides some fudge factor + * for hashtable overhead.) */ subquery_size = node->plan->plan_rows * (MAXALIGN(node->plan->plan_width) + MAXALIGN(sizeof(HeapTupleHeaderData))); @@ -616,7 +617,7 @@ subplan_is_hashable(SubLink *slink, SubPlan *node) { foreach(l, ((BoolExpr *) slink->testexpr)->args) { - Node *andarg = (Node *) lfirst(l); + Node *andarg = (Node *) lfirst(l); if (!IsA(andarg, OpExpr)) return false; /* probably can't happen */ @@ -686,8 +687,8 @@ convert_IN_to_join(PlannerInfo *root, SubLink *sublink) return NULL; if (sublink->testexpr && IsA(sublink->testexpr, OpExpr)) { - List *opclasses; - List *opstrats; + List *opclasses; + List *opstrats; get_op_btree_interpretation(((OpExpr *) sublink->testexpr)->opno, &opclasses, &opstrats); diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index bea7c03a739..eedd1a8ff07 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.43 2006/08/19 02:48:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.44 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -40,20 +40,20 @@ typedef struct reduce_outer_joins_state } reduce_outer_joins_state; static Node *pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, - RangeTblEntry *rte, - bool below_outer_join, - bool append_rel_member); + RangeTblEntry *rte, + bool below_outer_join, + bool append_rel_member); static Node *pull_up_simple_union_all(PlannerInfo *root, Node *jtnode, - RangeTblEntry *rte); + RangeTblEntry *rte); static void pull_up_union_leaf_queries(Node *setOp, PlannerInfo *root, - int parentRTindex, Query *setOpQuery); + int parentRTindex, Query *setOpQuery); static void make_setop_translation_lists(Query *query, Index newvarno, List **col_mappings, List **translated_vars); static bool is_simple_subquery(Query *subquery); static bool is_simple_union_all(Query *subquery); static bool is_simple_union_all_recurse(Node *setOp, Query *setOpQuery, - List *colTypes); + List *colTypes); static bool has_nullable_targetlist(Query *subquery); static bool is_safe_append_member(Query *subquery); static void resolvenew_in_jointree(Node *jtnode, int varno, @@ -66,7 +66,7 @@ static void reduce_outer_joins_pass2(Node *jtnode, static void fix_in_clause_relids(List *in_info_list, int varno, Relids subrelids); static void fix_append_rel_relids(List *append_rel_list, int varno, - Relids subrelids); + Relids subrelids); static Node *find_jointree_node_for_rel(Node *jtnode, int relid); @@ -136,7 +136,7 @@ pull_up_IN_clauses(PlannerInfo *root, Node *node) * side of an outer join. This restricts what we can do. * * append_rel_member is true if we are looking at a member subquery of - * an append relation. This puts some different restrictions on what + * an append relation. This puts some different restrictions on what * we can do. * * A tricky aspect of this code is that if we pull up a subquery we have @@ -173,8 +173,8 @@ pull_up_subqueries(PlannerInfo *root, Node *jtnode, * variables evaluated at the right place in the modified plan tree. * Fix it someday. * - * If we are looking at an append-relation member, we can't pull - * it up unless is_safe_append_member says so. + * If we are looking at an append-relation member, we can't pull it up + * unless is_safe_append_member says so. */ if (rte->rtekind == RTE_SUBQUERY && is_simple_subquery(rte->subquery) && @@ -186,14 +186,15 @@ pull_up_subqueries(PlannerInfo *root, Node *jtnode, /* * Alternatively, is it a simple UNION ALL subquery? If so, flatten - * into an "append relation". We can do this regardless of nullability - * considerations since this transformation does not result in - * propagating non-Var expressions into upper levels of the query. + * into an "append relation". We can do this regardless of + * nullability considerations since this transformation does not + * result in propagating non-Var expressions into upper levels of the + * query. * * It's also safe to do this regardless of whether this query is - * itself an appendrel member. (If you're thinking we should try - * to flatten the two levels of appendrel together, you're right; - * but we handle that in set_append_rel_pathlist, not here.) + * itself an appendrel member. (If you're thinking we should try to + * flatten the two levels of appendrel together, you're right; but we + * handle that in set_append_rel_pathlist, not here.) */ if (rte->rtekind == RTE_SUBQUERY && is_simple_union_all(rte->subquery)) @@ -258,7 +259,7 @@ pull_up_subqueries(PlannerInfo *root, Node *jtnode, * Attempt to pull up a single simple subquery. * * jtnode is a RangeTblRef that has been tentatively identified as a simple - * subquery by pull_up_subqueries. We return the replacement jointree node, + * subquery by pull_up_subqueries. We return the replacement jointree node, * or jtnode itself if we determine that the subquery can't be pulled up after * all. */ @@ -275,11 +276,10 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, ListCell *rt; /* - * Need a modifiable copy of the subquery to hack on. Even if we - * didn't sometimes choose not to pull up below, we must do this - * to avoid problems if the same subquery is referenced from - * multiple jointree items (which can't happen normally, but might - * after rule rewriting). + * Need a modifiable copy of the subquery to hack on. Even if we didn't + * sometimes choose not to pull up below, we must do this to avoid + * problems if the same subquery is referenced from multiple jointree + * items (which can't happen normally, but might after rule rewriting). */ subquery = copyObject(rte->subquery); @@ -287,8 +287,8 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, * Create a PlannerInfo data structure for this subquery. * * NOTE: the next few steps should match the first processing in - * subquery_planner(). Can we refactor to avoid code duplication, - * or would that just make things uglier? + * subquery_planner(). Can we refactor to avoid code duplication, or + * would that just make things uglier? */ subroot = makeNode(PlannerInfo); subroot->parse = subquery; @@ -296,12 +296,12 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, subroot->append_rel_list = NIL; /* - * Pull up any IN clauses within the subquery's WHERE, so that we - * don't leave unoptimized INs behind. + * Pull up any IN clauses within the subquery's WHERE, so that we don't + * leave unoptimized INs behind. */ if (subquery->hasSubLinks) subquery->jointree->quals = pull_up_IN_clauses(subroot, - subquery->jointree->quals); + subquery->jointree->quals); /* * Recursively pull up the subquery's subqueries, so that @@ -310,19 +310,19 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, * * Note: below_outer_join = false is correct here even if we are within an * outer join in the upper query; the lower query starts with a clean - * slate for outer-join semantics. Likewise, we say we aren't handling - * an appendrel member. + * slate for outer-join semantics. Likewise, we say we aren't handling an + * appendrel member. */ subquery->jointree = (FromExpr *) pull_up_subqueries(subroot, (Node *) subquery->jointree, false, false); /* - * Now we must recheck whether the subquery is still simple enough - * to pull up. If not, abandon processing it. + * Now we must recheck whether the subquery is still simple enough to pull + * up. If not, abandon processing it. * - * We don't really need to recheck all the conditions involved, - * but it's easier just to keep this "if" looking the same as the - * one in pull_up_subqueries. + * We don't really need to recheck all the conditions involved, but it's + * easier just to keep this "if" looking the same as the one in + * pull_up_subqueries. */ if (is_simple_subquery(subquery) && (!below_outer_join || has_nullable_targetlist(subquery)) && @@ -335,18 +335,18 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, /* * Give up, return unmodified RangeTblRef. * - * Note: The work we just did will be redone when the subquery - * gets planned on its own. Perhaps we could avoid that by - * storing the modified subquery back into the rangetable, but - * I'm not gonna risk it now. + * Note: The work we just did will be redone when the subquery gets + * planned on its own. Perhaps we could avoid that by storing the + * modified subquery back into the rangetable, but I'm not gonna risk + * it now. */ return jtnode; } /* - * Adjust level-0 varnos in subquery so that we can append its - * rangetable to upper query's. We have to fix the subquery's - * in_info_list and append_rel_list, as well. + * Adjust level-0 varnos in subquery so that we can append its rangetable + * to upper query's. We have to fix the subquery's in_info_list and + * append_rel_list, as well. */ rtoffset = list_length(parse->rtable); OffsetVarNodes((Node *) subquery, rtoffset, 0); @@ -354,18 +354,18 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, OffsetVarNodes((Node *) subroot->append_rel_list, rtoffset, 0); /* - * Upper-level vars in subquery are now one level closer to their - * parent than before. + * Upper-level vars in subquery are now one level closer to their parent + * than before. */ IncrementVarSublevelsUp((Node *) subquery, -1, 1); IncrementVarSublevelsUp((Node *) subroot->in_info_list, -1, 1); IncrementVarSublevelsUp((Node *) subroot->append_rel_list, -1, 1); /* - * Replace all of the top query's references to the subquery's - * outputs with copies of the adjusted subtlist items, being - * careful not to replace any of the jointree structure. (This'd - * be a lot cleaner if we could use query_tree_mutator.) + * Replace all of the top query's references to the subquery's outputs + * with copies of the adjusted subtlist items, being careful not to + * replace any of the jointree structure. (This'd be a lot cleaner if we + * could use query_tree_mutator.) */ subtlist = subquery->targetList; parse->targetList = (List *) @@ -404,27 +404,27 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, } /* - * Now append the adjusted rtable entries to upper query. (We hold - * off until after fixing the upper rtable entries; no point in - * running that code on the subquery ones too.) + * Now append the adjusted rtable entries to upper query. (We hold off + * until after fixing the upper rtable entries; no point in running that + * code on the subquery ones too.) */ parse->rtable = list_concat(parse->rtable, subquery->rtable); /* - * Pull up any FOR UPDATE/SHARE markers, too. (OffsetVarNodes - * already adjusted the marker rtindexes, so just concat the lists.) + * Pull up any FOR UPDATE/SHARE markers, too. (OffsetVarNodes already + * adjusted the marker rtindexes, so just concat the lists.) */ parse->rowMarks = list_concat(parse->rowMarks, subquery->rowMarks); /* - * We also have to fix the relid sets of any parent InClauseInfo - * nodes. (This could perhaps be done by ResolveNew, but it would - * clutter that routine's API unreasonably.) + * We also have to fix the relid sets of any parent InClauseInfo nodes. + * (This could perhaps be done by ResolveNew, but it would clutter that + * routine's API unreasonably.) * - * Likewise, relids appearing in AppendRelInfo nodes have to be fixed - * (but we took care of their translated_vars lists above). We already - * checked that this won't require introducing multiple subrelids into - * the single-slot AppendRelInfo structs. + * Likewise, relids appearing in AppendRelInfo nodes have to be fixed (but + * we took care of their translated_vars lists above). We already checked + * that this won't require introducing multiple subrelids into the + * single-slot AppendRelInfo structs. */ if (root->in_info_list || root->append_rel_list) { @@ -444,8 +444,8 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, subroot->append_rel_list); /* - * We don't have to do the equivalent bookkeeping for outer-join - * info, because that hasn't been set up yet. + * We don't have to do the equivalent bookkeeping for outer-join info, + * because that hasn't been set up yet. */ Assert(root->oj_info_list == NIL); Assert(subroot->oj_info_list == NIL); @@ -457,8 +457,8 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, /* subquery won't be pulled up if it hasAggs, so no work there */ /* - * Return the adjusted subquery jointree to replace the - * RangeTblRef entry in parent's jointree. + * Return the adjusted subquery jointree to replace the RangeTblRef entry + * in parent's jointree. */ return (Node *) subquery->jointree; } @@ -468,7 +468,7 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, * Pull up a single simple UNION ALL subquery. * * jtnode is a RangeTblRef that has been identified as a simple UNION ALL - * subquery by pull_up_subqueries. We pull up the leaf subqueries and + * subquery by pull_up_subqueries. We pull up the leaf subqueries and * build an "append relation" for the union set. The result value is just * jtnode, since we don't actually need to change the query jointree. */ @@ -524,9 +524,9 @@ pull_up_union_leaf_queries(Node *setOp, PlannerInfo *root, int parentRTindex, /* * Upper-level vars in subquery are now one level closer to their - * parent than before. We don't have to worry about offsetting - * varnos, though, because any such vars must refer to stuff above - * the level of the query we are pulling into. + * parent than before. We don't have to worry about offsetting + * varnos, though, because any such vars must refer to stuff above the + * level of the query we are pulling into. */ IncrementVarSublevelsUp((Node *) subquery, -1, 1); @@ -658,9 +658,9 @@ is_simple_subquery(Query *subquery) /* * Don't pull up a subquery that has any volatile functions in its - * targetlist. Otherwise we might introduce multiple evaluations of - * these functions, if they get copied to multiple places in the upper - * query, leading to surprising results. + * targetlist. Otherwise we might introduce multiple evaluations of these + * functions, if they get copied to multiple places in the upper query, + * leading to surprising results. */ if (contain_volatile_functions((Node *) subquery->targetList)) return false; @@ -799,16 +799,15 @@ is_safe_append_member(Query *subquery) ListCell *l; /* - * It's only safe to pull up the child if its jointree contains - * exactly one RTE, else the AppendRelInfo data structure breaks. - * The one base RTE could be buried in several levels of FromExpr, - * however. + * It's only safe to pull up the child if its jointree contains exactly + * one RTE, else the AppendRelInfo data structure breaks. The one base RTE + * could be buried in several levels of FromExpr, however. * - * Also, the child can't have any WHERE quals because there's no - * place to put them in an appendrel. (This is a bit annoying...) - * If we didn't need to check this, we'd just test whether - * get_relids_in_jointree() yields a singleton set, to be more - * consistent with the coding of fix_append_rel_relids(). + * Also, the child can't have any WHERE quals because there's no place to + * put them in an appendrel. (This is a bit annoying...) If we didn't + * need to check this, we'd just test whether get_relids_in_jointree() + * yields a singleton set, to be more consistent with the coding of + * fix_append_rel_relids(). */ jtnode = subquery->jointree; while (IsA(jtnode, FromExpr)) @@ -825,10 +824,10 @@ is_safe_append_member(Query *subquery) /* * XXX For the moment we also have to insist that the subquery's tlist * includes only simple Vars. This is pretty annoying, but fixing it - * seems to require nontrivial changes --- mainly because joinrel - * tlists are presently assumed to contain only Vars. Perhaps a - * pseudo-variable mechanism similar to the one speculated about - * in pull_up_subqueries' comments would help? FIXME someday. + * seems to require nontrivial changes --- mainly because joinrel tlists + * are presently assumed to contain only Vars. Perhaps a pseudo-variable + * mechanism similar to the one speculated about in pull_up_subqueries' + * comments would help? FIXME someday. */ foreach(l, subquery->targetList) { @@ -1190,9 +1189,9 @@ fix_append_rel_relids(List *append_rel_list, int varno, Relids subrelids) /* * We only want to extract the member relid once, but we mustn't fail - * immediately if there are multiple members; it could be that none of - * the AppendRelInfo nodes refer to it. So compute it on first use. - * Note that bms_singleton_member will complain if set is not singleton. + * immediately if there are multiple members; it could be that none of the + * AppendRelInfo nodes refer to it. So compute it on first use. Note that + * bms_singleton_member will complain if set is not singleton. */ foreach(l, append_rel_list) { diff --git a/src/backend/optimizer/prep/prepqual.c b/src/backend/optimizer/prep/prepqual.c index b0d2e7d18cd..22e1dd07f2f 100644 --- a/src/backend/optimizer/prep/prepqual.c +++ b/src/backend/optimizer/prep/prepqual.c @@ -25,7 +25,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepqual.c,v 1.55 2006/07/14 14:52:21 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepqual.c,v 1.56 2006/10/04 00:29:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -212,7 +212,7 @@ push_nots(Expr *qual) if (negator) { - OpExpr *newopexpr = makeNode(OpExpr); + OpExpr *newopexpr = makeNode(OpExpr); newopexpr->opno = negator; newopexpr->opfuncid = InvalidOid; @@ -228,9 +228,9 @@ push_nots(Expr *qual) { /* * Negate a ScalarArrayOpExpr if there is a negator for its operator; - * for example x = ANY (list) becomes x <> ALL (list). - * Otherwise, retain the clause as it is (the NOT can't be pushed down - * any farther). + * for example x = ANY (list) becomes x <> ALL (list). Otherwise, + * retain the clause as it is (the NOT can't be pushed down any + * farther). */ ScalarArrayOpExpr *saopexpr = (ScalarArrayOpExpr *) qual; Oid negator = get_negator(saopexpr->opno); diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index c4bbd9d2eec..4d442421694 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -16,7 +16,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.83 2006/08/12 02:52:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.84 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -157,13 +157,13 @@ preprocess_targetlist(PlannerInfo *root, List *tlist) /* * If the query has a RETURNING list, add resjunk entries for any Vars * used in RETURNING that belong to other relations. We need to do this - * to make these Vars available for the RETURNING calculation. Vars - * that belong to the result rel don't need to be added, because they - * will be made to refer to the actual heap tuple. + * to make these Vars available for the RETURNING calculation. Vars that + * belong to the result rel don't need to be added, because they will be + * made to refer to the actual heap tuple. */ if (parse->returningList && list_length(parse->rtable) > 1) { - List *vars; + List *vars; ListCell *l; vars = pull_var_clause((Node *) parse->returningList, false); diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 3bf7223199f..44aebd9ed3f 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -6,14 +6,14 @@ * * There are two code paths in the planner for set-operation queries. * If a subquery consists entirely of simple UNION ALL operations, it - * is converted into an "append relation". Otherwise, it is handled + * is converted into an "append relation". Otherwise, it is handled * by the general code in this module (plan_set_operations and its * subroutines). There is some support code here for the append-relation * case, but most of the heavy lifting for that is done elsewhere, * notably in prepjointree.c and allpaths.c. * * There is also some code here to support planning of queries that use - * inheritance (SELECT FROM foo*). Inheritance trees are converted into + * inheritance (SELECT FROM foo*). Inheritance trees are converted into * append relations, and thenceforth share code with the UNION ALL case. * * @@ -22,7 +22,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.133 2006/08/10 02:36:28 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.134 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -69,14 +69,14 @@ static List *generate_append_tlist(List *colTypes, bool flag, List *input_plans, List *refnames_tlist); static void expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, - Index rti); + Index rti); static void make_inh_translation_lists(Relation oldrelation, - Relation newrelation, - Index newvarno, - List **col_mappings, - List **translated_vars); + Relation newrelation, + Index newvarno, + List **col_mappings, + List **translated_vars); static Node *adjust_appendrel_attrs_mutator(Node *node, - AppendRelInfo *context); + AppendRelInfo *context); static Relids adjust_relid_set(Relids relids, Index oldrelid, Index newrelid); static List *adjust_inherited_tlist(List *tlist, AppendRelInfo *context); @@ -713,21 +713,21 @@ find_all_inheritors(Oid parentrel) /* * expand_inherited_tables * Expand each rangetable entry that represents an inheritance set - * into an "append relation". At the conclusion of this process, + * into an "append relation". At the conclusion of this process, * the "inh" flag is set in all and only those RTEs that are append * relation parents. */ void expand_inherited_tables(PlannerInfo *root) { - Index nrtes; - Index rti; - ListCell *rl; + Index nrtes; + Index rti; + ListCell *rl; /* - * expand_inherited_rtentry may add RTEs to parse->rtable; there is - * no need to scan them since they can't have inh=true. So just - * scan as far as the original end of the rtable list. + * expand_inherited_rtentry may add RTEs to parse->rtable; there is no + * need to scan them since they can't have inh=true. So just scan as far + * as the original end of the rtable list. */ nrtes = list_length(root->parse->rtable); rl = list_head(root->parse->rtable); @@ -745,7 +745,7 @@ expand_inherited_tables(PlannerInfo *root) * Check whether a rangetable entry represents an inheritance set. * If so, add entries for all the child tables to the query's * rangetable, and build AppendRelInfo nodes for all the child tables - * and add them to root->append_rel_list. If not, clear the entry's + * and add them to root->append_rel_list. If not, clear the entry's * "inh" flag to prevent later code from looking for AppendRelInfos. * * Note that the original RTE is considered to represent the whole @@ -801,22 +801,22 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) } /* - * Must open the parent relation to examine its tupdesc. We need not - * lock it since the rewriter already obtained at least AccessShareLock - * on each relation used in the query. + * Must open the parent relation to examine its tupdesc. We need not lock + * it since the rewriter already obtained at least AccessShareLock on each + * relation used in the query. */ oldrelation = heap_open(parentOID, NoLock); /* - * However, for each child relation we add to the query, we must obtain - * an appropriate lock, because this will be the first use of those - * relations in the parse/rewrite/plan pipeline. + * However, for each child relation we add to the query, we must obtain an + * appropriate lock, because this will be the first use of those relations + * in the parse/rewrite/plan pipeline. * * If the parent relation is the query's result relation, then we need * RowExclusiveLock. Otherwise, check to see if the relation is accessed * FOR UPDATE/SHARE or not. We can't just grab AccessShareLock because * then the executor would be trying to upgrade the lock, leading to - * possible deadlocks. (This code should match the parser and rewriter.) + * possible deadlocks. (This code should match the parser and rewriter.) */ if (rti == parse->resultRelation) lockmode = RowExclusiveLock; @@ -900,8 +900,8 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) /* * The executor will check the parent table's access permissions when it - * examines the parent's added RTE entry. There's no need to check - * twice, so turn off access check bits in the original RTE. + * examines the parent's added RTE entry. There's no need to check twice, + * so turn off access check bits in the original RTE. */ rte->requiredPerms = 0; } @@ -948,8 +948,8 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation, atttypmod = att->atttypmod; /* - * When we are generating the "translation list" for the parent - * table of an inheritance set, no need to search for matches. + * When we are generating the "translation list" for the parent table + * of an inheritance set, no need to search for matches. */ if (oldrelation == newrelation) { @@ -964,9 +964,8 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation, /* * Otherwise we have to search for the matching column by name. - * There's no guarantee it'll have the same column position, - * because of cases like ALTER TABLE ADD COLUMN and multiple - * inheritance. + * There's no guarantee it'll have the same column position, because + * of cases like ALTER TABLE ADD COLUMN and multiple inheritance. */ for (new_attno = 0; new_attno < newnatts; new_attno++) { @@ -979,7 +978,7 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation, if (atttypid != att->atttypid || atttypmod != att->atttypmod) elog(ERROR, "attribute \"%s\" of relation \"%s\" does not match parent's type", attname, RelationGetRelationName(newrelation)); - + numbers = lappend_int(numbers, new_attno + 1); vars = lappend(vars, makeVar(newvarno, (AttrNumber) (new_attno + 1), @@ -1060,7 +1059,7 @@ adjust_appendrel_attrs_mutator(Node *node, AppendRelInfo *context) var->varnoold = context->child_relid; if (var->varattno > 0) { - Node *newnode; + Node *newnode; if (var->varattno > list_length(context->translated_vars)) elog(ERROR, "attribute %d of relation \"%s\" does not exist", @@ -1075,10 +1074,10 @@ adjust_appendrel_attrs_mutator(Node *node, AppendRelInfo *context) else if (var->varattno == 0) { /* - * Whole-row Var: if we are dealing with named rowtypes, - * we can use a whole-row Var for the child table plus a - * coercion step to convert the tuple layout to the parent's - * rowtype. Otherwise we have to generate a RowExpr. + * Whole-row Var: if we are dealing with named rowtypes, we + * can use a whole-row Var for the child table plus a coercion + * step to convert the tuple layout to the parent's rowtype. + * Otherwise we have to generate a RowExpr. */ if (OidIsValid(context->child_reltype)) { @@ -1217,9 +1216,9 @@ adjust_appendrel_attrs_mutator(Node *node, AppendRelInfo *context) * BUT: although we don't need to recurse into subplans, we do need to * make sure that they are copied, not just referenced as * expression_tree_mutator will do by default. Otherwise we'll have the - * same subplan node referenced from each arm of the finished APPEND - * plan, which will cause trouble in the executor. This is a kluge that - * should go away when we redesign querytrees. + * same subplan node referenced from each arm of the finished APPEND plan, + * which will cause trouble in the executor. This is a kluge that should + * go away when we redesign querytrees. */ if (is_subplan(node)) { @@ -1267,7 +1266,7 @@ adjust_relid_set(Relids relids, Index oldrelid, Index newrelid) * * The relid sets are adjusted by substituting child_relid for parent_relid. * (NOTE: oldrel is not necessarily the parent_relid relation!) We are also - * careful to map attribute numbers within the array properly. User + * careful to map attribute numbers within the array properly. User * attributes have to be mapped through col_mappings, but system attributes * and whole-row references always have the same attno. * @@ -1353,7 +1352,7 @@ adjust_inherited_tlist(List *tlist, AppendRelInfo *context) foreach(tl, tlist) { TargetEntry *tle = (TargetEntry *) lfirst(tl); - int newattno; + int newattno; if (tle->resjunk) continue; /* ignore junk items */ diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 99d3147aeb5..c9d9512b2f5 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.221 2006/09/28 20:51:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.222 2006/10/04 00:29:55 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -403,7 +403,7 @@ count_agg_clauses_walker(Node *node, AggClauseCounts *counts) Form_pg_aggregate aggform; Oid aggtranstype; int i; - ListCell *l; + ListCell *l; Assert(aggref->agglevelsup == 0); counts->numAggs++; @@ -887,7 +887,7 @@ contain_nonstrict_functions_walker(Node *node, void *context) * * Returns the set of all Relids that are referenced in the clause in such * a way that the clause cannot possibly return TRUE if any of these Relids - * is an all-NULL row. (It is OK to err on the side of conservatism; hence + * is an all-NULL row. (It is OK to err on the side of conservatism; hence * the analysis here is simplistic.) * * The semantics here are subtly different from contain_nonstrict_functions: @@ -1020,7 +1020,7 @@ find_nonnullable_rels_walker(Node *node, bool top_level) static bool is_strict_saop(ScalarArrayOpExpr *expr, bool falseOK) { - Node *rightop; + Node *rightop; /* The contained operator must be strict. */ if (!op_strict(expr->opno)) @@ -1288,12 +1288,13 @@ CommuteRowCompareExpr(RowCompareExpr *clause) } clause->opnos = newops; + /* - * Note: we don't bother to update the opclasses list, but just set - * it to empty. This is OK since this routine is currently only used - * for index quals, and the index machinery won't use the opclass - * information. The original opclass list is NOT valid if we have - * commuted any cross-type comparisons, so don't leave it in place. + * Note: we don't bother to update the opclasses list, but just set it to + * empty. This is OK since this routine is currently only used for index + * quals, and the index machinery won't use the opclass information. The + * original opclass list is NOT valid if we have commuted any cross-type + * comparisons, so don't leave it in place. */ clause->opclasses = NIL; /* XXX */ @@ -2109,9 +2110,9 @@ eval_const_expressions_mutator(Node *node, context); if (arg && IsA(arg, RowExpr)) { - RowExpr *rarg = (RowExpr *) arg; - List *newargs = NIL; - ListCell *l; + RowExpr *rarg = (RowExpr *) arg; + List *newargs = NIL; + ListCell *l; /* * We break ROW(...) IS [NOT] NULL into separate tests on its @@ -2120,15 +2121,15 @@ eval_const_expressions_mutator(Node *node, */ foreach(l, rarg->args) { - Node *relem = (Node *) lfirst(l); + Node *relem = (Node *) lfirst(l); /* - * A constant field refutes the whole NullTest if it's of - * the wrong nullness; else we can discard it. + * A constant field refutes the whole NullTest if it's of the + * wrong nullness; else we can discard it. */ if (relem && IsA(relem, Const)) { - Const *carg = (Const *) relem; + Const *carg = (Const *) relem; if (carg->constisnull ? (ntest->nulltesttype == IS_NOT_NULL) : @@ -2152,8 +2153,8 @@ eval_const_expressions_mutator(Node *node, } if (arg && IsA(arg, Const)) { - Const *carg = (Const *) arg; - bool result; + Const *carg = (Const *) arg; + bool result; switch (ntest->nulltesttype) { @@ -2166,7 +2167,7 @@ eval_const_expressions_mutator(Node *node, default: elog(ERROR, "unrecognized nulltesttype: %d", (int) ntest->nulltesttype); - result = false; /* keep compiler quiet */ + result = false; /* keep compiler quiet */ break; } @@ -2188,8 +2189,8 @@ eval_const_expressions_mutator(Node *node, context); if (arg && IsA(arg, Const)) { - Const *carg = (Const *) arg; - bool result; + Const *carg = (Const *) arg; + bool result; switch (btest->booltesttype) { @@ -2218,7 +2219,7 @@ eval_const_expressions_mutator(Node *node, default: elog(ERROR, "unrecognized booltesttype: %d", (int) btest->booltesttype); - result = false; /* keep compiler quiet */ + result = false; /* keep compiler quiet */ break; } @@ -3174,7 +3175,7 @@ expression_tree_walker(Node *node, break; case T_Aggref: { - Aggref *expr = (Aggref *) node; + Aggref *expr = (Aggref *) node; if (expression_tree_walker((Node *) expr->args, walker, context)) @@ -3452,8 +3453,8 @@ query_tree_walker(Query *query, if (query->utilityStmt) { /* - * Certain utility commands contain general-purpose Querys embedded - * in them --- if this is one, invoke the walker on the sub-Query. + * Certain utility commands contain general-purpose Querys embedded in + * them --- if this is one, invoke the walker on the sub-Query. */ if (IsA(query->utilityStmt, CopyStmt)) { @@ -3828,8 +3829,8 @@ expression_tree_mutator(Node *node, break; case T_RowCompareExpr: { - RowCompareExpr *rcexpr = (RowCompareExpr *) node; - RowCompareExpr *newnode; + RowCompareExpr *rcexpr = (RowCompareExpr *) node; + RowCompareExpr *newnode; FLATCOPY(newnode, rcexpr, RowCompareExpr); MUTATE(newnode->largs, rcexpr->largs, List *); diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 2cc79ed239e..01f3151bee8 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.132 2006/08/02 01:59:46 joe Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.133 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -418,7 +418,7 @@ create_seqscan_path(PlannerInfo *root, RelOptInfo *rel) * for an ordered index, or NoMovementScanDirection for * an unordered index. * 'outer_rel' is the outer relation if this is a join inner indexscan path. - * (pathkeys and indexscandir are ignored if so.) NULL if not. + * (pathkeys and indexscandir are ignored if so.) NULL if not. * * Returns the new path node. */ @@ -680,12 +680,12 @@ create_result_path(List *quals) /* Ideally should define cost_result(), but I'm too lazy */ pathnode->path.startup_cost = 0; pathnode->path.total_cost = cpu_tuple_cost; + /* - * In theory we should include the qual eval cost as well, but - * at present that doesn't accomplish much except duplicate work that - * will be done again in make_result; since this is only used for - * degenerate cases, nothing interesting will be done with the path - * cost values... + * In theory we should include the qual eval cost as well, but at present + * that doesn't accomplish much except duplicate work that will be done + * again in make_result; since this is only used for degenerate cases, + * nothing interesting will be done with the path cost values... */ return pathnode; diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index aba4b881571..de14ddd2dc0 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.126 2006/09/19 22:49:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.127 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -78,9 +78,9 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, List *indexinfos = NIL; /* - * We need not lock the relation since it was already locked, either - * by the rewriter or when expand_inherited_rtentry() added it to the - * query's rangetable. + * We need not lock the relation since it was already locked, either by + * the rewriter or when expand_inherited_rtentry() added it to the query's + * rangetable. */ relation = heap_open(relationObjectId, NoLock); @@ -95,8 +95,8 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, /* * Estimate relation size --- unless it's an inheritance parent, in which - * case the size will be computed later in set_append_rel_pathlist, and - * we must leave it zero for now to avoid bollixing the total_table_pages + * case the size will be computed later in set_append_rel_pathlist, and we + * must leave it zero for now to avoid bollixing the total_table_pages * calculation. */ if (!inhparent) @@ -152,9 +152,9 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, /* * Ignore invalid indexes, since they can't safely be used for - * queries. Note that this is OK because the data structure - * we are constructing is only used by the planner --- the - * executor still needs to insert into "invalid" indexes! + * queries. Note that this is OK because the data structure we + * are constructing is only used by the planner --- the executor + * still needs to insert into "invalid" indexes! */ if (!index->indisvalid) { @@ -508,14 +508,14 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte) /* * We do not currently enforce that CHECK constraints contain only * immutable functions, so it's necessary to check here. We daren't draw - * conclusions from plan-time evaluation of non-immutable functions. - * Since they're ANDed, we can just ignore any mutable constraints in - * the list, and reason about the rest. + * conclusions from plan-time evaluation of non-immutable functions. Since + * they're ANDed, we can just ignore any mutable constraints in the list, + * and reason about the rest. */ safe_constraints = NIL; foreach(lc, constraint_pred) { - Node *pred = (Node *) lfirst(lc); + Node *pred = (Node *) lfirst(lc); if (!contain_mutable_functions(pred)) safe_constraints = lappend(safe_constraints, pred); @@ -526,9 +526,9 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte) * refute the entire collection at once. This may allow us to make proofs * that would fail if we took them individually. * - * Note: we use rel->baserestrictinfo, not safe_restrictions as might - * seem an obvious optimization. Some of the clauses might be OR clauses - * that have volatile and nonvolatile subclauses, and it's OK to make + * Note: we use rel->baserestrictinfo, not safe_restrictions as might seem + * an obvious optimization. Some of the clauses might be OR clauses that + * have volatile and nonvolatile subclauses, and it's OK to make * deductions with the nonvolatile parts. */ if (predicate_refuted_by(safe_constraints, rel->baserestrictinfo)) diff --git a/src/backend/optimizer/util/predtest.c b/src/backend/optimizer/util/predtest.c index b909e6d4bf2..4a2609a4ab6 100644 --- a/src/backend/optimizer/util/predtest.c +++ b/src/backend/optimizer/util/predtest.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/predtest.c,v 1.9 2006/09/28 20:51:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/predtest.c,v 1.10 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -208,6 +208,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_AND: + /* * AND-clause => AND-clause if A implies each of B's items */ @@ -224,6 +225,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) return result; case CLASS_OR: + /* * AND-clause => OR-clause if A implies any of B's items * @@ -241,6 +243,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) iterate_end(pred_info); if (result) return result; + /* * Also check if any of A's items implies B * @@ -258,6 +261,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) return result; case CLASS_ATOM: + /* * AND-clause => atom if any of A's items implies B */ @@ -279,6 +283,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_OR: + /* * OR-clause => OR-clause if each of A's items implies any * of B's items. Messy but can't do it any more simply. @@ -286,7 +291,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) result = true; iterate_begin(citem, clause, clause_info) { - bool presult = false; + bool presult = false; iterate_begin(pitem, predicate, pred_info) { @@ -308,6 +313,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) case CLASS_AND: case CLASS_ATOM: + /* * OR-clause => AND-clause if each of A's items implies B * @@ -331,6 +337,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_AND: + /* * atom => AND-clause if A implies each of B's items */ @@ -347,6 +354,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) return result; case CLASS_OR: + /* * atom => OR-clause if A implies any of B's items */ @@ -363,6 +371,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate) return result; case CLASS_ATOM: + /* * atom => atom is the base case */ @@ -427,6 +436,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_AND: + /* * AND-clause R=> AND-clause if A refutes any of B's items * @@ -444,6 +454,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) iterate_end(pred_info); if (result) return result; + /* * Also check if any of A's items refutes B * @@ -461,6 +472,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_OR: + /* * AND-clause R=> OR-clause if A refutes each of B's items */ @@ -477,6 +489,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_ATOM: + /* * If B is a NOT-clause, A R=> B if A => B's arg */ @@ -484,6 +497,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) if (not_arg && predicate_implied_by_recurse(clause, not_arg)) return true; + /* * AND-clause R=> atom if any of A's items refutes B */ @@ -505,6 +519,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_OR: + /* * OR-clause R=> OR-clause if A refutes each of B's items */ @@ -521,6 +536,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_AND: + /* * OR-clause R=> AND-clause if each of A's items refutes * any of B's items. @@ -528,7 +544,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) result = true; iterate_begin(citem, clause, clause_info) { - bool presult = false; + bool presult = false; iterate_begin(pitem, predicate, pred_info) { @@ -549,6 +565,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_ATOM: + /* * If B is a NOT-clause, A R=> B if A => B's arg */ @@ -556,6 +573,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) if (not_arg && predicate_implied_by_recurse(clause, not_arg)) return true; + /* * OR-clause R=> atom if each of A's items refutes B */ @@ -574,6 +592,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) break; case CLASS_ATOM: + /* * If A is a NOT-clause, A R=> B if B => A's arg */ @@ -584,6 +603,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) switch (pclass) { case CLASS_AND: + /* * atom R=> AND-clause if A refutes any of B's items */ @@ -600,6 +620,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_OR: + /* * atom R=> OR-clause if A refutes each of B's items */ @@ -616,6 +637,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) return result; case CLASS_ATOM: + /* * If B is a NOT-clause, A R=> B if A => B's arg */ @@ -623,6 +645,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate) if (not_arg && predicate_implied_by_recurse(clause, not_arg)) return true; + /* * atom R=> atom is the base case */ @@ -654,8 +677,8 @@ predicate_classify(Node *clause, PredIterInfo info) Assert(!IsA(clause, RestrictInfo)); /* - * If we see a List, assume it's an implicit-AND list; this is the - * correct semantics for lists of RestrictInfo nodes. + * If we see a List, assume it's an implicit-AND list; this is the correct + * semantics for lists of RestrictInfo nodes. */ if (IsA(clause, List)) { @@ -685,13 +708,13 @@ predicate_classify(Node *clause, PredIterInfo info) if (IsA(clause, ScalarArrayOpExpr)) { ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause; - Node *arraynode = (Node *) lsecond(saop->args); + Node *arraynode = (Node *) lsecond(saop->args); /* - * We can break this down into an AND or OR structure, but only if - * we know how to iterate through expressions for the array's - * elements. We can do that if the array operand is a non-null - * constant or a simple ArrayExpr. + * We can break this down into an AND or OR structure, but only if we + * know how to iterate through expressions for the array's elements. + * We can do that if the array operand is a non-null constant or a + * simple ArrayExpr. */ if (arraynode && IsA(arraynode, Const) && !((Const *) arraynode)->constisnull) @@ -716,7 +739,7 @@ predicate_classify(Node *clause, PredIterInfo info) } /* - * PredIterInfo routines for iterating over regular Lists. The iteration + * PredIterInfo routines for iterating over regular Lists. The iteration * state variable is the next ListCell to visit. */ static void @@ -852,7 +875,7 @@ arrayexpr_startup_fn(Node *clause, PredIterInfo info) { ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause; ArrayExprIterState *state; - ArrayExpr *arrayexpr; + ArrayExpr *arrayexpr; /* Create working state struct */ state = (ArrayExprIterState *) palloc(sizeof(ArrayExprIterState)); diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 331855f8e9f..4d5bffdb7b1 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.82 2006/09/19 22:49:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.83 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -97,9 +97,10 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptKind reloptkind) case RTE_SUBQUERY: case RTE_FUNCTION: case RTE_VALUES: + /* - * Subquery, function, or values list --- set up attr range - * and arrays + * Subquery, function, or values list --- set up attr range and + * arrays * * Note: 0 is included in range to support whole-row Vars */ @@ -417,8 +418,8 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, int ndx; /* - * We can't run into any child RowExprs here, but we could find - * a whole-row Var with a ConvertRowtypeExpr atop it. + * We can't run into any child RowExprs here, but we could find a + * whole-row Var with a ConvertRowtypeExpr atop it. */ var = origvar; while (!IsA(var, Var)) diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c index ec43ee39f0e..9176ae1680c 100644 --- a/src/backend/optimizer/util/restrictinfo.c +++ b/src/backend/optimizer/util/restrictinfo.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.48 2006/07/01 18:38:33 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.49 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -169,14 +169,15 @@ make_restrictinfo_from_bitmapqual(Path *bitmapqual, */ return NIL; } + /* * If the sublist contains multiple RestrictInfos, we create an * AND subclause. If there's just one, we have to check if it's * an OR clause, and if so flatten it to preserve AND/OR flatness * of our output. * - * We construct lists with and without sub-RestrictInfos, so - * as not to have to regenerate duplicate RestrictInfos below. + * We construct lists with and without sub-RestrictInfos, so as + * not to have to regenerate duplicate RestrictInfos below. */ if (list_length(sublist) > 1) { @@ -186,7 +187,7 @@ make_restrictinfo_from_bitmapqual(Path *bitmapqual, } else { - RestrictInfo *subri = (RestrictInfo *) linitial(sublist); + RestrictInfo *subri = (RestrictInfo *) linitial(sublist); Assert(IsA(subri, RestrictInfo)); if (restriction_is_or_clause(subri)) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 582747a23f4..f4e58a3b8d1 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.351 2006/09/18 16:04:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.352 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -99,7 +99,7 @@ static Query *transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt); static Query *transformInsertStmt(ParseState *pstate, InsertStmt *stmt, List **extras_before, List **extras_after); static List *transformInsertRow(ParseState *pstate, List *exprlist, - List *stmtcols, List *icolumns, List *attrnos); + List *stmtcols, List *icolumns, List *attrnos); static List *transformReturningList(ParseState *pstate, List *returningList); static Query *transformIndexStmt(ParseState *pstate, IndexStmt *stmt); static Query *transformRuleStmt(ParseState *query, RuleStmt *stmt, @@ -133,7 +133,7 @@ static void transformFKConstraints(ParseState *pstate, bool isAddConstraint); static void applyColumnNames(List *dst, List *src); static void getSetColTypes(ParseState *pstate, Node *node, - List **colTypes, List **colTypmods); + List **colTypes, List **colTypmods); static void transformLockingClause(Query *qry, LockingClause *lc); static void transformConstraintAttrs(List *constraintList); static void transformColumnType(ParseState *pstate, ColumnDef *column); @@ -343,7 +343,7 @@ transformStmt(ParseState *pstate, Node *parseTree, case T_CopyStmt: { - CopyStmt *n = (CopyStmt *) parseTree; + CopyStmt *n = (CopyStmt *) parseTree; result = makeNode(Query); result->commandType = CMD_UTILITY; @@ -552,8 +552,8 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, /* * We have three cases to deal with: DEFAULT VALUES (selectStmt == NULL), - * VALUES list, or general SELECT input. We special-case VALUES, both - * for efficiency and so we can handle DEFAULT specifications. + * VALUES list, or general SELECT input. We special-case VALUES, both for + * efficiency and so we can handle DEFAULT specifications. */ isGeneralSelect = (selectStmt && selectStmt->valuesLists == NIL); @@ -602,8 +602,8 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, { /* * We have INSERT ... DEFAULT VALUES. We can handle this case by - * emitting an empty targetlist --- all columns will be defaulted - * when the planner expands the targetlist. + * emitting an empty targetlist --- all columns will be defaulted when + * the planner expands the targetlist. */ exprList = NIL; } @@ -705,25 +705,25 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, else if (list_length(selectStmt->valuesLists) > 1) { /* - * Process INSERT ... VALUES with multiple VALUES sublists. - * We generate a VALUES RTE holding the transformed expression - * lists, and build up a targetlist containing Vars that reference - * the VALUES RTE. + * Process INSERT ... VALUES with multiple VALUES sublists. We + * generate a VALUES RTE holding the transformed expression lists, and + * build up a targetlist containing Vars that reference the VALUES + * RTE. */ List *exprsLists = NIL; int sublist_length = -1; foreach(lc, selectStmt->valuesLists) { - List *sublist = (List *) lfirst(lc); + List *sublist = (List *) lfirst(lc); /* Do basic expression transformation (same as a ROW() expr) */ sublist = transformExpressionList(pstate, sublist); /* - * All the sublists must be the same length, *after* transformation - * (which might expand '*' into multiple items). The VALUES RTE - * can't handle anything different. + * All the sublists must be the same length, *after* + * transformation (which might expand '*' into multiple items). + * The VALUES RTE can't handle anything different. */ if (sublist_length < 0) { @@ -747,8 +747,8 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, /* * There mustn't have been any table references in the expressions, - * else strange things would happen, like Cartesian products of - * those tables with the VALUES list ... + * else strange things would happen, like Cartesian products of those + * tables with the VALUES list ... */ if (pstate->p_joinlist != NIL) ereport(ERROR, @@ -756,10 +756,10 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, errmsg("VALUES must not contain table references"))); /* - * Another thing we can't currently support is NEW/OLD references - * in rules --- seems we'd need something like SQL99's LATERAL - * construct to ensure that the values would be available while - * evaluating the VALUES RTE. This is a shame. FIXME + * Another thing we can't currently support is NEW/OLD references in + * rules --- seems we'd need something like SQL99's LATERAL construct + * to ensure that the values would be available while evaluating the + * VALUES RTE. This is a shame. FIXME */ if (list_length(pstate->p_rtable) != 1 && contain_vars_of_level((Node *) exprsLists, 0)) @@ -793,7 +793,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, * INSERT INTO foo VALUES(bar.*) * * The sublist is just computed directly as the Query's targetlist, - * with no VALUES RTE. So it works just like SELECT without FROM. + * with no VALUES RTE. So it works just like SELECT without FROM. *---------- */ List *valuesLists = selectStmt->valuesLists; @@ -818,7 +818,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, attnos = list_head(attrnos); foreach(lc, exprList) { - Expr *expr = (Expr *) lfirst(lc); + Expr *expr = (Expr *) lfirst(lc); ResTarget *col; TargetEntry *tle; @@ -836,10 +836,10 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt, } /* - * If we have a RETURNING clause, we need to add the target relation - * to the query namespace before processing it, so that Var references - * in RETURNING will work. Also, remove any namespace entries added - * in a sub-SELECT or VALUES list. + * If we have a RETURNING clause, we need to add the target relation to + * the query namespace before processing it, so that Var references in + * RETURNING will work. Also, remove any namespace entries added in a + * sub-SELECT or VALUES list. */ if (stmt->returningList) { @@ -875,7 +875,7 @@ static List * transformInsertRow(ParseState *pstate, List *exprlist, List *stmtcols, List *icolumns, List *attrnos) { - List *result; + List *result; ListCell *lc; ListCell *icols; ListCell *attnos; @@ -884,7 +884,7 @@ transformInsertRow(ParseState *pstate, List *exprlist, * Check length of expr list. It must not have more expressions than * there are target columns. We allow fewer, but only if no explicit * columns list was given (the remaining columns are implicitly - * defaulted). Note we must check this *after* transformation because + * defaulted). Note we must check this *after* transformation because * that could expand '*' into multiple items. */ if (list_length(exprlist) > list_length(icolumns)) @@ -905,7 +905,7 @@ transformInsertRow(ParseState *pstate, List *exprlist, attnos = list_head(attrnos); foreach(lc, exprlist) { - Expr *expr = (Expr *) lfirst(lc); + Expr *expr = (Expr *) lfirst(lc); ResTarget *col; col = (ResTarget *) lfirst(icols); @@ -1292,10 +1292,10 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, TupleConstr *constr; AclResult aclresult; - bool including_defaults = false; - bool including_constraints = false; - bool including_indexes = false; - ListCell *elem; + bool including_defaults = false; + bool including_constraints = false; + bool including_indexes = false; + ListCell *elem; relation = heap_openrv(inhRelation->relation, AccessShareLock); @@ -1318,32 +1318,33 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, constr = tupleDesc->constr; foreach(elem, inhRelation->options) + { + int option = lfirst_int(elem); + + switch (option) { - int option = lfirst_int(elem); - switch (option) - { - case CREATE_TABLE_LIKE_INCLUDING_DEFAULTS: - including_defaults = true; - break; - case CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS: - including_defaults = false; - break; - case CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS: - including_constraints = true; - break; - case CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS: - including_constraints = false; - break; - case CREATE_TABLE_LIKE_INCLUDING_INDEXES: - including_indexes = true; - break; - case CREATE_TABLE_LIKE_EXCLUDING_INDEXES: - including_indexes = false; - break; - default: - elog(ERROR, "unrecognized CREATE TABLE LIKE option: %d", option); - } + case CREATE_TABLE_LIKE_INCLUDING_DEFAULTS: + including_defaults = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS: + including_defaults = false; + break; + case CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS: + including_constraints = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS: + including_constraints = false; + break; + case CREATE_TABLE_LIKE_INCLUDING_INDEXES: + including_indexes = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_INDEXES: + including_indexes = false; + break; + default: + elog(ERROR, "unrecognized CREATE TABLE LIKE option: %d", option); } + } if (including_indexes) elog(ERROR, "TODO"); @@ -1418,14 +1419,16 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, } } - if (including_constraints && tupleDesc->constr) { - int ccnum; + if (including_constraints && tupleDesc->constr) + { + int ccnum; AttrNumber *attmap = varattnos_map_schema(tupleDesc, cxt->columns); - for(ccnum = 0; ccnum < tupleDesc->constr->num_check; ccnum++) { - char *ccname = tupleDesc->constr->check[ccnum].ccname; - char *ccbin = tupleDesc->constr->check[ccnum].ccbin; - Node *ccbin_node = stringToNode(ccbin); + for (ccnum = 0; ccnum < tupleDesc->constr->num_check; ccnum++) + { + char *ccname = tupleDesc->constr->check[ccnum].ccname; + char *ccbin = tupleDesc->constr->check[ccnum].ccbin; + Node *ccbin_node = stringToNode(ccbin); Constraint *n = makeNode(Constraint); change_varattnos_of_a_node(ccbin_node, attmap); @@ -1435,7 +1438,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, n->raw_expr = ccbin_node; n->cooked_expr = NULL; n->indexspace = NULL; - cxt->ckconstraints = lappend(cxt->ckconstraints, (Node*)n); + cxt->ckconstraints = lappend(cxt->ckconstraints, (Node *) n); } } @@ -1888,7 +1891,7 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt, if (pstate->p_hasAggs) ereport(ERROR, (errcode(ERRCODE_GROUPING_ERROR), - errmsg("cannot use aggregate function in rule WHERE condition"))); + errmsg("cannot use aggregate function in rule WHERE condition"))); /* save info about sublinks in where clause */ qry->hasSubLinks = pstate->p_hasSubLinks; @@ -2175,8 +2178,8 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) RangeTblEntry *rte; RangeTblRef *rtr; ListCell *lc; - ListCell *lc2; - int i; + ListCell *lc2; + int i; qry->commandType = CMD_SELECT; @@ -2190,21 +2193,21 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) Assert(stmt->op == SETOP_NONE); /* - * For each row of VALUES, transform the raw expressions and gather - * type information. This is also a handy place to reject DEFAULT - * nodes, which the grammar allows for simplicity. + * For each row of VALUES, transform the raw expressions and gather type + * information. This is also a handy place to reject DEFAULT nodes, which + * the grammar allows for simplicity. */ foreach(lc, stmt->valuesLists) { - List *sublist = (List *) lfirst(lc); + List *sublist = (List *) lfirst(lc); /* Do basic expression transformation (same as a ROW() expr) */ sublist = transformExpressionList(pstate, sublist); /* * All the sublists must be the same length, *after* transformation - * (which might expand '*' into multiple items). The VALUES RTE - * can't handle anything different. + * (which might expand '*' into multiple items). The VALUES RTE can't + * handle anything different. */ if (sublist_length < 0) { @@ -2226,7 +2229,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) i = 0; foreach(lc2, sublist) { - Node *col = (Node *) lfirst(lc2); + Node *col = (Node *) lfirst(lc2); if (IsA(col, SetToDefault)) ereport(ERROR, @@ -2238,8 +2241,8 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) } /* - * Now resolve the common types of the columns, and coerce everything - * to those types. + * Now resolve the common types of the columns, and coerce everything to + * those types. */ for (i = 0; i < sublist_length; i++) { @@ -2249,13 +2252,13 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) newExprsLists = NIL; foreach(lc, exprsLists) { - List *sublist = (List *) lfirst(lc); - List *newsublist = NIL; + List *sublist = (List *) lfirst(lc); + List *newsublist = NIL; i = 0; foreach(lc2, sublist) { - Node *col = (Node *) lfirst(lc2); + Node *col = (Node *) lfirst(lc2); col = coerce_to_common_type(pstate, col, coltypes[i], "VALUES"); newsublist = lappend(newsublist, col); @@ -2283,8 +2286,8 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) qry->targetList = expandRelAttrs(pstate, rte, rtr->rtindex, 0); /* - * The grammar allows attaching ORDER BY, LIMIT, and FOR UPDATE - * to a VALUES, so cope. + * The grammar allows attaching ORDER BY, LIMIT, and FOR UPDATE to a + * VALUES, so cope. */ qry->sortClause = transformSortClause(pstate, stmt->sortClause, @@ -2299,7 +2302,7 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) if (stmt->lockingClause) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("SELECT FOR UPDATE/SHARE cannot be applied to VALUES"))); + errmsg("SELECT FOR UPDATE/SHARE cannot be applied to VALUES"))); /* handle any CREATE TABLE AS spec */ if (stmt->into) @@ -2313,10 +2316,10 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) } /* - * There mustn't have been any table references in the expressions, - * else strange things would happen, like Cartesian products of - * those tables with the VALUES list. We have to check this after - * parsing ORDER BY et al since those could insert more junk. + * There mustn't have been any table references in the expressions, else + * strange things would happen, like Cartesian products of those tables + * with the VALUES list. We have to check this after parsing ORDER BY et + * al since those could insert more junk. */ if (list_length(pstate->p_joinlist) != 1) ereport(ERROR, @@ -2324,10 +2327,10 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) errmsg("VALUES must not contain table references"))); /* - * Another thing we can't currently support is NEW/OLD references - * in rules --- seems we'd need something like SQL99's LATERAL - * construct to ensure that the values would be available while - * evaluating the VALUES RTE. This is a shame. FIXME + * Another thing we can't currently support is NEW/OLD references in rules + * --- seems we'd need something like SQL99's LATERAL construct to ensure + * that the values would be available while evaluating the VALUES RTE. + * This is a shame. FIXME */ if (list_length(pstate->p_rtable) != 1 && contain_vars_of_level((Node *) newExprsLists, 0)) @@ -2390,8 +2393,8 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) /* * Find leftmost leaf SelectStmt; extract the one-time-only items from it * and from the top-level node. (Most of the INTO options can be - * transferred to the Query immediately, but intoColNames has to be - * saved to apply below.) + * transferred to the Query immediately, but intoColNames has to be saved + * to apply below.) */ leftmostSelect = stmt->larg; while (leftmostSelect && leftmostSelect->op != SETOP_NONE) @@ -2865,9 +2868,9 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) qry->hasSubLinks = pstate->p_hasSubLinks; /* - * Top-level aggregates are simply disallowed in UPDATE, per spec. - * (From an implementation point of view, this is forced because the - * implicit ctid reference would otherwise be an ungrouped variable.) + * Top-level aggregates are simply disallowed in UPDATE, per spec. (From + * an implementation point of view, this is forced because the implicit + * ctid reference would otherwise be an ungrouped variable.) */ if (pstate->p_hasAggs) ereport(ERROR, @@ -2890,7 +2893,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) { TargetEntry *tle = (TargetEntry *) lfirst(tl); ResTarget *origTarget; - int attrno; + int attrno; if (tle->resjunk) { @@ -2916,7 +2919,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) (errcode(ERRCODE_UNDEFINED_COLUMN), errmsg("column \"%s\" of relation \"%s\" does not exist", origTarget->name, - RelationGetRelationName(pstate->p_target_relation)), + RelationGetRelationName(pstate->p_target_relation)), parser_errposition(pstate, origTarget->location))); updateTargetListEntry(pstate, tle, origTarget->name, @@ -2948,9 +2951,9 @@ transformReturningList(ParseState *pstate, List *returningList) return NIL; /* nothing to do */ /* - * We need to assign resnos starting at one in the RETURNING list. - * Save and restore the main tlist's value of p_next_resno, just in - * case someone looks at it later (probably won't happen). + * We need to assign resnos starting at one in the RETURNING list. Save + * and restore the main tlist's value of p_next_resno, just in case + * someone looks at it later (probably won't happen). */ save_next_resno = pstate->p_next_resno; pstate->p_next_resno = 1; @@ -2975,7 +2978,7 @@ transformReturningList(ParseState *pstate, List *returningList) if (list_length(pstate->p_rtable) != length_rtable) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("RETURNING may not contain references to other relations"))); + errmsg("RETURNING may not contain references to other relations"))); /* mark column origins */ markTargetListOrigins(pstate, rlist); @@ -3204,7 +3207,7 @@ static Query * transformPrepareStmt(ParseState *pstate, PrepareStmt *stmt) { Query *result = makeNode(Query); - List *argtype_oids; /* argtype OIDs in a list */ + List *argtype_oids; /* argtype OIDs in a list */ Oid *argtoids = NULL; /* and as an array */ int nargs; List *queries; @@ -3233,10 +3236,9 @@ transformPrepareStmt(ParseState *pstate, PrepareStmt *stmt) } /* - * Analyze the statement using these parameter types (any - * parameters passed in from above us will not be visible to it), - * allowing information about unknown parameters to be deduced - * from context. + * Analyze the statement using these parameter types (any parameters + * passed in from above us will not be visible to it), allowing + * information about unknown parameters to be deduced from context. */ queries = parse_analyze_varparams((Node *) stmt->query, pstate->p_sourcetext, @@ -3250,8 +3252,8 @@ transformPrepareStmt(ParseState *pstate, PrepareStmt *stmt) elog(ERROR, "unexpected extra stuff in prepared statement"); /* - * Check that all parameter types were determined, and convert the - * array of OIDs into a list for storage. + * Check that all parameter types were determined, and convert the array + * of OIDs into a list for storage. */ argtype_oids = NIL; for (i = 0; i < nargs; i++) @@ -3360,7 +3362,7 @@ CheckSelectLocking(Query *qry) if (qry->havingQual != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("SELECT FOR UPDATE/SHARE is not allowed with HAVING clause"))); + errmsg("SELECT FOR UPDATE/SHARE is not allowed with HAVING clause"))); if (qry->hasAggs) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -3500,15 +3502,15 @@ applyLockingClause(Query *qry, Index rtindex, bool forUpdate, bool noWait) if ((rc = get_rowmark(qry, rtindex)) != NULL) { /* - * If the same RTE is specified both FOR UPDATE and FOR SHARE, - * treat it as FOR UPDATE. (Reasonable, since you can't take - * both a shared and exclusive lock at the same time; it'll - * end up being exclusive anyway.) + * If the same RTE is specified both FOR UPDATE and FOR SHARE, treat + * it as FOR UPDATE. (Reasonable, since you can't take both a shared + * and exclusive lock at the same time; it'll end up being exclusive + * anyway.) * - * We also consider that NOWAIT wins if it's specified both ways. - * This is a bit more debatable but raising an error doesn't - * seem helpful. (Consider for instance SELECT FOR UPDATE NOWAIT - * from a view that internally contains a plain FOR UPDATE spec.) + * We also consider that NOWAIT wins if it's specified both ways. This + * is a bit more debatable but raising an error doesn't seem helpful. + * (Consider for instance SELECT FOR UPDATE NOWAIT from a view that + * internally contains a plain FOR UPDATE spec.) */ rc->forUpdate |= forUpdate; rc->noWait |= noWait; diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 70b6946d5fa..be584b514c6 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.157 2006/08/14 23:39:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.158 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -544,8 +544,8 @@ transformRangeFunction(ParseState *pstate, RangeFunction *r) /* * If a coldeflist was supplied, ensure it defines a legal set of names * (no duplicates) and datatypes (no pseudo-types, for instance). - * addRangeTableEntryForFunction looked up the type names but didn't - * check them further than that. + * addRangeTableEntryForFunction looked up the type names but didn't check + * them further than that. */ if (r->coldeflist) { @@ -1338,10 +1338,10 @@ transformGroupClause(ParseState *pstate, List *grouplist, ListCell *l; /* Preprocess the grouping clause, lookup TLEs */ - foreach (l, grouplist) + foreach(l, grouplist) { TargetEntry *tle; - Oid restype; + Oid restype; tle = findTargetlistEntry(pstate, lfirst(l), targetlist, GROUP_CLAUSE); @@ -1359,21 +1359,20 @@ transformGroupClause(ParseState *pstate, List *grouplist, } /* - * Now iterate through the ORDER BY clause. If we find a grouping - * element that matches the ORDER BY element, append the grouping - * element to the result set immediately. Otherwise, stop - * iterating. The effect of this is to look for a prefix of the - * ORDER BY list in the grouping clauses, and to move that prefix - * to the front of the GROUP BY. + * Now iterate through the ORDER BY clause. If we find a grouping element + * that matches the ORDER BY element, append the grouping element to the + * result set immediately. Otherwise, stop iterating. The effect of this + * is to look for a prefix of the ORDER BY list in the grouping clauses, + * and to move that prefix to the front of the GROUP BY. */ - foreach (l, sortClause) + foreach(l, sortClause) { - SortClause *sc = (SortClause *) lfirst(l); - ListCell *prev = NULL; - ListCell *tl; - bool found = false; + SortClause *sc = (SortClause *) lfirst(l); + ListCell *prev = NULL; + ListCell *tl; + bool found = false; - foreach (tl, tle_list) + foreach(tl, tle_list) { TargetEntry *tle = (TargetEntry *) lfirst(tl); @@ -1399,17 +1398,17 @@ transformGroupClause(ParseState *pstate, List *grouplist, } /* - * Now add any remaining elements of the GROUP BY list in the - * order we received them. + * Now add any remaining elements of the GROUP BY list in the order we + * received them. * - * XXX: are there any additional criteria to consider when - * ordering grouping clauses? + * XXX: are there any additional criteria to consider when ordering + * grouping clauses? */ foreach(l, tle_list) { TargetEntry *tle = (TargetEntry *) lfirst(l); GroupClause *gc; - Oid sort_op; + Oid sort_op; /* avoid making duplicate grouplist entries */ if (targetIsInSortList(tle, result)) diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 010c704c689..9cfe4391bdc 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.143 2006/07/26 19:31:51 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.144 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -163,11 +163,11 @@ coerce_type(ParseState *pstate, Node *node, /* * If the target type is a domain, we want to call its base type's - * input routine, not domain_in(). This is to avoid premature - * failure when the domain applies a typmod: existing input - * routines follow implicit-coercion semantics for length checks, - * which is not always what we want here. The needed check will - * be applied properly inside coerce_to_domain(). + * input routine, not domain_in(). This is to avoid premature failure + * when the domain applies a typmod: existing input routines follow + * implicit-coercion semantics for length checks, which is not always + * what we want here. The needed check will be applied properly + * inside coerce_to_domain(). */ baseTypeMod = -1; baseTypeId = getBaseTypeAndTypmod(targetTypeId, &baseTypeMod); @@ -180,13 +180,13 @@ coerce_type(ParseState *pstate, Node *node, newcon->constisnull = con->constisnull; /* - * We pass typmod -1 to the input routine, primarily because - * existing input routines follow implicit-coercion semantics for - * length checks, which is not always what we want here. Any - * length constraint will be applied later by our caller. + * We pass typmod -1 to the input routine, primarily because existing + * input routines follow implicit-coercion semantics for length + * checks, which is not always what we want here. Any length + * constraint will be applied later by our caller. * - * We assume here that UNKNOWN's internal representation is the - * same as CSTRING. + * We assume here that UNKNOWN's internal representation is the same + * as CSTRING. */ if (!con->constisnull) newcon->constvalue = stringTypeDatum(targetType, @@ -886,8 +886,8 @@ coerce_to_bigint(ParseState *pstate, Node *node, ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), /* translator: first %s is name of a SQL construct, eg LIMIT */ - errmsg("argument of %s must be type bigint, not type %s", - constructName, format_type_be(inputTypeId)))); + errmsg("argument of %s must be type bigint, not type %s", + constructName, format_type_be(inputTypeId)))); } if (expression_returns_set(node)) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 0812c3d4418..7c72ae9e22a 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.197 2006/08/12 20:05:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.198 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -65,7 +65,7 @@ static Node *transformIndirection(ParseState *pstate, Node *basenode, static Node *typecast_expression(ParseState *pstate, Node *expr, TypeName *typename); static Node *make_row_comparison_op(ParseState *pstate, List *opname, - List *largs, List *rargs, int location); + List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, RowExpr *lrow, RowExpr *rrow, int location); static Expr *make_distinct_op(ParseState *pstate, List *opname, @@ -772,8 +772,8 @@ static Node * transformAExprOf(ParseState *pstate, A_Expr *a) { /* - * Checking an expression for match to a list of type names. - * Will result in a boolean constant node. + * Checking an expression for match to a list of type names. Will result + * in a boolean constant node. */ Node *lexpr = transformExpr(pstate, a->lexpr); ListCell *telem; @@ -791,7 +791,7 @@ transformAExprOf(ParseState *pstate, A_Expr *a) } /* - * We have two forms: equals or not equals. Flip the sense of the result + * We have two forms: equals or not equals. Flip the sense of the result * for not equals. */ if (strcmp(strVal(linitial(a->name)), "<>") == 0) @@ -820,10 +820,10 @@ transformAExprIn(ParseState *pstate, A_Expr *a) useOr = true; /* - * We try to generate a ScalarArrayOpExpr from IN/NOT IN, but this is - * only possible if the inputs are all scalars (no RowExprs) and there - * is a suitable array type available. If not, we fall back to a - * boolean condition tree with multiple copies of the lefthand expression. + * We try to generate a ScalarArrayOpExpr from IN/NOT IN, but this is only + * possible if the inputs are all scalars (no RowExprs) and there is a + * suitable array type available. If not, we fall back to a boolean + * condition tree with multiple copies of the lefthand expression. * * First step: transform all the inputs, and detect whether any are * RowExprs. @@ -834,7 +834,7 @@ transformAExprIn(ParseState *pstate, A_Expr *a) rexprs = NIL; foreach(l, (List *) a->rexpr) { - Node *rexpr = transformExpr(pstate, lfirst(l)); + Node *rexpr = transformExpr(pstate, lfirst(l)); haveRowExpr |= (rexpr && IsA(rexpr, RowExpr)); rexprs = lappend(rexprs, rexpr); @@ -842,10 +842,10 @@ transformAExprIn(ParseState *pstate, A_Expr *a) } /* - * If not forced by presence of RowExpr, try to resolve a common - * scalar type for all the expressions, and see if it has an array type. - * (But if there's only one righthand expression, we may as well just - * fall through and generate a simple = comparison.) + * If not forced by presence of RowExpr, try to resolve a common scalar + * type for all the expressions, and see if it has an array type. (But if + * there's only one righthand expression, we may as well just fall through + * and generate a simple = comparison.) */ if (!haveRowExpr && list_length(rexprs) != 1) { @@ -853,9 +853,9 @@ transformAExprIn(ParseState *pstate, A_Expr *a) Oid array_type; /* - * Select a common type for the array elements. Note that since - * the LHS' type is first in the list, it will be preferred when - * there is doubt (eg, when all the RHS items are unknown literals). + * Select a common type for the array elements. Note that since the + * LHS' type is first in the list, it will be preferred when there is + * doubt (eg, when all the RHS items are unknown literals). */ scalar_type = select_common_type(typeids, "IN"); @@ -864,8 +864,8 @@ transformAExprIn(ParseState *pstate, A_Expr *a) if (array_type != InvalidOid) { /* - * OK: coerce all the right-hand inputs to the common type - * and build an ArrayExpr for them. + * OK: coerce all the right-hand inputs to the common type and + * build an ArrayExpr for them. */ List *aexprs; ArrayExpr *newa; @@ -910,11 +910,11 @@ transformAExprIn(ParseState *pstate, A_Expr *a) !IsA(rexpr, RowExpr)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("arguments of row IN must all be row expressions"), + errmsg("arguments of row IN must all be row expressions"), parser_errposition(pstate, a->location))); cmp = make_row_comparison_op(pstate, a->name, - (List *) copyObject(((RowExpr *) lexpr)->args), + (List *) copyObject(((RowExpr *) lexpr)->args), ((RowExpr *) rexpr)->args, a->location); } @@ -1111,8 +1111,8 @@ transformSubLink(ParseState *pstate, SubLink *sublink) if (sublink->subLinkType == EXISTS_SUBLINK) { /* - * EXISTS needs no test expression or combining operator. - * These fields should be null already, but make sure. + * EXISTS needs no test expression or combining operator. These fields + * should be null already, but make sure. */ sublink->testexpr = NULL; sublink->operName = NIL; @@ -1140,8 +1140,8 @@ transformSubLink(ParseState *pstate, SubLink *sublink) } /* - * EXPR and ARRAY need no test expression or combining operator. - * These fields should be null already, but make sure. + * EXPR and ARRAY need no test expression or combining operator. These + * fields should be null already, but make sure. */ sublink->testexpr = NULL; sublink->operName = NIL; @@ -1164,8 +1164,8 @@ transformSubLink(ParseState *pstate, SubLink *sublink) left_list = list_make1(lefthand); /* - * Build a list of PARAM_SUBLINK nodes representing the - * output columns of the subquery. + * Build a list of PARAM_SUBLINK nodes representing the output columns + * of the subquery. */ right_list = NIL; foreach(l, qtree->targetList) @@ -1185,9 +1185,9 @@ transformSubLink(ParseState *pstate, SubLink *sublink) } /* - * We could rely on make_row_comparison_op to complain if the - * list lengths differ, but we prefer to generate a more specific - * error message. + * We could rely on make_row_comparison_op to complain if the list + * lengths differ, but we prefer to generate a more specific error + * message. */ if (list_length(left_list) < list_length(right_list)) ereport(ERROR, @@ -1968,8 +1968,8 @@ make_row_comparison_op(ParseState *pstate, List *opname, parser_errposition(pstate, location))); /* - * We can't compare zero-length rows because there is no principled - * basis for figuring out what the operator is. + * We can't compare zero-length rows because there is no principled basis + * for figuring out what the operator is. */ if (nopers == 0) ereport(ERROR, @@ -1978,8 +1978,8 @@ make_row_comparison_op(ParseState *pstate, List *opname, parser_errposition(pstate, location))); /* - * Identify all the pairwise operators, using make_op so that - * behavior is the same as in the simple scalar case. + * Identify all the pairwise operators, using make_op so that behavior is + * the same as in the simple scalar case. */ opexprs = NIL; forboth(l, largs, r, rargs) @@ -1999,9 +1999,9 @@ make_row_comparison_op(ParseState *pstate, List *opname, if (cmp->opresulttype != BOOLOID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("row comparison operator must yield type boolean, " - "not type %s", - format_type_be(cmp->opresulttype)), + errmsg("row comparison operator must yield type boolean, " + "not type %s", + format_type_be(cmp->opresulttype)), parser_errposition(pstate, location))); if (expression_returns_set((Node *) cmp)) ereport(ERROR, @@ -2012,16 +2012,16 @@ make_row_comparison_op(ParseState *pstate, List *opname, } /* - * If rows are length 1, just return the single operator. In this - * case we don't insist on identifying btree semantics for the operator - * (but we still require it to return boolean). + * If rows are length 1, just return the single operator. In this case we + * don't insist on identifying btree semantics for the operator (but we + * still require it to return boolean). */ if (nopers == 1) return (Node *) linitial(opexprs); /* * Now we must determine which row comparison semantics (= <> < <= > >=) - * apply to this set of operators. We look for btree opclasses containing + * apply to this set of operators. We look for btree opclasses containing * the operators, and see which interpretations (strategy numbers) exist * for each operator. */ @@ -2031,14 +2031,15 @@ make_row_comparison_op(ParseState *pstate, List *opname, i = 0; foreach(l, opexprs) { - Bitmapset *this_strats; + Bitmapset *this_strats; ListCell *j; get_op_btree_interpretation(((OpExpr *) lfirst(l))->opno, &opclass_lists[i], &opstrat_lists[i]); + /* - * convert strategy number list to a Bitmapset to make the intersection - * calculation easy. + * convert strategy number list to a Bitmapset to make the + * intersection calculation easy. */ this_strats = NULL; foreach(j, opstrat_lists[i]) @@ -2074,21 +2075,21 @@ make_row_comparison_op(ParseState *pstate, List *opname, /* * Prefer the interpretation with the most default opclasses. */ - int best_defaults = 0; - bool multiple_best = false; - int this_rctype; + int best_defaults = 0; + bool multiple_best = false; + int this_rctype; rctype = 0; /* keep compiler quiet */ while ((this_rctype = bms_first_member(strats)) >= 0) { - int ndefaults = 0; + int ndefaults = 0; for (i = 0; i < nopers; i++) { forboth(l, opclass_lists[i], r, opstrat_lists[i]) { - Oid opclass = lfirst_oid(l); - int opstrat = lfirst_int(r); + Oid opclass = lfirst_oid(l); + int opstrat = lfirst_int(r); if (opstrat == this_rctype && opclass_is_default(opclass)) @@ -2116,12 +2117,12 @@ make_row_comparison_op(ParseState *pstate, List *opname, } /* - * For = and <> cases, we just combine the pairwise operators with - * AND or OR respectively. + * For = and <> cases, we just combine the pairwise operators with AND or + * OR respectively. * * Note: this is presently the only place where the parser generates - * BoolExpr with more than two arguments. Should be OK since the - * rest of the system thinks BoolExpr is N-argument anyway. + * BoolExpr with more than two arguments. Should be OK since the rest of + * the system thinks BoolExpr is N-argument anyway. */ if (rctype == ROWCOMPARE_EQ) return (Node *) makeBoolExpr(AND_EXPR, opexprs); @@ -2129,20 +2130,20 @@ make_row_comparison_op(ParseState *pstate, List *opname, return (Node *) makeBoolExpr(OR_EXPR, opexprs); /* - * Otherwise we need to determine exactly which opclass to associate - * with each operator. + * Otherwise we need to determine exactly which opclass to associate with + * each operator. */ opclasses = NIL; for (i = 0; i < nopers; i++) { - Oid best_opclass = 0; - int ndefault = 0; - int nmatch = 0; + Oid best_opclass = 0; + int ndefault = 0; + int nmatch = 0; forboth(l, opclass_lists[i], r, opstrat_lists[i]) { - Oid opclass = lfirst_oid(l); - int opstrat = lfirst_int(r); + Oid opclass = lfirst_oid(l); + int opstrat = lfirst_int(r); if (opstrat == rctype) { @@ -2161,7 +2162,7 @@ make_row_comparison_op(ParseState *pstate, List *opname, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("could not determine interpretation of row comparison operator %s", strVal(llast(opname))), - errdetail("There are multiple equally-plausible candidates."), + errdetail("There are multiple equally-plausible candidates."), parser_errposition(pstate, location))); } @@ -2251,7 +2252,7 @@ make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, if (((OpExpr *) result)->opresulttype != BOOLOID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("IS DISTINCT FROM requires = operator to yield boolean"), + errmsg("IS DISTINCT FROM requires = operator to yield boolean"), parser_errposition(pstate, location))); /* diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index b1b53164f80..a61099766b9 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.189 2006/07/27 19:52:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.190 2006/10/04 00:29:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -36,7 +36,7 @@ static Node *ParseComplexProjection(ParseState *pstate, char *funcname, Node *first_arg, int location); static void unknown_attribute(ParseState *pstate, Node *relref, char *attname, - int location); + int location); /* @@ -265,13 +265,13 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, /* * Reject attempt to call a parameterless aggregate without (*) - * syntax. This is mere pedantry but some folks insisted ... + * syntax. This is mere pedantry but some folks insisted ... */ if (fargs == NIL && !agg_star) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("%s(*) must be used to call a parameterless aggregate function", - NameListToString(funcname)), + errmsg("%s(*) must be used to call a parameterless aggregate function", + NameListToString(funcname)), parser_errposition(pstate, location))); /* parse_agg.c does additional aggregate-specific processing */ diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 9c1b58704e9..8cad187550c 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.94 2006/08/02 01:59:47 joe Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.95 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -61,15 +61,15 @@ make_parsestate(ParseState *parentParseState) * is a dummy (always 0, in fact). * * The locations stored in raw parsetrees are byte offsets into the source - * string. We have to convert them to 1-based character indexes for reporting - * to clients. (We do things this way to avoid unnecessary overhead in the + * string. We have to convert them to 1-based character indexes for reporting + * to clients. (We do things this way to avoid unnecessary overhead in the * normal non-error case: computing character indexes would be much more * expensive than storing token offsets.) */ int parser_errposition(ParseState *pstate, int location) { - int pos; + int pos; /* No-op if location was not provided */ if (location < 0) diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c index be53472d048..d8ac0d0ff82 100644 --- a/src/backend/parser/parse_oper.c +++ b/src/backend/parser/parse_oper.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_oper.c,v 1.89 2006/07/14 14:52:22 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_oper.c,v 1.90 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -29,7 +29,7 @@ #include "utils/typcache.h" -static Oid binary_oper_exact(List *opname, Oid arg1, Oid arg2); +static Oid binary_oper_exact(List *opname, Oid arg1, Oid arg2); static FuncDetailCode oper_select_candidate(int nargs, Oid *input_typeids, FuncCandidateList candidates, @@ -37,8 +37,8 @@ static FuncDetailCode oper_select_candidate(int nargs, static const char *op_signature_string(List *op, char oprkind, Oid arg1, Oid arg2); static void op_error(ParseState *pstate, List *op, char oprkind, - Oid arg1, Oid arg2, - FuncDetailCode fdresult, int location); + Oid arg1, Oid arg2, + FuncDetailCode fdresult, int location); static Expr *make_op_expr(ParseState *pstate, Operator op, Node *ltree, Node *rtree, Oid ltypeId, Oid rtypeId); @@ -701,10 +701,9 @@ left_oper(ParseState *pstate, List *op, Oid arg, bool noError, int location) if (clist != NULL) { /* - * The returned list has args in the form (0, oprright). - * Move the useful data into args[0] to keep oper_select_candidate - * simple. XXX we are assuming here that we may scribble on the - * list! + * The returned list has args in the form (0, oprright). Move the + * useful data into args[0] to keep oper_select_candidate simple. + * XXX we are assuming here that we may scribble on the list! */ FuncCandidateList clisti; @@ -872,7 +871,7 @@ make_scalar_array_op(ParseState *pstate, List *opname, if (!OidIsValid(rtypeId)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("op ANY/ALL (array) requires array on right side"), + errmsg("op ANY/ALL (array) requires array on right side"), parser_errposition(pstate, location))); } @@ -902,12 +901,12 @@ make_scalar_array_op(ParseState *pstate, List *opname, if (rettype != BOOLOID) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("op ANY/ALL (array) requires operator to yield boolean"), + errmsg("op ANY/ALL (array) requires operator to yield boolean"), parser_errposition(pstate, location))); if (get_func_retset(opform->oprcode)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("op ANY/ALL (array) requires operator not to return a set"), + errmsg("op ANY/ALL (array) requires operator not to return a set"), parser_errposition(pstate, location))); /* diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index e9896be6349..75d5a50702a 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.124 2006/08/02 01:59:47 joe Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.125 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -48,7 +48,7 @@ static void expandTupleDesc(TupleDesc tupdesc, Alias *eref, List **colnames, List **colvars); static int specialAttNum(const char *attname); static void warnAutoRange(ParseState *pstate, RangeVar *relation, - int location); + int location); /* @@ -970,7 +970,7 @@ addRangeTableEntryForValues(ParseState *pstate, numaliases = list_length(eref->colnames); while (numaliases < numcolumns) { - char attrname[64]; + char attrname[64]; numaliases++; snprintf(attrname, sizeof(attrname), "column%d", numaliases); @@ -1146,6 +1146,7 @@ addImplicitRTE(ParseState *pstate, RangeVar *relation, int location) /* issue warning or error as needed */ warnAutoRange(pstate, relation, location); + /* * Note that we set inFromCl true, so that the RTE will be listed * explicitly if the parsetree is ever decompiled by ruleutils.c. This @@ -1311,7 +1312,7 @@ expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, varattno = 0; foreach(lc, (List *) linitial(rte->values_lists)) { - Node *col = (Node *) lfirst(lc); + Node *col = (Node *) lfirst(lc); varattno++; if (colnames) @@ -1676,13 +1677,13 @@ get_rte_attribute_type(RangeTblEntry *rte, AttrNumber attnum, case RTE_VALUES: { /* Values RTE --- get type info from first sublist */ - List *collist = (List *) linitial(rte->values_lists); + List *collist = (List *) linitial(rte->values_lists); Node *col; if (attnum < 1 || attnum > list_length(collist)) elog(ERROR, "values list %s does not have attribute %d", rte->eref->aliasname, attnum); - col = (Node *) list_nth(collist, attnum-1); + col = (Node *) list_nth(collist, attnum - 1); *vartype = exprType(col); *vartypmod = exprTypmod(col); } @@ -1963,15 +1964,15 @@ warnAutoRange(ParseState *pstate, RangeVar *relation, int location) /* * Check to see if there are any potential matches in the query's - * rangetable. This affects the message we provide. + * rangetable. This affects the message we provide. */ rte = searchRangeTable(pstate, relation); /* - * If we found a match that has an alias and the alias is visible in - * the namespace, then the problem is probably use of the relation's - * real name instead of its alias, ie "SELECT foo.* FROM foo f". - * This mistake is common enough to justify a specific hint. + * If we found a match that has an alias and the alias is visible in the + * namespace, then the problem is probably use of the relation's real name + * instead of its alias, ie "SELECT foo.* FROM foo f". This mistake is + * common enough to justify a specific hint. * * If we found a match that doesn't meet those criteria, assume the * problem is illegal use of a relation outside its scope, as in the @@ -1988,11 +1989,11 @@ warnAutoRange(ParseState *pstate, RangeVar *relation, int location) if (rte) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_TABLE), - errmsg("invalid reference to FROM-clause entry for table \"%s\"", - relation->relname), + errmsg("invalid reference to FROM-clause entry for table \"%s\"", + relation->relname), (badAlias ? - errhint("Perhaps you meant to reference the table alias \"%s\".", - badAlias) : + errhint("Perhaps you meant to reference the table alias \"%s\".", + badAlias) : errhint("There is an entry for table \"%s\", but it cannot be referenced from this part of the query.", rte->eref->aliasname)), parser_errposition(pstate, location))); @@ -2000,8 +2001,8 @@ warnAutoRange(ParseState *pstate, RangeVar *relation, int location) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_TABLE), (pstate->parentParseState ? - errmsg("missing FROM-clause entry in subquery for table \"%s\"", - relation->relname) : + errmsg("missing FROM-clause entry in subquery for table \"%s\"", + relation->relname) : errmsg("missing FROM-clause entry for table \"%s\"", relation->relname)), parser_errposition(pstate, location))); @@ -2017,8 +2018,8 @@ warnAutoRange(ParseState *pstate, RangeVar *relation, int location) errmsg("adding missing FROM-clause entry for table \"%s\"", relation->relname)), (badAlias ? - errhint("Perhaps you meant to reference the table alias \"%s\".", - badAlias) : + errhint("Perhaps you meant to reference the table alias \"%s\".", + badAlias) : (rte ? errhint("There is an entry for table \"%s\", but it cannot be referenced from this part of the query.", rte->eref->aliasname) : 0)), diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 961e3205432..bb4b065eebb 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.148 2006/08/14 23:39:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.149 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -161,7 +161,7 @@ transformTargetList(ParseState *pstate, List *targetlist) * This is the identical transformation to transformTargetList, except that * the input list elements are bare expressions without ResTarget decoration, * and the output elements are likewise just expressions without TargetEntry - * decoration. We use this for ROW() and VALUES() constructs. + * decoration. We use this for ROW() and VALUES() constructs. */ List * transformExpressionList(ParseState *pstate, List *exprlist) @@ -436,7 +436,7 @@ transformAssignedExpr(ParseState *pstate, colname, format_type_be(attrtype), format_type_be(type_id)), - errhint("You will need to rewrite or cast the expression."), + errhint("You will need to rewrite or cast the expression."), parser_errposition(pstate, location))); } @@ -446,7 +446,7 @@ transformAssignedExpr(ParseState *pstate, /* * updateTargetListEntry() - * This is used in UPDATE statements only. It prepares an UPDATE + * This is used in UPDATE statements only. It prepares an UPDATE * TargetEntry for assignment to a column of the target table. * This includes coercing the given value to the target column's type * (if necessary), and dealing with any subfield names or subscripts @@ -687,7 +687,7 @@ transformAssignmentIndirection(ParseState *pstate, targetName, format_type_be(targetTypeId), format_type_be(exprType(rhs))), - errhint("You will need to rewrite or cast the expression."), + errhint("You will need to rewrite or cast the expression."), parser_errposition(pstate, location))); else ereport(ERROR, @@ -697,7 +697,7 @@ transformAssignmentIndirection(ParseState *pstate, targetName, format_type_be(targetTypeId), format_type_be(exprType(rhs))), - errhint("You will need to rewrite or cast the expression."), + errhint("You will need to rewrite or cast the expression."), parser_errposition(pstate, location))); } @@ -761,9 +761,9 @@ checkInsertTargets(ParseState *pstate, List *cols, List **attrnos) if (attrno == InvalidAttrNumber) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" of relation \"%s\" does not exist", - name, - RelationGetRelationName(pstate->p_target_relation)), + errmsg("column \"%s\" of relation \"%s\" does not exist", + name, + RelationGetRelationName(pstate->p_target_relation)), parser_errposition(pstate, col->location))); /* @@ -825,8 +825,8 @@ ExpandColumnRefStar(ParseState *pstate, ColumnRef *cref, * * (e.g., SELECT * FROM emp, dept) * - * Since the grammar only accepts bare '*' at top level of SELECT, - * we need not handle the targetlist==false case here. + * Since the grammar only accepts bare '*' at top level of SELECT, we + * need not handle the targetlist==false case here. */ Assert(targetlist); @@ -898,7 +898,7 @@ ExpandColumnRefStar(ParseState *pstate, ColumnRef *cref, return expandRelAttrs(pstate, rte, rtindex, sublevels_up); else { - List *vars; + List *vars; expandRTE(rte, rtindex, sublevels_up, false, NULL, &vars); @@ -1114,8 +1114,8 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) /* * This case should not occur: a column of a table or values list - * shouldn't have type RECORD. Fall through and fail - * (most likely) at the bottom. + * shouldn't have type RECORD. Fall through and fail (most + * likely) at the bottom. */ break; case RTE_SUBQUERY: diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index 45666d88809..93c7db6b52a 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.84 2006/09/25 15:17:34 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.85 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -210,7 +210,7 @@ TypeNameListToString(List *typenames) initStringInfo(&string); foreach(l, typenames) { - TypeName *typename = (TypeName *) lfirst(l); + TypeName *typename = (TypeName *) lfirst(l); Assert(IsA(typename, TypeName)); if (l != list_head(typenames)) @@ -358,7 +358,7 @@ typeTypeRelid(Type typ) /* * Given a type structure and a string, returns the internal representation - * of that string. The "string" can be NULL to perform conversion of a NULL + * of that string. The "string" can be NULL to perform conversion of a NULL * (which might result in failure, if the input function rejects NULLs). */ Datum diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c index 7f1c926f672..674d4d497cc 100644 --- a/src/backend/parser/parser.c +++ b/src/backend/parser/parser.c @@ -14,7 +14,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parser.c,v 1.67 2006/07/15 03:35:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parser.c,v 1.68 2006/10/04 00:29:56 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -64,7 +64,7 @@ raw_parser(const char *str) * Intermediate filter between parser and base lexer (base_yylex in scan.l). * * The filter is needed because in some cases the standard SQL grammar - * requires more than one token lookahead. We reduce these cases to one-token + * requires more than one token lookahead. We reduce these cases to one-token * lookahead by combining tokens here, in order to keep the grammar LALR(1). * * Using a filter is simpler than trying to recognize multiword tokens @@ -91,15 +91,16 @@ filtered_base_yylex(void) switch (cur_token) { case WITH: + /* * WITH CASCADED, LOCAL, or CHECK must be reduced to one token * - * XXX an alternative way is to recognize just WITH_TIME and - * put the ugliness into the datetime datatype productions - * instead of WITH CHECK OPTION. However that requires promoting - * WITH to a fully reserved word. If we ever have to do that - * anyway (perhaps for SQL99 recursive queries), come back and - * simplify this code. + * XXX an alternative way is to recognize just WITH_TIME and put + * the ugliness into the datetime datatype productions instead of + * WITH CHECK OPTION. However that requires promoting WITH to a + * fully reserved word. If we ever have to do that anyway + * (perhaps for SQL99 recursive queries), come back and simplify |