Thread

Commits

  1. Fix uninitialized memory propagation mistakes

  1. Valgrind failures caused by multivariate stats patch

    Andres Freund <andres@anarazel.de> — 2017-03-25T21:10:31Z

    Hi,
    
    I just tried to run valgrind before pushing my expression evaluation
    work, but that triggers independent failures:
    
    ==2486== Uninitialised byte(s) found during client check request
    ==2486==    at 0x5B56B9: PageAddItemExtended (bufpage.c:329)
    ==2486==    by 0x225E14: RelationPutHeapTuple (hio.c:53)
    ==2486==    by 0x21A656: heap_update (heapam.c:4189)
    ==2486==    by 0x21BAA2: simple_heap_update (heapam.c:4511)
    ==2486==    by 0x2B2B1F: CatalogTupleUpdate (indexing.c:216)
    ==2486==    by 0x5784C2: statext_store (extended_stats.c:298)
    ==2486==    by 0x577CFF: BuildRelationExtStatistics (extended_stats.c:99)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==  Address 0x92b7f93 is 195 bytes inside a block of size 215 client-defined
    ==2486==    at 0x761EAC: MemoryContextAllocExtended (mcxt.c:840)
    ==2486==    by 0x1C08EB: heap_form_tuple (heaptuple.c:744)
    ==2486==    by 0x1C0BBF: heap_modify_tuple (heaptuple.c:833)
    ==2486==    by 0x578497: statext_store (extended_stats.c:292)
    ==2486==    by 0x577CFF: BuildRelationExtStatistics (extended_stats.c:99)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    ==2486==  Uninitialised value was created by a heap allocation
    ==2486==    at 0x76212F: palloc (mcxt.c:872)
    ==2486==    by 0x578814: statext_ndistinct_build (mvdistinct.c:80)
    ==2486==    by 0x577CCE: BuildRelationExtStatistics (extended_stats.c:94)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    ==2486==    by 0x45DFA6: main (main.c:228)
    ==2486== 
    {
       <insert_a_suppression_name_here>
       Memcheck:User
       fun:PageAddItemExtended
       fun:RelationPutHeapTuple
       fun:heap_update
       fun:simple_heap_update
       fun:CatalogTupleUpdate
       fun:statext_store
       fun:BuildRelationExtStatistics
       fun:do_analyze_rel
       fun:analyze_rel
       fun:vacuum
       fun:ExecVacuum
       fun:standard_ProcessUtility
       fun:ProcessUtility
       fun:PortalRunUtility
       fun:PortalRunMulti
       fun:PortalRun
       fun:exec_simple_query
       fun:PostgresMain
       fun:BackendRun
       fun:BackendStartup
    }
    ==2486== Uninitialised byte(s) found during client check request
    ==2486==    at 0x1C4857: printtup (printtup.c:347)
    ==2486==    by 0x401FD5: ExecutePlan (execMain.c:1681)
    ==2486==    by 0x3FFDED: standard_ExecutorRun (execMain.c:355)
    ==2486==    by 0x3FFC07: ExecutorRun (execMain.c:298)
    ==2486==    by 0x5C40BD: PortalRunSelect (pquery.c:928)
    ==2486==    by 0x5C3D50: PortalRun (pquery.c:769)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    ==2486==    by 0x45DFA6: main (main.c:228)
    ==2486==  Address 0x3e8c50f5 is in a rw- anonymous segment
    ==2486==  Uninitialised value was created by a heap allocation
    ==2486==    at 0x76212F: palloc (mcxt.c:872)
    ==2486==    by 0x578814: statext_ndistinct_build (mvdistinct.c:80)
    ==2486==    by 0x577CCE: BuildRelationExtStatistics (extended_stats.c:94)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    ==2486==    by 0x45DFA6: main (main.c:228)
    ==2486== 
    {
       <insert_a_suppression_name_here>
       Memcheck:User
       fun:printtup
       fun:ExecutePlan
       fun:standard_ExecutorRun
       fun:ExecutorRun
       fun:PortalRunSelect
       fun:PortalRun
       fun:exec_simple_query
       fun:PostgresMain
       fun:BackendRun
       fun:BackendStartup
       fun:ServerLoop
       fun:PostmasterMain
       fun:main
    }
    ==2486== Conditional jump or move depends on uninitialised value(s)
    ==2486==    at 0x220FCC: log_heap_update (heapam.c:7585)
    ==2486==    by 0x21ABBA: heap_update (heapam.c:4240)
    ==2486==    by 0x21BAA2: simple_heap_update (heapam.c:4511)
    ==2486==    by 0x2B2B1F: CatalogTupleUpdate (indexing.c:216)
    ==2486==    by 0x5784C2: statext_store (extended_stats.c:298)
    ==2486==    by 0x577CFF: BuildRelationExtStatistics (extended_stats.c:99)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==  Uninitialised value was created by a heap allocation
    ==2486==    at 0x76212F: palloc (mcxt.c:872)
    ==2486==    by 0x578814: statext_ndistinct_build (mvdistinct.c:80)
    ==2486==    by 0x577CCE: BuildRelationExtStatistics (extended_stats.c:94)
    ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    ==2486==    by 0x45DFA6: main (main.c:228)
    ==2486== 
    {
       <insert_a_suppression_name_here>
       Memcheck:Cond
       fun:log_heap_update
       fun:heap_update
       fun:simple_heap_update
       fun:CatalogTupleUpdate
       fun:statext_store
       fun:BuildRelationExtStatistics
       fun:do_analyze_rel
       fun:analyze_rel
       fun:vacuum
       fun:ExecVacuum
       fun:standard_ProcessUtility
       fun:ProcessUtility
       fun:PortalRunUtility
       fun:PortalRunMulti
       fun:PortalRun
       fun:exec_simple_query
       fun:PostgresMain
       fun:BackendRun
       fun:BackendStartup
       fun:ServerLoop
    }
    
    printttup being reached usually isn't a good signal...
    
    Greetings,
    
    Andres Freund
    
    
    
  2. Re: Valgrind failures caused by multivariate stats patch

    Tom Lane <tgl@sss.pgh.pa.us> — 2017-03-25T21:37:20Z

    Andres Freund <andres@anarazel.de> writes:
    > I just tried to run valgrind before pushing my expression evaluation
    > work, but that triggers independent failures:
    
    FWIW, I just now finished valgrinding the regression tests on 457a44487
    plus the expression patch, and it looked good.  So these failures
    are definitely independent of your work.
    
    			regards, tom lane
    
    
    
  3. Re: Valgrind failures caused by multivariate stats patch

    Tomas Vondra <tomas.vondra@2ndquadrant.com> — 2017-03-26T18:38:52Z

    On 03/25/2017 10:10 PM, Andres Freund wrote:
    ...
    > ==2486== Uninitialised byte(s) found during client check request
    > ==2486==    at 0x1C4857: printtup (printtup.c:347)
    > ==2486==    by 0x401FD5: ExecutePlan (execMain.c:1681)
    > ==2486==    by 0x3FFDED: standard_ExecutorRun (execMain.c:355)
    > ==2486==    by 0x3FFC07: ExecutorRun (execMain.c:298)
    > ==2486==    by 0x5C40BD: PortalRunSelect (pquery.c:928)
    > ==2486==    by 0x5C3D50: PortalRun (pquery.c:769)
    > ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    > ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    > ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    > ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    > ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    > ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    > ==2486==    by 0x45DFA6: main (main.c:228)
    > ==2486==  Address 0x3e8c50f5 is in a rw- anonymous segment
    > ==2486==  Uninitialised value was created by a heap allocation
    > ==2486==    at 0x76212F: palloc (mcxt.c:872)
    > ==2486==    by 0x578814: statext_ndistinct_build (mvdistinct.c:80)
    > ==2486==    by 0x577CCE: BuildRelationExtStatistics (extended_stats.c:94)
    > ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    > ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    > ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    > ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    > ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    > ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    > ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    > ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    > ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    > ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    > ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    > ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    > ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    > ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    > ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    > ==2486==    by 0x45DFA6: main (main.c:228)
    
    Hmmm, so I have a theory about what's going on, but no matter what I do 
    I can't trigger these valgrind failures. What switches are you using to 
    start valgrind? I'm using this:
    
    valgrind --leak-check=no --undef-value-errors=yes \
       --expensive-definedness-checks=yes --track-origins=yes \
       --read-var-info=yes --gen-suppressions=all \
       --suppressions=src/tools/valgrind.supp --time-stamp=yes \
       --log-file=$HOME/pg-valgrind/%p.log --trace-children=yes \
       postgres --log_line_prefix="%m %p " --log_statement=all \
       --shared_buffers=64MB -D /home/user/tmp/data-valgrind 2>&1
    
    FWIW I think the issue is that statext_ndistinct_build does palloc() and 
    then uses offsetof() to copy data into the chunk, which might result in 
    a few bytes skipped due to alignment/padding. But as I can't reproduce 
    the valgrind failure, it's hard to say.
    
    regards
    
    -- 
    Tomas Vondra                  http://www.2ndQuadrant.com
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
    
    
    
  4. Re: Valgrind failures caused by multivariate stats patch

    Andres Freund <andres@anarazel.de> — 2017-03-26T18:47:56Z

    On 2017-03-26 20:38:52 +0200, Tomas Vondra wrote:
    > On 03/25/2017 10:10 PM, Andres Freund wrote:
    > ...
    > > ==2486== Uninitialised byte(s) found during client check request
    > > ==2486==    at 0x1C4857: printtup (printtup.c:347)
    > > ==2486==    by 0x401FD5: ExecutePlan (execMain.c:1681)
    > > ==2486==    by 0x3FFDED: standard_ExecutorRun (execMain.c:355)
    > > ==2486==    by 0x3FFC07: ExecutorRun (execMain.c:298)
    > > ==2486==    by 0x5C40BD: PortalRunSelect (pquery.c:928)
    > > ==2486==    by 0x5C3D50: PortalRun (pquery.c:769)
    > > ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    > > ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    > > ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    > > ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    > > ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    > > ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    > > ==2486==    by 0x45DFA6: main (main.c:228)
    > > ==2486==  Address 0x3e8c50f5 is in a rw- anonymous segment
    > > ==2486==  Uninitialised value was created by a heap allocation
    > > ==2486==    at 0x76212F: palloc (mcxt.c:872)
    > > ==2486==    by 0x578814: statext_ndistinct_build (mvdistinct.c:80)
    > > ==2486==    by 0x577CCE: BuildRelationExtStatistics (extended_stats.c:94)
    > > ==2486==    by 0x3546B6: do_analyze_rel (analyze.c:577)
    > > ==2486==    by 0x353B76: analyze_rel (analyze.c:271)
    > > ==2486==    by 0x3E7B89: vacuum (vacuum.c:321)
    > > ==2486==    by 0x3E7755: ExecVacuum (vacuum.c:122)
    > > ==2486==    by 0x5C5F1C: standard_ProcessUtility (utility.c:670)
    > > ==2486==    by 0x5C5724: ProcessUtility (utility.c:353)
    > > ==2486==    by 0x5C46CA: PortalRunUtility (pquery.c:1174)
    > > ==2486==    by 0x5C48D0: PortalRunMulti (pquery.c:1317)
    > > ==2486==    by 0x5C3E1A: PortalRun (pquery.c:795)
    > > ==2486==    by 0x5BDC1A: exec_simple_query (postgres.c:1101)
    > > ==2486==    by 0x5C203F: PostgresMain (postgres.c:4071)
    > > ==2486==    by 0x525138: BackendRun (postmaster.c:4317)
    > > ==2486==    by 0x524848: BackendStartup (postmaster.c:3989)
    > > ==2486==    by 0x520C4A: ServerLoop (postmaster.c:1729)
    > > ==2486==    by 0x5201D9: PostmasterMain (postmaster.c:1337)
    > > ==2486==    by 0x45DFA6: main (main.c:228)
    > 
    > Hmmm, so I have a theory about what's going on, but no matter what I do I
    > can't trigger these valgrind failures. What switches are you using to start
    > valgrind? I'm using this:
    > 
    > valgrind --leak-check=no --undef-value-errors=yes \
    >   --expensive-definedness-checks=yes --track-origins=yes \
    >   --read-var-info=yes --gen-suppressions=all \
    >   --suppressions=src/tools/valgrind.supp --time-stamp=yes \
    >   --log-file=$HOME/pg-valgrind/%p.log --trace-children=yes \
    >   postgres --log_line_prefix="%m %p " --log_statement=all \
    >   --shared_buffers=64MB -D /home/user/tmp/data-valgrind 2>&1
    
    	--quiet \
             --error-exitcode=55 \
             --suppressions=${PG_SRC_DIR}/src/tools/valgrind.supp \
             --trace-children=yes --track-origins=yes --read-var-info=yes \
    	 --num-callers=20 \
             --leak-check=no \
    	 --gen-suppressions=all \
    
    the error-exitcode makes it a whole lot easier to see an error, because
    it triggers a crash-restart cycle at backend exit ;)
    
    Note that skink also finds the issue:
    https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=skink&dt=2017-03-26%2013%3A00%3A01&stg=check
    
    Did you compile postgres with valgrind support (-DUSE_VALGRIND / pg_config_manual.h)?
    
    - Andres
    
    
    
  5. Re: Valgrind failures caused by multivariate stats patch

    Tomas Vondra <tomas.vondra@2ndquadrant.com> — 2017-03-26T21:13:09Z

    On 03/26/2017 08:47 PM, Andres Freund wrote:
    > On 2017-03-26 20:38:52 +0200, Tomas Vondra wrote:
    >> ...
    >> Hmmm, so I have a theory about what's going on, but no matter what I do I
    >> can't trigger these valgrind failures. What switches are you using to start
    >> valgrind? I'm using this:
    >>
    >> valgrind --leak-check=no --undef-value-errors=yes \
    >>   --expensive-definedness-checks=yes --track-origins=yes \
    >>   --read-var-info=yes --gen-suppressions=all \
    >>   --suppressions=src/tools/valgrind.supp --time-stamp=yes \
    >>   --log-file=$HOME/pg-valgrind/%p.log --trace-children=yes \
    >>   postgres --log_line_prefix="%m %p " --log_statement=all \
    >>   --shared_buffers=64MB -D /home/user/tmp/data-valgrind 2>&1
    >
    > 	--quiet \
    >          --error-exitcode=55 \
    >          --suppressions=${PG_SRC_DIR}/src/tools/valgrind.supp \
    >          --trace-children=yes --track-origins=yes --read-var-info=yes \
    > 	 --num-callers=20 \
    >          --leak-check=no \
    > 	 --gen-suppressions=all \
    >
    > the error-exitcode makes it a whole lot easier to see an error, because
    > it triggers a crash-restart cycle at backend exit ;)
    >
    
    OK, this did the trick. And just as I suspected, it seems to be due to 
    doing memcpy+offsetof when serializing the statistic into a bytea. The 
    attached patch fixes that for me. Can you test it on your build?
    
    regards
    
    --
    Tomas Vondra                  http://www.2ndQuadrant.com
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
    
  6. Re: Valgrind failures caused by multivariate stats patch

    Alvaro Herrera <alvherre@2ndquadrant.com> — 2017-03-28T15:11:14Z

    Tomas Vondra wrote:
    
    > OK, this did the trick. And just as I suspected, it seems to be due to doing
    > memcpy+offsetof when serializing the statistic into a bytea. The attached
    > patch fixes that for me. Can you test it on your build?
    
    Buildfarm member skink confirms that this is fixed.  Thanks!
    
    -- 
    Álvaro Herrera                https://www.2ndQuadrant.com/
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services