Re: [HACKERS] Some cleanups/enhancements - Mailing list pgsql-hackers
From | Jeroen van Vianen |
---|---|
Subject | Re: [HACKERS] Some cleanups/enhancements |
Date | |
Msg-id | 350EC403.6AE2@design.nl Whole thread Raw |
In response to | Re: [HACKERS] Some cleanups/enhancements (Bruce Momjian <maillist@candle.pha.pa.us>) |
Responses |
Re: [HACKERS] Some cleanups/enhancements
Re: [HACKERS] Some cleanups/enhancements |
List | pgsql-hackers |
Bruce Momjian wrote: > > jeroenv@design.nl, can you send in patches for these? > > > > > > I'm running PostgreSQL 6.3 on Linux 2.1.85 with gcc 2.8.0 and libc5. So > > > far no problems, however I noted some cleanups / enhancements which I > > > would like to do. Before I send you a bunch of patches I thought I'll > > > tell you what I'm planning to do. Please comment on my list and indicate > > > whether I should go ahead. > > > > > > - Fix all Makefiles so 'make dep' and 'make depend' work > > > - Fix all Makefiles so 'make clean' throws away the depend file > > > - Some other Makefile cleanups > > > > These all sound good. If there is a possibility of large breakage, wait > > until after v6.3. > > > > > - gcc 2.8.0 issues some additional warnings which are very easy to fix: > > > - register i --> register int i There's a patch attached to fix gcc 2.8.x warnings, except for the yyerror ones from bison. It also includes a few 'enhancements' to the C programming style (which are, of course, personal). The other patch removes the compilation of backend/lib/qsort.c, as qsort() is a standard function in stdlib.h and can be used any where else (and it is). It was only used in backend/optimizer/geqo/geqo_pool.c, backend/optimizer/path/predmig.c, and backend/storage/page/bufpage.c > > Some or all of these changes might not be appropriate for v6.3, since we > > are in beta testing and since they do not affect the current functionality. > > For those cases, how about submitting patches based on the final v6.3 > > release? There's more to come. Please review these patches. I ran the regression tests and they only failed where this was expected (random, geo, etc). Cheers, Jeroen *** backend/commands/copy.c.orig Mon Mar 16 21:03:12 1998 --- backend/commands/copy.c Mon Mar 16 21:04:04 1998 *************** *** 1160,1165 **** --- 1160,1166 ---- (c == '\\' && !is_array)) fputc('\\', fp); else if (c == '\\' && is_array) + { if (*(string + 1) == '\\') { /* translate \\ to \\\\ */ *************** *** 1174,1179 **** --- 1175,1181 ---- fputc('\\', fp); fputc('\\', fp); } + } fputc(*string, fp); } } *** backend/commands/sequence.c.orig Mon Mar 16 21:04:40 1998 --- backend/commands/sequence.c Mon Mar 16 21:05:28 1998 *************** *** 499,516 **** --- 499,520 ---- elog(ERROR, "DefineSequence: can't INCREMENT by 0"); if (max_value == (DefElem *) NULL) /* MAXVALUE */ + { if (new->increment_by > 0) new->max_value = SEQ_MAXVALUE; /* ascending seq */ else new->max_value = -1;/* descending seq */ + } else new->max_value = get_param(max_value); if (min_value == (DefElem *) NULL) /* MINVALUE */ + { if (new->increment_by > 0) new->min_value = 1; /* ascending seq */ else new->min_value = SEQ_MINVALUE; /* descending seq */ + } else new->min_value = get_param(min_value); *************** *** 519,528 **** --- 523,534 ---- new->min_value, new->max_value); if (last_value == (DefElem *) NULL) /* START WITH */ + { if (new->increment_by > 0) new->last_value = new->min_value; /* ascending seq */ else new->last_value = new->max_value; /* descending seq */ + } else new->last_value = get_param(last_value); *** backend/commands/variable.c.orig Mon Mar 16 21:05:34 1998 --- backend/commands/variable.c Mon Mar 16 21:06:23 1998 *************** *** 444,456 **** { /* Not yet tried to save original value from environment? */ if (defaultTZ == NULL) /* found something? then save it for later */ if ((defaultTZ = getenv("TZ")) != NULL) strcpy(TZvalue, defaultTZ); ! /* found nothing so mark with an invalid pointer */ else defaultTZ = (char *) -1; strcpy(tzbuf, "TZ="); strcat(tzbuf, tok); --- 444,458 ---- { /* Not yet tried to save original value from environment? */ if (defaultTZ == NULL) + { /* found something? then save it for later */ if ((defaultTZ = getenv("TZ")) != NULL) strcpy(TZvalue, defaultTZ); ! /* found nothing so mark with an invalid pointer */ else defaultTZ = (char *) -1; + } strcpy(tzbuf, "TZ="); strcat(tzbuf, tok); *** backend/executor/nodeIndexscan.c.orig Tue Mar 3 21:46:44 1998 --- backend/executor/nodeIndexscan.c Mon Mar 16 21:06:59 1998 *************** *** 91,97 **** IndexScanDesc scandesc; Relation heapRelation; RetrieveIndexResult result; - ItemPointer iptr; HeapTuple tuple; TupleTableSlot *slot; Buffer buffer = InvalidBuffer; --- 91,96 ---- *************** *** 116,173 **** * ---------------- */ ! for (;;) { ! result = index_getnext(scandesc, direction); ! /* ---------------- ! * if scanning this index succeeded then return the ! * appropriate heap tuple.. else return NULL. ! * ---------------- ! */ ! if (result) ! { ! iptr = &result->heap_iptr; ! tuple = heap_fetch(heapRelation, ! false, ! iptr, ! &buffer); ! /* be tidy */ ! pfree(result); ! ! if (tuple == NULL) ! { ! /* ---------------- ! * we found a deleted tuple, so keep on scanning.. ! * ---------------- ! */ ! if (BufferIsValid(buffer)) ! ReleaseBuffer(buffer); ! continue; ! } /* ---------------- ! * store the scanned tuple in the scan tuple slot of ! * the scan state. Eventually we will only do this and not ! * return a tuple. Note: we pass 'false' because tuples ! * returned by amgetnext are pointers onto disk pages and ! * were not created with palloc() and so should not be pfree()'d. ! * ---------------- ! */ ExecStoreTuple(tuple, /* tuple to store */ ! slot,/* slot to store in */ ! buffer, /* buffer associated with tuple */ ! false); /* don't pfree */ ! return slot; } ! ! /* ---------------- ! * if we get here it means the index scan failed so we ! * are at the end of the scan.. ! * ---------------- ! */ ! return ExecClearTuple(slot); } } /* ---------------------------------------------------------------- --- 115,161 ---- * ---------------- */ ! /* ---------------- ! * if scanning this index succeeded then return the ! * appropriate heap tuple.. else return NULL. ! * ---------------- ! */ ! while ((result = index_getnext(scandesc, direction)) != NULL) { ! tuple = heap_fetch(heapRelation, false, &result->heap_iptr, &buffer); ! /* be tidy */ ! pfree(result); + if (tuple != NULL) + { /* ---------------- ! * store the scanned tuple in the scan tuple slot of ! * the scan state. Eventually we will only do this and not ! * return a tuple. Note: we pass 'false' because tuples ! * returned by amgetnext are pointers onto disk pages and ! * were not created with palloc() and so should not be pfree()'d. ! * ---------------- ! */ ExecStoreTuple(tuple, /* tuple to store */ ! slot, /* slot to store in */ ! buffer, /* buffer associated with tuple */ ! false); /* don't pfree */ ! return slot; } ! else ! { ! if (BufferIsValid(buffer)) ! ReleaseBuffer(buffer); ! } } + + /* ---------------- + * if we get here it means the index scan failed so we + * are at the end of the scan.. + * ---------------- + */ + return ExecClearTuple(slot); } /* ---------------------------------------------------------------- *************** *** 194,207 **** TupleTableSlot * ExecIndexScan(IndexScan *node) { - TupleTableSlot *returnTuple; - /* ---------------- * use IndexNext as access method * ---------------- */ ! returnTuple = ExecScan(&node->scan, IndexNext); ! return returnTuple; } /* ---------------------------------------------------------------- --- 182,192 ---- TupleTableSlot * ExecIndexScan(IndexScan *node) { /* ---------------- * use IndexNext as access method * ---------------- */ ! return ExecScan(&node->scan, IndexNext); } /* ---------------------------------------------------------------- *************** *** 377,383 **** { if (scanKeys[i] != NULL) pfree(scanKeys[i]); - } /* ---------------- --- 362,367 ---- *** backend/executor/nodeSeqscan.c.orig Tue Mar 3 21:45:08 1998 --- backend/executor/nodeSeqscan.c Mon Mar 16 21:07:57 1998 *************** *** 128,135 **** * else, scan the relation * ---------------- */ ! outerPlan = outerPlan((Plan *) node); ! if (outerPlan) { slot = ExecProcNode(outerPlan, (Plan *) node); } --- 128,134 ---- * else, scan the relation * ---------------- */ ! if ((outerPlan = outerPlan((Plan *) node)) != NULL) { slot = ExecProcNode(outerPlan, (Plan *) node); } *************** *** 375,382 **** scanstate = node->scanstate; estate = node->plan.state; ! outerPlan = outerPlan((Plan *) node); ! if (outerPlan) { /* we are scanning a subplan */ outerPlan = outerPlan((Plan *) node); --- 374,380 ---- scanstate = node->scanstate; estate = node->plan.state; ! if ((outerPlan = outerPlan((Plan *) node)) != NULL) { /* we are scanning a subplan */ outerPlan = outerPlan((Plan *) node); *** backend/lib/qsort.c.orig Mon Mar 16 21:08:25 1998 --- backend/lib/qsort.c Mon Mar 16 21:09:47 1998 *************** *** 117,129 **** * comparisons than the insertion sort. */ #define SORT(bot, n) { \ ! if (n > 1) \ ! if (n == 2) { \ ! t1 = bot + size; \ ! if (compar(t1, bot) < 0) \ ! SWAP(t1, bot); \ ! } else \ ! insertion_sort(bot, n, size, compar); \ } static void --- 117,130 ---- * comparisons than the insertion sort. */ #define SORT(bot, n) { \ ! if (n > 1) { \ ! if (n == 2) { \ ! t1 = bot + size; \ ! if (compar(t1, bot) < 0) \ ! SWAP(t1, bot); \ ! } else \ ! insertion_sort(bot, n, size, compar); \ ! } \ } static void *** backend/libpq/be-dumpdata.c.orig Mon Mar 16 21:10:26 1998 --- backend/libpq/be-dumpdata.c Mon Mar 16 21:10:45 1998 *************** *** 305,314 **** --- 305,316 ---- lengths[i] = typeinfo->attrs[i]->attlen; if (lengths[i] == -1) /* variable length attribute */ + { if (!isnull) lengths[i] = VARSIZE(attr) - VARHDRSZ; else lengths[i] = 0; + } if (!isnull && OidIsValid(typoutput)) { *** backend/optimizer/path/joinrels.c.orig Mon Mar 16 21:11:08 1998 --- backend/optimizer/path/joinrels.c Mon Mar 16 21:11:22 1998 *************** *** 70,79 **** --- 70,81 ---- Rel *outer_rel = (Rel *) lfirst(r); if (!(joins = find_clause_joins(root, outer_rel, outer_rel->joininfo))) + { if (BushyPlanFlag) joins = find_clauseless_joins(outer_rel, outer_rels); else joins = find_clauseless_joins(outer_rel, root->base_relation_list_); + } join_list = nconc(join_list, joins); } *** backend/parser/analyze.c.orig Mon Mar 16 21:11:53 1998 --- backend/parser/analyze.c Mon Mar 16 21:12:14 1998 *************** *** 583,593 **** --- 583,595 ---- elog(ERROR, "parser: internal error; unrecognized deferred node", NULL); if (constraint->contype == CONSTR_PRIMARY) + { if (have_pkey) elog(ERROR, "CREATE TABLE/PRIMARY KEY multiple primary keys" " for table %s are not legal", stmt->relname); else have_pkey = TRUE; + } else if (constraint->contype != CONSTR_UNIQUE) elog(ERROR, "parser: internal error; unrecognized deferred constraint", NULL); *** backend/postmaster/postmaster.c.orig Mon Mar 16 21:14:22 1998 --- backend/postmaster/postmaster.c Mon Mar 16 21:22:55 1998 *************** *** 60,66 **** #include <sys/socket.h> #ifdef HAVE_LIMITS_H #include <limits.h> - #define MAXINT INT_MAX #else #include <values.h> #endif --- 60,65 ---- *************** *** 100,105 **** --- 99,108 ---- #else #define FORK() vfork() #endif + #endif + + #if !defined(MAXINT) + #define MAXINT INT_MAX #endif #define INVALID_SOCK (-1) *** backend/utils/adt/arrayfuncs.c.orig Mon Mar 16 21:15:50 1998 --- backend/utils/adt/arrayfuncs.c Mon Mar 16 21:16:22 1998 *************** *** 78,85 **** static void _ReadArray(int st[], int endp[], int bsize, int srcfd, int destfd, ArrayType *array, int isDestLO, bool *isNull); ! static ArrayCastAndSet(char *src, bool typbyval, int typlen, char *dest); ! static SanityCheckInput(int ndim, int n, int dim[], int lb[], int indx[]); static int array_read(char *destptr, int eltsize, int nitems, char *srcptr); static char *array_seek(char *ptr, int eltsize, int nitems); --- 78,85 ---- static void _ReadArray(int st[], int endp[], int bsize, int srcfd, int destfd, ArrayType *array, int isDestLO, bool *isNull); ! static int ArrayCastAndSet(char *src, bool typbyval, int typlen, char *dest); ! static int SanityCheckInput(int ndim, int n, int dim[], int lb[], int indx[]); static int array_read(char *destptr, int eltsize, int nitems, char *srcptr); static char *array_seek(char *ptr, int eltsize, int nitems); *************** *** 1023,1028 **** --- 1023,1029 ---- pfree(buff); } if (isDestLO) + { if (ARR_IS_CHUNKED(array)) { _ReadChunkArray(lowerIndx, upperIndx, len, fd, (char *) newfd, array, *************** *** 1032,1037 **** --- 1033,1039 ---- { _ReadArray(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull); } + } #ifdef LOARRAY LOclose(fd); LOclose(newfd); *** bin/pg_dump/pg_dump.c.orig Mon Mar 16 21:17:10 1998 --- bin/pg_dump/pg_dump.c Mon Mar 16 21:17:38 1998 *************** *** 1591,1600 **** --- 1591,1602 ---- findx++; } if (TRIGGER_FOR_UPDATE(tgtype)) + { if (findx > 0) strcat(query, " OR UPDATE"); else strcat(query, " UPDATE"); + } sprintf(query, "%s ON %s FOR EACH ROW EXECUTE PROCEDURE %s (", query, tblinfo[i].relname, tgfunc); for (findx = 0; findx < tgnargs; findx++) *************** *** 2508,2513 **** --- 2510,2516 ---- { ACLlist = ParseACL(tblinfo[i].relacl, &l); if (ACLlist == (ACL *) NULL) + { if (l == 0) continue; else *************** *** 2516,2521 **** --- 2519,2525 ---- tblinfo[i].relname); exit_nicely(g_conn); } + } /* Revoke Default permissions for PUBLIC */ fprintf(fout, *** bin/pg_version/pg_version.c.orig Mon Mar 16 21:36:07 1998 --- bin/pg_version/pg_version.c Mon Mar 16 21:36:18 1998 *************** *** 14,20 **** #include <stdlib.h> #include <stdio.h> ! #include <version.h> /* interface to SetPgVersion */ --- 14,20 ---- #include <stdlib.h> #include <stdio.h> ! #include "version.h" /* interface to SetPgVersion */ *** backend/optimizer/geqo/geqo_pool.c.orig Mon Mar 16 21:40:24 1998 --- backend/optimizer/geqo/geqo_pool.c Mon Mar 16 21:41:50 1998 *************** *** 35,42 **** #include "optimizer/clauses.h" #include "optimizer/cost.h" - #include "lib/qsort.h" - #include "optimizer/geqo_gene.h" #include "optimizer/geqo.h" #include "optimizer/geqo_pool.h" --- 35,40 ---- *************** *** 127,134 **** void sort_pool(Pool *pool) { ! pg_qsort(pool->data, pool->size, sizeof(Chromosome), compare); ! } /* --- 125,131 ---- void sort_pool(Pool *pool) { ! qsort(pool->data, pool->size, sizeof(Chromosome), compare); } /* *** backend/optimizer/path/predmig.c.orig Mon Mar 16 21:41:30 1998 --- backend/optimizer/path/predmig.c Mon Mar 16 21:41:34 1998 *************** *** 47,53 **** #include "optimizer/cost.h" #include "optimizer/keys.h" #include "optimizer/tlist.h" - #include "lib/qsort.h" #define is_clause(node) (get_cinfo(node)) /* a stream node * represents a clause --- 47,52 ---- *************** *** 698,704 **** nodearray[i] = tmp; /* sort the array */ ! pg_qsort(nodearray, num, sizeof(LispValue), xfunc_stream_compare); /* paste together the array elements */ output = nodearray[num - 1]; --- 697,703 ---- nodearray[i] = tmp; /* sort the array */ ! qsort(nodearray, num, sizeof(LispValue), xfunc_stream_compare); /* paste together the array elements */ output = nodearray[num - 1]; *** backend/storage/page/bufpage.c.orig Mon Mar 16 21:42:09 1998 --- backend/storage/page/bufpage.c Mon Mar 16 21:42:24 1998 *************** *** 24,31 **** #include "utils/memutils.h" #include "storage/bufpage.h" - #include "lib/qsort.h" - static void PageIndexTupleDeleteAdjustLinePointers(PageHeader phdr, char *location, Size size); --- 24,29 ---- *************** *** 330,336 **** } /* sort itemIdSortData array... */ ! pg_qsort((char *) itemidbase, nused, sizeof(struct itemIdSortData), itemidcompare); /* compactify page */ --- 328,334 ---- } /* sort itemIdSortData array... */ ! qsort((char *) itemidbase, nused, sizeof(struct itemIdSortData), itemidcompare); /* compactify page */ *** backend/lib/Makefile.orig Mon Mar 16 21:42:40 1998 --- backend/lib/Makefile Mon Mar 16 21:42:50 1998 *************** *** 15,21 **** CFLAGS+=$(INCLUDE_OPT) ! OBJS = bit.o fstack.o hasht.o lispsort.o qsort.o stringinfo.o dllist.o all: SUBSYS.o --- 15,21 ---- CFLAGS+=$(INCLUDE_OPT) ! OBJS = bit.o fstack.o hasht.o lispsort.o stringinfo.o dllist.o all: SUBSYS.o
pgsql-hackers by date: