From da5aba105f9b4c4957203cc91bf586f8997d4d0c Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 24 Jan 2000 02:12:58 +0000 Subject: [PATCH] Remove Ops parameter from STATRELID cache lookup, for Tom Lane and optimizer. --- doc/src/sgml/oper.sgml | 2 +- src/backend/catalog/indexing.c | 21 ++++++---------- src/backend/utils/adt/selfuncs.c | 4 +-- src/backend/utils/cache/syscache.c | 16 ++++++------ src/include/catalog/catversion.h | 4 +-- src/include/catalog/indexing.h | 10 ++++---- src/interfaces/libpq/fe-connect.c | 38 ++++++++++++++++++++++++++--- src/interfaces/libpq/fe-exec.c | 39 ++---------------------------- 8 files changed, 61 insertions(+), 73 deletions(-) diff --git a/doc/src/sgml/oper.sgml b/doc/src/sgml/oper.sgml index 673adfbc6a..179a05e491 100644 --- a/doc/src/sgml/oper.sgml +++ b/doc/src/sgml/oper.sgml @@ -411,7 +411,7 @@ logical union !~* Does not match (regex), case insensitive - 'thomas' !~ '.*vadim.*' + 'thomas' !~* '.*vadim.*' diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index 97e15d5d1d..83f51eba54 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.56 2000/01/10 16:13:12 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.57 2000/01/24 02:12:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -64,7 +64,7 @@ char *Name_pg_rewrite_indices[Num_pg_rewrite_indices] = char *Name_pg_shadow_indices[Num_pg_shadow_indices] = {ShadowNameIndex, ShadowSysidIndex}; char *Name_pg_statistic_indices[Num_pg_statistic_indices] = - {StatisticRelidAttnumOpIndex}; + {StatisticRelidAttnumIndex}; char *Name_pg_trigger_indices[Num_pg_trigger_indices] = {TriggerRelidIndex, TriggerConstrNameIndex, TriggerConstrRelidIndex}; char *Name_pg_type_indices[Num_pg_type_indices] = @@ -926,13 +926,12 @@ ShadowSysidIndexScan(Relation heapRelation, int4 sysId) HeapTuple -StatisticRelidAttnumOpIndexScan(Relation heapRelation, +StatisticRelidAttnumIndexScan(Relation heapRelation, Oid relId, - AttrNumber attNum, - Oid op) + AttrNumber attNum) { Relation idesc; - ScanKeyData skey[3]; + ScanKeyData skey[2]; HeapTuple tuple; ScanKeyEntryInitialize(&skey[0], @@ -947,14 +946,8 @@ StatisticRelidAttnumOpIndexScan(Relation heapRelation, (RegProcedure) F_INT2EQ, Int16GetDatum(attNum)); - ScanKeyEntryInitialize(&skey[2], - (bits16) 0x0, - (AttrNumber) 3, - (RegProcedure) F_OIDEQ, - ObjectIdGetDatum(op)); - - idesc = index_openr(StatisticRelidAttnumOpIndex); - tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 3); + idesc = index_openr(StatisticRelidAttnumIndex); + tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 2); index_close(idesc); diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 5838fdc471..c6b9520a26 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.51 2000/01/23 03:43:23 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.52 2000/01/24 02:12:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -609,7 +609,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid, tuple = SearchSysCacheTuple(STATRELID, ObjectIdGetDatum(relid), Int16GetDatum((int16) attnum), - opid, + 0, 0); if (!HeapTupleIsValid(tuple)) { diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 0d4c1e3e05..879e21c69b 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.45 2000/01/23 03:43:24 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.46 2000/01/24 02:12:56 momjian Exp $ * * NOTES * These routines allow the parser/planner/executor to perform @@ -54,7 +54,7 @@ typedef HeapTuple (*ScanFunc) (); Add your new cache to the list in include/utils/syscache.h. Keep the list sorted alphabetically and adjust the cache numbers accordingly. - + Add your entry to the cacheinfo[] array below. All cache lists are alphabetical, so add it in the proper place. Specify the relation name, number of arguments, argument names, size of tuple, index lookup @@ -75,7 +75,7 @@ typedef HeapTuple (*ScanFunc) (); Finally, any place your relation gets heap_insert() or heap_update calls, include code to do a CatalogIndexInsert() to update the system indexes. The heap_* calls do not update indexes. - + bjm 1999/11/22 --------------------------------------------------------------------------- @@ -360,16 +360,16 @@ NULL,NULL /* ShadowSysidIndex, ShadowSysidIndexScan*/}, {StatisticRelationName, /* STATRELID */ - 3, + 2, { Anum_pg_statistic_starelid, Anum_pg_statistic_staattnum, - Anum_pg_statistic_staop, + 0, 0 }, offsetof(FormData_pg_statistic, stacommonval), - StatisticRelidAttnumOpIndex, - (ScanFunc) StatisticRelidAttnumOpIndexScan}, + StatisticRelidAttnumIndex, + (ScanFunc) StatisticRelidAttnumIndexScan}, {TypeRelationName, /* TYPENAME */ 1, { @@ -520,7 +520,7 @@ SearchSysCacheTuple(int cacheId,/* cache selection code */ get_temp_rel_by_username(DatumGetPointer(key1))) != NULL) key1 = PointerGetDatum(nontemp_relname); } - + tp = SearchSysCache(SysCache[cacheId], key1, key2, key3, key4); if (!HeapTupleIsValid(tp)) { diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index d706d1f20a..87d0f84b1c 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -36,7 +36,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: catversion.h,v 1.9 2000/01/22 23:50:23 tgl Exp $ + * $Id: catversion.h,v 1.10 2000/01/24 02:12:57 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -52,6 +52,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200001221 +#define CATALOG_VERSION_NO 200001251 #endif diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h index ff7a166f2e..2c88379d7d 100644 --- a/src/include/catalog/indexing.h +++ b/src/include/catalog/indexing.h @@ -7,7 +7,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: indexing.h,v 1.33 2000/01/10 16:13:20 momjian Exp $ + * $Id: indexing.h,v 1.34 2000/01/24 02:12:57 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -73,7 +73,7 @@ #define RewriteRulenameIndex "pg_rewrite_rulename_index" #define ShadowNameIndex "pg_shadow_name_index" #define ShadowSysidIndex "pg_shadow_sysid_index" -#define StatisticRelidAttnumOpIndex "pg_statistic_relid_att_op_index" +#define StatisticRelidAttnumIndex "pg_statistic_relid_att_index" #define TriggerConstrNameIndex "pg_trigger_tgconstrname_index" #define TriggerConstrRelidIndex "pg_trigger_tgconstrrelid_index" #define TriggerRelidIndex "pg_trigger_tgrelid_index" @@ -153,8 +153,8 @@ extern HeapTuple RewriteRulenameIndexScan(Relation heapRelation, char *ruleName); extern HeapTuple ShadowNameIndexScan(Relation heapRelation, char *useName); extern HeapTuple ShadowSysidIndexScan(Relation heapRelation, int4 sysId); -extern HeapTuple StatisticRelidAttnumOpIndexScan(Relation heapRelation, - Oid relId, AttrNumber attNum, Oid op); +extern HeapTuple StatisticRelidAttnumIndexScan(Relation heapRelation, + Oid relId, AttrNumber attNum); extern HeapTuple TypeNameIndexScan(Relation heapRelation, char *typeName); extern HeapTuple TypeOidIndexScan(Relation heapRelation, Oid typeId); @@ -202,7 +202,7 @@ DECLARE_UNIQUE_INDEX(pg_rewrite_rulename_index on pg_rewrite using btree(rulenam xDECLARE_UNIQUE_INDEX(pg_shadow_name_index on pg_shadow using btree(usename name_ops)); xDECLARE_UNIQUE_INDEX(pg_shadow_sysid_index on pg_shadow using btree(usesysid int4_ops)); */ -DECLARE_INDEX(pg_statistic_relid_att_op_index on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, staop oid_ops)); +DECLARE_INDEX(pg_statistic_relid_att_op_index on pg_statistic using btree(starelid oid_ops, staattnum int2_ops)); DECLARE_INDEX(pg_trigger_tgconstrname_index on pg_trigger using btree(tgconstrname name_ops)); DECLARE_INDEX(pg_trigger_tgconstrrelid_index on pg_trigger using btree(tgconstrrelid oid_ops)); DECLARE_INDEX(pg_trigger_tgrelid_index on pg_trigger using btree(tgrelid oid_ops)); diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 6cfe06e3d1..48f4117ace 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.114 2000/01/23 01:27:39 petere Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.115 2000/01/24 02:12:58 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -391,7 +391,6 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, PGconn *conn; char *tmp; /* An error message from some service we call. */ bool error = FALSE; /* We encountered an error. */ - int i; conn = makeEmptyPGconn(); if (conn == NULL) @@ -585,6 +584,30 @@ update_db_info(PGconn *conn) return 0; } +/* ---------- + * connectMakeNonblocking - + * Make a connection non-blocking. + * Returns 1 if successful, 0 if not. + * ---------- + */ +static int +connectMakeNonblocking(PGconn *conn) +{ +#ifndef WIN32 + if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0) +#else + if (ioctlsocket(conn->sock, FIONBIO, &on) != 0) +#endif + { + printfPQExpBuffer(&conn->errorMessage, + "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n", + errno, strerror(errno)); + return 0; + } + + return 1; +} + /* ---------- * connectNoDelay - * Sets the TCP_NODELAY socket option. @@ -755,7 +778,7 @@ connectDBStart(PGconn *conn) * Ewan Mellor . * ---------- */ #if (!defined(WIN32) || defined(WIN32_NON_BLOCKING_CONNECTIONS)) && !defined(USE_SSL) - if (PQsetnonblocking(conn, TRUE) != 0) + if (connectMakeNonblocking(conn) == 0) goto connect_errReturn; #endif @@ -868,7 +891,7 @@ connectDBStart(PGconn *conn) /* This makes the connection non-blocking, for all those cases which forced us not to do it above. */ #if (defined(WIN32) && !defined(WIN32_NON_BLOCKING_CONNECTIONS)) || defined(USE_SSL) - if (PQsetnonblocking(conn, TRUE) != 0) + if (connectMakeNonblocking(conn) == 0) goto connect_errReturn; #endif @@ -1786,6 +1809,13 @@ closePGconn(PGconn *conn) (void) pqFlush(conn); } + /* + * must reset the blocking status so a possible reconnect will work + * don't call PQsetnonblocking() because it will fail if it's unable + * to flush the connection. + */ + conn->nonblocking = FALSE; + /* * Close the connection, reset all transient state, flush I/O buffers. */ diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 9840cc3b9c..0b4a5077fd 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.87 2000/01/18 06:09:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.88 2000/01/24 02:12:58 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -2116,7 +2116,6 @@ PQgetisnull(const PGresult *res, int tup_num, int field_num) int PQsetnonblocking(PGconn *conn, int arg) { - int fcntlarg; arg = (arg == TRUE) ? 1 : 0; /* early out if the socket is already in the state requested */ @@ -2131,45 +2130,11 @@ PQsetnonblocking(PGconn *conn, int arg) * _from_ or _to_ blocking mode, either way we can block them. */ /* if we are going from blocking to non-blocking flush here */ - if (!pqIsnonblocking(conn) && pqFlush(conn)) + if (pqFlush(conn)) return (-1); - -#ifdef USE_SSL - if (conn->ssl) - { - printfPQExpBuffer(&conn->errorMessage, - "PQsetnonblocking() -- not supported when using SSL\n"); - return (-1); - } -#endif /* USE_SSL */ - -#ifndef WIN32 - fcntlarg = fcntl(conn->sock, F_GETFL, 0); - if (fcntlarg == -1) - return (-1); - - if ((arg == TRUE && - fcntl(conn->sock, F_SETFL, fcntlarg | O_NONBLOCK) == -1) || - (arg == FALSE && - fcntl(conn->sock, F_SETFL, fcntlarg & ~O_NONBLOCK) == -1)) -#else - fcntlarg = arg; - if (ioctlsocket(conn->sock, FIONBIO, &fcntlarg) != 0) -#endif - { - printfPQExpBuffer(&conn->errorMessage, - "PQsetblocking() -- unable to set nonblocking status to %s\n", - arg == TRUE ? "TRUE" : "FALSE"); - return (-1); - } - conn->nonblocking = arg; - /* if we are going from non-blocking to blocking flush here */ - if (pqIsnonblocking(conn) && pqFlush(conn)) - return (-1); - return (0); }