@@ -700,6 +700,8 @@ pg_ptrack_get_and_clear(Oid tablespace_oid, Oid db_oid, Oid rel_oid,
700
700
res_db = pgut_execute (backup_conn ,
701
701
"SELECT datname FROM pg_database WHERE oid=$1" ,
702
702
1 , (const char * * ) params );
703
+ if (PQntuples (res_db ) != 1 || PQnfields (res_db ) != 1 )
704
+ elog (ERROR , "cannot find database by oid %u" , db_oid );
703
705
704
706
dbname = pstrdup (PQgetvalue (res_db , 0 , 0 ));
705
707
PQclear (res_db );
@@ -710,6 +712,9 @@ pg_ptrack_get_and_clear(Oid tablespace_oid, Oid db_oid, Oid rel_oid,
710
712
711
713
res = pgut_execute (tmp_conn , "SELECT pg_ptrack_get_and_clear($1, $2)" ,
712
714
2 , (const char * * )params );
715
+ if (PQnfields (res ) != 1 )
716
+ elog (ERROR , "cannot get ptrack file from database \"%s\" by tablespace oid %u and relation oid %u" ,
717
+ dbname , tablespace_oid , rel_oid );
713
718
result = (char * ) PQunescapeBytea ((unsigned char * ) PQgetvalue (res , 0 , 0 ),
714
719
result_size );
715
720
PQclear (res );
@@ -1447,23 +1452,23 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno)
1447
1452
static void
1448
1453
make_pagemap_from_ptrack (parray * files )
1449
1454
{
1450
- int i ;
1455
+ size_t i ;
1451
1456
1452
1457
for (i = 0 ; i < parray_num (files ); i ++ )
1453
1458
{
1454
- pgFile * p = (pgFile * ) parray_get (files , i );
1459
+ pgFile * p = (pgFile * ) parray_get (files , i );
1455
1460
1456
1461
if (p -> ptrack_path != NULL )
1457
1462
{
1458
- char * tablespace ;
1459
- Oid db_oid ,
1460
- rel_oid ,
1461
- tablespace_oid = 0 ;
1462
- int sep_iter ,
1463
- sep_count = 0 ;
1464
- char * ptrack_nonparsed ;
1465
- size_t ptrack_nonparsed_size = 0 ;
1466
- size_t start_addr ;
1463
+ char * tablespace ;
1464
+ Oid db_oid ,
1465
+ rel_oid ,
1466
+ tablespace_oid = 0 ;
1467
+ int sep_iter ,
1468
+ sep_count = 0 ;
1469
+ char * ptrack_nonparsed ;
1470
+ size_t ptrack_nonparsed_size = 0 ;
1471
+ size_t start_addr ;
1467
1472
1468
1473
tablespace = strstr (p -> ptrack_path , PG_TBLSPC_DIR );
1469
1474
@@ -1476,13 +1481,23 @@ make_pagemap_from_ptrack(parray *files)
1476
1481
* base/db_oid/rel_oid
1477
1482
*/
1478
1483
sep_iter = strlen (p -> path );
1479
- while (sep_count != 2 && sep_iter >= 0 )
1484
+ while (sep_iter >= 0 )
1485
+ {
1486
+ if (IS_DIR_SEP (p -> path [sep_iter ]))
1487
+ sep_count ++ ;
1488
+ if (sep_count == 2 )
1489
+ break ;
1480
1490
sep_iter -- ;
1491
+ }
1492
+
1493
+ if (sep_iter <= 0 )
1494
+ elog (ERROR , "path of the file \"%s\" has wrong format" ,
1495
+ p -> path );
1481
1496
1482
1497
sscanf (p -> path + sep_iter + 1 , "%u/%u" , & db_oid , & rel_oid );
1483
1498
1484
1499
ptrack_nonparsed = pg_ptrack_get_and_clear (tablespace_oid , db_oid ,
1485
- rel_oid , & ptrack_nonparsed_size );
1500
+ rel_oid , & ptrack_nonparsed_size );
1486
1501
1487
1502
/* TODO What is 8? */
1488
1503
start_addr = (RELSEG_SIZE /8 )* p -> segno ;
0 commit comments