Hi!

On 29.01.2025 10:02, John Naylor wrote:
This is done -- thanks for the report, and for testing.

It's good that this is done! But i still see the problem.

At ecb8226a in master with the same configure as in [1]
(with asserts) valgrind gives:
==00:00:00:23.937 285792== Conditional jump or move depends on uninitialised 
value(s)
==00:00:00:23.937 285792==    at 0x3084A3: fasthash_accum 
(hashfn_unstable.h:142)
==00:00:00:23.937 285792==    by 0x3084A3: fasthash_accum_cstring_aligned 
(hashfn_unstable.h:299)
==00:00:00:23.937 285792==    by 0x3084A3: fasthash_accum_cstring 
(hashfn_unstable.h:323)
==00:00:00:23.937 285792==    by 0x3084A3: spcachekey_hash (namespace.c:268)
==00:00:00:23.937 285792==    by 0x308A3C: nsphash_lookup (simplehash.h:836)
==00:00:00:23.937 285792==    by 0x308A3C: spcache_insert (namespace.c:394)
==00:00:00:23.937 285792==    by 0x3095D9: cachedNamespacePath 
(namespace.c:4251)
==00:00:00:23.937 285792==    by 0x3096C2: recomputeNamespacePath 
(namespace.c:4309)
==00:00:00:23.937 285792==    by 0x3097B3: RelnameGetRelid (namespace.c:890)
==00:00:00:23.937 285792==    by 0x30AF72: RangeVarGetRelidExtended 
(namespace.c:539)
==00:00:00:23.937 285792==    by 0x2F0738: objectNamesToOids (aclchk.c:701)
==00:00:00:23.937 285792==    by 0x2F5EFF: ExecuteGrantStmt (aclchk.c:425)
==00:00:00:23.937 285792==    by 0x65E2E7: ProcessUtilitySlow (utility.c:1812)
==00:00:00:23.937 285792==    by 0x65CCB2: standard_ProcessUtility 
(utility.c:969)
==00:00:00:23.937 285792==    by 0x65CF84: ProcessUtility (utility.c:523)
==00:00:00:23.937 285792==    by 0x65A426: PortalRunUtility (pquery.c:1152)

Please see backtrace at bt-with-asserts-Og.txt attached.
Without asserts it falls in similar way:
==00:00:00:23.391 271086== Conditional jump or move depends on uninitialised 
value(s)
==00:00:00:23.391 271086==    at 0x2BE8FE: fasthash_accum 
(hashfn_unstable.h:180)
==00:00:00:23.391 271086==    by 0x2BE8FE: fasthash_accum_cstring_aligned 
(hashfn_unstable.h:299)
==00:00:00:23.391 271086==    by 0x2BE8FE: fasthash_accum_cstring 
(hashfn_unstable.h:323)
==00:00:00:23.391 271086==    by 0x2BE8FE: spcachekey_hash (namespace.c:268)

See bt-wo-asserts-Og.txt

In addition the -O0 build with asserts gives an error in the
pg_rightmost_one_pos64(), not in the fasthash_accum():
==00:00:00:16.360 100422==    at 0x3424D6: pg_rightmost_one_pos64 
(pg_bitutils.h:148)
==00:00:00:16.360 100422==    by 0x342909: fasthash_accum_cstring_aligned 
(hashfn_unstable.h:298)
==00:00:00:16.360 100422==    by 0x3429AB: fasthash_accum_cstring 
(hashfn_unstable.h:323)
==00:00:00:16.360 100422==    by 0x342AFC: spcachekey_hash (namespace.c:268)
==00:00:00:16.360 100422==    by 0x3437C2: nsphash_lookup (simplehash.h:836)

See bt-with-asserts-O0.txt, please. It is clear as "word" contains 5 undefined 
bytes.
(Maybe compiler swallowed this line in -Og build.)
The previous two cases not so clear because valgrind decided that
the "remainder" in the fasthash_accum_cstring_aligned() was undefined.
It thinks that if the argument of __builtin_ctzl() contains some
undefined bytes then the result will be undefined although all rightmost
bits and the first non-zero bit are located in the defined bytes.
On the other hand the presence of the line "Assert(word != 0);"
in the pg_rightmost_one_pos64() already appears to be a
valid reason to use a valgrind-safe solution that will
not allow any undefined bits in its argument.

Besides i found that in the case described above it takes 214
asm instructions to perform "call 0xXXX <spcachekey_hash>" for
existing implementation in the master while the patch from [2]
was a bit faster - 211 instructions.
So i rebased it on the current master and kindly ask to take
it into account as well.

With the best regards,

--
Anton A. Melnikov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

