Skip to content

Commit eeed012

Browse files
committed
Merge branch 'PGPRO9_6' into PGPROEE9_6
Import upstream patches up do 06/02/17
2 parents cef538d + e6ea61b commit eeed012

File tree

26 files changed

+739
-664
lines changed

26 files changed

+739
-664
lines changed

doc/src/sgml/ref/create_database.sgml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ CREATE DATABASE <replaceable class="PARAMETER">name</replaceable>
258258
The <literal>CONNECTION LIMIT</> option is only enforced approximately;
259259
if two new sessions start at about the same time when just one
260260
connection <quote>slot</> remains for the database, it is possible that
261-
both will fail. Also, the limit is not enforced against superusers.
261+
both will fail. Also, the limit is not enforced against superusers or
262+
background worker processes.
262263
</para>
263264
</refsect1>
264265

doc/src/sgml/ref/create_role.sgml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,10 @@ CREATE ROLE <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replac
199199
<listitem>
200200
<para>
201201
If role can log in, this specifies how many concurrent connections
202-
the role can make. -1 (the default) means no limit.
202+
the role can make. -1 (the default) means no limit. Note that only
203+
normal connections are counted towards this limit. Neither prepared
204+
transactions nor background worker connections are counted towards
205+
this limit.
203206
</para>
204207
</listitem>
205208
</varlistentry>

