X-Git-Url: http://sigaev.ru/git/gitweb.cgi?p=plantuner.git;a=blobdiff_plain;f=plantuner.c;h=13ab9b9da6f7a6049124d32bf5c78c31f944dcde;hp=4e0f0c598b2abca7b9b933bd9427b528affb3f77;hb=6f6cf9c1eceefad467bbe333fd3ed270ea937bdf;hpb=176da910e8225a413bac8992e650507f10f9b9d1;ds=sidebyside diff --git a/plantuner.c b/plantuner.c index 4e0f0c5..13ab9b9 100644 --- a/plantuner.c +++ b/plantuner.c @@ -1,5 +1,30 @@ /* * Copyright (c) 2009 Teodor Sigaev + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include @@ -41,7 +66,7 @@ indexesOutAssign(const char * newval, bool doit, GucSource source) nOids = list_length(namelist); newOids = malloc(sizeof(Oid) * (nOids+1)); if (!newOids) - elog(ERROR,"could not allocate %d bytes", sizeof(Oid) * (nOids+1)); + elog(ERROR,"could not allocate %d bytes", (int)(sizeof(Oid) * (nOids+1))); } foreach(l, namelist) @@ -51,12 +76,18 @@ indexesOutAssign(const char * newval, bool doit, GucSource source) if (indexOid == InvalidOid) { - elog(WARNING,"'%s' does not exist", curname); +#if PG_VERSION_NUM >= 90100 + if (doit == false) +#endif + elog(WARNING,"'%s' does not exist", curname); continue; } else if ( get_rel_relkind(indexOid) != RELKIND_INDEX ) { - elog(WARNING,"'%s' is not an index", curname); +#if PG_VERSION_NUM >= 90100 + if (doit == false) +#endif + elog(WARNING,"'%s' is not an index", curname); continue; } else if (doit) @@ -84,6 +115,30 @@ cleanup: return NULL; } +#if PG_VERSION_NUM >= 90100 + +static bool +indexesOutCheck(char **newval, void **extra, GucSource source) +{ + char *val; + + val = (char*)indexesOutAssign(*newval, false, source); + + if (val) + { + *newval = val; + return true; + } + + return false; +} +static void +indexesOutAssignNew(const char *newval, void *extra) +{ + indexesOutAssign(newval, true, PGC_S_USER /* doesn't matter */); +} + +#endif static void indexFilter(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel) { @@ -153,7 +208,12 @@ _PG_init(void) "", PGC_USERSET, 0, +#if PG_VERSION_NUM >= 90100 + indexesOutCheck, + indexesOutAssignNew, +#else indexesOutAssign, +#endif IndexFilterShow );