[1] 
https://www.postgresql.org/message-id/a3a959f6-14b8-4819-ac04-eaf2aa2e868d%40postgrespro.ru
[2] https://www.postgresql.org/message-id/0647027b-9c9a-4f16-8f7c-3f9f3eb9451e%40postgrespro.ru
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000003084a3 in fasthash_accum (len=2, k=0x6e312c8 "og", hs=<synthetic 
pointer>) at ../../../src/include/common/hashfn_unstable.h:142
142             Assert(len <= FH_SIZEOF_ACCUM);
(gdb) bt full
#0  0x00000000003084a3 in fasthash_accum (len=2, k=0x6e312c8 "og", 
hs=<synthetic pointer>) at ../../../src/include/common/hashfn_unstable.h:142
        lower_four = <optimized out>
        lower_four = <optimized out>
#1  fasthash_accum_cstring_aligned (str=0x6e312c8 "og", hs=<synthetic pointer>) 
at ../../../src/include/common/hashfn_unstable.h:299
        start = 0x6e312c0 "pg_catalog"
        remainder = 2
        zero_byte_low = 9259542121126297600
        start = <optimized out>
        remainder = <optimized out>
        zero_byte_low = <optimized out>
        chunk = <optimized out>
#2  fasthash_accum_cstring (str=0x6e312c0 "pg_catalog", hs=<synthetic pointer>) 
at ../../../src/include/common/hashfn_unstable.h:323
        len = <optimized out>
        len_check = 10
        hs_check = {accum = <optimized out>, hash = <optimized out>}
        len = <optimized out>
        len_check = <optimized out>
        hs_check = {accum = <optimized out>, hash = <optimized out>}
#3  spcachekey_hash (key=...) at namespace.c:268
        hs = {accum = <optimized out>, hash = <optimized out>}
        sp_len = <optimized out>
#4  0x0000000000308a3d in nsphash_lookup (key=..., tb=0x6e3f0c0) at 
../../../src/include/lib/simplehash.h:836
        hash = <optimized out>
        hash = <optimized out>
#5  spcache_insert (searchPath=searchPath@entry=0x6e312c0 "pg_catalog", 
roleid=roleid@entry=10) at namespace.c:394
        entry = <optimized out>
        cachekey = {searchPath = <optimized out>, roleid = <optimized out>}
#6  0x00000000003095da in cachedNamespacePath (searchPath=0x6e312c0 
"pg_catalog", roleid=roleid@entry=10) at namespace.c:4251
        oldcxt = <optimized out>
        entry = <optimized out>
#7  0x00000000003096c3 in recomputeNamespacePath () at namespace.c:4309
        roleid = 10
        pathChanged = <optimized out>
        entry = <optimized out>
#8  0x00000000003097b4 in RelnameGetRelid (relname=0x6e03548 "pg_authid") at 
namespace.c:890
        relid = <optimized out>
        l = <optimized out>
#9  0x000000000030af73 in RangeVarGetRelidExtended (relation=0x6e03568, 
lockmode=lockmode@entry=1, flags=flags@entry=0, callback=callback@entry=0x0, 
callback_arg=callback_arg@entry=0x0) at namespace.c:539
        inval_count = 0
        relId = <optimized out>
        oldRelId = 0
        retry = false
        missing_ok = false
        __func__ = "RangeVarGetRelidExtended"
#10 0x00000000002f0739 in objectNamesToOids (objtype=OBJECT_TABLE, 
objnames=0x6e035b8, is_grant=false) at aclchk.c:701
        relvar = <optimized out>
        relOid = <optimized out>
        cell__state = {l = <optimized out>, i = <optimized out>}
        objects = 0x0
        cell = <optimized out>
        lockmode = 1
#11 0x00000000002f5f00 in ExecuteGrantStmt (stmt=stmt@entry=0x6e03680) at 
aclchk.c:425
        istmt = {is_grant = false, objtype = OBJECT_TABLE, objects = 0x0, 
all_privs = 48, privileges = 115357312, col_privs = 0x1ffeffea90, grantees = 
0x7abd11 <EventCacheLookup+50>, grant_option = 255, behavior = (DROP_CASCADE | 
unknown: 0xfffffffe)}
        cell = <optimized out>
        errormsg = <optimized out>
        all_privileges = <optimized out>
        __func__ = "ExecuteGrantStmt"
#12 0x000000000065e2e8 in ProcessUtilitySlow (pstate=pstate@entry=0x6f9a490, 
pstmt=pstmt@entry=0x6e03730, queryString=queryString@entry=0x6e02b60 "REVOKE 
ALL ON pg_authid FROM public;\n", 
context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=params@entry=0x0, 
queryEnv=queryEnv@entry=0x0, dest=0xb69740 <debugtupDR>, qc=0x1ffefff0a0) at 
utility.c:1812
        _save_exception_stack = 0x1ffeffef60
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {117023888, 2018119622333043965, 0, 
115357488, 115357312, 0, 2018119622479844605, 2035117059389658365}, 
__mask_was_saved = 0, __saved_mask = {__val = {117023872, 16, 0, 0, 0, 
1296236544, 117024128, 16, 0, 0, 0, 1296236544, 117023872, 16, 0, 0}}}}
        _do_rethrow = false
        parsetree = 0x6e03680
        isTopLevel = true
        isCompleteQuery = true
        needCleanup = false
        commandCollected = false
        address = {classId = 4278184864, objectId = 31, objectSubId = -16782448}
        secondaryObject = {classId = 0, objectId = 0, objectSubId = 0}
        __func__ = "ProcessUtilitySlow"
#13 0x000000000065ccb3 in standard_ProcessUtility (pstmt=0x6e03730, 
queryString=0x6e02b60 "REVOKE ALL ON pg_authid FROM public;\n", 
readOnlyTree=<optimized out>, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, 
queryEnv=0x0, dest=0xb69740 <debugtupDR>, qc=0x1ffefff0a0) at utility.c:969
        stmt = 0x6e03680
        parsetree = 0x6e03680
        isTopLevel = true
        isAtomicContext = false
        pstate = 0x6f9a490
        readonly_flags = <optimized out>
        __func__ = "standard_ProcessUtility"
#14 0x000000000065cf85 in ProcessUtility (pstmt=pstmt@entry=0x6e03730, 
queryString=<optimized out>, readOnlyTree=<optimized out>, context=<optimized 
out>, params=<optimized out>, queryEnv=<optimized out>, dest=0xb69740 
<debugtupDR>, qc=0x1ffefff0a0) at utility.c:523
No locals.
#15 0x000000000065a427 in PortalRunUtility (portal=portal@entry=0x6fbaaa0, 
pstmt=pstmt@entry=0x6e03730, isTopLevel=isTopLevel@entry=true, 
setHoldSnapshot=setHoldSnapshot@entry=false, dest=dest@entry=0xb69740 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:1152
No locals.
#16 0x000000000065a72d in PortalRunMulti (portal=portal@entry=0x6fbaaa0, 
isTopLevel=isTopLevel@entry=true, setHoldSnapshot=setHoldSnapshot@entry=false, 
dest=dest@entry=0xb69740 <debugtupDR>, altdest=altdest@entry=0xb69740 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:1309
        pstmt = 0x6e03730
        stmtlist_item__state = {l = <optimized out>, i = <optimized out>}
        active_snapshot_set = false
        stmtlist_item = 0x6e03a98
#17 0x000000000065ab2c in PortalRun (portal=portal@entry=0x6fbaaa0, 
count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=true, 
dest=dest@entry=0xb69740 <debugtupDR>, altdest=altdest@entry=0xb69740 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:787
        _save_exception_stack = 0x1ffefff1b0
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {0, 2018119622158980349, 117156512, 
115357392, 0, 115357440, 2018119622349821181, 2035117056493622525}, 
__mask_was_saved = 0, __saved_mask = {__val = {117164768, 10556638, 1, 
137422172183, 115357440, 137422172160, 8214643, 117156512, 10556638, 1, 1, 
137422172224, 8389872, 137422172224, 10175009201158647808, 115357464}}}}
        _do_rethrow = <optimized out>
        result = <optimized out>
        nprocessed = <optimized out>
        saveTopTransactionResourceOwner = 0x6ec93b8
        saveTopTransactionContext = 0x6fe8d00
        saveActivePortal = 0x0
        saveResourceOwner = 0x6ec93b8
        savePortalContext = 0x0
        saveMemoryContext = 0x6fe8d00
        __func__ = "PortalRun"
#18 0x000000000065693a in exec_simple_query 
(query_string=query_string@entry=0x6e02b60 "REVOKE ALL ON pg_authid FROM 
public;\n") at postgres.c:1271
        cmdtaglen = 6
        snapshot_set = <optimized out>
        per_parsetree_context = 0x0
        plantree_list = 0x6e03a80
        parsetree = 0x6e036d0
        commandTag = <optimized out>
        qc = {commandTag = CMDTAG_UNKNOWN, nprocessed = 0}
        querytree_list = <optimized out>
        portal = 0x6fbaaa0
        receiver = 0xb69740 <debugtupDR>
        format = 0
        cmdtagname = <optimized out>
        parsetree_item__state = {l = <optimized out>, i = <optimized out>}
        dest = DestDebug
        oldcontext = 0x6fe8d00
        parsetree_list = 0x6e03700
        parsetree_item = 0x6e03718
        save_log_statement_stats = false
        was_logged = false
        use_implicit_block = false
        msec_str = "`+\340\006\000\000\000\000`\361\377\376\037\000\000\000\f", 
'\000' <repeats 14 times>
        __func__ = "exec_simple_query"
#19 0x0000000000658af5 in PostgresMain (dbname=<optimized out>, 
username=username@entry=0x6e16130 "postgres") at postgres.c:4691
        query_string = 0x6e02b60 "REVOKE ALL ON pg_authid FROM public;\n"
        firstchar = <optimized out>
        input_message = {data = 0x6e02b60 "REVOKE ALL ON pg_authid FROM 
public;\n", len = 38, maxlen = 1024, cursor = 38}
        local_sigjmp_buf = {{__jmpbuf = {115584336, 2018119622223992061, 
115433776, 12, 0, 0, 2018119622205117693, 2035117057862145277}, 
__mask_was_saved = 1, __saved_mask = {__val = {0, 137422172784, 8383051, 
137422172816, 18446744073709551615, 4869, 115337696, 116000232, 17408, 0, 0, 
12, 10175009201158647808, 115337696, 115433776, 137422172816}}}}
        send_ready_for_query = false
        idle_in_transaction_timeout_enabled = false
        idle_session_timeout_enabled = false
        __func__ = "PostgresMain"
#20 0x0000000000659044 in PostgresSingleUserMain (argc=argc@entry=12, 
argv=argv@entry=0x6dfe520, username=0x6e16130 "postgres") at postgres.c:4130
        dbname = 0x6e3ad50 "template1"
        __func__ = "PostgresSingleUserMain"
#21 0x00000000004ad10a in main (argc=12, argv=0x6dfe520) at main.c:226
        do_check_root = <optimized out>
        dispatch_option = <optimized out>
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000002be8fe in fasthash_accum (len=2, k=0x6e312c8 "og", hs=<synthetic 
pointer>) at ../../../src/include/common/hashfn_unstable.h:180
180             switch (len)
(gdb) bt full
#0  0x00000000002be8fe in fasthash_accum (len=2, k=0x6e312c8 "og", 
hs=<synthetic pointer>) at ../../../src/include/common/hashfn_unstable.h:180
        lower_four = <optimized out>
        lower_four = <optimized out>
#1  fasthash_accum_cstring_aligned (str=0x6e312c8 "og", hs=<optimized out>) at 
../../../src/include/common/hashfn_unstable.h:299
        start = <optimized out>
        remainder = 2
        zero_byte_low = 9259542121126297600
        start = <optimized out>
        remainder = <optimized out>
        zero_byte_low = <optimized out>
        chunk = <optimized out>
#2  fasthash_accum_cstring (str=0x6e312c0 "pg_catalog", hs=<synthetic pointer>) 
at ../../../src/include/common/hashfn_unstable.h:323
        len = <optimized out>
        len = <optimized out>
#3  spcachekey_hash (key=...) at namespace.c:268
        hs = {accum = <optimized out>, hash = <optimized out>}
        sp_len = <optimized out>
        hs = {accum = <optimized out>, hash = <optimized out>}
        sp_len = <optimized out>
#4  nsphash_lookup (key=..., tb=0x6e3f0c0) at 
../../../src/include/lib/simplehash.h:836
        hash = <optimized out>
        hash = <optimized out>
#5  spcache_insert (searchPath=searchPath@entry=0x6e312c0 "pg_catalog", 
roleid=roleid@entry=10) at namespace.c:394
        entry = <optimized out>
        cachekey = {searchPath = <optimized out>, roleid = <optimized out>}
#6  0x00000000002bfc5b in cachedNamespacePath (searchPath=0x6e312c0 
"pg_catalog", roleid=roleid@entry=10) at namespace.c:4251
        oldcxt = <optimized out>
        entry = <optimized out>
#7  0x00000000002bfd44 in recomputeNamespacePath () at namespace.c:4309
        roleid = 10
        pathChanged = <optimized out>
        entry = <optimized out>
#8  0x00000000002bfe35 in RelnameGetRelid (relname=0x6e03548 "pg_authid") at 
namespace.c:890
        relid = <optimized out>
        l = <optimized out>
#9  0x00000000002c14e1 in RangeVarGetRelidExtended (relation=0x6e03568, 
lockmode=lockmode@entry=1, flags=flags@entry=0, callback=callback@entry=0x0, 
callback_arg=callback_arg@entry=0x0) at namespace.c:539
        inval_count = 0
        relId = <optimized out>
        oldRelId = 0
        retry = false
        missing_ok = false
        __func__ = "RangeVarGetRelidExtended"
#10 0x00000000002a87dc in objectNamesToOids (objtype=<optimized out>, 
objnames=0x6e035b8, is_grant=false) at aclchk.c:701
        relvar = <optimized out>
        relOid = <optimized out>
        cell__state = {l = <optimized out>, i = <optimized out>}
        objects = 0x0
        cell = <optimized out>
        lockmode = 1
#11 0x00000000002adbf9 in ExecuteGrantStmt (stmt=stmt@entry=0x6e03680) at 
aclchk.c:425
        istmt = {is_grant = false, objtype = OBJECT_TABLE, objects = 0x0, 
all_privs = 48, privileges = 115357312, col_privs = 0x1ffeffea90, grantees = 
0x6e82cb <EventCacheLookup+50>, grant_option = 255, behavior = (DROP_CASCADE | 
unknown: 0xfffffffe)}
        cell = <optimized out>
        errormsg = <optimized out>
        all_privileges = <optimized out>
        __func__ = "ExecuteGrantStmt"
#12 0x00000000005b2c30 in ProcessUtilitySlow (pstate=pstate@entry=0x6f9a490, 
pstmt=pstmt@entry=0x6e03730, queryString=queryString@entry=0x6e02b60 "REVOKE 
ALL ON pg_authid FROM public;\n", 
context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=params@entry=0x0, 
queryEnv=queryEnv@entry=0x0, dest=0xa5d760 <debugtupDR>, qc=0x1ffefff0a0) at 
utility.c:1812
        _save_exception_stack = 0x1ffeffef60
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {117023888, -2063849044308330718, 0, 
115357488, 115357312, 0, -2063849044429965534, -2061450765248563422}, 
__mask_was_saved = 0, __saved_mask = {__val = {117023872, 16, 0, 0, 0, 
1296236544, 117024128, 16, 0, 0, 0, 1296236544, 117023872, 16, 0, 0}}}}
        _do_rethrow = false
        parsetree = 0x6e03680
        isTopLevel = true
        isCompleteQuery = true
        needCleanup = false
        commandCollected = false
        address = {classId = 4278184864, objectId = 31, objectSubId = -16782448}
        secondaryObject = {classId = 0, objectId = 0, objectSubId = 0}
        __func__ = "ProcessUtilitySlow"
#13 0x00000000005b180d in standard_ProcessUtility (pstmt=0x6e03730, 
queryString=0x6e02b60 "REVOKE ALL ON pg_authid FROM public;\n", 
readOnlyTree=<optimized out>, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, 
queryEnv=0x0, dest=0xa5d760 <debugtupDR>, qc=0x1ffefff0a0) at utility.c:969
        stmt = 0x6e03680
        parsetree = 0x6e03680
        isTopLevel = true
        isAtomicContext = false
        pstate = 0x6f9a490
        readonly_flags = <optimized out>
        __func__ = "standard_ProcessUtility"
#14 0x00000000005b1a5f in ProcessUtility (pstmt=pstmt@entry=0x6e03730, 
queryString=<optimized out>, readOnlyTree=<optimized out>, context=<optimized 
out>, params=<optimized out>, queryEnv=<optimized out>, dest=0xa5d760 
<debugtupDR>, qc=0x1ffefff0a0) at utility.c:523
No locals.
#15 0x00000000005af30c in PortalRunUtility (portal=portal@entry=0x6fbaaa0, 
pstmt=pstmt@entry=0x6e03730, isTopLevel=isTopLevel@entry=true, 
setHoldSnapshot=setHoldSnapshot@entry=false, dest=dest@entry=0xa5d760 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:1152
No locals.
#16 0x00000000005af55c in PortalRunMulti (portal=portal@entry=0x6fbaaa0, 
isTopLevel=isTopLevel@entry=true, setHoldSnapshot=setHoldSnapshot@entry=false, 
dest=dest@entry=0xa5d760 <debugtupDR>, altdest=altdest@entry=0xa5d760 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:1309
        pstmt = 0x6e03730
        stmtlist_item__state = {l = <optimized out>, i = <optimized out>}
        active_snapshot_set = false
        stmtlist_item = 0x6e03a98
#17 0x00000000005af85f in PortalRun (portal=portal@entry=0x6fbaaa0, 
count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=true, 
dest=dest@entry=0xa5d760 <debugtupDR>, altdest=altdest@entry=0xa5d760 
<debugtupDR>, qc=qc@entry=0x1ffefff0a0) at pquery.c:787
        _save_exception_stack = 0x1ffefff1b0
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {0, -2063849044213958878, 10868576, 
115357392, 0, 115357440, -2063849044291553502, -2061450777208359134}, 
__mask_was_saved = 0, __saved_mask = {__val = {117164768, 9483622, 1, 
137422172183, 115357440, 137422172160, 7397230, 117156512, 9483622, 1, 1, 
137422172224, 7547098, 115354464, 2504669645130645504, 117156512}}}}
        _do_rethrow = <optimized out>
        result = <optimized out>
        nprocessed = <optimized out>
        saveTopTransactionResourceOwner = 0x6ec93b8
        saveTopTransactionContext = 0x6fe8d00
        saveActivePortal = 0x0
        saveResourceOwner = 0x6ec93b8
        savePortalContext = 0x0
        saveMemoryContext = 0x6fe8d00
        __func__ = "PortalRun"
#18 0x00000000005abae2 in exec_simple_query 
(query_string=query_string@entry=0x6e02b60 "REVOKE ALL ON pg_authid FROM 
public;\n") at postgres.c:1271
        cmdtaglen = 6
        snapshot_set = <optimized out>
        per_parsetree_context = 0x0
        plantree_list = <optimized out>
        parsetree = 0x6e036d0
        commandTag = CMDTAG_REVOKE
        qc = {commandTag = CMDTAG_UNKNOWN, nprocessed = 0}
        querytree_list = <optimized out>
        portal = 0x6fbaaa0
        receiver = 0xa5d760 <debugtupDR>
        format = 0
        cmdtagname = <optimized out>
        parsetree_item__state = {l = <optimized out>, i = <optimized out>}
        dest = DestDebug
        oldcontext = 0x6fe8d00
        parsetree_list = 0x6e03700
        parsetree_item = 0x6e03718
        save_log_statement_stats = false
        was_logged = false
        use_implicit_block = false
        msec_str = "`+\340\006\000\000\000\000`\361\377\376\037\000\000\000\f", 
'\000' <repeats 14 times>
        __func__ = "exec_simple_query"
#19 0x00000000005adc2c in PostgresMain (dbname=<optimized out>, 
username=username@entry=0x6e16130 "postgres") at postgres.c:4691
        query_string = 0x6e02b60 "REVOKE ALL ON pg_authid FROM public;\n"
        firstchar = <optimized out>
        input_message = {data = 0x6e02b60 "REVOKE ALL ON pg_authid FROM 
public;\n", len = 38, maxlen = 1024, cursor = 38}
        local_sigjmp_buf = {{__jmpbuf = {115584336, -2063849044165724382, 
115433776, 12, 0, 0, -2063849044184598750, -2061450776201464030}, 
__mask_was_saved = 1, __saved_mask = {__val = {0, 1006, 18446744073709551615, 
4869, 115337696, 116000232, 17408, 0, 0, 1048564, 2504669645130645504, 12, 
115337696, 115433776, 12, 137422172816}}}}
        send_ready_for_query = false
        idle_in_transaction_timeout_enabled = false
        idle_session_timeout_enabled = false
        __func__ = "PostgresMain"
#20 0x00000000005ae132 in PostgresSingleUserMain (argc=argc@entry=12, 
argv=argv@entry=0x6dfe520, username=0x6e16130 "postgres") at postgres.c:4130
        dbname = 0x6e3ad50 "template1"
        __func__ = "PostgresSingleUserMain"
#21 0x0000000000438ef2 in main (argc=12, argv=0x6dfe520) at main.c:226
        do_check_root = <optimized out>
        dispatch_option = <optimized out>
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000003424d6 in pg_rightmost_one_pos64 (word=9259542121126297600) at 
../../../src/include/port/pg_bitutils.h:148
148             Assert(word != 0);
(gdb) bt full
#0  0x00000000003424d6 in pg_rightmost_one_pos64 (word=9259542121126297600) at 
../../../src/include/port/pg_bitutils.h:148
No locals.
#1  0x000000000034290a in fasthash_accum_cstring_aligned (hs=0x1ffeffe5b0, 
str=0x6e312c8 "og") at ../../../src/include/common/hashfn_unstable.h:298
        start = 0x6e312c0 "pg_catalog"
        remainder = 115544768
        zero_byte_low = 9259542121126297600
#2  0x00000000003429ac in fasthash_accum_cstring (hs=0x1ffeffe5b0, 
str=0x6e312c0 "pg_catalog") at ../../../src/include/common/hashfn_unstable.h:323
        len = 0
        len_check = 10
        hs_check = {accum = 26479, hash = 4431955251355380062}
#3  0x0000000000342afd in spcachekey_hash (key=...) at namespace.c:268
        hs = {accum = 7809651190464997232, hash = 9554609706923330532}
        sp_len = 0
#4  0x00000000003437c3 in nsphash_lookup (tb=0x71e5e00, key=...) at 
../../../src/include/lib/simplehash.h:836
        hash = 0
#5  0x00000000003439d6 in spcache_insert (searchPath=0x6e312c0 "pg_catalog", 
roleid=10) at namespace.c:394
        entry = 0x71e5d00
        cachekey = {searchPath = 0x6e312c0 "pg_catalog", roleid = 10}
#6  0x0000000000349b89 in cachedNamespacePath (searchPath=0x6e312c0 
"pg_catalog", roleid=10) at namespace.c:4251
        oldcxt = 0x6ec4f88
        entry = 0x6fd8858
#7  0x0000000000349cc2 in recomputeNamespacePath () at namespace.c:4309
        roleid = 10
        pathChanged = false
        entry = 0xc0a58cfefe9b00
#8  0x000000000034458e in RelnameGetRelid (relname=0x6efff68 "pg_authid") at 
namespace.c:890
        relid = 3466
        l = 0x100000000000000
#9  0x0000000000343ccc in RangeVarGetRelidExtended (relation=0x6efff88, 
lockmode=1, flags=0, callback=0x0, callback_arg=0x0) at namespace.c:539
        inval_count = 0
        relId = 4278183792
        oldRelId = 0
        retry = false
        missing_ok = false
        __func__ = "RangeVarGetRelidExtended"
#10 0x00000000003240ed in objectNamesToOids (objtype=OBJECT_TABLE, 
objnames=0x6efffd8, is_grant=false) at aclchk.c:701
        relvar = 0x6efff88
        relOid = 0
        cell__state = {l = 0x6efffd8, i = 0}
        objects = 0x0
        cell = 0x6effff0
        lockmode = 1
#11 0x0000000000323814 in ExecuteGrantStmt (stmt=0x6f000a0) at aclchk.c:425
        istmt = {is_grant = false, objtype = OBJECT_TABLE, objects = 0x0, 
all_privs = 144, privileges = 4358515, col_privs = 0x1ffeffe8b0, grantees = 
0x42801d <EventTriggerBeginCompleteQuery+17>, grant_option = 112, behavior = 
DROP_RESTRICT}
        cell = 0x0
        errormsg = 0x71b4ad0 "~", '\177' <repeats 199 times>...
        all_privileges = 137422170220
        __func__ = "ExecuteGrantStmt"
#12 0x00000000007cf762 in ProcessUtilitySlow (pstate=0x71b49e0, 
pstmt=0x6f00150, queryString=0x6eff580 "REVOKE ALL ON pg_authid FROM 
public;\n", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, 
dest=0xdfcca0 <debugtupDR>, qc=0x1ffefff090) at utility.c:1812
        _save_exception_stack = 0x1ffeffef10
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {0, 4259416265021831164, 1991968, 
137422173200, 0, 0, 4259416265145563132, 4261392063212664828}, __mask_was_saved 
= 0, __saved_mask = {__val = {0, 1296236544, 117345944, 24, 0, 0, 0, 
1296236544, 117345824, 16, 0, 0, 0, 0, 54225220520549120, 137422171344}}}}
        _do_rethrow = false
        parsetree = 0x6f000a0
        isTopLevel = true
        isCompleteQuery = true
        needCleanup = false
        commandCollected = false
        address = {classId = 117345944, objectId = 0, objectSubId = 1}
        secondaryObject = {classId = 0, objectId = 0, objectSubId = 0}
        __func__ = "ProcessUtilitySlow"
#13 0x00000000007cd8a4 in standard_ProcessUtility (pstmt=0x6f00150, 
queryString=0x6eff580 "REVOKE ALL ON pg_authid FROM public;\n", 
readOnlyTree=false, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, 
dest=0xdfcca0 <debugtupDR>, qc=0x1ffefff090) at utility.c:969
        stmt = 0x6f000a0
        parsetree = 0x6f000a0
        isTopLevel = true
        isAtomicContext = false
        pstate = 0x71b49e0
        readonly_flags = 0
        __func__ = "standard_ProcessUtility"
#14 0x00000000007ccbc1 in ProcessUtility (pstmt=0x6f00150, 
queryString=0x6eff580 "REVOKE ALL ON pg_authid FROM public;\n", 
readOnlyTree=false, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, 
dest=0xdfcca0 <debugtupDR>, qc=0x1ffefff090) at utility.c:523
No locals.
#15 0x00000000007cb624 in PortalRunUtility (portal=0x6fbaaa0, pstmt=0x6f00150, 
isTopLevel=true, setHoldSnapshot=false, dest=0xdfcca0 <debugtupDR>, 
qc=0x1ffefff090) at pquery.c:1152
No locals.
#16 0x00000000007cb89e in PortalRunMulti (portal=0x6fbaaa0, isTopLevel=true, 
setHoldSnapshot=false, dest=0xdfcca0 <debugtupDR>, altdest=0xdfcca0 
<debugtupDR>, qc=0x1ffefff090) at pquery.c:1309
        pstmt = 0x6f00150
        stmtlist_item__state = {l = 0x6f004a0, i = 0}
        active_snapshot_set = false
        stmtlist_item = 0x6f004b8
#17 0x00000000007caced in PortalRun (portal=0x6fbaaa0, 
count=9223372036854775807, isTopLevel=true, dest=0xdfcca0 <debugtupDR>, 
altdest=0xdfcca0 <debugtupDR>, qc=0x1ffefff090) at pquery.c:787
        _save_exception_stack = 0x1ffefff1d0
        _save_context_stack = 0x0
        _local_sigjmp_buf = {{__jmpbuf = {0, 4259416265049094140, 1991968, 
137422173200, 0, 0, 4259416265072162812, 4261392059674507260}, __mask_was_saved 
= 0, __saved_mask = {__val = {10311311, 64, 54225220520549120, 137422172064, 
10315239, 137422172103, 4411134904, 13045126, 119228640, 137422172128, 
10546663, 0, 137422172174, 4294967296, 117345536, 137422173200}}}}
        _do_rethrow = false
        result = false
        nprocessed = 137422173200
        saveTopTransactionResourceOwner = 0x6ec93b8
        saveTopTransactionContext = 0x6fe8d00
        saveActivePortal = 0x0
        saveResourceOwner = 0x6ec93b8
        savePortalContext = 0x0
        saveMemoryContext = 0x6fe8d00
        __func__ = "PortalRun"
