@@ -1465,6 +1465,7 @@ aqo_data_store(uint64 fs, int fss, AqoDataArgs *data, List *reloids)
1465
1465
}
1466
1466
}
1467
1467
aqo_state -> data_changed = true;
1468
+ Assert (entry -> rows > 0 );
1468
1469
end :
1469
1470
result = aqo_state -> data_changed ;
1470
1471
LWLockRelease (& aqo_state -> data_lock );
@@ -1505,13 +1506,15 @@ build_knn_matrix(OkNNrdata *data, const OkNNrdata *temp_data, double *features)
1505
1506
if (features != NULL )
1506
1507
{
1507
1508
int old_rows = data -> rows ;
1508
- int k = old_rows ;
1509
+ int k = ( old_rows < 0 ) ? 0 : old_rows ;
1509
1510
1510
1511
if (data -> cols > 0 )
1511
1512
{
1512
1513
int i ;
1513
1514
1514
- for (i = 0 ; i < data -> rows ; i ++ )
1515
+ Assert (data -> cols == temp_data -> cols );
1516
+
1517
+ for (i = 0 ; i < temp_data -> rows ; i ++ )
1515
1518
{
1516
1519
if (k < aqo_K && !neirest_neighbor (data -> matrix , old_rows , data -> matrix [i ], data -> cols ))
1517
1520
{
@@ -1521,6 +1524,7 @@ build_knn_matrix(OkNNrdata *data, const OkNNrdata *temp_data, double *features)
1521
1524
k ++ ;
1522
1525
}
1523
1526
}
1527
+ data -> rows = k ;
1524
1528
}
1525
1529
}
1526
1530
else
@@ -1605,11 +1609,13 @@ _fill_knn_data(const DataEntry *entry, List **reloids)
1605
1609
}
1606
1610
1607
1611
/*
1608
- * Return on feature subspace, unique defined by its class (fs) and hash value
1609
- * (fss).
1610
- * If reloids is NULL, skip loading of this list.
1612
+ * By given feature space and subspace, build kNN data structure.
1613
+ *
1611
1614
* If wideSearch is true - make seqscan on the hash table to see for relevant
1612
1615
* data across neighbours.
1616
+ * If reloids is NULL - don't fill this list.
1617
+ *
1618
+ * Return false if the operation was unsuccessful.
1613
1619
*/
1614
1620
bool
1615
1621
load_aqo_data (uint64 fs , int fss , OkNNrdata * data , List * * reloids ,
@@ -1634,7 +1640,7 @@ load_aqo_data(uint64 fs, int fss, OkNNrdata *data, List **reloids,
1634
1640
goto end ;
1635
1641
1636
1642
/* One entry with all correctly filled fields is found */
1637
- Assert (entry );
1643
+ Assert (entry && entry -> rows > 0 );
1638
1644
Assert (DsaPointerIsValid (entry -> data_dp ));
1639
1645
1640
1646
if (entry -> cols != data -> cols )
@@ -1643,12 +1649,14 @@ load_aqo_data(uint64 fs, int fss, OkNNrdata *data, List **reloids,
1643
1649
elog (LOG , "[AQO] Does a collision happened? Check it if possible "
1644
1650
"(fs: " UINT64_FORMAT ", fss: %d)." ,
1645
1651
fs , fss );
1646
- found = false;
1652
+ found = false; /* Sign of unsuccessful operation */
1647
1653
goto end ;
1648
1654
}
1649
1655
1650
1656
temp_data = _fill_knn_data (entry , reloids );
1657
+ Assert (temp_data -> rows > 0 );
1651
1658
build_knn_matrix (data , temp_data , features );
1659
+ Assert (data -> rows > 0 );
1652
1660
}
1653
1661
else
1654
1662
/* Iterate across all elements of the table. XXX: Maybe slow. */
@@ -1662,6 +1670,8 @@ load_aqo_data(uint64 fs, int fss, OkNNrdata *data, List **reloids,
1662
1670
{
1663
1671
List * tmp_oids = NIL ;
1664
1672
1673
+ Assert (entry -> rows > 0 );
1674
+
1665
1675
if (entry -> key .fss != fss || entry -> cols != data -> cols )
1666
1676
continue ;
1667
1677
0 commit comments