@@ -1465,6 +1465,7 @@ aqo_data_store(uint64 fs, int fss, AqoDataArgs *data, List *reloids)
14651465}
14661466}
14671467aqo_state -> data_changed = true;
1468+ Assert (entry -> rows > 0 );
14681469end :
14691470result = aqo_state -> data_changed ;
14701471LWLockRelease (& aqo_state -> data_lock );
@@ -1505,13 +1506,15 @@ build_knn_matrix(OkNNrdata *data, const OkNNrdata *temp_data, double *features)
15051506if (features != NULL )
15061507{
15071508int old_rows = data -> rows ;
1508- int k = old_rows ;
1509+ int k = ( old_rows < 0 ) ? 0 : old_rows ;
15091510
15101511if (data -> cols > 0 )
15111512{
15121513int i ;
15131514
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 ++ )
15151518{
15161519if (k < aqo_K && !neirest_neighbor (data -> matrix ,old_rows ,data -> matrix [i ],data -> cols ))
15171520{
@@ -1521,6 +1524,7 @@ build_knn_matrix(OkNNrdata *data, const OkNNrdata *temp_data, double *features)
15211524k ++ ;
15221525}
15231526}
1527+ data -> rows = k ;
15241528}
15251529}
15261530else
@@ -1605,11 +1609,13 @@ _fill_knn_data(const DataEntry *entry, List **reloids)
16051609}
16061610
16071611/*
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+ *
16111614 * If wideSearch is true - make seqscan on the hash table to see for relevant
16121615 * data across neighbours.
1616+ * If reloids is NULL - don't fill this list.
1617+ *
1618+ * Return false if the operation was unsuccessful.
16131619 */
16141620bool
16151621load_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,
16341640gotoend ;
16351641
16361642/* One entry with all correctly filled fields is found */
1637- Assert (entry );
1643+ Assert (entry && entry -> rows > 0 );
16381644Assert (DsaPointerIsValid (entry -> data_dp ));
16391645
16401646if (entry -> cols != data -> cols )
@@ -1643,12 +1649,14 @@ load_aqo_data(uint64 fs, int fss, OkNNrdata *data, List **reloids,
16431649elog (LOG ,"[AQO] Does a collision happened? Check it if possible "
16441650"(fs: " UINT64_FORMAT ", fss: %d)." ,
16451651fs ,fss );
1646- found = false;
1652+ found = false;/* Sign of unsuccessful operation */
16471653gotoend ;
16481654}
16491655
16501656temp_data = _fill_knn_data (entry ,reloids );
1657+ Assert (temp_data -> rows > 0 );
16511658build_knn_matrix (data ,temp_data ,features );
1659+ Assert (data -> rows > 0 );
16521660}
16531661else
16541662/* 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,
16621670{
16631671List * tmp_oids = NIL ;
16641672
1673+ Assert (entry -> rows > 0 );
1674+
16651675if (entry -> key .fss != fss || entry -> cols != data -> cols )
16661676continue ;
16671677