PG_MODULE_MAGIC;
+#if (PG_VERSION_NUM >= 90400)
+#define SNAPSHOT NULL
+#else
+#define SNAPSHOT SnapshotNow
+#endif
+
static Oid
-getDefaultOpclass(Oid amoid, Oid typid)
+getDefaultOpclass(Oid amoid, Oid typid)
{
ScanKeyData skey;
SysScanDesc scan;
Relation heapRel;
Oid opclassOid = InvalidOid;
- heapRel = heap_open(OperatorClassRelationId, AccessShareLock);
+ heapRel = heap_open(OperatorClassRelationId, AccessShareLock);
ScanKeyInit(&skey,
Anum_pg_opclass_opcmethod,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(amoid));
- scan = systable_beginscan(heapRel,
- OpclassAmNameNspIndexId, true,
- SnapshotNow, 1, &skey);
+ scan = systable_beginscan(heapRel,
+ OpclassAmNameNspIndexId, true,
+ SNAPSHOT, 1, &skey);
while (HeapTupleIsValid((tuple = systable_getnext(scan))))
{
}
static Oid
-getAMProc(Oid amoid, Oid typid)
+getAMProc(Oid amoid, Oid typid)
{
Oid opclassOid = getDefaultOpclass(amoid, typid);
Oid procOid = InvalidOid;
/*
* Search binary-coercible type
*/
+#ifdef SearchSysCacheList1
+ catlist = SearchSysCacheList1(CASTSOURCETARGET,
+ ObjectIdGetDatum(typid));
+#else
catlist = SearchSysCacheList(CASTSOURCETARGET, 1,
ObjectIdGetDatum(typid),
0, 0, 0);
+#endif
for (i = 0; i < catlist->n_members; i++)
{
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = &catlist->members[i]->tuple;
Form_pg_cast castForm = (Form_pg_cast)GETSTRUCT(tuple);
if ( castForm->castfunc == InvalidOid && castForm->castcontext == COERCION_CODE_IMPLICIT )
ReleaseSysCacheList(catlist);
}
-
+
if ( !OidIsValid(opclassOid) )
return InvalidOid;
#endif
scan = systable_beginscan(heapRel, AccessMethodProcedureIndexId, true,
- SnapshotNow,
+ SNAPSHOT,
#if PG_VERSION_NUM >= 90200
4,
#else
static ProcTypeInfo *cacheProcs = NULL;
static int nCacheProcs = 0;
+#ifndef TupleDescAttr
+#define TupleDescAttr(tupdesc, i) ((tupdesc)->attrs[(i)])
+#endif
+
static ProcTypeInfo
fillProcs(Oid typid)
{
if (tupdesc->natts != 2)
elog(ERROR,"Composite type has wrong number of fields");
- if (tupdesc->attrs[1]->atttypid != FLOAT4OID)
+ if (TupleDescAttr(tupdesc, 1)->atttypid != FLOAT4OID)
elog(ERROR,"Second field of composite type is not float4");
oldcontext = MemoryContextSwitchTo(TopMemoryContext);
ReleaseTupleDesc(tupdesc);
- info->cmpFuncOid = getAMProc(BTREE_AM_OID, info->tupDesc->attrs[0]->atttypid);
- info->hashFuncOid = getAMProc(HASH_AM_OID, info->tupDesc->attrs[0]->atttypid);
- }
- else
+ info->cmpFuncOid = getAMProc(BTREE_AM_OID,
+ TupleDescAttr(info->tupDesc, 0)->atttypid);
+ info->hashFuncOid = getAMProc(HASH_AM_OID,
+ TupleDescAttr(info->tupDesc, 0)->atttypid);
+ }
+ else
{
info->tupDesc = NULL;
Assert( av->typid != bv->typid );
- return ( av->typid > bv->typid ) ? 1 : -1;
+ return ( av->typid > bv->typid ) ? 1 : -1;
}
ProcTypeInfo
if ( nCacheProcs == 1 )
{
- if ( cacheProcs[0]->typid == typid )
+ if ( cacheProcs[0]->typid == typid )
{
/*cacheProcs[0]->hashFuncInited = cacheProcs[0]->cmpFuncInited = false;*/
return cacheProcs[0];
else if ( nCacheProcs > 1 )
{
ProcTypeInfo *StopMiddle;
- ProcTypeInfo *StopLow = cacheProcs,
+ ProcTypeInfo *StopLow = cacheProcs,
*StopHigh = cacheProcs + nCacheProcs;
while (StopLow < StopHigh) {
}
info = fillProcs(typid);
- if ( nCacheProcs == 0 )
+ if ( nCacheProcs == 0 )
{
cacheProcs = malloc(sizeof(ProcTypeInfo));
{
ProcTypeInfo info = (ProcTypeInfo)arg;
- if (info->tupDesc)
+ if (info->tupDesc)
/* composite type */
return DatumGetInt32( FCall2( &info->cmpFunc,
- deconstructCompositeType(info, *(Datum*)a, NULL),
- deconstructCompositeType(info, *(Datum*)b, NULL) ) );
+ deconstructCompositeType(info, *(Datum*)a, NULL),
+ deconstructCompositeType(info, *(Datum*)b, NULL) ) );
return DatumGetInt32( FCall2( &info->cmpFunc,
*(Datum*)a, *(Datum*)b ) );
static int
cmpArrayElemArg(const void *a, const void *b, void *arg)
{
- cmpArrayElemData *data = (cmpArrayElemData*)arg;
- int res;
+ cmpArrayElemData *data = (cmpArrayElemData*)arg;
+ int res;
if (data->info->tupDesc)
res = DatumGetInt32( FCall2( &data->info->cmpFunc,
- deconstructCompositeType(data->info, *(Datum*)a, NULL),
- deconstructCompositeType(data->info, *(Datum*)b, NULL) ) );
+ deconstructCompositeType(data->info, *(Datum*)a, NULL),
+ deconstructCompositeType(data->info, *(Datum*)b, NULL) ) );
else
res = DatumGetInt32( FCall2( &data->info->cmpFunc,
*(Datum*)a, *(Datum*)b ) );
if ( s->nelems > 1 )
{
cmpArrayElemData data;
- int i;
+ int i;
getFmgrInfoCmp(s->info);
data.info = s->info;
break;
default:
elog(ERROR,"Unknown TF method: %d", tfm);
- }
+ }
}
else
{
s->df[i] = 0.0; /* unknown word */
}
- }
+ }
}
}
else if ( cache )
}
}
}
- else if (s->nelems > 0 && cache)
+ else if (s->nelems > 0 && cache)
{
stat = fingArrayStat(cache, s->info->typid, s->elems[0], stat);
if ( stat )
{
ArrayType *a, *b;
SimpleArray *sa, *sb;
-
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(0), &a, &sa, NULL);
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(1), &b, &sb, NULL);
switch(getSmlType())
{
- case ST_TFIDF:
+ case ST_TFIDF:
PG_RETURN_FLOAT4( TFIDFSml(sa, sb) );
break;
- case ST_COSINE:
+ case ST_COSINE:
{
int cnt;
double power;
PG_RETURN_FLOAT4( ((double)cnt) / sqrt( power ) );
}
break;
- case ST_OVERLAP:
+ case ST_OVERLAP:
{
float4 res = (float4)numOfIntersect(sa, sb);
elog(ERROR,"Unsupported formula type of similarity");
}
- PG_RETURN_FLOAT4(0.0); /* keep compiler quiet */
+ PG_RETURN_FLOAT4(0.0); /* keep compiler quiet */
}
PG_FUNCTION_INFO_V1(arraysmlw);
ArrayType *a, *b;
SimpleArray *sa, *sb;
bool useIntersect = PG_GETARG_BOOL(2);
- double numerator = 0.0;
- double denominatorA = 0.0,
+ double numerator = 0.0;
+ double denominatorA = 0.0,
denominatorB = 0.0,
tmpA, tmpB;
int cmp;
ProcTypeInfo info;
int ai = 0, bi = 0;
-
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(0), &a, &sa, NULL);
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(1), &b, &sb, NULL);
ArrayType *a, *b;
SimpleArray *sa, *sb;
double power = 0.0;
-
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(0), &a, &sa, NULL);
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(1), &b, &sb, NULL);
switch(getSmlType())
{
- case ST_TFIDF:
+ case ST_TFIDF:
power = TFIDFSml(sa, sb);
break;
- case ST_COSINE:
+ case ST_COSINE:
{
int cnt;
power = ((double)cnt) / power;
}
break;
- case ST_OVERLAP:
+ case ST_OVERLAP:
power = (double)numOfIntersect(sa, sb);
break;
default:
bool isnull;
void *plan;
int stat;
- text *formula = PG_GETARG_TEXT_P(2);
-
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ text *formula = PG_GETARG_TEXT_P(2);
+
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(0), &a, &sa, NULL);
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(1), &b, &sb, NULL);
SPI_connect();
-
if ( cachedPlan == NULL || cachedLen != VARSIZE(formula) - VARHDRSZ ||
memcmp( cachedFormula, VARDATA(formula), VARSIZE(formula) - VARHDRSZ ) != 0 )
{
SPI_freeplan(plan);
cachedLen = VARSIZE(formula) - VARHDRSZ;
- memcpy( cachedFormula, VARDATA(formula), VARSIZE(formula) - VARHDRSZ );
+ memcpy( cachedFormula, VARDATA(formula), VARSIZE(formula) - VARHDRSZ );
}
plan = cachedPlan;
{
ArrayType *a;
SimpleArray *sa;
- Datum query = PG_GETARG_DATUM(1);
+ Datum query = PG_GETARG_DATUM(1);
Oid queryTypeOid;
Datum *StopLow,
*StopHigh,
*StopMiddle;
int cmp;
- fcinfo->flinfo->fn_extra = SearchArrayCache(
+ fcinfo->flinfo->fn_extra = SearchArrayCache(
fcinfo->flinfo->fn_extra,
fcinfo->flinfo->fn_mcxt,
PG_GETARG_DATUM(0), &a, &sa, NULL);
StopLow = sa->elems;
StopHigh = sa->elems + sa->nelems;
- while (StopLow < StopHigh)
+ while (StopLow < StopHigh)
{
StopMiddle = StopLow + ((StopHigh - StopLow) >> 1);
cmp = cmpArrayElem(StopMiddle, &query, sa->info);