]> granicus.if.org Git - postgresql/log
postgresql
6 years agoRemove 'target' from GroupPathExtraData.
Robert Haas [Thu, 29 Mar 2018 20:17:18 +0000 (16:17 -0400)]
Remove 'target' from GroupPathExtraData.

It's not needed.

Jeevan Chalke

Discussion: http://postgr.es/m/CAM2+6=XPWujjmj5zUaBTGDoB38CemwcPmjkRy0qOcsQj_V+2sQ@mail.gmail.com

6 years agoRewrite the code that applies scan/join targets to paths.
Robert Haas [Thu, 29 Mar 2018 19:47:57 +0000 (15:47 -0400)]
Rewrite the code that applies scan/join targets to paths.

If the toplevel scan/join target list is parallel-safe, postpone
generating Gather (or Gather Merge) paths until after the toplevel has
been adjusted to return it.  This (correctly) makes queries with
expensive functions in the target list more likely to choose a
parallel plan, since the cost of the plan now reflects the fact that
the evaluation will happen in the workers rather than the leader.
The original complaint about this problem was from Jeff Janes.

If the toplevel scan/join relation is partitioned, recursively apply
the changes to all partitions.  This sometimes allows us to get rid of
Result nodes, because Append is not projection-capable but its
children may be.  It also cleans up what appears to be incorrect SRF
handling from commit e2f1eb0ee30d144628ab523432320f174a2c8966: the old
code had no knowledge of SRFs for child scan/join rels.

Because we now use create_projection_path() in some cases where we
formerly used apply_projection_to_path(), this changes the ordering
of columns in some queries generated by postgres_fdw.  Update
regression outputs accordingly.

Patch by me, reviewed by Amit Kapila and by Ashutosh Bapat.  Other
fixes for this problem (substantially different from this version)
were reviewed by Dilip Kumar, Amit Khandekar, and Marina Polyakova.

Discussion: http://postgr.es/m/CAMkU=1ycXNipvhWuweUVpKuyu6SpNjF=yHWu4c4US5JgVGxtZQ@mail.gmail.com

6 years agoPostpone generate_gather_paths for topmost scan/join rel.
Robert Haas [Mon, 12 Mar 2018 20:45:15 +0000 (16:45 -0400)]
Postpone generate_gather_paths for topmost scan/join rel.

Don't call generate_gather_paths for the topmost scan/join relation
when it is initially populated with paths.  Instead, do the work in
grouping_planner.  By itself, this gains nothing; in fact it loses
slightly because we end up calling set_cheapest() for the topmost
scan/join rel twice rather than once.  However, it paves the way for
a future commit which will postpone generate_gather_paths for the
topmost scan/join relation even further, allowing more accurate
costing of parallel paths.

Amit Kapila and Robert Haas.  Earlier versions of this patch (which
different substantially) were reviewed by Dilip Kumar, Amit
Khandekar, Marina Polyakova, and Ashutosh Bapat.

6 years agoTeach create_projection_plan to omit projection where possible.
Robert Haas [Thu, 29 Mar 2018 19:37:39 +0000 (15:37 -0400)]
Teach create_projection_plan to omit projection where possible.

We sometimes insert a ProjectionPath into a plan tree when projection
is not strictly required. The existing code already arranges to avoid
emitting a Result node when the ProjectionPath's subpath can perform
the projection itself, but previously it didn't consider the
possibility that the parent node might not actually require the
projection to be performed at all.

Skipping projection when it's not required can not only avoid Result
nodes that aren't needed, but also avoid losing the "physical tlist"
optimization unneccessarily.

Patch by me, reviewed by Amit Kapila.

Discussion: http://postgr.es/m/CA+TgmoakT5gmahbPWGqrR2nAdFOMAOnOXYoWHRdVfGWs34t6_A@mail.gmail.com

6 years agoC comments: "a" <--> "an" corrections
Bruce Momjian [Thu, 29 Mar 2018 19:18:53 +0000 (15:18 -0400)]
C comments:  "a" <--> "an" corrections

Reported-by: Michael Paquier, Abhijit Menon-Sen
Discussion: https://postgr.es/m/20180305045854.GB2266@paquier.xyz

Author: Michael Paquier, Abhijit Menon-Sen, me

6 years agoREADME change: update for hash access method
Bruce Momjian [Thu, 29 Mar 2018 18:38:32 +0000 (14:38 -0400)]
README change:  update for hash access method

Reported-by: Thomas Munro, Justin Pryzby
Discussion: https://postgr.es/m/CAEepm=1_682z-09DNHj4GkCJAqWK-D6h9Oq5ea84T1oqq1-Utg@mail.gmail.com

6 years agoFix incorrect copy/paste in comment
Magnus Hagander [Thu, 29 Mar 2018 17:11:05 +0000 (19:11 +0200)]
Fix incorrect copy/paste in comment

Author: Alexander Korotkov <a.korotkov@postgrespro.ru>

6 years agoFix typo in comment
Magnus Hagander [Thu, 29 Mar 2018 17:10:04 +0000 (19:10 +0200)]
Fix typo in comment

Author: Daniel Gustafsson <daniel@yesql.se>

6 years agoRemove unnecessary BufferGetPage() calls in fsm_vacuum_page().
Tom Lane [Thu, 29 Mar 2018 16:44:19 +0000 (12:44 -0400)]
Remove unnecessary BufferGetPage() calls in fsm_vacuum_page().

Just noticed that these were quite redundant, since we're holding the
page address in a local variable anyway, and we have pin on the buffer
throughout.

Also improve a comment.

6 years agoRemove UpdateFreeSpaceMap(), use FreeSpaceMapVacuumRange() instead.
Tom Lane [Thu, 29 Mar 2018 16:22:37 +0000 (12:22 -0400)]
Remove UpdateFreeSpaceMap(), use FreeSpaceMapVacuumRange() instead.

FreeSpaceMapVacuumRange has the same effect, is more efficient if many
pages are involved, and makes fewer assumptions about how it's used.
Notably, Claudio Freire pointed out that UpdateFreeSpaceMap could fail
if the specified freespace value isn't the maximum possible.  This isn't
a problem for the single existing user, but the function represents an
attractive nuisance IMO, because it's named as though it were a
general-purpose update function and its limitations are undocumented.
In any case we don't need multiple ways to get the same result.

In passing, do some code review and cleanup in RelationAddExtraBlocks.
In particular, I see no excuse for it to omit the PageIsNew safety check
that's done in the mainline extension path in RelationGetBufferForTuple.

Discussion: https://postgr.es/m/CAGTBQpYR0uJCNTt3M5GOzBRHo+-GccNO1nCaQ8yEJmZKSW5q1A@mail.gmail.com

6 years agoC comment: fix wording about shared memory message queue
Bruce Momjian [Thu, 29 Mar 2018 16:18:34 +0000 (12:18 -0400)]
C comment:  fix wording about shared memory message queue

Reported-by: Tels
Discussion: https://postgr.es/m/e66e05bc55f5ce904e361ad17a3395ae.squirrel@sm.webmail.pair.com

6 years agoWhile vacuuming a large table, update upper-level FSM data every so often.
Tom Lane [Thu, 29 Mar 2018 15:29:54 +0000 (11:29 -0400)]
While vacuuming a large table, update upper-level FSM data every so often.

VACUUM updates leaf-level FSM entries immediately after cleaning the
corresponding heap blocks.  fsmpage.c updates the intra-page search trees
on the leaf-level FSM pages when this happens, but it does not touch the
upper-level FSM pages, so that the released space might not actually be
findable by searchers.  Previously, updating the upper-level pages happened
only at the conclusion of the VACUUM run, in a single FreeSpaceMapVacuum()
call.  This is bad because the VACUUM might get canceled before ever
reaching that point, so that from the point of view of searchers no space
has been freed at all, leading to table bloat.

We can improve matters by updating the upper pages immediately after each
cycle of index-cleaning and heap-cleaning, processing just the FSM pages
corresponding to the range of heap blocks we have now fully cleaned.
This adds a small amount of extra work, since the FSM pages leading down
to each range boundary will be touched twice, but it's pretty negligible
compared to everything else going on in a large VACUUM.

If there are no indexes, VACUUM doesn't work in cycles but just cleans
each heap page on first visit.  In that case we just arbitrarily update
upper FSM pages after each 8GB of heap.  That maintains the goal of not
letting all this work slide until the very end, and it doesn't seem worth
expending extra complexity on a case that so seldom occurs in practice.

In either case, the FSM is fully up to date before any attempt is made
to truncate the relation, so that the most likely scenario for VACUUM
cancellation no longer results in out-of-date upper FSM pages.  When
we do successfully truncate, adjusting the FSM to reflect that is now
fully handled within FreeSpaceMapTruncateRel.

Claudio Freire, reviewed by Masahiko Sawada and Jing Wang, some additional
tweaks by me

Discussion: https://postgr.es/m/CAGTBQpYR0uJCNTt3M5GOzBRHo+-GccNO1nCaQ8yEJmZKSW5q1A@mail.gmail.com

6 years agoAdd casts from jsonb
Teodor Sigaev [Thu, 29 Mar 2018 13:33:56 +0000 (16:33 +0300)]
Add casts from jsonb

Add explicit cast from scalar jsonb to all numeric and bool types. It would be
better to have cast from scalar jsonb to text too but there is already a cast
from jsonb to text as just text representation of json. There is no way to have
two different casts for the same type's pair.

Bump catalog version

Author: Anastasia Lubennikova with editorization by Nikita Glukhov and me
Review by: Aleksander Alekseev, Nikita Glukhov, Darafei Praliaskouski
Discussion: https://www.postgresql.org/message-id/flat/0154d35a-24ae-f063-5273-9ffcdf1c7f2e@postgrespro.ru

6 years agodocs: fix INSTALL.xml build by using "standalone-ignore"
Bruce Momjian [Thu, 29 Mar 2018 11:53:57 +0000 (07:53 -0400)]
docs:  fix INSTALL.xml build by using "standalone-ignore"

Was broken by "jit" link.

6 years agoFix typo in comment
Magnus Hagander [Thu, 29 Mar 2018 09:42:32 +0000 (11:42 +0200)]
Fix typo in comment

Arthur Zakirov, confirmed by Thomas Munro

6 years agoAllow committing inside cursor loop
Peter Eisentraut [Wed, 28 Mar 2018 22:57:10 +0000 (18:57 -0400)]
Allow committing inside cursor loop

Previously, committing or aborting inside a cursor loop was prohibited
because that would close and remove the cursor.  To allow that,
automatically convert such cursors to holdable cursors so they survive
commits or rollbacks.  Portals now have a new state "auto-held", which
means they have been converted automatically from pinned.  An auto-held
portal is kept on transaction commit or rollback, but is still removed
when returning to the main loop on error.

This supports all languages that have cursor loop constructs: PL/pgSQL,
PL/Python, PL/Perl.

Reviewed-by: Ildus Kurbangaliev <i.kurbangaliev@postgrespro.ru>
6 years agoC comment: fix typo, log -> lag
Bruce Momjian [Wed, 28 Mar 2018 22:23:39 +0000 (18:23 -0400)]
C comment:  fix typo, log -> lag

Reported-by: atorikoshi
Discussion: https://postgr.es/m/b61f2ab9-c0e0-d33d-ce3f-42a228025681@lab.ntt.co.jp

Author: atorikoshi

6 years agoFix mistakes in the just added JIT docs.
Andres Freund [Wed, 28 Mar 2018 22:07:08 +0000 (15:07 -0700)]
Fix mistakes in the just added JIT docs.

Reported-By: Lukas Fittl
Author: Andres Freund

6 years agoAdd documentation for the JIT feature.
Andres Freund [Wed, 28 Mar 2018 21:22:42 +0000 (14:22 -0700)]
Add documentation for the JIT feature.

As promised in earlier commits, this adds documentation about the new
build options, the new GUCs, about the planner logic when JIT is used,
and the benefits of JIT in general.

Also adds a more implementation oriented README.

I'm sure we're going to want to expand this further, but I think this
is a reasonable start.

Author: Andres Freund, with contributions by Thomas Munro
Reviewed-By: Thomas Munro
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoAdd EXPLAIN support for JIT.
Andres Freund [Wed, 28 Mar 2018 20:26:51 +0000 (13:26 -0700)]
Add EXPLAIN support for JIT.

This just shows a few details about JITing, e.g. how many functions
have been JITed, and how long that took.  To avoid noise in regression
tests with functions sometimes being JITed in --with-llvm builds,
disable display when COSTS OFF is specified.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoAdd inlining support to LLVM JIT provider.
Andres Freund [Wed, 28 Mar 2018 20:19:08 +0000 (13:19 -0700)]
Add inlining support to LLVM JIT provider.

This provides infrastructure to allow JITed code to inline code
implemented in C. This e.g. can be postgres internal functions or
extension code.

This already speeds up long running queries, by allowing the LLVM
optimizer to optimize across function boundaries. The optimization
potential currently doesn't reach its full potential because LLVM
cannot optimize the FunctionCallInfoData argument fully away, because
it's allocated on the heap rather than the stack. Fixing that is
beyond what's realistic for v11.

To be able to do that, use CLANG to convert C code to LLVM bitcode,
and have LLVM build a summary for it. That bitcode can then be used to
to inline functions at runtime. For that the bitcode needs to be
installed. Postgres bitcode goes into $pkglibdir/bitcode/postgres,
extensions go into equivalent directories.  PGXS has been modified so
that happens automatically if postgres has been compiled with LLVM
support.

Currently this isn't the fastest inline implementation, modules are
reloaded from disk during inlining. That's to work around an apparent
LLVM bug, triggering an apparently spurious error in LLVM assertion
enabled builds.  Once that is resolved we can remove the superfluous
read from disk.

Docs will follow in a later commit containing docs for the whole JIT
feature.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoUse isinf builtin for clang, for performance.
Andres Freund [Wed, 28 Mar 2018 19:45:32 +0000 (12:45 -0700)]
Use isinf builtin for clang, for performance.

When compiling with clang glibc's definition of isinf() ends up
leading to and external libc function call. That's because there was a
bug in the builtin in an old gcc version, and clang claims
compatibility with an older version.  That causes clang to be
measurably slower for floating point heavy workloads than gcc.

To fix simply redirect isinf when using clang and clang confirms it
has __builtin_isinf().

6 years agoMake pg_rewind skip files and directories that are removed during server start.
Fujii Masao [Wed, 28 Mar 2018 19:56:52 +0000 (04:56 +0900)]
Make pg_rewind skip files and directories that are removed during server start.

The target cluster that was rewound needs to perform recovery from
the checkpoint created at failover, which leads it to remove or recreate
some files and directories that may have been copied from the source
cluster. So pg_rewind can skip synchronizing such files and directories,
and which reduces the amount of data transferred during a rewind
without changing the usefulness of the operation.

Author: Michael Paquier
Reviewed-by: Anastasia Lubennikova, Stephen Frost and me
Discussion: https://postgr.es/m/20180205071022.GA17337@paquier.xyz

6 years agoFix handling of files that source server removes during pg_rewind is running.
Fujii Masao [Wed, 28 Mar 2018 19:00:21 +0000 (04:00 +0900)]
Fix handling of files that source server removes during pg_rewind is running.

After processing the filemap to build the list of chunks that will be
fetched from the source to rewing the target server, it is possible that
a file which was previously processed is removed from the source.  A
simple example of such an occurence is a WAL segment which gets recycled
on the target in-between.  When the filemap is processed, files not
categorized as relation files are first truncated to prepare for its
full copy of which is going to be taken from the source, divided into a
set of junks.  However, for a recycled WAL segment, this would result in
a segment which has a zero-byte size.  With such an empty file,
post-rewind recovery thinks that records are saved but they are actually
not because of the truncation which happened when processing the
filemap, resulting in data loss.

In order to fix the problem, make sure that files which are found as
removed on the source when receiving chunks of them are as well deleted
on the target server for consistency.

Back-patch to 9.5 where pg_rewind was added.

Author: Tsunakawa Takayuki
Reviewed-by: Michael Paquier
Reported-by: Tsunakawa Takayuki
Discussion: https://postgr.es/m/0A3221C70F24FB45833433255569204D1F8DAAA2%40G01JPEXMBYT05

6 years agoPL/pgSQL: Nested CALL with transactions
Peter Eisentraut [Sat, 24 Mar 2018 14:05:06 +0000 (10:05 -0400)]
PL/pgSQL: Nested CALL with transactions

So far, a nested CALL or DO in PL/pgSQL would not establish a context
where transaction control statements were allowed.  This fixes that by
handling CALL and DO specially in PL/pgSQL, passing the atomic/nonatomic
execution context through and doing the required management around
transaction boundaries.

Reviewed-by: Tomas Vondra <tomas.vondra@2ndquadrant.com>
6 years agoFix actual and potential double-frees around tuplesort usage.
Tom Lane [Wed, 28 Mar 2018 17:26:43 +0000 (13:26 -0400)]
Fix actual and potential double-frees around tuplesort usage.

tuplesort_gettupleslot() passed back tuples allocated in the tuplesort's
own memory context, even when the caller was responsible to free them.
This created a double-free hazard, because some callers might destroy
the tuplesort object (via tuplesort_end) before trying to clean up the
last returned tuple.  To avoid this, change the API to specify that the
tuple is allocated in the caller's memory context.  v10 and HEAD already
did things that way, but in 9.5 and 9.6 this is a live bug that can
demonstrably cause crashes with some grouping-set usages.

In 9.5 and 9.6, this requires doing an extra tuple copy in some cases,
which is unfortunate.  But the amount of refactoring needed to avoid it
seems excessive for a back-patched change, especially since the cases
where an extra copy happens are less performance-critical.

Likewise change tuplesort_getdatum() to return pass-by-reference Datums
in the caller's context not the tuplesort's context.  There seem to be
no live bugs among its callers, but clearly the same sort of situation
could happen in future.

For other tuplesort fetch routines, continue to allocate the memory in
the tuplesort's context.  This is a little inconsistent with what we now
do for tuplesort_gettupleslot() and tuplesort_getdatum(), but that's
preferable to adding new copy overhead in the back branches where it's
clearly unnecessary.  These other fetch routines provide the weakest
possible guarantees about tuple memory lifespan from v10 on, anyway,
so this actually seems more consistent overall.

Adjust relevant comments to reflect these API redefinitions.

Arguably, we should change the pre-9.5 branches as well, but since
there are no known failure cases there, it seems not worth the risk.

Peter Geoghegan, per report from Bernd Helmle.  Reviewed by Kyotaro
Horiguchi; thanks also to Andreas Seltenreich for extracting a
self-contained test case.

Discussion: https://postgr.es/m/1512661638.9720.34.camel@oopsware.de

6 years agoStore 2PC GID in commit/abort WAL recs for logical decoding
Simon Riggs [Wed, 28 Mar 2018 16:42:50 +0000 (17:42 +0100)]
Store 2PC GID in commit/abort WAL recs for logical decoding

Store GID of 2PC in commit/abort WAL records when wal_level = logical.
This allows logical decoding to send the SAME gid to subscribers
across restarts of logical replication.

Track relica origin replay progress for 2PC.

(Edited from patch 0003 in the logical decoding 2PC series.)

Authors: Nikhil Sontakke, Stas Kelvich
Reviewed-by: Simon Riggs, Andres Freund
6 years agoAttempt to fix jsonb_plpython build on Windows
Peter Eisentraut [Wed, 28 Mar 2018 15:49:23 +0000 (11:49 -0400)]
Attempt to fix jsonb_plpython build on Windows

6 years agoFix jsonb_plpython tests on older Python versions
Peter Eisentraut [Wed, 28 Mar 2018 15:01:40 +0000 (11:01 -0400)]
Fix jsonb_plpython tests on older Python versions

Rewrite one test to avoid a case where some Python versions have output
format differences (Decimal('1') vs Decimal("1")).

6 years agoTransforms for jsonb to PL/Python
Peter Eisentraut [Wed, 28 Mar 2018 12:32:43 +0000 (08:32 -0400)]
Transforms for jsonb to PL/Python

Add a new contrib module jsonb_plpython that provide a transform between
jsonb and PL/Python.  jsonb values are converted to appropriate Python
types such as dicts and lists, and vice versa.

Author: Anthony Bykov <a.bykov@postgrespro.ru>
Reviewed-by: Aleksander Alekseev <a.alekseev@postgrespro.ru>
Reviewed-by: Nikita Glukhov <n.gluhov@postgrespro.ru>
6 years agoMake fast_default regression tests locale independent
Andrew Dunstan [Wed, 28 Mar 2018 06:36:45 +0000 (17:06 +1030)]
Make fast_default regression tests locale independent

6 years agoUse pg_stat_get_xact* functions within xacts
Simon Riggs [Wed, 28 Mar 2018 04:21:00 +0000 (05:21 +0100)]
Use pg_stat_get_xact* functions within xacts

Resolve build farm failures from c203d6cf81b4d7e43,
diagnosed by Tom Lane.

The output of pg_stat_get_xact_tuples_hot_updated() and friends
is not guaranteed to show anything after the transaction completes.
Data is flushed slowly to stats collector, so using them can
give timing issues.

6 years agoQuick adaption of JIT tuple deforming to the fast default patch.
Andres Freund [Wed, 28 Mar 2018 04:03:10 +0000 (21:03 -0700)]
Quick adaption of JIT tuple deforming to the fast default patch.

Instead using memset to set tts_isnull, call the new
slot_getmissingattrs().

Also fix a bug (= instead of >=) in the code generation. Normally = is
correct, but when repeatedly deforming fields not in a
tuple (e.g. deform up to natts + 1 and then natts + 2) >= is needed.

Discussion: https://postgr.es/m/20180328010053.i2qvsuuusst4lgmc@alap3.anarazel.de

6 years agoAdd catversion bump missed in 16828d5c0.
Andres Freund [Wed, 28 Mar 2018 02:07:39 +0000 (19:07 -0700)]
Add catversion bump missed in 16828d5c0.

Given that pg_attribute changed its layout...

6 years agoFast ALTER TABLE ADD COLUMN with a non-NULL default
Andrew Dunstan [Wed, 28 Mar 2018 00:13:52 +0000 (10:43 +1030)]
Fast ALTER TABLE ADD COLUMN with a non-NULL default

Currently adding a column to a table with a non-NULL default results in
a rewrite of the table. For large tables this can be both expensive and
disruptive. This patch removes the need for the rewrite as long as the
default value is not volatile. The default expression is evaluated at
the time of the ALTER TABLE and the result stored in a new column
(attmissingval) in pg_attribute, and a new column (atthasmissing) is set
to true. Any existing row when fetched will be supplied with the
attmissingval. New rows will have the supplied value or the default and
so will never need the attmissingval.

Any time the table is rewritten all the atthasmissing and attmissingval
settings for the attributes are cleared, as they are no longer needed.

The most visible code change from this is in heap_attisnull, which
acquires a third TupleDesc argument, allowing it to detect a missing
value if there is one. In many cases where it is known that there will
not be any (e.g.  catalog relations) NULL can be passed for this
argument.

Andrew Dunstan, heavily modified from an original patch from Serge
Rielau.
Reviewed by Tom Lane, Andres Freund, Tomas Vondra and David Rowley.

Discussion: https://postgr.es/m/31e2e921-7002-4c27-59f5-51f08404c858@2ndQuadrant.com

6 years agoUpdate pgindent's typedefs blacklist, and make it easier to adjust.
Tom Lane [Tue, 27 Mar 2018 22:15:39 +0000 (18:15 -0400)]
Update pgindent's typedefs blacklist, and make it easier to adjust.

It seems that all buildfarm members are now using the <stdbool.h> code
path, so that none of them report "bool" as a typedef.  We still need it
to be treated that way, so adjust pgindent to force that whether or not
it's in the given list.

Also, the recent introduction of LLVM infrastructure has caused the
appearance of some typedef names that we definitely *don't* want
treated as typedefs, such as "string" and "abs".  Extend the existing
blacklist to include these.  (Additions based on comparing v10's
typedefs list to what the buildfarm is currently emitting.)

Rearrange the code so that the lists of whitelisted/blacklisted
names are a bit easier to find and modify.

Andrew Dunstan and Tom Lane

Discussion: https://postgr.es/m/28690.1521912334@sss.pgh.pa.us

6 years agoAllow memory contexts to have both fixed and variable ident strings.
Tom Lane [Tue, 27 Mar 2018 20:46:47 +0000 (16:46 -0400)]
Allow memory contexts to have both fixed and variable ident strings.

Originally, we treated memory context names as potentially variable in
all cases, and therefore always copied them into the context header.
Commit 9fa6f00b1 rethought this a little bit and invented a distinction
between fixed and variable names, skipping the copy step for the former.
But we can make things both simpler and more useful by instead allowing
there to be two parts to a context's identification, a fixed "name" and
an optional, variable "ident".  The name supplied in the context create
call is now required to be a compile-time-constant string in all cases,
as it is never copied but just pointed to.  The "ident" string, if
wanted, is supplied later.  This is needed because typically we want
the ident to be stored inside the context so that it's cleaned up
automatically on context deletion; that means it has to be copied into
the context before we can set the pointer.

The cost of this approach is basically just an additional pointer field
in struct MemoryContextData, which isn't much overhead, and is bought
back entirely in the AllocSet case by not needing a headerSize field
anymore, since we no longer have to cope with variable header length.
In addition, we can simplify the internal interfaces for memory context
creation still further, saving a few cycles there.  And it's no longer
true that a custom identifier disqualifies a context from participating
in aset.c's freelist scheme, so possibly there's some win on that end.

All the places that were using non-compile-time-constant context names
are adjusted to put the variable info into the "ident" instead.  This
allows more effective identification of those contexts in many cases;
for example, subsidary contexts of relcache entries are now identified
by both type (e.g. "index info") and relname, where before you got only
one or the other.  Contexts associated with PL function cache entries
are now identified more fully and uniformly, too.

I also arranged for plancache contexts to use the query source string
as their identifier.  This is basically free for CachedPlanSources, as
they contained a copy of that string already.  We pay an extra pstrdup
to do it for CachedPlans.  That could perhaps be avoided, but it would
make things more fragile (since the CachedPlanSource is sometimes
destroyed first).  I suspect future improvements in error reporting will
require CachedPlans to have a copy of that string anyway, so it's not
clear that it's worth moving mountains to avoid it now.

This also changes the APIs for context statistics routines so that the
context-specific routines no longer assume that output goes straight
to stderr, nor do they know all details of the output format.  This
is useful immediately to reduce code duplication, and it also allows
for external code to do something with stats output that's different
from printing to stderr.

The reason for pushing this now rather than waiting for v12 is that
it rethinks some of the API changes made by commit 9fa6f00b1.  Seems
better for extension authors to endure just one round of API changes
not two.

Discussion: https://postgr.es/m/CAB=Je-FdtmFZ9y9REHD7VsSrnCkiBhsA4mdsLKSPauwXtQBeNA@mail.gmail.com

6 years agoAllow HOT updates for some expression indexes
Simon Riggs [Tue, 27 Mar 2018 18:57:02 +0000 (19:57 +0100)]
Allow HOT updates for some expression indexes

If the value of an index expression is unchanged after UPDATE,
allow HOT updates where previously we disallowed them, giving
a significant performance boost in those cases.

Particularly useful for indexes such as JSON->>field where the
JSON value changes but the indexed value does not.

Submitted as "surjective indexes" patch, now enabled by use
of new "recheck_on_update" parameter.

Author: Konstantin Knizhnik
Reviewer: Simon Riggs, with much wordsmithing and some cleanup

6 years agolibpq: PQhost to return active connected host or hostaddr
Peter Eisentraut [Tue, 27 Mar 2018 16:31:34 +0000 (12:31 -0400)]
libpq: PQhost to return active connected host or hostaddr

Previously, PQhost didn't return the connected host details when the
connection type was CHT_HOST_ADDRESS (i.e., via hostaddr).  Instead, it
returned the complete host connection parameter (which could contain
multiple hosts) or the default host details, which was confusing and
arguably incorrect.

Change this to return the actually connected host or hostaddr
irrespective of the connection type.  When hostaddr but no host was
specified, hostaddr is now returned.  Never return the original host
connection parameter, and document that PQhost cannot be relied on
before the connection is established.

PQport is similarly changed to always return the active connection port
and never the original connection parameter.

Author: Hari Babu <kommi.haribabu@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>
Reviewed-by: David G. Johnston <david.g.johnston@gmail.com>
6 years agoFix count of skipped test of basebackup on Windows
Teodor Sigaev [Tue, 27 Mar 2018 14:40:56 +0000 (17:40 +0300)]
Fix count of skipped test of basebackup on Windows

Commit 920a5e500a119b03356fb1fb64a677eb1aa5fc6f add tests which should be
skipped on Windows boxes, but patch doesn't contain right count of them.

David Steel

6 years agoSkip temp tables from basebackup.
Teodor Sigaev [Tue, 27 Mar 2018 13:14:40 +0000 (16:14 +0300)]
Skip temp tables from basebackup.

Do not store temp tables in basebackup, they will not be visible anyway, so,
there are not reasons to store them.

Author: David Steel
Reviewed by: me
Discussion: https://www.postgresql.org/message-id/flat/5ea4d26a-a453-c1b7-eff9-5a3ef8f8aceb@pgmasters.net

6 years agoAdd predicate locking for GiST
Teodor Sigaev [Tue, 27 Mar 2018 12:43:19 +0000 (15:43 +0300)]
Add predicate locking for GiST

Add page-level predicate locking, due to gist's code organization, patch seems
close to trivial: add check before page changing, add predicate lock before page
scanning.  Although choosing right place to check is not simple: it should not
be called during index build, it should support insertion of new downlink and so
on.

Author: Shubham Barai with editorization by me and Alexander Korotkov
Reviewed by: Alexander Korotkov, Andrey Borodin, me
Discussion: https://www.postgresql.org/message-id/flat/CALxAEPtdcANpw5ePU3LvnTP8HCENFw6wygupQAyNBgD-sG3h0g@mail.gmail.com

6 years agoAdapt to LLVM 7+ Orc API changes.
Andres Freund [Mon, 26 Mar 2018 22:55:16 +0000 (15:55 -0700)]
Adapt to LLVM 7+ Orc API changes.

This is mostly done to be able to validate features and fixes
submitted to LLVM. Given the size of these changes that seems
acceptable.

Author: Andres Freund

6 years agoLLVMJIT: Free created module in LLVM < 5.
Andres Freund [Mon, 26 Mar 2018 23:04:39 +0000 (16:04 -0700)]
LLVMJIT: Free created module in LLVM < 5.

Due to the differing APIs between versions, I forgot to deallocate the
generated module in older LLVM versions, leading to a memory leak.

Author: Andres Freund

6 years agoMake new regression indpendent of max_parallel_workers_per_gather.
Andres Freund [Mon, 26 Mar 2018 21:59:37 +0000 (14:59 -0700)]
Make new regression  indpendent of max_parallel_workers_per_gather.

The tests in e2f1eb0ee30d1 ("Implement partition-wise
grouping/aggregation.") weren't independent of the server's
max_parallel_workers_per_gather setting.  I (Andres) find it useful to
locally run with that disabled, and the aforementioned patch broke
this.

Author: Jeevan Chalke
Discussion:
    https://postgr.es/m/20180322210703.qmga3vsxqmiiypci@alap3.anarazel.de
    https://postgr.es/m/CAM2+6=UNWGKTgh9aOn4=SQ72HfFzbVFseh9=5N54bD6KB+D9OQ@mail.gmail.com

6 years agoCorrect some typos in the new JIT code.
Andres Freund [Mon, 26 Mar 2018 19:58:17 +0000 (12:58 -0700)]
Correct some typos in the new JIT code.

Author: Thomas Munro

6 years agoJIT tuple deforming in LLVM JIT provider.
Andres Freund [Mon, 26 Mar 2018 19:57:19 +0000 (12:57 -0700)]
JIT tuple deforming in LLVM JIT provider.

Performing JIT compilation for deforming gains performance benefits
over unJITed deforming from compile-time knowledge of the tuple
descriptor. Fixed column widths, NOT NULLness, etc can be taken
advantage of.

Right now the JITed deforming is only used when deforming tuples as
part of expression evaluation (and obviously only if the descriptor is
known). It's likely to be beneficial in other cases, too.

By default tuple deforming is JITed whenever an expression is JIT
compiled. There's a separate boolean GUC controlling it, but that's
expected to be primarily useful for development and benchmarking.

Docs will follow in a later commit containing docs for the whole JIT
feature.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoSet random seed for pgbench.
Teodor Sigaev [Mon, 26 Mar 2018 15:26:27 +0000 (18:26 +0300)]
Set random seed for pgbench.

Setting random could increase reproducibility of test in some cases. Patch
suggests three providers for seed: time (default), strong random
generator (if available) and unsigned constant. Seed could be set from
command line or enviroment variable.

Author: Fabien Coelho
Reviewed by: Chapman Flack
Discussion: https://www.postgresql.org/message-id/flat/20160407082711.q7iq3ykffqxcszkv@alap3.anarazel.de

6 years agoFix thinko in comment
Alvaro Herrera [Mon, 26 Mar 2018 15:00:25 +0000 (12:00 -0300)]
Fix thinko in comment

The listed numbers disagreed with the ones being used in the symbols;
but instead of just fixing the numbers in the comment, use the symbolic
name instead, which seems clearer.

This has been wrong all along, so apply back to 9.5 where BRIN was
introduced.

Reported-by: Tomas Vondra
Discussion: https://postgr.es/m/5ff514f2-8b1e-6366-b11c-8e2ed442562d@2ndquadrant.com

6 years agoFix test impredictability
Alvaro Herrera [Mon, 26 Mar 2018 14:45:58 +0000 (11:45 -0300)]
Fix test impredictability

Test 'triggers' fails when another one creates triggers concurrently at
some precise time, because of a missing WHERE clause.

Per buildfarm members snapper, desmoxytes.

6 years agoHandle INSERT .. ON CONFLICT with partitioned tables
Alvaro Herrera [Mon, 26 Mar 2018 13:43:54 +0000 (10:43 -0300)]
Handle INSERT .. ON CONFLICT with partitioned tables

Commit eb7ed3f30634 enabled unique constraints on partitioned tables,
but one thing that was not working properly is INSERT/ON CONFLICT.
This commit introduces a new node keeps state related to the ON CONFLICT
clause per partition, and fills it when that partition is about to be
used for tuple routing.

Author: Amit Langote, Álvaro Herrera
Reviewed-by: Etsuro Fujita, Pavan Deolasee
Discussion: https://postgr.es/m/20180228004602.cwdyralmg5ejdqkq@alvherre.pgsql

6 years agoFix typo
Alvaro Herrera [Mon, 26 Mar 2018 12:55:42 +0000 (09:55 -0300)]
Fix typo

6 years agoRemove two tests inadvertently added in 2b27273435
Andrew Dunstan [Mon, 26 Mar 2018 12:23:02 +0000 (22:53 +1030)]
Remove two tests inadvertently added in 2b27273435

6 years agoOptimize btree insertions for common case of increasing values
Andrew Dunstan [Mon, 26 Mar 2018 12:09:24 +0000 (22:39 +1030)]
Optimize btree insertions for common case of increasing values

Remember the last page of an index insert if it's the rightmost leaf
page. If the next entry belongs on and can fit in the remembered page,
insert the new entry there as long as we can get a lock on the page.
Otherwise, fall back on the more expensive method of searching for
the right place to insert the entry.

This provides a performance improvement for the common case where an
index entry is for monotonically increasing or nearly monotonically
increasing value such as an identity field or a current timestamp.

Pavan Deolasee
Reviewed by Claudio Freire, Simon Riggs and Peter Geoghegan

Discussion: https://postgr.es/m/CABOikdM9DrupjyKZZFM5k8-0RCDs1wk6JzEkg7UgSW6QzOwMZw@mail.gmail.com

6 years agoDoc: add example of type resolution in nested UNIONs.
Tom Lane [Sun, 25 Mar 2018 20:15:15 +0000 (16:15 -0400)]
Doc: add example of type resolution in nested UNIONs.

Section 10.5 didn't say explicitly that multiple UNIONs are resolved
pairwise.  Since the resolution algorithm is described as taking any
number of inputs, readers might well think that a query like
"select x union select y union select z" would be resolved by
considering x, y, and z in one resolution step.  But that's not what
happens (and I think that behavior is per SQL spec).  Add an example
clarifying this point.

Per bug #15129 from Philippe Beaudoin.

Discussion: https://postgr.es/m/152196085023.32649.9916472370480121694@wrigleys.postgresql.org

6 years agoFix unsafe extraction of the OID part of a relation filename.
Tom Lane [Sun, 25 Mar 2018 19:15:32 +0000 (15:15 -0400)]
Fix unsafe extraction of the OID part of a relation filename.

Commit 8694cc96b did this randomly differently from other callers of
parse_filename_for_nontemp_relation().  Perhaps unsurprisingly,
the randomly different way is wrong; it fails to ensure the
extracted string is null-terminated.  Per buildfarm member skink.

Discussion: https://postgr.es/m/14453.1522001792@sss.pgh.pa.us

6 years agopg_resetwal: Allow users to change the WAL segment size
Peter Eisentraut [Sun, 25 Mar 2018 18:58:49 +0000 (14:58 -0400)]
pg_resetwal: Allow users to change the WAL segment size

This adds a new option --wal-segsize (analogous to initdb) that changes
the WAL segment size in pg_control.

Author: Nathan Bossart <bossartn@amazon.com>

6 years agoinitdb: Further polishing of --wal-segsize option
Peter Eisentraut [Sun, 25 Mar 2018 13:17:07 +0000 (09:17 -0400)]
initdb: Further polishing of --wal-segsize option

Extend documentation.  Improve option parsing in case no argument was
specified.

6 years agoRemove useless if-test.
Tom Lane [Sun, 25 Mar 2018 18:54:16 +0000 (14:54 -0400)]
Remove useless if-test.

Coverity complained that this check is pointless, and it's right.
There is no case where we'd call ExecutorStart with a null plannedstmt,
and if we did, it'd have crashed before here.  Thinko in commit cc415a56d.

6 years agoDoc: remove extra comma in syntax summary for array_fill().
Tom Lane [Sun, 25 Mar 2018 16:38:21 +0000 (12:38 -0400)]
Doc: remove extra comma in syntax summary for array_fill().

Noted by Scott Ure.  Back-patch to all supported branches.

Discussion: https://postgr.es/m/152199346794.4544.1888397173908716912@wrigleys.postgresql.org

6 years agopg_resetwal: Fix logical typo in code
Peter Eisentraut [Sun, 25 Mar 2018 13:09:04 +0000 (09:09 -0400)]
pg_resetwal: Fix logical typo in code

introduced in f1a074b146c900bd439b6ef1953866f41b61a669

6 years agoAdd #includes missed in commit e22b27f0cb3ee03ee300d431997f5944ccf2d7b3.
Tom Lane [Sun, 25 Mar 2018 04:46:43 +0000 (00:46 -0400)]
Add #includes missed in commit e22b27f0cb3ee03ee300d431997f5944ccf2d7b3.

Leaving out getopt_long.h works on some platforms, but not all.
Per buildfarm.

Discussion: https://postgr.es/m/20180325030552.f462zqmohs6cqekg@alap3.anarazel.de

6 years agoStabilize regression test result.
Tom Lane [Sun, 25 Mar 2018 04:09:26 +0000 (00:09 -0400)]
Stabilize regression test result.

If random() returns a result sufficiently close to zero, float8out
switches to scientific notation, breaking this test case's expectation
that the output should look like '0.xxxxxxxxx'.  Casting to numeric
should fix that.  Per buildfarm member pogona.

Discussion: https://postgr.es/m/20180324212502.wt4serghfidge2on@alap3.anarazel.de

6 years agoMop-up for commit feb8254518752b2cb4a8964c374dd82d49ef0e0d.
Tom Lane [Sun, 25 Mar 2018 03:44:01 +0000 (23:44 -0400)]
Mop-up for commit feb8254518752b2cb4a8964c374dd82d49ef0e0d.

Missed these occurrences of some of the adjusted error messages.
Per buildfarm member pademelon.

6 years agoAdd long options to pg_resetwal and pg_controldata
Peter Eisentraut [Sun, 25 Mar 2018 01:14:20 +0000 (21:14 -0400)]
Add long options to pg_resetwal and pg_controldata

We were running out of good single-letter options for some upcoming
pg_resetwal functionality, so add long options to create more
possibilities.  Add to pg_controldata as well for symmetry.

based on patch by Bossart, Nathan <bossartn@amazon.com>

6 years agoinitdb: Improve --wal-segsize handling
Peter Eisentraut [Sat, 24 Mar 2018 19:40:21 +0000 (15:40 -0400)]
initdb: Improve --wal-segsize handling

Give separate error messages for when the argument is not a number and
when it is not the right kind of number.

Fix wording in the help message.

6 years agoImprove pg_resetwal documentation
Peter Eisentraut [Sat, 24 Mar 2018 19:38:57 +0000 (15:38 -0400)]
Improve pg_resetwal documentation

Clarify that the -l option takes a file name, not an "address", and that
that might be different from the LSN if nondefault WAL segment sizes are
used.

6 years agoDon't qualify type pg_catalog.text in extend-extensions-example.
Noah Misch [Sat, 24 Mar 2018 03:31:03 +0000 (20:31 -0700)]
Don't qualify type pg_catalog.text in extend-extensions-example.

Extension scripts begin execution with pg_catalog at the front of the
search path, so type names reliably refer to pg_catalog.  Remove these
superfluous qualifications.  Earlier <programlisting> of this <sect1>
already omitted them.  Back-patch to 9.3 (all supported versions).

6 years agoSmall refactoring
Peter Eisentraut [Fri, 23 Mar 2018 21:18:22 +0000 (17:18 -0400)]
Small refactoring

Put the "atomic" argument of ExecuteDoStmt() and ExecuteCallStmt() into
a variable instead of repeating the formula.

6 years agoFurther fix interaction of Perl and stdbool.h
Peter Eisentraut [Fri, 23 Mar 2018 20:31:49 +0000 (16:31 -0400)]
Further fix interaction of Perl and stdbool.h

In the case that PostgreSQL uses stdbool.h but Perl doesn't, we need to
prevent Perl from defining bool, to prevent compiler warnings about
redefinition.

6 years agoFix make rules that generate multiple output files.
Tom Lane [Fri, 23 Mar 2018 17:45:37 +0000 (13:45 -0400)]
Fix make rules that generate multiple output files.

For years, our makefiles have correctly observed that "there is no correct
way to write a rule that generates two files".  However, what we did is to
provide empty rules that "generate" the secondary output files from the
primary one, and that's not right either.  Depending on the details of
the creating process, the primary file might end up timestamped later than
one or more secondary files, causing subsequent make runs to consider the
secondary file(s) out of date.  That's harmless in a plain build, since
make will just re-execute the empty rule and nothing happens.  But it's
fatal in a VPATH build, since make will expect the secondary file to be
rebuilt in the build directory.  This would manifest as "file not found"
failures during VPATH builds from tarballs, if we were ever unlucky enough
to ship a tarball with apparently out-of-date secondary files.  (It's not
clear whether that has ever actually happened, but it definitely could.)

To ensure that secondary output files have timestamps >= their primary's,
change our makefile convention to be that we provide a "touch $@" action
not an empty rule.  Also, make sure that this rule actually gets invoked
during a distprep run, else the hazard remains.

It's been like this a long time, so back-patch to all supported branches.

In HEAD, I skipped the changes in src/backend/catalog/Makefile, because
those rules are due to get replaced soon in the bootstrap data format
patch, and there seems no need to create a merge issue for that patch.
If for some reason we fail to land that patch in v11, we'll need to
back-fill the changes in that one makefile from v10.

Discussion: https://postgr.es/m/18556.1521668179@sss.pgh.pa.us

6 years agoExclude unlogged tables from base backups
Teodor Sigaev [Fri, 23 Mar 2018 16:14:12 +0000 (19:14 +0300)]
Exclude unlogged tables from base backups

Exclude unlogged tables from base backup entirely except init fork which marks
created unlogged table. The next question is do not backup temp table but
it's a story for separate patch.

Author: David Steele
Review by: Adam Brightwell, Masahiko Sawada
Discussion: https://www.postgresql.org/message-id/flat/04791bab-cb04-ba43-e9c0-664a4c1ffb2c@pgmasters.net

6 years agoFix interaction of Perl and stdbool.h
Peter Eisentraut [Fri, 23 Mar 2018 14:31:10 +0000 (10:31 -0400)]
Fix interaction of Perl and stdbool.h

Revert the PL/Perl-specific change in
9a95a77d9d5d3003d2d67121f2731b6e5fc37336.  We must not prevent Perl from
using stdbool.h when it has been built to do so, even if it uses an
incompatible size.  Otherwise, we would be imposing our bool on Perl,
which will lead to crashes because of the size mismatch.

Instead, we undef bool after including the Perl headers, as we did
previously, but now only if we are not using stdbool.h ourselves.
Record that choice in c.h as USE_STDBOOL.  This will also make it easier
to apply that coding pattern elsewhere if necessary.

6 years agopg_resetwal: Prevent division-by-zero errors
Peter Eisentraut [Fri, 23 Mar 2018 14:10:49 +0000 (10:10 -0400)]
pg_resetwal: Prevent division-by-zero errors

Handle the case where the pg_control file specifies a WAL segment size
of 0 bytes.  This would previously have led to a division by zero error.
Change this to assume the whole file is corrupt and go to guess
everything.

Discussion: https://www.postgresql.org/message-id/a6163ad7-cc99-fdd1-dfad-25df73032ab8%402ndquadrant.com

6 years agoAllow FOR EACH ROW triggers on partitioned tables
Alvaro Herrera [Fri, 23 Mar 2018 13:48:22 +0000 (10:48 -0300)]
Allow FOR EACH ROW triggers on partitioned tables

Previously, FOR EACH ROW triggers were not allowed in partitioned
tables.  Now we allow AFTER triggers on them, and on trigger creation we
cascade to create an identical trigger in each partition.  We also clone
the triggers to each partition that is created or attached later.

This means that deferred unique keys are allowed on partitioned tables,
too.

Author: Álvaro Herrera
Reviewed-by: Peter Eisentraut, Simon Riggs, Amit Langote, Robert Haas,
Thomas Munro
Discussion: https://postgr.es/m/20171229225319.ajltgss2ojkfd3kp@alvherre.pgsql

6 years agopg_resetwal: Add simple test suite
Peter Eisentraut [Fri, 23 Mar 2018 12:42:25 +0000 (08:42 -0400)]
pg_resetwal: Add simple test suite

Some subsequent patches will add to this, but to avoid conflicts, set up
the basics separately.

6 years agoAdapt expression JIT to stdbool.h introduction.
Andres Freund [Fri, 23 Mar 2018 05:15:51 +0000 (22:15 -0700)]
Adapt expression JIT to stdbool.h introduction.

The LLVM JIT provider uses clang to synchronize types between normal C
code and runtime generated code. Clang represents stdbool.h style
booleans in return values & parameters differently from booleans
stored in variables.

Thus the expression compilation code from 2a0faed9d needs to be
adapted to 9a95a77d9. Instead of hardcoding i8 as the type for
booleans (which already was wrong on some edge case platforms!), use
postgres' notion of a boolean as used for storage and for parameters.

Per buildfarm animal xenodermus.

Author: Andres Freund

6 years agoFix whitespace
Peter Eisentraut [Fri, 23 Mar 2018 02:36:17 +0000 (22:36 -0400)]
Fix whitespace

6 years agoRemove stdbool workaround in sepgsql
Peter Eisentraut [Fri, 23 Mar 2018 01:59:28 +0000 (21:59 -0400)]
Remove stdbool workaround in sepgsql

Since we now use stdbool.h in c.h, this workaround breaks the build and
is no longer necessary, so remove it.  (Technically, there could be
platforms with a 4-byte bool in stdbool.h, in which case we would not
include stdbool.h in c.h, and so the old problem that caused this
workaround would reappear.  But this combination is not known to happen
on the range of platforms where sepgsql can be built.)

6 years agoUse stdbool.h if suitable
Peter Eisentraut [Fri, 23 Mar 2018 00:42:25 +0000 (20:42 -0400)]
Use stdbool.h if suitable

Using the standard bool type provided by C allows some recent compilers
and debuggers to give better diagnostics.  Also, some extension code and
third-party headers are increasingly pulling in stdbool.h, so it's
probably saner if everyone uses the same definition.

But PostgreSQL code is not prepared to handle bool of a size other than
1, so we keep our own old definition if we encounter a stdbool.h with a
bool of a different size.  (Among current build farm members, this only
applies to old macOS versions on PowerPC.)

To check that the used bool is of the right size, add a static
assertions about size of GinTernaryValue vs bool.  This is currently the
only place that assumes that bool and char are of the same size.

Discussion: https://www.postgresql.org/message-id/flat/3a0fe7e1-5ed1-414b-9230-53bbc0ed1f49@2ndquadrant.com

6 years agoAdd expression compilation support to LLVM JIT provider.
Andres Freund [Tue, 20 Mar 2018 09:20:46 +0000 (02:20 -0700)]
Add expression compilation support to LLVM JIT provider.

In addition to the interpretation of expressions (which back
evaluation of WHERE clauses, target list projection, aggregates
transition values etc) support compiling expressions to native code,
using the infrastructure added in earlier commits.

To avoid duplicating a lot of code, only support emitting code for
cases that are likely to be performance critical. For expression steps
that aren't deemed that, use the existing interpreter.

The generated code isn't great - some architectural changes are
required to address that. But this already yields a significant
speedup for some analytics queries, particularly with WHERE clauses
filtering a lot, or computing multiple aggregates.

Author: Andres Freund
Tested-By: Thomas Munro
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

Disable JITing for VALUES() nodes.

VALUES() nodes are only ever executed once. This is primarily helpful
for debugging, when forcing JITing even for cheap queries.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoAdd FIELDNO_* macro designating offset into structs required for JIT.
Andres Freund [Wed, 24 Jan 2018 07:20:02 +0000 (23:20 -0800)]
Add FIELDNO_* macro designating offset into structs required for JIT.

For any interesting JIT target, fields inside structs need to be
accessed. b96d550e contains infrastructure for syncing the definition
of types between postgres C code and runtime code generation with
LLVM. But that doesn't sync the number or names of fields inside
structs, just the types (including padding etc).

One option would be to hardcode the offset numbers in the JIT code,
but that'd be hard to keep in sync. Instead add macros indicating the
field offset to the fields that need to be accessed. Not pretty, but
manageable.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoExpand list of synchronized types and functions in LLVM JIT provider.
Andres Freund [Mon, 5 Feb 2018 17:09:28 +0000 (09:09 -0800)]
Expand list of synchronized types and functions in LLVM JIT provider.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoImprove style guideline compliance of assorted error-report messages.
Tom Lane [Thu, 22 Mar 2018 21:33:10 +0000 (17:33 -0400)]
Improve style guideline compliance of assorted error-report messages.

Per the project style guide, details and hints should have leading
capitalization and end with a period.  On the other hand, errcontext should
not be capitalized and should not end with a period.  To support well
formatted error contexts in dblink, extend dblink_res_error() to take a
format+arguments rather than a hardcoded string.

Daniel Gustafsson

Discussion: https://postgr.es/m/B3C002C8-21A0-4F53-A06E-8CAB29FCF295@yesql.se

6 years agoConsider Parallel Append of partial paths for UNION [ALL].
Robert Haas [Thu, 22 Mar 2018 20:09:28 +0000 (16:09 -0400)]
Consider Parallel Append of partial paths for UNION [ALL].

Without this patch, we can implement a UNION or UNION ALL as an
Append where Gather appears beneath one or more of the Append
branches, but this lets us put the Gather node on top, with
a partial path for each relation underneath.

There is considerably more work that could be done to improve
planning in this area, but that will probably need to wait
for a future release.

Patch by me, reviewed and tested by Ashutosh Bapat and Rajkumar
Raghuwanshi.

Discussion: http://postgr.es/m/CA+TgmoaLRAOqHmMZx=ESM3VDEPceg+-XXZsRXQ8GtFJO_zbMSw@mail.gmail.com

6 years agoSync up our various ways of estimating pg_class.reltuples.
Tom Lane [Thu, 22 Mar 2018 19:47:29 +0000 (15:47 -0400)]
Sync up our various ways of estimating pg_class.reltuples.

VACUUM thought that reltuples represents the total number of tuples in
the relation, while ANALYZE counted only live tuples.  This can cause
"flapping" in the value when background vacuums and analyzes happen
separately.  The planner's use of reltuples essentially assumes that
it's the count of live (visible) tuples, so let's standardize on having
it mean live tuples.

Another issue is that the definition of "live tuple" isn't totally clear;
what should be done with INSERT_IN_PROGRESS or DELETE_IN_PROGRESS tuples?
ANALYZE's choices in this regard are made on the assumption that if the
originating transaction commits at all, it will happen after ANALYZE
finishes, so we should ignore the effects of the in-progress transaction
--- unless it is our own transaction, and then we should count it.
Let's propagate this definition into VACUUM, too.

Likewise propagate this definition into CREATE INDEX, and into
contrib/pgstattuple's pgstattuple_approx() function.

Tomas Vondra, reviewed by Haribabu Kommi, some corrections by me

Discussion: https://postgr.es/m/16db4468-edfa-830a-f921-39a50498e77e@2ndquadrant.com

6 years agoBasic planner and executor integration for JIT.
Andres Freund [Thu, 22 Mar 2018 18:45:07 +0000 (11:45 -0700)]
Basic planner and executor integration for JIT.

This adds simple cost based plan time decision about whether JIT
should be performed. jit_above_cost, jit_optimize_above_cost are
compared with the total cost of a plan, and if the cost is above them
JIT is performed / optimization is performed respectively.

For that PlannedStmt and EState have a jitFlags (es_jit_flags) field
that stores information about what JIT operations should be performed.

EState now also has a new es_jit field, which can store a
JitContext. When there are no errors the context is released in
standard_ExecutorEnd().

It is likely that the default values for jit_[optimize_]above_cost
will need to be adapted further, but in my test these values seem to
work reasonably.

Author: Andres Freund, with feedback by Peter Eisentraut
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoAdd helpers for emitting LLVM IR.
Andres Freund [Thu, 22 Mar 2018 18:10:33 +0000 (11:10 -0700)]
Add helpers for emitting LLVM IR.

These basically just help to make code a bit more concise and pgindent
proof.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoDebugging and profiling support for LLVM JIT provider.
Andres Freund [Thu, 22 Mar 2018 18:07:55 +0000 (11:07 -0700)]
Debugging and profiling support for LLVM JIT provider.

This currently requires patches to the LLVM codebase to be
effective (submitted upstream), the GUCs are available without those
patches however.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoSupport for optimizing and emitting code in LLVM JIT provider.
Andres Freund [Thu, 22 Mar 2018 18:05:22 +0000 (11:05 -0700)]
Support for optimizing and emitting code in LLVM JIT provider.

This commit introduces the ability to actually generate code using
LLVM. In particular, this adds:

- Ability to emit code both in heavily optimized and largely
  unoptimized fashion
- Batching facility to allow functions to be defined in small
  increments, but optimized and emitted in executable form in larger
  batches (for performance and memory efficiency)
- Type and function declaration synchronization between runtime
  generated code and normal postgres code. This is critical to be able
  to access struct fields etc.
- Developer oriented jit_dump_bitcode GUC, for inspecting / debugging
  the generated code.
- per JitContext statistics of number of functions, time spent
  generating code, optimizing, and emitting it.  This will later be
  employed for EXPLAIN support.

This commit doesn't yet contain any code actually generating
functions. That'll follow in later commits.

Documentation for GUCs added, and for JIT in general, will be added in
later commits.

Author: Andres Freund, with contributions by Pierre Ducroquet
Testing-By: Thomas Munro, Peter Eisentraut
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

6 years agoAvoid creating a TOAST table for a partitioned table.
Robert Haas [Thu, 22 Mar 2018 17:49:38 +0000 (13:49 -0400)]
Avoid creating a TOAST table for a partitioned table.

It's useless.

Amit Langote

Discussion: http://postgr.es/m/b4c9dee6-d134-49b8-79c4-07fbd7c3b898@lab.ntt.co.jp

6 years agoFix typo in comment.
Robert Haas [Thu, 22 Mar 2018 17:36:14 +0000 (13:36 -0400)]
Fix typo in comment.

Michael Paquier

Discussion: http://postgr.es/m/20180205071404.GB17337@paquier.xyz

6 years agodoc: Update parallel join documentation for Parallel Shared Hash.
Robert Haas [Thu, 22 Mar 2018 17:25:59 +0000 (13:25 -0400)]
doc: Update parallel join documentation for Parallel Shared Hash.

Thomas Munro

Discussion: http://postgr.es/m/CAEepm=3XdL=+bn3=WQVCCT5wwfAEv-4onKpk+XQZdwDXv6etzA@mail.gmail.com

6 years agoFix tuple counting in SP-GiST index build.
Tom Lane [Thu, 22 Mar 2018 17:23:47 +0000 (13:23 -0400)]
Fix tuple counting in SP-GiST index build.

Count the number of tuples in the index honestly, instead of assuming
that it's the same as the number of tuples in the heap.  (It might be
different if the index is partial.)

