⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ginarrayproc.c

📁 postgresql8.3.4源码,开源数据库
💻 C
字号:
/*------------------------------------------------------------------------- * * ginarrayproc.c *	  support functions for GIN's indexing of any array * * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION *	  $PostgreSQL: pgsql/src/backend/access/gin/ginarrayproc.c,v 1.12 2008/01/01 19:45:46 momjian Exp $ *------------------------------------------------------------------------- */#include "postgres.h"#include "access/gin.h"#include "utils/array.h"#include "utils/lsyscache.h"#define GinOverlapStrategy		1#define GinContainsStrategy		2#define GinContainedStrategy	3#define GinEqualStrategy		4#define ARRAYCHECK(x) do {									\	if ( ARR_HASNULL(x) )									\		ereport(ERROR,										\			(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),		\			 errmsg("array must not contain null values")));		\} while(0)/* * Function used as extractValue and extractQuery both */Datumginarrayextract(PG_FUNCTION_ARGS){	ArrayType  *array;	int32	   *nentries = (int32 *) PG_GETARG_POINTER(1);	Datum	   *entries = NULL;	int16		elmlen;	bool		elmbyval;	char		elmalign;	/*	 * we should guarantee that array will not be destroyed during all	 * operation	 */	array = PG_GETARG_ARRAYTYPE_P_COPY(0);	ARRAYCHECK(array);	get_typlenbyvalalign(ARR_ELEMTYPE(array),						 &elmlen, &elmbyval, &elmalign);	deconstruct_array(array,					  ARR_ELEMTYPE(array),					  elmlen, elmbyval, elmalign,					  &entries, NULL, (int *) nentries);	if (*nentries == 0 && PG_NARGS() == 3)	{		switch (PG_GETARG_UINT16(2))	/* StrategyNumber */		{			case GinOverlapStrategy:				*nentries = -1; /* nobody can be found */				break;			case GinContainsStrategy:			case GinContainedStrategy:			case GinEqualStrategy:			default:			/* require fullscan: GIN can't find void								 * arrays */				break;		}	}	/* we should not free array, entries[i] points into it */	PG_RETURN_POINTER(entries);}Datumginqueryarrayextract(PG_FUNCTION_ARGS){	PG_RETURN_DATUM(DirectFunctionCall3(ginarrayextract,										PG_GETARG_DATUM(0),										PG_GETARG_DATUM(1),										PG_GETARG_DATUM(2)));}Datumginarrayconsistent(PG_FUNCTION_ARGS){	bool	   *check = (bool *) PG_GETARG_POINTER(0);	StrategyNumber strategy = PG_GETARG_UINT16(1);	ArrayType  *query = PG_GETARG_ARRAYTYPE_P(2);	int			res,				i,				nentries;	/* ARRAYCHECK was already done by previous ginarrayextract call */	switch (strategy)	{		case GinOverlapStrategy:		case GinContainedStrategy:			/* at least one element in check[] is true, so result = true */			res = TRUE;			break;		case GinContainsStrategy:		case GinEqualStrategy:			nentries = ArrayGetNItems(ARR_NDIM(query), ARR_DIMS(query));			res = TRUE;			for (i = 0; i < nentries; i++)				if (!check[i])				{					res = FALSE;					break;				}			break;		default:			elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",				 strategy);			res = FALSE;	}	PG_RETURN_BOOL(res);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -