mirror of
https://github.com/postgres/postgres.git
synced 2025-08-28 18:48:04 +03:00
Add reusable routine for making arrays unique.
Introduce qunique() and qunique_arg(), which can be used after qsort() and qsort_arg() respectively to remove duplicate values. Use it where appropriate. Author: Thomas Munro Reviewed-by: Tom Lane (in an earlier version) Discussion: https://postgr.es/m/CAEepm%3D2vmFTNpAmwbGGD2WaryM6T3hSDVKQPfUwjdD_5XY6vAA%40mail.gmail.com
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
#include "access/reloptions.h"
|
||||
#include "access/relscan.h"
|
||||
#include "commands/progress.h"
|
||||
#include "lib/qunique.h"
|
||||
#include "miscadmin.h"
|
||||
#include "utils/array.h"
|
||||
#include "utils/datum.h"
|
||||
@@ -435,8 +436,6 @@ _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey,
|
||||
Oid elemtype;
|
||||
RegProcedure cmp_proc;
|
||||
BTSortArrayContext cxt;
|
||||
int last_non_dup;
|
||||
int i;
|
||||
|
||||
if (nelems <= 1)
|
||||
return nelems; /* no work to do */
|
||||
@@ -475,20 +474,8 @@ _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey,
|
||||
_bt_compare_array_elements, (void *) &cxt);
|
||||
|
||||
/* Now scan the sorted elements and remove duplicates */
|
||||
last_non_dup = 0;
|
||||
for (i = 1; i < nelems; i++)
|
||||
{
|
||||
int32 compare;
|
||||
|
||||
compare = DatumGetInt32(FunctionCall2Coll(&cxt.flinfo,
|
||||
cxt.collation,
|
||||
elems[last_non_dup],
|
||||
elems[i]));
|
||||
if (compare != 0)
|
||||
elems[++last_non_dup] = elems[i];
|
||||
}
|
||||
|
||||
return last_non_dup + 1;
|
||||
return qunique_arg(elems, nelems, sizeof(Datum),
|
||||
_bt_compare_array_elements, &cxt);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user