Back-patch to all supported versions.

Tomas Vondra

Discussion: https://postgr.es/m/3b3d8eac-c709-0d25-088e-b98339a1b28a@2ndquadrant.com

6 years agoCall pgstat_report_activity() in parallel CREATE INDEX workers.
Robert Haas [Thu, 22 Mar 2018 17:15:03 +0000 (13:15 -0400)]
Call pgstat_report_activity() in parallel CREATE INDEX workers.

Also set debug_query_string.

Oversight in commit 9da0cc35284bdbe8d442d732963303ff0e0a40bc

Peter Geoghegan, per a report by Phil Florent.

Discussion: https://postgr.es/m/CAH2-Wzmf-34hD4n40uTuE-ZY9P5c%2BmvhFbCdQfN%3DKrKiVm3j3A%40mail.gmail.com

6 years agoFix errors in contrib/bloom index build.
Tom Lane [Thu, 22 Mar 2018 17:13:58 +0000 (13:13 -0400)]
Fix errors in contrib/bloom index build.

Count the number of tuples in the index honestly, instead of assuming
that it's the same as the number of tuples in the heap.  (It might be
different if the index is partial.)

Fix counting of tuples in current index page, too.  This error would
have led to failing to write out the final page of the index if it
contained exactly one tuple, so that the last tuple of the relation
would not get indexed.

Back-patch to 9.6 where contrib/bloom was added.

Tomas Vondra and Tom Lane

Discussion: https://postgr.es/m/3b3d8eac-c709-0d25-088e-b98339a1b28a@2ndquadrant.com

6 years agoImplement partition-wise grouping/aggregation.
Robert Haas [Thu, 22 Mar 2018 16:49:48 +0000 (12:49 -0400)]
Implement partition-wise grouping/aggregation.

If the partition keys of input relation are part of the GROUP BY
clause, all the rows belonging to a given group come from a single
partition.  This allows aggregation/grouping over a partitioned
relation to be broken down * into aggregation/grouping on each
partition.  This should be no worse, and often better, than the normal
approach.

If the GROUP BY clause does not contain all the partition keys, we can
still perform partial aggregation for each partition and then finalize
aggregation after appending the partial results.  This is less certain
to be a win, but it's still useful.

Jeevan Chalke, Ashutosh Bapat, Robert Haas.  The larger patch series
of which this patch is a part was also reviewed and tested by Antonin
Houska, Rajkumar Raghuwanshi, David Rowley, Dilip Kumar, Konstantin
Knizhnik, Pascal Legrand, and Rafia Sabih.

Discussion: http://postgr.es/m/CAM2+6=V64_xhstVHie0Rz=KPEQnLJMZt_e314P0jaT_oJ9MR8A@mail.gmail.com

6 years agoAdd conditional.c to libpgfeutils for MSVC build
Teodor Sigaev [Thu, 22 Mar 2018 16:45:34 +0000 (19:45 +0300)]
Add conditional.c to libpgfeutils for MSVC build

conditional.c was moved in f67b113ac62777d18cd20d3c4d05be964301b936 commit
but forgotten to add to Windows build system.

I don't have a Windows box, so blind attempt.

6 years agoUINT64CONST'fy long constants in pgbench
Teodor Sigaev [Thu, 22 Mar 2018 16:38:54 +0000 (19:38 +0300)]
UINT64CONST'fy long constants in pgbench

In commit e51a04840a1c45db101686bef0b7025d5014c74b it was missed 64-bit
constants, wrap them with UINT64CONST().

Per buildfarm member dromedary and gripe from Tom Lane

6 years agoAdd \if support to pgbench
Teodor Sigaev [Thu, 22 Mar 2018 14:42:03 +0000 (17:42 +0300)]
Add \if support to pgbench

Patch adds \if to pgbench as it done for psql. Implementation shares condition
stack code with psql, so, this code is moved to fe_utils directory.

Author: Fabien COELHO with minor editorization by me
Review by: Vik Fearing, Fedor Sigaev
Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.20.1711252200190.28523@lancre