1. 31 Mar, 2021 1 commit
    • Tom Lane's avatar
      Remove small inefficiency in ExecARDeleteTriggers/ExecARUpdateTriggers. · 65158f49
      Tom Lane authored
      Whilst poking at nodeModifyTable.c, I chanced to notice that while
      its calls to ExecBR*Triggers and ExecIR*Triggers are protected by
      tests to see if there are any relevant triggers to fire, its calls
      to ExecAR*Triggers are not; the latter functions do the equivalent
      tests themselves.  This seems possibly reasonable given the more
      complex conditions involved, but what's less reasonable is that
      the ExecAR* functions aren't careful to do no work when there is
      no work to be done.  ExecARInsertTriggers gets this right, but the
      other two will both force creation of a slot that the query may
      have no use for.  ExecARUpdateTriggers additionally performed a
      usually-useless ExecClearTuple() on that slot.  This is probably
      all pretty microscopic in real workloads, but a cycle shaved is a
      cycle earned.
      65158f49
  2. 30 Mar, 2021 13 commits
  3. 29 Mar, 2021 8 commits
    • Alvaro Herrera's avatar
      psql: call clearerr() just before printing · 8d645a11
      Alvaro Herrera authored
      We were never doing clearerr() on the output stream, which results in a
      message being printed after each result once an EOF is seen:
      
      could not print result table: Success
      
      This message was added by commit b0343699 (in the pg13 era); before
      that, the error indicator would never be examined.  So backpatch only
      that far back, even though the actual bug (to wit: the fact that the
      error indicator is never cleared) is older.
      8d645a11
    • David Rowley's avatar
      Adjust design of per-worker parallel seqscan data struct · af527705
      David Rowley authored
      The design of the data structures which allow storage of the per-worker
      memory during parallel seq scans were not ideal. The work done in
      56788d21 required an additional data structure to allow workers to
      remember the range of pages that had been allocated to them for
      processing during a parallel seqscan.  That commit added a void pointer
      field to TableScanDescData to allow heapam to store the per-worker
      allocation information.  However putting the field there made very little
      sense given that we have AM specific structs for that, e.g.
      HeapScanDescData.
      
      Here we remove the void pointer field from TableScanDescData and add a
      dedicated field for this purpose to HeapScanDescData.
      
      Previously we also allocated memory for this parallel per-worker data for
      all scans, regardless if it was a parallel scan or not.  This was just a
      wasted allocation for non-parallel scans, so here we make the allocation
      conditional on the scan being parallel.
      
      Also, add previously missing pfree() to free the per-worker data in
      heap_endscan().
      
      Reported-by: Andres Freund
      Reviewed-by: Andres Freund
      Discussion: https://postgr.es/m/20210317023101.anvejcfotwka6gaa@alap3.anarazel.de
      af527705
    • Andrew Dunstan's avatar
      Allow matching the DN of a client certificate for authentication · 6d7a6fea
      Andrew Dunstan authored
      Currently we only recognize the Common Name (CN) of a certificate's
      subject to be matched against the user name. Thus certificates with
      subjects '/OU=eng/CN=fred' and '/OU=sales/CN=fred' will have the same
      connection rights. This patch provides an option to match the whole
      Distinguished Name (DN) instead of just the CN. On any hba line using
      client certificate identity, there is an option 'clientname' which can
      have values of 'DN' or 'CN'. The default is 'CN', the current procedure.
      
      The DN is matched against the RFC2253 formatted DN, which looks like
      'CN=fred,OU=eng'.
      
      This facility of probably best used in conjunction with an ident map.
      
      Discussion: https://postgr.es/m/92e70110-9273-d93c-5913-0bccb6562740@dunslane.net
      
      Reviewed-By: Michael Paquier, Daniel Gustafsson, Jacob Champion
      6d7a6fea
    • Peter Eisentraut's avatar
      Clean up date_part tests a bit · efcc7572
      Peter Eisentraut authored
      Some tests for timestamp and timestamptz were in the date.sql test
      file.  Move them to their appropriate files, or drop tests cases that
      were already present there.
      efcc7572
    • Peter Eisentraut's avatar
      Add unistr function · f37fec83
      Peter Eisentraut authored
      This allows decoding a string with Unicode escape sequences.  It is
      similar to Unicode escape strings, but offers some more flexibility.
      
      Author: Pavel Stehule <pavel.stehule@gmail.com>
      Reviewed-by: default avatarAsif Rehman <asifr.rehman@gmail.com>
      Discussion: https://www.postgresql.org/message-id/flat/CAFj8pRA5GnKT+gDVwbVRH2ep451H_myBt+NTz8RkYUARE9+qOQ@mail.gmail.com
      f37fec83
    • Peter Eisentraut's avatar
      Reset standard_conforming_strings in strings test · ebedd0c7
      Peter Eisentraut authored
      After some tests relating to standard_conforming_strings behavior, the
      value was not reset to the default value.  Therefore, the rest of the
      tests in that file ran with the nondefault setting, which affected the
      results of some tests.  For clarity, reset the value and run the rest
      of the tests with the default setting again.
      ebedd0c7
    • Peter Geoghegan's avatar
      PageAddItemExtended(): Add LP_UNUSED assertion. · 30aaab26
      Peter Geoghegan authored
      Assert that LP_UNUSED items have no storage.  If it's worth having
      defensive code in non-assert builds then it's worth having an assertion
      as well.
      30aaab26
    • David Rowley's avatar
      Cache if PathTarget and RestrictInfos contain volatile functions · f58b230e
      David Rowley authored
      Here we aim to reduce duplicate work done by contain_volatile_functions()
      by caching whether PathTargets and RestrictInfos contain any volatile
      functions the first time contain_volatile_functions() is called for them.
      Any future calls for these nodes just use the cached value rather than
      going to the trouble of recursively checking the sub-node all over again.
      Thanks to Tom Lane for the idea.
      
      Any locations in the code which make changes to a PathTarget or
      RestrictInfo which could change the outcome of the volatility check must
      change the cached value back to VOLATILITY_UNKNOWN again.
      contain_volatile_functions() is the only code in charge of setting the
      cache value to either VOLATILITY_VOLATILE or VOLATILITY_NOVOLATILE.
      
      Some existing code does benefit from this additional caching, however,
      this change is mainly aimed at an upcoming patch that must check for
      volatility during the join search.  Repeated volatility checks in that
      case can become very expensive when the join search contains more than a
      few relations.
      
      Author: David Rowley
      Discussion: https://postgr.es/m/3795226.1614059027@sss.pgh.pa.us
      f58b230e
  4. 28 Mar, 2021 1 commit
  5. 27 Mar, 2021 2 commits
  6. 26 Mar, 2021 10 commits
    • Tomas Vondra's avatar
      Extended statistics on expressions · a4d75c86
      Tomas Vondra authored
      Allow defining extended statistics on expressions, not just just on
      simple column references.  With this commit, expressions are supported
      by all existing extended statistics kinds, improving the same types of
      estimates. A simple example may look like this:
      
        CREATE TABLE t (a int);
        CREATE STATISTICS s ON mod(a,10), mod(a,20) FROM t;
        ANALYZE t;
      
      The collected statistics are useful e.g. to estimate queries with those
      expressions in WHERE or GROUP BY clauses:
      
        SELECT * FROM t WHERE mod(a,10) = 0 AND mod(a,20) = 0;
      
        SELECT 1 FROM t GROUP BY mod(a,10), mod(a,20);
      
      This introduces new internal statistics kind 'e' (expressions) which is
      built automatically when the statistics object definition includes any
      expressions. This represents single-expression statistics, as if there
      was an expression index (but without the index maintenance overhead).
      The statistics is stored in pg_statistics_ext_data as an array of
      composite types, which is possible thanks to 79f6a942.
      
      CREATE STATISTICS allows building statistics on a single expression, in
      which case in which case it's not possible to specify statistics kinds.
      
      A new system view pg_stats_ext_exprs can be used to display expression
      statistics, similarly to pg_stats and pg_stats_ext views.
      
      ALTER TABLE ... ALTER COLUMN ... TYPE now treats indexes the same way it
      treats indexes, i.e. it drops and recreates the statistics. This means
      all statistics are reset, and we no longer try to preserve at least the
      functional dependencies. This should not be a major issue in practice,
      as the functional dependencies actually rely on per-column statistics,
      which were always reset anyway.
      
      Author: Tomas Vondra
      Reviewed-by: Justin Pryzby, Dean Rasheed, Zhihong Yu
      Discussion: https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com
      a4d75c86
    • Tomas Vondra's avatar
      Reduce duration of stats_ext regression tests · 98376c18
      Tomas Vondra authored
      The regression tests of extended statistics were taking a fair amount of
      time, due to using fairly large data sets with a couple thousand rows.
      So far this was fine, but with tests for statistics on expressions the
      duration would get a bit excessive.  So reduce the size of some of the
      tests that will be used to test expressions, to keep the duration under
      control.  Done in a separate commit before adding the statistics on
      expressions, to make it clear which estimates are expected to change.
      
      Author: Tomas Vondra
      Discussion: https://postgr.es/m/ad7891d2-e90c-b446-9fe2-7419143847d7%40enterprisedb.com
      98376c18
    • Tomas Vondra's avatar
      Fix ndistinct estimates with system attributes · 33e52ad9
      Tomas Vondra authored
      When estimating the number of groups using extended statistics, the code
      was discarding information about system attributes. This led to strange
      situation that
      
          SELECT 1 FROM t GROUP BY ctid;
      
      could have produced higher estimate (equal to pg_class.reltuples) than
      
          SELECT 1 FROM t GROUP BY a, b, ctid;
      
      with extended statistics on (a,b). Fixed by retaining information about
      the system attribute.
      
      Backpatch all the way to 10, where extended statistics were introduced.
      
      Author: Tomas Vondra
      Backpatch-through: 10
      33e52ad9
    • Noah Misch's avatar
      Add "pg_database_owner" default role. · a14a0118
      Noah Misch authored
      Membership consists, implicitly, of the current database owner.  Expect
      use in template databases.  Once pg_database_owner has rights within a
      template, each owner of a database instantiated from that template will
      exercise those rights.
      
      Reviewed by John Naylor.
      
      Discussion: https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com
      a14a0118
    • Noah Misch's avatar
      Merge similar algorithms into roles_is_member_of(). · f687bf61
      Noah Misch authored
      The next commit would have complicated two or three algorithms, so take
      this opportunity to consolidate.  No functional changes.
      
      Reviewed by John Naylor.
      
      Discussion: https://postgr.es/m/20201228043148.GA1053024@rfd.leadboat.com
      f687bf61
    • Tomas Vondra's avatar
      Fix alignment in BRIN minmax-multi deserialization · 73b96bad
      Tomas Vondra authored
      The deserialization failed to ensure correct alignment, as it assumed it
      can simply point into the serialized value. The serialization however
      ignores alignment and copies just the significant bytes in order to make
      the result as small as possible. This caused failures on systems that
      are sensitive to mialigned addresses, like sparc, or with address
      sanitizer enabled.
      
      Fixed by copying the serialized data to ensure proper alignment. While
      at it, fix an issue with serialization on big endian machines, using the
      same store_att_byval/fetch_att trick as extended statistics.
      
      Discussion: https://postgr.es/0c8c3304-d3dd-5e29-d5ac-b50589a23c8c%40enterprisedb.com
      73b96bad
    • Tomas Vondra's avatar
      BRIN minmax-multi indexes · ab596105
      Tomas Vondra authored
      Adds BRIN opclasses similar to the existing minmax, except that instead
      of summarizing the page range into a single [min,max] range, the summary
      consists of multiple ranges and/or points, allowing gaps. This allows
      more efficient handling of data with poor correlation to physical
      location within the table and/or outlier values, for which the regular
      minmax opclassed tend to work poorly.
      
      It's possible to specify the number of values kept for each page range,
      either as a single point or an interval boundary.
      
        CREATE TABLE t (a int);
        CREATE INDEX ON t
         USING brin (a int4_minmax_multi_ops(values_per_range=16));
      
      When building the summary, the values are combined into intervals with
      the goal to minimize the "covering" (sum of interval lengths), using a
      support procedure computing distance between two values.
      
      Bump catversion, due to various catalog changes.
      
      Author: Tomas Vondra <tomas.vondra@postgresql.org>
      Reviewed-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
      Reviewed-by: default avatarAlexander Korotkov <aekorotkov@gmail.com>
      Reviewed-by: default avatarSokolov Yura <y.sokolov@postgrespro.ru>
      Reviewed-by: default avatarJohn Naylor <john.naylor@enterprisedb.com>
      Discussion: https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com
      Discussion: https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com
      ab596105
    • Tomas Vondra's avatar
      BRIN bloom indexes · 77b88cd1
      Tomas Vondra authored
      Adds a BRIN opclass using a Bloom filter to summarize the range. Indexes
      using the new opclasses allow only equality queries (similar to hash
      indexes), but that works fine for data like UUID, MAC addresses etc. for
      which range queries are not very common. This also means the indexes
      work for data that is not well correlated to physical location within
      the table, or perhaps even entirely random (which is a common issue with
      existing BRIN minmax opclasses).
      
      It's possible to specify opclass parameters with the usual Bloom filter
      parameters, i.e. the desired false-positive rate and the expected number
      of distinct values per page range.
      
        CREATE TABLE t (a int);
        CREATE INDEX ON t
         USING brin (a int4_bloom_ops(false_positive_rate = 0.05,
                                      n_distinct_per_range = 100));
      
      The opclasses do not operate on the indexed values directly, but compute
      a 32-bit hash first, and the Bloom filter is built on the hash value.
      Collisions should not be a huge issue though, as the number of distinct
      values in a page ranges is usually fairly small.
      
      Bump catversion, due to various catalog changes.
      
      Author: Tomas Vondra <tomas.vondra@postgresql.org>
      Reviewed-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
      Reviewed-by: default avatarAlexander Korotkov <aekorotkov@gmail.com>
      Reviewed-by: default avatarSokolov Yura <y.sokolov@postgrespro.ru>
      Reviewed-by: default avatarNico Williams <nico@cryptonector.com>
      Reviewed-by: default avatarJohn Naylor <john.naylor@enterprisedb.com>
      Discussion: https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com
      Discussion: https://postgr.es/m/5d78b774-7e9c-c94e-12cf-fef51cc89b1a%402ndquadrant.com
      77b88cd1
    • Tomas Vondra's avatar
      Support the old signature of BRIN consistent function · a681e3c1
      Tomas Vondra authored
      Commit a1c649d8 changed the signature of the BRIN consistent function
      by adding a new required parameter.  Treating the parameter as optional,
      which would make the change backwards incompatibile, was rejected with
      the justification that there are few out-of-core extensions, so it's not
      worth adding making the code more complex, and it's better to deal with
      that in the extension.
      
      But after further thought, that would be rather problematic, because
      pg_upgrade simply dumps catalog contents and the same version of an
      extension needs to work on both PostgreSQL versions. Supporting both
      variants of the consistent function (with 3 or 4 arguments) makes that
      possible.
      
      The signature is not the only thing that changed, as commit 72ccf55c
      moved handling of IS [NOT] NULL keys from the support procedures. But
      this change is backward compatible - handling the keys in exension is
      unnecessary, but harmless. The consistent function will do a bit of
      unnecessary work, but it should be very cheap.
      
      This also undoes most of the changes to the existing opclasses (minmax
      and inclusion), making them use the old signature again. This should
      make backpatching simpler.
      
      Catversion bump, because of changes in pg_amproc.
      
      Author: Tomas Vondra <tomas.vondra@postgresql.org>
      Author: Nikita Glukhov <n.gluhov@postgrespro.ru>
      Reviewed-by: default avatarMark Dilger <hornschnorter@gmail.com>
      Reviewed-by: default avatarAlexander Korotkov <aekorotkov@gmail.com>
      Reviewed-by: default avatarMasahiko Sawada <masahiko.sawada@enterprisedb.com>
      Reviewed-by: default avatarJohn Naylor <john.naylor@enterprisedb.com>
      Discussion: https://postgr.es/m/c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com
      a681e3c1
    • Tomas Vondra's avatar
      Remove unnecessary pg_amproc BRIN minmax entries · a68dfa27
      Tomas Vondra authored
      The BRIN minmax opclasses included amproc entries with mismatching left
      and right types, but those happen to be unnecessary.  The opclasses only
      need cross-type operators, not cross-type support procedures. Discovered
      when trying to define equivalent BRIN operator families in an extension.
      
      Catversion bump, because of pg_amproc changes.
      
      Author: Tomas Vondra
      Reviewed-by: Alvaro Herrera
      Discussion: https://postgr.es/m/78c357ab-3395-8433-e7b3-b2cfcc9fdc23%40enterprisedb.com
      a68dfa27
  7. 25 Mar, 2021 5 commits
    • Robert Haas's avatar
      Fix interaction of TOAST compression with expression indexes. · 5db1fd78
      Robert Haas authored
      Before, trying to compress a value for insertion into an expression
      index would crash.
      
      Dilip Kumar, with some editing by me. Report by Jaime Casanova.
      
      Discussion: http://postgr.es/m/CAJKUy5gcs0zGOp6JXU2mMVdthYhuQpFk=S3V8DOKT=LZC1L36Q@mail.gmail.com
      5db1fd78
    • Alvaro Herrera's avatar
      ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY · 71f4c8c6
      Alvaro Herrera authored
      Allow a partition be detached from its partitioned table without
      blocking concurrent queries, by running in two transactions and only
      requiring ShareUpdateExclusive in the partitioned table.
      
      Because it runs in two transactions, it cannot be used in a transaction
      block.  This is the main reason to use dedicated syntax: so that users
      can choose to use the original mode if they need it.  But also, it
      doesn't work when a default partition exists (because an exclusive lock
      would still need to be obtained on it, in order to change its partition
      constraint.)
      
      In case the second transaction is cancelled or a crash occurs, there's
      ALTER TABLE .. DETACH PARTITION .. FINALIZE, which executes the final
      steps.
      
      The main trick to make this work is the addition of column
      pg_inherits.inhdetachpending, initially false; can only be set true in
      the first part of this command.  Once that is committed, concurrent
      transactions that use a PartitionDirectory will include or ignore
      partitions so marked: in optimizer they are ignored if the row is marked
      committed for the snapshot; in executor they are always included.  As a
      result, and because of the way PartitionDirectory caches partition
      descriptors, queries that were planned before the detach will see the
      rows in the detached partition and queries that are planned after the
      detach, won't.
      
      A CHECK constraint is created that duplicates the partition constraint.
      This is probably not strictly necessary, and some users will prefer to
      remove it afterwards, but if the partition is re-attached to a
      partitioned table, the constraint needn't be rechecked.
      
      Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
      Reviewed-by: default avatarAmit Langote <amitlangote09@gmail.com>
      Reviewed-by: default avatarJustin Pryzby <pryzby@telsasoft.com>
      Discussion: https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql
      71f4c8c6
    • Alvaro Herrera's avatar
      Document lock obtained during partition detach · 650d6235
      Alvaro Herrera authored
      On partition detach, we acquire a SHARE lock on all tables that
      reference the partitioned table that we're detaching a partition from,
      but failed to document this fact.  My oversight in commit f56f8f8d.
      Repair.  Backpatch to 12.
      
      Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
      Discussion: https://postgr.es/m/20210325180244.GA12738@alvherre.pgsql
      650d6235
    • Alvaro Herrera's avatar
      Add comments for AlteredTableInfo->rel · cc121d55
      Alvaro Herrera authored
      The prior commit which introduced it was pretty squalid in terms of
      code documentation, so add some comments.
      cc121d55
    • Alvaro Herrera's avatar
      Let ALTER TABLE Phase 2 routines manage the relation pointer · cd03c6e9
      Alvaro Herrera authored
      Struct AlteredRelationInfo gains a new Relation member, to be used only
      by Phase 2 (ATRewriteCatalogs); this allows ATExecCmd() subroutines open
      and close the relation internally.
      
      A future commit will use this facility to implement an ALTER TABLE
      subcommand that closes and reopens the relation across transaction
      boundaries.
      
      (It is possible to keep the relation open past phase 2 to be used by
      phase 3 instead of having to reopen it that point, but there are some
      minor complications with that; it's not clear that there is much to be
      won from doing that, though.)
      
      Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
      Discussion: https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql
      cd03c6e9