src/backend/access/transam/twophase.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ MarkAsPreparing(TransactionId xid, const char *gid,
420420
proc->backendId = InvalidBackendId;
421421
proc->databaseId = databaseid;
422422
proc->roleId = owner;
423+
proc->isBackgroundWorker = false;
423424
proc->lwWaiting = false;
424425
proc->lwWaitMode = 0;
425426
proc->waitLock = NULL;

src/backend/optimizer/plan/createplan.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5639,6 +5639,16 @@ materialize_finished_plan(Plan *subplan)
56395639

56405640
matplan = (Plan *) make_material(subplan);
56415641

5642+
/*
5643+
* XXX horrid kluge: if there are any initPlans attached to the subplan,
5644+
* move them up to the Material node, which is now effectively the top
5645+
* plan node in its query level. This prevents failure in
5646+
* SS_finalize_plan(), which see for comments. We don't bother adjusting
5647+
* the subplan's cost estimate for this.
5648+
*/
5649+
matplan->initPlan = subplan->initPlan;
5650+
subplan->initPlan = NIL;
5651+
56425652
/* Set cost data */
56435653
cost_material(&matpath,
56445654
subplan->startup_cost,

src/backend/optimizer/plan/planner.c

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
305305
if (cursorOptions & CURSOR_OPT_SCROLL)
306306
{
307307
if (!ExecSupportsBackwardScan(top_plan))
308-
{
309-
Plan *sub_plan = top_plan;
310-
311-
top_plan = materialize_finished_plan(sub_plan);
312-
313-
/*
314-
* XXX horrid kluge: if there are any initPlans attached to the
315-
* formerly-top plan node, move them up to the Material node. This
316-
* prevents failure in SS_finalize_plan, which see for comments.
317-
* We don't bother adjusting the sub_plan's cost estimate for
318-
* this.
319-
*/
320-
top_plan->initPlan = sub_plan->initPlan;
321-
sub_plan->initPlan = NIL;
322-
}
308+
top_plan = materialize_finished_plan(top_plan);
323309
}
324310

325311
/*

src/backend/storage/ipc/procarray.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2833,6 +2833,38 @@ CountDBBackends(Oid databaseid)
28332833
return count;
28342834
}
28352835

2836+
/*
2837+
* CountDBConnections --- counts database backends ignoring any background
2838+
* worker processes
2839+
*/
2840+
int
2841+
CountDBConnections(Oid databaseid)
2842+
{
2843+
ProcArrayStruct *arrayP = procArray;
2844+
int count = 0;
2845+
int index;
2846+
2847+
LWLockAcquire(ProcArrayLock, LW_SHARED);
2848+
2849+
for (index = 0; index < arrayP->numProcs; index++)
2850+
{
2851+
int pgprocno = arrayP->pgprocnos[index];
2852+
volatile PGPROC *proc = &allProcs[pgprocno];
2853+
2854+
if (proc->pid == 0)
2855+
continue; /* do not count prepared xacts */
2856+
if (proc->isBackgroundWorker)
2857+
continue; /* do not count background workers */
2858+
if (!OidIsValid(databaseid) ||
2859+
proc->databaseId == databaseid)
2860+
count++;
2861+
}
2862+
2863+
LWLockRelease(ProcArrayLock);
2864+
2865+
return count;
2866+
}
2867+
28362868
/*
28372869
* CancelDBBackends --- cancel backends that are using specified database
28382870
*/
@@ -2892,6 +2924,8 @@ CountUserBackends(Oid roleid)
28922924

28932925
if (proc->pid == 0)
28942926
continue; /* do not count prepared xacts */
2927+
if (proc->isBackgroundWorker)
2928+
continue; /* do not count background workers */
28952929
if (proc->roleId == roleid)
28962930
count++;
28972931
}

src/backend/storage/lmgr/proc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ InitProcess(void)
375375
MyProc->backendId = InvalidBackendId;
376376
MyProc->databaseId = InvalidOid;
377377
MyProc->roleId = InvalidOid;
378+
MyProc->isBackgroundWorker = IsBackgroundWorker;
378379
MyPgXact->delayChkpt = false;
379380
MyPgXact->vacuumFlags = 0;
380381
/* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */
@@ -548,6 +549,7 @@ InitAuxiliaryProcess(void)
548549
MyProc->backendId = InvalidBackendId;
549550
MyProc->databaseId = InvalidOid;
550551
MyProc->roleId = InvalidOid;
552+
MyProc->isBackgroundWorker = IsBackgroundWorker;
551553
MyPgXact->delayChkpt = false;
552554
MyPgXact->vacuumFlags = 0;
553555
MyProc->lwWaiting = false;

src/backend/utils/init/postinit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ CheckMyDatabase(const char *name, bool am_superuser)
351351
*/
352352
if (dbform->datconnlimit >= 0 &&
353353
!am_superuser &&
354-
CountDBBackends(MyDatabaseId) > dbform->datconnlimit)
354+
CountDBConnections(MyDatabaseId) > dbform->datconnlimit)
355355
ereport(FATAL,
356356
(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
357357
errmsg("too many connections for database \"%s\"",

src/backend/utils/mb/Unicode/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ GENERICMAPS = $(ISO8859MAPS) $(WINMAPS) \
4242
johab_to_utf8.map utf8_to_johab.map \
4343
uhc_to_utf8.map utf8_to_uhc.map \
4444
gbk_to_utf8.map utf8_to_gbk.map \
45-
koi8r_to_utf8.map utf8_to_koi8r.map
45+
koi8r_to_utf8.map utf8_to_koi8r.map \
46+
koi8u_to_utf8.map utf8_to_koi8u.map
4647

4748
SPECIALMAPS = euc_cn_to_utf8.map utf8_to_euc_cn.map \
4849
euc_jp_to_utf8.map utf8_to_euc_jp.map \

src/bin/pg_dump/dumputils.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -368,11 +368,12 @@ buildACLCommands(const char *name, const char *subname,
368368
*/
369369
bool
370370
buildDefaultACLCommands(const char *type, const char *nspname,
371-
const char *acls, const char *owner,
371+
const char *acls, const char *racls,
372+
const char *initacls, const char *initracls,
373+
const char *owner,
372374
int remoteVersion,
373375
PQExpBuffer sql)
374376
{
375-
bool result;
376377
PQExpBuffer prefix;
377378

378379
prefix = createPQExpBuffer();
@@ -388,14 +389,22 @@ buildDefaultACLCommands(const char *type, const char *nspname,
388389
if (nspname)
389390
appendPQExpBuffer(prefix, "IN SCHEMA %s ", fmtId(nspname));
390391

391-
result = buildACLCommands("", NULL,
392-
type, acls, "", owner,
393-
prefix->data, remoteVersion,
394-
sql);
392+
if (strlen(initacls) != 0 || strlen(initracls) != 0)
393+
{
394+
appendPQExpBuffer(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\n");
395+
if (!buildACLCommands("", NULL, type, initacls, initracls, owner,
396+
prefix->data, remoteVersion, sql))
397+
return false;
398+
appendPQExpBuffer(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n");
399+
}
400+
401+
if (!buildACLCommands("", NULL, type, acls, racls, owner,
402+
prefix->data, remoteVersion, sql))
403+
return false;
395404

396405
destroyPQExpBuffer(prefix);
397406

398-
return result;
407+
return true;
399408
}
400409

401410
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy