Thread: BUG #15653: pg_detoast_datum_packed problem
The following bug has been logged on the website: Bug reference: 15653 Logged by: Vladimir Kokovic Email address: vladimir.kokovic@gmail.com PostgreSQL version: Unsupported/Unknown Operating system: linux manjaro Description: This bug I have to report only for sentimental reasons because vkBytea system exists since the version of PostgreSQL 7.4! vkBytea system serves to restore all elemental PostgreSQL types in bytea form. It survived all versions in the meantime so that current GIT HEAD would report SIGSEGV to the pg_bvarchar method. My impression is that the problem is in the method pg_detoast_datum_packed but i do not understand the reason why. select * return all rows OK. The complete primer and source in tar.gz will be sent later.
Hi, GDB BACKTRACE ------------- GNU gdb (GDB) 8.2.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... vk qt5printers vk wx5printers vk libpython sys.version_info(major=3, minor=7, micro=2, releaselevel='final', serial=0) Reading symbols from /mnt/sdd1/home/src/postgresql-devel/20190222/bin/postgres...done. [New LWP 4815] [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/libthread_db.so.1". Core was generated by `postgres: vlada ispp-pionir-test ::1(33336) SELECT '. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x00007f8888d24f10 in __memcpy_ssse3 () from /usr/lib/libc.so.6 (gdb) bt #0 0x00007f8888d24f10 in __memcpy_ssse3 () from /usr/lib/libc.so.6 #1 0x00007f8889e615ce in pg_bvarchar (fcinfo=0x560c6689fa40) at vkBytea.c:137 #2 0x0000560c6503478c in ExecInterpExpr (state=0x560c6689f488, econtext=0x560c6689e910, isnull=0x7ffe0538847f) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execExprInterp.c:649 #3 0x0000560c6503672b in ExecInterpExprStillValid (state=0x560c6689f488, econtext=0x560c6689e910, isNull=0x7ffe0538847f) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execExprInterp.c:1769 #4 0x0000560c6504ccad in ExecEvalExprSwitchContext (state=0x560c6689f488, econtext=0x560c6689e910, isNull=0x7ffe0538847f) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/include/executor/executor.h:308 #5 0x0000560c6504cddd in ExecQual (state=0x560c6689f488, econtext=0x560c6689e910) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/include/executor/executor.h:377 #6 0x0000560c6504d0d2 in ExecScan (node=0x560c6689e7f8, accessMtd=0x560c65080e57 <SeqNext>, recheckMtd=0x560c65080f20 <SeqRecheck>) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execScan.c:190 #7 0x0000560c65080f6e in ExecSeqScan (pstate=0x560c6689e7f8) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/nodeSeqscan.c:129 #8 0x0000560c6504ad76 in ExecProcNodeFirst (node=0x560c6689e7f8) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execProcnode.c:445 #9 0x0000560c65082510 in ExecProcNode (node=0x560c6689e7f8) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/include/executor/executor.h:241 #10 0x0000560c65082656 in ExecSort (pstate=0x560c6689e5e0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/nodeSort.c:107 #11 0x0000560c6504ad76 in ExecProcNodeFirst (node=0x560c6689e5e0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execProcnode.c:445 #12 0x0000560c6503f1f9 in ExecProcNode (node=0x560c6689e5e0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/include/executor/executor.h:241 #13 0x0000560c65041be1 in ExecutePlan (estate=0x560c6689e388, planstate=0x560c6689e5e0, use_parallel_mode=false, operation=CMD_SELECT, sendTuples=true, numberTuples=0, direction=ForwardScanDirection, dest=0x560c668ef3c8, execute_once=true) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execMain.c:1644 #14 0x0000560c6503f871 in standard_ExecutorRun (queryDesc=0x560c6693aab8, direction=ForwardScanDirection, count=0, execute_once=true) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execMain.c:362 #15 0x0000560c6503f695 in ExecutorRun (queryDesc=0x560c6693aab8, direction=ForwardScanDirection, count=0, execute_once=true) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/executor/execMain.c:306 #16 0x0000560c65256540 in PortalRunSelect (portal=0x560c66824048, forward=true, count=0, dest=0x560c668ef3c8) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/tcop/pquery.c:929 --Type <RET> for more, q to quit, c to continue without paging-- #17 0x0000560c6525615f in PortalRun (portal=0x560c66824048, count=9223372036854775807, isTopLevel=true, run_once=true, dest=0x560c668ef3c8, altdest=0x560c668ef3c8, completionTag=0x7ffe05388950 "") at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/tcop/pquery.c:770 #18 0x0000560c6524f797 in exec_simple_query ( query_string=0x560c667b5528 "RELEASE _EXEC_SVP_0x4f3870;SAVEPOINT _EXEC_SVP_0x4f3870;select *,OID from ispp_wmpl where (bvarchar(key))>=(bvarchar('W '::varchar)) and (bvarchar(key))<=(bvarchar('W", '~' <repeats 11 times>, "'::varchar)) order by key") at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/tcop/postgres.c:1215 #19 0x0000560c652541a6 in PostgresMain (argc=1, argv=0x560c667ae488, dbname=0x560c667e1e68 "ispp-pionir-test", username=0x560c667e4020 "vlada") at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/tcop/postgres.c:4256 #20 0x0000560c651a4be9 in BackendRun (port=0x560c667db6f0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/postmaster/postmaster.c:4382 #21 0x0000560c651a42d1 in BackendStartup (port=0x560c667db6f0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/postmaster/postmaster.c:4073 #22 0x0000560c651a020d in ServerLoop () at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/postmaster/postmaster.c:1703 #23 0x0000560c6519f999 in PostmasterMain (argc=3, argv=0x560c667ac3c0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/postmaster/postmaster.c:1376 #24 0x0000560c650b941c in main (argc=3, argv=0x560c667ac3c0) at /mnt/sdd1/home/src/postgresql-devel/postgresql-git/postgresql/src/backend/main/main.c:228 (gdb) Vladimir Koković, DP senior(69) Belgrade, Mar. 1 2019 On 25.2.19. 17:37, gmail Vladimir Koković wrote: > The complete primer and source in tar.gz > > On 23.2.19. 21:43, PG Bug reporting form wrote: >> The following bug has been logged on the website: >> >> Bug reference: 15653 >> Logged by: Vladimir Kokovic >> Email address: vladimir.kokovic@gmail.com >> PostgreSQL version: Unsupported/Unknown >> Operating system: linux manjaro >> Description: >> >> This bug I have to report only for sentimental reasons because vkBytea >> system exists since the version of PostgreSQL 7.4! >> vkBytea system serves to restore all elemental PostgreSQL types in bytea >> form. >> It survived all versions in the meantime so that current GIT HEAD would >> report SIGSEGV to the pg_bvarchar method. >> My impression is that the problem is in the method >> pg_detoast_datum_packed >> but i do not understand the reason why. select * return all rows OK. >> >> The complete primer and source in tar.gz will be sent later. >> > >
Hi, /* SQL function: bvarchar(varchar) returns bytea */ PG_FUNCTION_INFO_V1(pg_bvarchar); Datum pg_bvarchar(PG_FUNCTION_ARGS) { VarChar *arg = PG_GETARG_VARCHAR_PP(0); unsigned len; bytea *res; len = VARSIZE( arg ) - VARHDRSZ; res = (text *)palloc( len + VARHDRSZ ); SET_VARSIZE( res, len + VARHDRSZ ); memcpy( VARDATA( res ), VARDATA( arg ), len); PG_RETURN_BYTEA_P(res); } Vladimir Koković, DP senior(69) Belgrade, Mar. 1 2019
>>>>> "gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes: gmail> VarChar *arg = PG_GETARG_VARCHAR_PP(0); The _PP there means that this is allowed to return either a packed (short) varlena or a normal one... gmail> len = VARSIZE( arg ) - VARHDRSZ; ...but VARSIZE is only allowed on unpacked varlenas, you need to use VARSIZE_ANY_EXHDR instead (and VARDATA_ANY rather than VARDATA). -- Andrew (irc:RhodiumToad)
Hi Andrew.
I changed VARSIZE to VARSIZE_ANY_EXHDR and VARDATA in VARDATA_ANY as you said, but there is still a problem I can not understand !
124 Datum pg_bvarchar(PG_FUNCTION_ARGS) {
125 VarChar *arg = PG_GETARG_VARCHAR_PP(0);0x7f5b4adb1380 <pg_bvarchar>: push r13
- 0x7f5b4adb1382 <pg_bvarchar+2>: push r12
- 0x7f5b4adb1384 <pg_bvarchar+4>: push rbp
- 0x7f5b4adb1385 <pg_bvarchar+5>: push rbx
- 0x7f5b4adb1386 <pg_bvarchar+6>: sub rsp,0x8
- 0x7f5b4adb138a <pg_bvarchar+10>: mov rdi,QWORD PTR [rdi+0x20]
- 0x7f5b4adb138e <pg_bvarchar+14>: call 0x7f5b4adb1030 <pg_detoast_datum_packed@plt>
- 0x7f5b4adb1393 <pg_bvarchar+19>: mov rbx,rax
126 unsigned len;
127 bytea *res;
128
129 len = VARSIZE_ANY_EXHDR(arg) - VARHDRSZ;
- 0x7f5b4adb1396 <pg_bvarchar+22>: movzx eax,BYTE PTR [rax]
- 0x7f5b4adb1399 <pg_bvarchar+25>: cmp al,0x1
- 0x7f5b4adb139b <pg_bvarchar+27>: je 0x7f5b4adb1408 <pg_bvarchar+136>
- 0x7f5b4adb139d <pg_bvarchar+29>: test al,0x1
- 0x7f5b4adb139f <pg_bvarchar+31>: jne 0x7f5b4adb13f0 <pg_bvarchar+112>
- 0x7f5b4adb13a1 <pg_bvarchar+33>: mov eax,DWORD PTR [rbx]
- 0x7f5b4adb13a3 <pg_bvarchar+35>: shr eax,0x2
- 0x7f5b4adb13a6 <pg_bvarchar+38>: lea edi,[rax-0x4]
- 0x7f5b4adb13a9 <pg_bvarchar+41>: lea r13d,[rax-0x8]
- 0x7f5b4adb13ad <pg_bvarchar+45>: mov r12,rdi
- 0x7f5b4adb13b0 <pg_bvarchar+48>: shl r12d,0x2
130 res = (text *) palloc(len + VARHDRSZ);
- 0x7f5b4adb13b4 <pg_bvarchar+52>: call 0x7f5b4adb1050 <palloc@plt>
- 0x7f5b4adb13b9 <pg_bvarchar+57>: lea rsi,[rbx+0x4]
- 0x7f5b4adb13bd <pg_bvarchar+61>: mov rdx,r13
- 0x7f5b4adb13c0 <pg_bvarchar+64>: mov rbp,rax
131 SET_VARSIZE(res, len + VARHDRSZ);
- 0x7f5b4adb13c3 <pg_bvarchar+67>: mov DWORD PTR [rax],r12d
132 memcpy(VARDATA(res), VARDATA_ANY(arg), len);
- 0x7f5b4adb13c6 <pg_bvarchar+70>: lea rax,[rbx+0x1]
- 0x7f5b4adb13ca <pg_bvarchar+74>: test BYTE PTR [rbx],0x1
- 0x7f5b4adb13cd <pg_bvarchar+77>: cmovne rsi,rax
- 0x7f5b4adb13d1 <pg_bvarchar+81>: lea rdi,[rbp+0x4]
- 0x7f5b4adb13d5 <pg_bvarchar+85>: call 0x7f5b4adb1040 <memcpy@plt> Program terminated with signal SIGSEGV, Segmentation fault.
133 PG_RETURN_BYTEA_P(res);
- 0x7f5b4adb13da <pg_bvarchar+90>: add rsp,0x8
- 0x7f5b4adb13de <pg_bvarchar+94>: mov rax,rbp
- 0x7f5b4adb13e1 <pg_bvarchar+97>: pop rbx
- 0x7f5b4adb13e2 <pg_bvarchar+98>: pop rbp
- 0x7f5b4adb13e3 <pg_bvarchar+99>: pop r12
- 0x7f5b4adb13e5 <pg_bvarchar+101>: pop r13
- 0x7f5b4adb13e7 <pg_bvarchar+103>: ret
- 0x7f5b4adb13e8 <pg_bvarchar+104>: nop DWORD PTR [rax+rax*1+0x0]
- 0x7f5b4adb13f0 <pg_bvarchar+112>: shr al,1
- 0x7f5b4adb13f2 <pg_bvarchar+114>: movzx eax,al
- 0x7f5b4adb13f5 <pg_bvarchar+117>: lea edi,[rax-0x1]
- 0x7f5b4adb13f8 <pg_bvarchar+120>: lea r13d,[rax-0x5]
- 0x7f5b4adb13fc <pg_bvarchar+124>: mov r12,rdi
- 0x7f5b4adb13ff <pg_bvarchar+127>: shl r12d,0x2
- 0x7f5b4adb1403 <pg_bvarchar+131>: jmp 0x7f5b4adb13b4 <pg_bvarchar+52>
- 0x7f5b4adb1405 <pg_bvarchar+133>: nop DWORD PTR [rax]
- 0x7f5b4adb1408 <pg_bvarchar+136>: movzx eax,BYTE PTR [rbx+0x1]
- 0x7f5b4adb140c <pg_bvarchar+140>: cmp al,0x1
- 0x7f5b4adb140e <pg_bvarchar+142>: je 0x7f5b4adb1438 <pg_bvarchar+184>
- 0x7f5b4adb1410 <pg_bvarchar+144>: mov edx,eax
- 0x7f5b4adb1412 <pg_bvarchar+146>: and edx,0xfe
- 0x7f5b4adb1418 <pg_bvarchar+152>: cmp edx,0x2
- 0x7f5b4adb141b <pg_bvarchar+155>: je 0x7f5b4adb1438 <pg_bvarchar+184>
- 0x7f5b4adb141d <pg_bvarchar+157>: cmp al,0x12
- 0x7f5b4adb141f <pg_bvarchar+159>: jne 0x7f5b4adb144e <pg_bvarchar+206>
- 0x7f5b4adb1421 <pg_bvarchar+161>: mov r13d,0xc
- 0x7f5b4adb1427 <pg_bvarchar+167>: mov r12d,0x40
- 0x7f5b4adb142d <pg_bvarchar+173>: mov edi,0x10
- 0x7f5b4adb1432 <pg_bvarchar+178>: jmp 0x7f5b4adb13b4 <pg_bvarchar+52>
- 0x7f5b4adb1434 <pg_bvarchar+180>: nop DWORD PTR [rax+0x0]
- 0x7f5b4adb1438 <pg_bvarchar+184>: mov r13d,0x4
- 0x7f5b4adb143e <pg_bvarchar+190>: mov r12d,0x20
- 0x7f5b4adb1444 <pg_bvarchar+196>: mov edi,0x8
- 0x7f5b4adb1449 <pg_bvarchar+201>: jmp 0x7f5b4adb13b4 <pg_bvarchar+52>
- 0x7f5b4adb144e <pg_bvarchar+206>: mov ecx,0x81
- 0x7f5b4adb1453 <pg_bvarchar+211>: lea rdx,[rip+0xba6] # 0x7f5b4adb2000
- 0x7f5b4adb145a <pg_bvarchar+218>: lea rsi,[rip+0xba9] # 0x7f5b4adb200a
- 0x7f5b4adb1461 <pg_bvarchar+225>: lea rdi,[rip+0xbbc] # 0x7f5b4adb2024
- 0x7f5b4adb1468 <pg_bvarchar+232>: call 0x7f5b4adb1060 <ExceptionalCondition@plt>
- 0x7f5b4adb146d: nop DWORD PTR [rax]
"gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes:gmail> VarChar *arg = PG_GETARG_VARCHAR_PP(0); The _PP there means that this is allowed to return either a packed (short) varlena or a normal one... gmail> len = VARSIZE( arg ) - VARHDRSZ; ...but VARSIZE is only allowed on unpacked varlenas, you need to use VARSIZE_ANY_EXHDR instead (and VARDATA_ANY rather than VARDATA).
>>>>> "gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes: gmail> Hi Andrew. gmail> I changed VARSIZE to VARSIZE_ANY_EXHDR and VARDATA in gmail> VARDATA_ANY as you said, but there is still a problem I can not gmail> understand ! Your message formatting was all messed up, but I can see that you are still subtracting VARHDRSZ - don't do that: VARSIZE_ANY_EXHDR already has the header size subtracted (hence "EXHDR"), it returns only the data size. (The header size is variable, 1 or 4 bytes, so it wouldn't make sense to include it.) -- Andrew (irc:RhodiumToad)
Hi Andrew,
You are absolutely right and "select ", OID from ispp_wmpl where (bvarchar (key))> = (bvarchar ('W' :: varchar)) and (bvarchar (key)) <= (bvarchar ~~~~~~~~ ':: varchar)) order by key" has passed! However, pg log file now has hundreds of warning message: 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 ... Andrew, I have to thank you for this help because without this, my 'select' would never have passed. Vladimir Koković, DP senior(69) Belgrade, Mar. 9 2019
"gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes:gmail> Hi Andrew.gmail> I changed VARSIZE to VARSIZE_ANY_EXHDR and VARDATA ingmail> VARDATA_ANY as you said, but there is still a problem I can notgmail> understand ! Your message formatting was all messed up, but I can see that you are still subtracting VARHDRSZ - don't do that: VARSIZE_ANY_EXHDR already has the header size subtracted (hence "EXHDR"), it returns only the data size. (The header size is variable, 1 or 4 bytes, so it wouldn't make sense to include it.)
Hi Andrew,
I forgot to show the final version of pg_bvarchar.
/* SQL function: bvarchar(varchar) returns bytea */
PG_FUNCTION_INFO_V1(pg_bvarchar);
Datum pg_bvarchar(PG_FUNCTION_ARGS) {
VarChar *arg = PG_GETARG_VARCHAR_PP(0);
unsigned len;
bytea *res;
len = VARSIZE_ANY_EXHDR(arg);
res = (text *) palloc(len);
SET_VARSIZE(res, len + VARHDRSZ);
memcpy(VARDATA(res), VARDATA_ANY(arg), len);
PG_RETURN_BYTEA_P(res);
}
On 9.3.19. 11:08, gmail Vladimir Koković wrote:
Hi Andrew,
You are absolutely right and "select ", OID from ispp_wmpl where (bvarchar (key))> = (bvarchar ('W' :: varchar)) and (bvarchar (key)) <= (bvarchar ~~~~~~~~ ':: varchar)) order by key" has passed! However, pg log file now has hundreds of warning message: 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 ... Andrew, I have to thank you for this help because without this, my 'select' would never have passed. Vladimir Koković, DP senior(69) Belgrade, Mar. 9 2019 On 9.3.19. 10:48, Andrew Gierth wrote:
"gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes:gmail> Hi Andrew.gmail> I changed VARSIZE to VARSIZE_ANY_EXHDR and VARDATA ingmail> VARDATA_ANY as you said, but there is still a problem I can notgmail> understand ! Your message formatting was all messed up, but I can see that you are still subtracting VARHDRSZ - don't do that: VARSIZE_ANY_EXHDR already has the header size subtracted (hence "EXHDR"), it returns only the data size. (The header size is variable, 1 or 4 bytes, so it wouldn't make sense to include it.)
Hi Andrew,
Definitely the problem is solved with the following version pg_bvarchar!
/* SQL function: bvarchar(varchar) returns bytea */
PG_FUNCTION_INFO_V1(pg_bvarchar);
Datum pg_bvarchar(PG_FUNCTION_ARGS) {
VarChar *arg = PG_GETARG_VARCHAR_PP(0);
unsigned len;
bytea *res;
len = VARSIZE_ANY_EXHDR(arg);
res = (text *) palloc(len + VARHDRSZ);
SET_VARSIZE(res, len + VARHDRSZ);
memcpy(VARDATA(res), VARDATA_ANY(arg), len);
PG_RETURN_BYTEA_P(res);
}
'select' has passed and no more warnigs.
Thanks again.
Vladimir Koković, DP senior(69)
Belgrade, Mar. 9 2019
Hi Andrew,
I forgot to show the final version of pg_bvarchar.
/* SQL function: bvarchar(varchar) returns bytea */
PG_FUNCTION_INFO_V1(pg_bvarchar);
Datum pg_bvarchar(PG_FUNCTION_ARGS) {
VarChar *arg = PG_GETARG_VARCHAR_PP(0);
unsigned len;
bytea *res;
len = VARSIZE_ANY_EXHDR(arg);
res = (text *) palloc(len);
SET_VARSIZE(res, len + VARHDRSZ);
memcpy(VARDATA(res), VARDATA_ANY(arg), len);
PG_RETURN_BYTEA_P(res);
}On 9.3.19. 11:08, gmail Vladimir Koković wrote:
Hi Andrew,
You are absolutely right and "select ", OID from ispp_wmpl where (bvarchar (key))> = (bvarchar ('W' :: varchar)) and (bvarchar (key)) <= (bvarchar ~~~~~~~~ ':: varchar)) order by key" has passed! However, pg log file now has hundreds of warning message: 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 2019-03-09 10:53:29 CET ispp-pionir-test :: 1 (53858) 14721 0 01000 WARNING: problem in allocation set ExprContext: detected write past chunk end in block 0x55ccb0b36468, chunk 0x55ccb0b36490 ... Andrew, I have to thank you for this help because without this, my 'select' would never have passed. Vladimir Koković, DP senior(69) Belgrade, Mar. 9 2019 On 9.3.19. 10:48, Andrew Gierth wrote:"gmail" == gmail Vladimir Koković <vladimir.kokovic@gmail.com> writes:gmail> Hi Andrew.gmail> I changed VARSIZE to VARSIZE_ANY_EXHDR and VARDATA ingmail> VARDATA_ANY as you said, but there is still a problem I can notgmail> understand ! Your message formatting was all messed up, but I can see that you are still subtracting VARHDRSZ - don't do that: VARSIZE_ANY_EXHDR already has the header size subtracted (hence "EXHDR"), it returns only the data size. (The header size is variable, 1 or 4 bytes, so it wouldn't make sense to include it.)