#18 0x00000000007c3750 in exec_simple_query (query_string=0x6eff580 "REVOKE ALL 
ON pg_authid FROM public;\n") at postgres.c:1271
        cmdtaglen = 6
        snapshot_set = false
        per_parsetree_context = 0x0
        plantree_list = 0x6f004a0
        parsetree = 0x6f000f0
        commandTag = CMDTAG_REVOKE
        qc = {commandTag = CMDTAG_UNKNOWN, nprocessed = 0}
        querytree_list = 0x6f00470
        portal = 0x6fbaaa0
        receiver = 0xdfcca0 <debugtupDR>
        format = 0
        cmdtagname = 0xc09ced "REVOKE"
        parsetree_item__state = {l = 0x6f00120, i = 0}
        dest = DestDebug
        oldcontext = 0x6fe8d00
        parsetree_list = 0x6f00120
        parsetree_item = 0x6f00138
        save_log_statement_stats = false
        was_logged = false
        use_implicit_block = false
        msec_str = 
"\320\360\377\376\037\000\000\000\020\263W\000\000\000\000\000\061\243\247\300\357\320\002\000\200\361\377\376\037\000\000"
        __func__ = "exec_simple_query"
#19 0x00000000007c8b38 in PostgresMain (dbname=0x6e3ad50 "template1", 
username=0x6e16130 "postgres") at postgres.c:4691
        query_string = 0x6eff580 "REVOKE ALL ON pg_authid FROM public;\n"
        firstchar = 81
        input_message = {data = 0x6eff580 "REVOKE ALL ON pg_authid FROM 
public;\n", len = 38, maxlen = 1024, cursor = 38}
        local_sigjmp_buf = {{__jmpbuf = {10849024, 4259416265479010300, 
1991968, 137422173200, 0, 0, 4259416265418192892, 4261392060253976572}, 
__mask_was_saved = 1, __saved_mask = {__val = {0, 115337696, 116000232, 4869, 
115337696, 116000232, 17408, 0, 115337696, 0, 115337696, 137422172816, 7970104, 
0, 115337696, 137422172848}}}}
        send_ready_for_query = false
        idle_in_transaction_timeout_enabled = false
        idle_session_timeout_enabled = false
        __func__ = "PostgresMain"
#20 0x00000000007c810c in PostgresSingleUserMain (argc=12, argv=0x6dfe520, 
username=0x6e16130 "postgres") at postgres.c:4130
        dbname = 0x6e3ad50 "template1"
        __func__ = "PostgresSingleUserMain"
#21 0x000000000057c202 in main (argc=12, argv=0x6dfe520) at main.c:226
        do_check_root = true
        dispatch_option = DISPATCH_SINGLE
From a04e825e776ebb5684a94a310b1dc2c54e515d0c Mon Sep 17 00:00:00 2001
From: "Anton A. Melnikov" <a.melni...@postgrespro.ru>
Date: Wed, 12 Feb 2025 20:22:45 +0300
Subject: [PATCH] Use valgrind-safe code to find a number of rightmost zero 
 bytes.

---
 src/include/common/hashfn_unstable.h | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/include/common/hashfn_unstable.h b/src/include/common/hashfn_unstable.h
index e07c0226c1f..82158f0d9c3 100644
--- a/src/include/common/hashfn_unstable.h
+++ b/src/include/common/hashfn_unstable.h
@@ -255,7 +255,7 @@ static inline size_t
 fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str)
 {
 	const char *const start = str;
-	size_t		remainder;
+	size_t		remainder = 0;
 	uint64		zero_byte_low;
 
 	Assert(PointerIsAligned(start, uint64));
@@ -291,11 +291,18 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str)
 	}
 
 	/*
-	 * The byte corresponding to the NUL will be 0x80, so the rightmost bit
-	 * position will be in the range 7, 15, ..., 63. Turn this into byte
-	 * position by dividing by 8.
+	 * The byte corresponding to the NUL terminator will be the rightmost 0x80.
+	 * pAll zero bytes to the right of it correspond to the tail of the string.
+	 * It remains to count them.
 	 */
-	remainder = pg_rightmost_one_pos64(zero_byte_low) / BITS_PER_BYTE;
+	while ((zero_byte_low & 0xFF) == 0)
+	{
+		zero_byte_low >>= 8;
+		++remainder;
+	}
+
+	Assert(remainder != 0);
+
 	fasthash_accum(hs, str, remainder);
 	str += remainder;
 
-- 
2.48.1

Reply via email to