55.2. ФÑнкÑии Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ Ð¼ÐµÑодов доÑÑÑпа
ÐндекÑнÑй меÑод доÑÑÑпа должен опÑеделиÑÑ Ð² IndexAmRoutine ÑледÑÑÑие ÑÑнкÑии поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸ обÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов:
IndexBuildResult *
ambuild (Relation heapRelation,
Relation indexRelation,
IndexInfo *indexInfo); СÑÑÐ¾Ð¸Ñ Ð½Ð¾Ð²Ñй индекÑ. ÐÑноÑение индекÑа Ñже ÑизиÑеÑки Ñоздано, но пока пÑÑÑо. Ðно должно бÑÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑикÑиÑованнÑми даннÑми, коÑоÑÑе ÑÑебÑÑÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, и запиÑÑми Ð´Ð»Ñ Ð²ÑеÑ
коÑÑежей, Ñже ÑÑÑеÑÑвÑÑÑиÑ
в ÑаблиÑе. ÐбÑÑно ÑÑнкÑÐ¸Ñ ambuild вÑзÑÐ²Ð°ÐµÑ IndexBuildHeapScan() Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка в ÑаблиÑе ÑÑÑеÑÑвÑÑÑиÑ
коÑÑежей и Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑавлÑÑÑÑÑ Ð² ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc и ÑодеÑжаÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ индекÑа.
void ambuildempty (Relation indexRelation);
СоздаÑÑ Ð¿ÑÑÑой Ð¸Ð½Ð´ÐµÐºÑ Ð¸ запиÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ в Ñлой иниÑиализаÑии (INIT_FORKNUM) данного оÑноÑениÑ. ÐÑÐ¾Ñ Ð¼ÐµÑод вÑзÑваеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐ¶ÑÑналиÑÑемÑÑ
индекÑов; пÑÑÑой индекÑ, запиÑаннÑй в Ñлой иниÑиализаÑии, бÑÐ´ÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑÑÑ Ð² оÑновной Ñлой оÑноÑÐµÐ½Ð¸Ñ Ð¿Ñи каждом пеÑезапÑÑке ÑеÑвеÑа.
bool
aminsert (Relation indexRelation,
Datum *values,
bool *isnull,
ItemPointer heap_tid,
Relation heapRelation,
IndexUniqueCheck checkUnique); ÐÑÑавлÑÐµÑ Ð½Ð¾Ð²Ñй коÑÑеж в ÑÑÑеÑÑвÑÑÑий индекÑ. РмаÑÑиваÑ
values и isnull пеÑедаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑоиндекÑиÑованÑ, а в heap_tid â иденÑиÑикаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого коÑÑежа (TID). ÐÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑникалÑнÑе индекÑÑ (Ñлаг amcanunique ÑÑÑановлен), паÑамеÑÑ checkUnique ÑказÑваеÑ, ÐºÐ°ÐºÐ°Ñ Ð¿ÑовеÑка ÑникалÑноÑÑи должна вÑполнÑÑÑÑÑ. ÐÑо завиÑÐ¸Ñ Ð¾Ñ Ñого, ÑвлÑеÑÑÑ Ð»Ð¸ огÑаниÑение ÑникалÑноÑÑи оÑкладÑваемÑм; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 55.5. ÐбÑÑно паÑамеÑÑ heapRelation нÑжен меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа ÑолÑко Ð´Ð»Ñ Ð¿ÑовеÑки ÑникалÑноÑÑи (Ñак как он должен обÑаÑиÑÑÑÑ Ðº оÑновнÑм даннÑм, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ Ð² акÑÑалÑноÑÑи коÑÑежа).
ÐозвÑаÑаемÑй ÑÑнкÑией бÑлев ÑезÑлÑÑÐ°Ñ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, ÑолÑко когда паÑамеÑÑ checkUnique Ñавен UNIQUE_CHECK_PARTIAL. Ð ÑÑом ÑлÑÑае ÑезÑлÑÑÐ°Ñ TRUE ознаÑаеÑ, ÑÑо Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ñизнана ÑникалÑной, Ñогда как FALSE ознаÑаеÑ, ÑÑо она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑникалÑной (и ÑÑебÑеÑÑÑ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ Ð¾ÑложеннÑÑ Ð¿ÑовеÑÐºÑ ÑникалÑноÑÑи). РдÑÑгиÑ
ÑлÑÑаÑÑ
ÑекомендÑеÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¿Ð¾ÑÑоÑннÑй ÑезÑлÑÑÐ°Ñ FALSE.
ÐекоÑоÑÑе индекÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑ Ð½Ðµ вÑе коÑÑежи. ÐÑли коÑÑеж не бÑÐ´ÐµÑ Ð¸Ð½Ð´ÐµÐºÑиÑован, aminsert должна пÑоÑÑо завеÑÑиÑÑÑÑ, не Ð´ÐµÐ»Ð°Ñ Ð½Ð¸Ñего.
IndexBulkDeleteResult *
ambulkdelete (IndexVacuumInfo *info,
IndexBulkDeleteResult *stats,
IndexBulkDeleteCallback callback,
void *callback_state); УдалÑÐµÑ ÐºÐ¾ÑÑеж(и) из индекÑа. ÐÑо опеÑаÑÐ¸Ñ Â«Ð¼Ð°ÑÑового ÑдалениÑ», коÑоÑÐ°Ñ Ð¿ÑедположиÑелÑно бÑÐ´ÐµÑ Ñеализована пÑÑÑм ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñего индекÑа и пÑовеÑки Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи, должна ли она ÑдалÑÑÑÑÑ. ÐеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ callback должна вÑзÑваÑÑÑÑ Ð² ÑÑиле callback( Ñ ÑезÑлÑÑаÑом bool, коÑоÑÑй говоÑиÑ, должна ли ÑдалÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð½Ð´ÐµÐºÑа, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð¿ÐµÑедаваемÑй TID. ÐозвÑаÑаÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° NULL или ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc и ÑодеÑжаÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ ÑезÑлÑÑаÑа ÑдалениÑ. NULL можно веÑнÑÑÑ, еÑли Ð½Ð¸ÐºÐ°ÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð½Ðµ должна пеÑедаваÑÑÑÑ Ð² TID, callback_state)amvacuumcleanup.
Ðз-за огÑаниÑÐµÐ½Ð¸Ñ maintenance_work_mem пÑоÑедÑÑа ambulkdelete Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð½ÐµÑколÑко Ñаз, когда ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð¸Ñ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво коÑÑежей. РаÑгÑменÑе stats пеÑедаÑÑÑÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего вÑзова Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ индекÑа (пÑи пеÑвом вÑзове в Ñ
оде опеÑаÑии VACUUM он ÑодеÑÐ¶Ð¸Ñ NULL). ÐÑо позволÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа накапливаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð² пÑоÑеÑÑе вÑей опеÑаÑии. ÐбÑÑно ambulkdelete модиÑиÑиÑÑÐµÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ, еÑли в stats пеÑедаÑÑÑÑ Ð½Ðµ NULL.
IndexBulkDeleteResult *
amvacuumcleanup (IndexVacuumInfo *info,
IndexBulkDeleteResult *stats); ÐÑовеÑÑи ÑбоÑÐºÑ Ð¿Ð¾Ñле опеÑаÑии VACUUM (до ÑÑого ambulkdelete могла вÑзÑваÑÑÑÑ Ð½ÐµÑколÑко или Ð½Ð¾Ð»Ñ Ñаз). ÐÑ ÑÑой ÑÑнкÑии не ÑÑебÑеÑÑÑ Ð½Ð¸Ñего, кÑоме как вÑдаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ индекÑÑ, но она Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизвеÑÑи маÑÑовÑÑ ÑбоÑкÑ, напÑимеÑ, вÑÑвободиÑÑ Ð¿ÑÑÑÑе ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа. Ð stats ей пеÑедаÑÑÑÑ ÑÑÑÑкÑÑÑа, возвÑаÑÑÐ½Ð½Ð°Ñ Ð¿Ñи поÑледнем вÑзове ambulkdelete, либо NULL, еÑли ambulkdelete не вÑзÑвалаÑÑ, Ñак как никакие коÑÑежи ÑдалÑÑÑ Ð½Ðµ ÑÑебовалоÑÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ NULL или ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc. СодеÑжаÑаÑÑÑ Ð² ÑÑой ÑÑÑÑкÑÑÑе ÑÑаÑиÑÑика бÑÐ´ÐµÑ Ð¾ÑÑажена в запиÑи в pg_class и попадÑÑ Ð² вÑвод ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM, еÑли она вÑполнÑлаÑÑ Ñ Ñказанием VERBOSE. NULL Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð²Ð¾Ð²Ñе не изменилÑÑ Ð² пÑоÑеÑÑе опеÑаÑии VACUUM, но в пÑоÑивном ÑлÑÑае должна возвÑаÑаÑÑÑÑ ÐºÐ¾ÑÑекÑÐ½Ð°Ñ ÑÑаÑиÑÑика.
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL веÑÑии 8.4, amvacuumcleanup Ñакже вÑзÑваеÑÑÑ Ð² конÑе опеÑаÑии ANALYZE. Ð ÑÑом ÑлÑÑае stats вÑегда NULL и лÑбое возвÑаÑаемое знаÑение игноÑиÑÑеÑÑÑ. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð²Ñзова можно ÑаÑпознаÑÑ, пÑовеÑив поле info->analyze_only. ÐÑи Ñаком вÑзове меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа ÑекомендÑеÑÑÑ Ð½Ð¸Ñего не делаÑÑ, кÑоме как пÑовеÑÑи ÑбоÑÐºÑ Ð¿Ð¾Ñле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, и ÑолÑко в ÑабоÑем пÑоÑеÑÑе авÑооÑиÑÑки.
bool amcanreturn (Relation indexRelation, int attno);
ÐÑовеÑÑеÑ, поддеÑживаеÑÑÑ Ð»Ð¸ ÑканиÑование ÑолÑко индекÑа Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑолбÑа, когда Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи индекÑа возвÑаÑаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑÑ
ÑÑолбÑов в виде IndexTuple. ÐÑÑибÑÑÑ Ð½ÑмеÑÑÑÑÑÑ Ñ 1, Ñо еÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑвого ÑÑолбÑа attno Ñавен 1. ÐозвÑаÑÐ°ÐµÑ true, еÑли Ñакое ÑканиÑование поддеÑживаеÑÑÑ, а инаÑе â false. ÐÑли индекÑнÑй меÑод доÑÑÑпа в пÑинÑипе не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование ÑолÑко индекÑа, в поле amcanreturn его ÑÑÑÑкÑÑÑÑ IndexAmRoutine можно запиÑаÑÑ NULL.
void
amcostestimate (PlannerInfo *root,
IndexPath *path,
double loop_count,
Cost *indexStartupCost,
Cost *indexTotalCost,
Selectivity *indexSelectivity,
double *indexCorrelation);РаÑÑÑиÑÑÐ²Ð°ÐµÑ Ð¿ÑимеÑнÑÑ ÑÑоимоÑÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ в Разделе 55.6.
bytea *
amoptions (ArrayType *reloptions,
bool validate); РазбиÑÐ°ÐµÑ Ð¸ пÑовеÑÑÐµÑ Ð¼Ð°ÑÑив паÑамеÑÑов Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ, ÑолÑко когда Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа задан оÑлиÑнÑй Ð¾Ñ NULL маÑÑив reloptions. ÐаÑÑив reloptions ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑлеменÑов Ñипа text, ÑодеÑжаÑиÑ
запиÑи вида имÑ=знаÑение. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° полÑÑиÑÑ Ð·Ð½Ð°Ñение Ñипа bytea, коÑоÑое бÑÐ´ÐµÑ ÑкопиÑовано в поле rd_options запиÑи индекÑа в relcache. СодеÑжимое ÑÑого знаÑÐµÐ½Ð¸Ñ bytea опÑеделÑеÑÑÑ Ñамим меÑодом доÑÑÑпа; болÑÑинÑÑво ÑÑандаÑÑнÑÑ
меÑодов доÑÑÑпа помеÑаÑÑ Ð² него ÑÑÑÑкÑÑÑÑ StdRdOptions. Ðогда паÑамеÑÑ validate Ñавен true, ÑÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑдаÑÑ Ð¿Ð¾Ð´Ñ
одÑÑее ÑообÑение об оÑибке, еÑли какие-либо паÑамеÑÑÑ Ð½ÐµÑаÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ñ Ð¸Ð»Ð¸ имеÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑе знаÑениÑ; еÑли же validate Ñавен false, некоÑÑекÑнÑе запиÑи Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑоÑÑо игноÑиÑоваÑÑÑÑ. (Ð validate пеÑедаÑÑÑÑ false, когда паÑамеÑÑÑ Ñже загÑÑÐ¶ÐµÐ½Ñ Ð² pg_catalog; пÑи ÑÑом невеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжена, ÑолÑко еÑли в меÑоде доÑÑÑпа поменÑлиÑÑ Ð¿Ñавила обÑабоÑки паÑамеÑÑов, и в ÑÑом ÑлÑÑае ÑÑÐ¾Ð¸Ñ Ð¿ÑоÑÑо игноÑиÑоваÑÑ Ñакие запиÑи.) NULL можно веÑнÑÑÑ, когда нÑжно полÑÑиÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑаниÑ.
bool
amproperty (Oid index_oid, int attno,
IndexAMProperty prop, const char *propname,
bool *res, bool *isnull); ÐÑоÑедÑÑа amproperty позволÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑнÑм меÑодам доÑÑÑпа пеÑеопÑеделÑÑÑ ÑÑандаÑÑное поведение ÑÑнкÑии pg_index_column_has_property и ÑвÑзаннÑÑ
Ñ Ð½ÐµÐ¹. ÐÑли меÑод доÑÑÑпа не пÑоÑвлÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
оÑобенноÑÑей пÑи запÑоÑе ÑвойÑÑв индекÑов, поле amproperty в ÑÑÑÑкÑÑÑе IndexAmRoutine Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ NULL. РпÑоÑивном ÑлÑÑае пÑоÑедÑÑа amproperty бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð½ÑлевÑми паÑамеÑÑами index_oid и attno пÑи вÑзове pg_indexam_has_property, либо Ñ ÐºÐ¾ÑÑекÑнÑм index_oid и нÑлевÑм attno пÑи вÑзове pg_index_has_property, либо Ñ ÐºÐ¾ÑÑекÑнÑм index_oid и положиÑелÑнÑм attno пÑи вÑзове pg_index_column_has_property. Ð prop пеÑедаÑÑÑÑ Ð·Ð½Ð°Ñение пеÑеÑиÑлениÑ, ÑказÑваÑÑее на пÑовеÑÑемое знаÑение, а в propname â ÑÑÑока Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑвойÑÑва. ÐÑли код ÑдÑа не ÑаÑпознаÑÑ Ð¸Ð¼Ñ ÑвойÑÑва, в prop пеÑедаÑÑÑÑ AMPROP_UNKNOWN. ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа могÑÑ Ð²Ð¾ÑпÑинимаÑÑ Ð½ÐµÑÑандаÑÑнÑе имена ÑвойÑÑв, пÑовеÑÑÑ propname на Ñовпадение (Ð´Ð»Ñ ÑоглаÑованноÑÑи Ñ ÐºÐ¾Ð´Ð¾Ð¼ ÑдÑа иÑполÑзÑйÑе Ð´Ð»Ñ Ð¿ÑовеÑки pg_strcasecmp); Ð´Ð»Ñ Ð¸Ð¼Ñн, извеÑÑнÑÑ
ÐºÐ¾Ð´Ñ ÑдÑа, лÑÑÑе пÑовеÑÑÑÑ prop. ÐÑли пÑоÑедÑÑа amproperty возвÑаÑÐ°ÐµÑ true, ÑÑо знаÑиÑ, ÑÑо она ÑÑÑановила ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки ÑвойÑÑва: она должна задаÑÑ Ð² *res возвÑаÑаемое логиÑеÑкое знаÑение или ÑÑÑановиÑÑ Ð² *isnull знаÑение true, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ NULL. (ÐеÑед вÑзовом обе ÑпомÑнÑÑÑе пеÑеменнÑе иниÑиализиÑÑÑÑÑÑ Ð·Ð½Ð°Ñением false.) ÐÑли amproperty возвÑаÑÐ°ÐµÑ false, код ÑдÑа пеÑеклÑÑаеÑÑÑ Ð½Ð° обÑÑнÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа пÑовеÑки ÑвойÑÑва.
ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, поддеÑживаÑÑие опеÑаÑоÑÑ ÑпоÑÑдоÑиваниÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑеализовÑваÑÑ Ð¿ÑовеÑÐºÑ ÑвойÑÑва AMPROP_DISTANCE_ORDERABLE, Ñак как код ÑдÑа не знаеÑ, как ÑÑо ÑделаÑÑ Ð¸ возвÑаÑÐ°ÐµÑ NULL. Также Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑеализоваÑÑ Ð¿ÑовеÑÐºÑ AMPROP_RETURNABLE, еÑли ÑÑо можно ÑделаÑÑ Ð¿ÑоÑе, Ñем обÑаÑаÑÑÑ Ðº индекÑÑ Ð¸ вÑзÑÐ²Ð°Ñ amcanreturn (ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð´ ÑдÑа по ÑмолÑаниÑ). ÐÐ»Ñ Ð²ÑеÑ
оÑÑалÑнÑÑ
ÑÑандаÑÑнÑÑ
ÑвойÑÑв поведение ÑдÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑиÑаÑÑ ÑдовлеÑвоÑиÑелÑнÑм.
bool amvalidate (Oid opclassoid);
ÐÑовеÑÑÐµÑ Ð·Ð°Ð¿Ð¸Ñи в каÑалоге Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов, наÑколÑко ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ Ð¼ÐµÑод доÑÑÑпа. ÐапÑимеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¿ÑовеÑкÑ, вÑе ли необÑ
одимÑе опоÑнÑе ÑÑнкÑии ÑеализованÑ. ФÑнкÑÐ¸Ñ amvalidate должна веÑнÑÑÑ false, еÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов непÑигоден к иÑполÑзованиÑ. СообÑÐµÐ½Ð¸Ñ Ð¾ пÑоблеме ÑледÑÐµÑ Ð²ÑдаÑÑ ÑеÑез ereport.
Ð¦ÐµÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑа, конеÑно, в Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¿Ð¾Ð¸Ñк коÑÑежей, ÑооÑвеÑÑÑвÑÑÑиÑ
индекÑиÑÑÐµÐ¼Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE, по огÑаниÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ клÑÑÑ Ð¿Ð¾Ð¸Ñка. СканиÑование индекÑа опиÑÑваеÑÑÑ Ð±Ð¾Ð»ÐµÐµ полно ниже, в Разделе 55.3. ÐндекÑнÑй меÑод доÑÑÑпа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Â«Ð¿ÑоÑÑое» ÑканиÑование, ÑканиÑование по «биÑовой каÑÑе» или и Ñо, и дÑÑгое. ÐеÑод доÑÑÑпа должен или Ð¼Ð¾Ð¶ÐµÑ ÑеализовÑваÑÑ ÑледÑÑÑие ÑÑнкÑии, ÑвÑзаннÑе Ñо ÑканиÑованием:
IndexScanDesc
ambeginscan (Relation indexRelation,
int nkeys,
int norderbys); ÐодгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑод к ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. РпаÑамеÑÑаÑ
nkeys и norderbys задаÑÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво опеÑаÑоÑов ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ ÑоÑÑиÑовки, коÑоÑÑе бÑдÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð¿Ñи ÑканиÑовании; ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи. ÐамеÑÑÑе, ÑÑо ÑакÑиÑеÑкие знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ пÑедоÑÑавлÑÑÑÑÑ. Ð ÑезÑлÑÑаÑе ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑдаÑÑ ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ ÑÑедÑÑвами palloc. Ð ÑвÑзи Ñ Ð¾ÑобенноÑÑÑми ÑеализаÑии, меÑод доÑÑÑпа должен ÑоздаÑÑ ÑÑÑ ÑÑÑÑкÑÑÑÑ, вÑзвав RelationGetIndexScan(). РболÑÑинÑÑве ÑлÑÑаев вÑе дейÑÑÐ²Ð¸Ñ ambeginscan ÑводÑÑÑÑ ÑолÑко к вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого вÑзова и, возможно, полÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок; вÑÑ Ñамое инÑеÑеÑное пÑи запÑÑке ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² amrescan.
void
amrescan (IndexScanDesc scan,
ScanKey keys,
int nkeys,
ScanKey orderbys,
int norderbys); ÐапÑÑÐºÐ°ÐµÑ Ð¸Ð»Ð¸ пеÑезапÑÑÐºÐ°ÐµÑ ÑканиÑование индекÑа, возможно, Ñ Ð½Ð¾Ð²Ñми клÑÑами ÑканиÑованиÑ. (ÐÐ»Ñ Ð¿ÐµÑезапÑÑка ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ñанее пеÑеданнÑми клÑÑами в keys и/или orderbys пеÑедаÑÑÑÑ NULL.) ÐамеÑÑÑе, ÑÑо колиÑеÑÑво клÑÑей или опеÑаÑоÑов ÑоÑÑиÑовки не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑевÑÑаÑÑ Ð·Ð½Ð°ÑениÑ, поÑÑÑпивÑие в ambeginscan. Ðа пÑакÑике возможноÑÑÑ Ð¿ÐµÑезапÑÑка иÑполÑзÑеÑÑÑ, когда в Ñоединении Ñо вложеннÑм Ñиклом вÑбиÑаеÑÑÑ Ð½Ð¾Ð²Ñй внеÑний коÑÑеж, Ñак ÑÑо ÑÑебÑеÑÑÑ ÑÑавнение Ñ Ð½Ð¾Ð²Ñм клÑÑом, но ÑÑÑÑкÑÑÑа клÑÑей ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ менÑеÑÑÑ.
bool
amgettuple (IndexScanDesc scan,
ScanDirection direction); ÐÑбиÑÐ°ÐµÑ ÑледÑÑÑий коÑÑеж в Ñ
оде данного ÑканиÑованиÑ, Ñ Ð¿ÐµÑедвижением по индекÑÑ Ð² заданном напÑавлении (впеÑÑд или назад). ÐозвÑаÑÐ°ÐµÑ TRUE, еÑли коÑÑеж бÑл полÑÑен, или FALSE, еÑли подÑ
одÑÑиÑ
коÑÑежей не оÑÑалоÑÑ. Ð ÑлÑÑае ÑÑпеÑ
а в ÑÑÑÑкÑÑÑе scan ÑоÑ
ÑанÑеÑÑÑ TID коÑÑежа. ÐамеÑÑÑе, ÑÑо под «ÑÑпеÑ
ом» здеÑÑ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ ÑолÑко, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑ, ÑооÑвеÑÑÑвÑÑÑÑÑ ÐºÐ»ÑÑам ÑканиÑованиÑ, а не Ñо, ÑÑо даннÑй коÑÑеж обÑзаÑелÑно ÑÑÑеÑÑвÑÐµÑ Ð² даннÑÑ
или оказÑваеÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñм в Ñнимке вÑзÑваÑÑего ÑÑбÑекÑа. ÐÑи положиÑелÑном ÑезÑлÑÑаÑе amgettuple должна Ñакже ÑÑÑановиÑÑ Ð´Ð»Ñ ÑвойÑÑва scan->xs_recheck знаÑение TRUE или FALSE. FALSE бÑÐ´ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ, ÑÑо запиÑÑ Ð¸Ð½Ð´ÐµÐºÑа ÑоÑно ÑооÑвеÑÑÑвÑÐµÑ ÐºÐ»ÑÑам ÑканиÑованиÑ, а TRUE, ÑÑо еÑÑÑ Ñомнение в ÑÑом, Ñак ÑÑо ÑÑловиÑ, пÑедÑÑавленнÑе клÑÑами ÑканиÑованиÑ, необÑ
одимо еÑÑ Ñаз пеÑепÑовеÑиÑÑ Ð´Ð»Ñ ÑакÑиÑеÑкого коÑÑежа, когда он бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен. ÐÑо ÑвойÑÑво введено Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки «неÑоÑнÑÑ
» опеÑаÑоÑов индекÑов. ÐамеÑÑÑе, ÑÑо ÑÐ°ÐºÐ°Ñ Ð¿ÐµÑепÑовеÑка каÑаеÑÑÑ ÑолÑко ÑÑловий ÑканиÑованиÑ; пÑÐµÐ´Ð¸ÐºÐ°Ñ ÑаÑÑиÑного индекÑа (еÑли он имееÑÑÑ) никогда не пеÑепÑовеÑÑеÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼, вÑзÑваÑÑим amgettuple.
ÐÑли Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование ÑолÑко индекÑа (Ñо еÑÑÑ, amcanreturn Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ñавен TRUE), Ñо в ÑлÑÑае ÑÑпеÑ
а меÑод доÑÑÑпа должен Ñакже пÑовеÑиÑÑ Ñлаг scan->xs_want_itup, и, еÑли он ÑÑÑановлен, должен веÑнÑÑÑ Ð¸ÑÑ
однÑе индекÑиÑованнÑе даннÑе Ð´Ð»Ñ ÑÑой запиÑи индекÑа, в виде ÑказаÑÐµÐ»Ñ Ð½Ð° IndexTuple, ÑоÑ
ÑанÑнного в scan->xs_itup, и деÑкÑипÑÐ¾Ñ ÐºÐ¾ÑÑежа scan->xs_itupdesc. (ÐонÑÑолиÑоваÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ ÑÑÐ¾Ñ ÑказаÑелÑ, должен Ñам меÑод доÑÑÑпа. Ðна должна ÑоÑ
ÑанÑÑÑÑÑ Ð² ÑабоÑем ÑоÑÑоÑнии как минимÑм до ÑледÑÑÑего вÑзова amgettuple, amrescan или amendscan в ÑекÑÑем ÑканиÑовании.)
ФÑнкÑÐ¸Ñ amgettuple должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Â«Ð¿ÑоÑÑое» ÑканиÑование индекÑа. РпÑоÑивном ÑлÑÑае поле amgettuple в ÑÑÑÑкÑÑÑе IndexAmRoutine должно ÑодеÑжаÑÑ NULL.
int64
amgetbitmap (IndexScanDesc scan,
TIDBitmap *tbm); ÐÑбиÑÐ°ÐµÑ Ð²Ñе коÑÑежи Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ добавлÑÐµÑ Ð¸Ñ
в пеÑедаваемÑÑ Ð²ÑзÑваÑÑим кодом ÑÑÑÑкÑÑÑÑ TIDBitmap (Ñо еÑÑÑ, полÑÑÐ°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое обÑединение множеÑÑва TID вÑбÑаннÑÑ
коÑÑежей Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом, Ñже запиÑаннÑм в биÑовой каÑÑе). ÐозвÑаÑÐ°ÐµÑ ÑÑа ÑÑнкÑÐ¸Ñ ÑиÑло полÑÑеннÑÑ
коÑÑежей (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко пÑиблизиÑелÑÐ½Ð°Ñ Ð¾Ñенка; напÑимеÑ, некоÑоÑÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа не ÑÑиÑÑваÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑениÑ). ÐобавлÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ ÐºÐ¾ÑÑежей в биÑовÑÑ ÐºÐ°ÑÑÑ, amgetbitmap Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо Ð´Ð»Ñ ÑÑиÑ
коÑÑежей нÑжно пеÑепÑовеÑиÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑканиÑованиÑ. ÐÐ»Ñ ÑÑого Ñак же, как и в amgettuple, ÑÑÑанавливаеÑÑÑ Ð²ÑÑ
одной паÑамеÑÑ xs_recheck. ÐамеÑание: в ÑекÑÑей ÑеализаÑии ÑÑа возможноÑÑÑ ÑвÑзÑваеÑÑÑ Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð½ÐµÑоÑного Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑамиÑ
биÑовÑÑ
каÑÑ, Ñаким обÑазом вÑзÑваÑÑий код пеÑепÑовеÑÑÐµÑ Ð´Ð»Ñ Ð¾ÑмеÑеннÑÑ
коÑÑежей и ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑканиÑованиÑ, и пÑÐµÐ´Ð¸ÐºÐ°Ñ ÑаÑÑиÑного индекÑа (еÑли он имееÑÑÑ). Ðднако Ñак Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ вÑегда. ФÑнкÑии amgetbitmap и amgettuple не могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² одном ÑканиÑовании индекÑа; еÑÑÑ Ð¸ дÑÑгие огÑаниÑÐµÐ½Ð¸Ñ Ð² пÑименении amgetbitmap, опиÑаннÑе в Разделе 55.3.
ФÑнкÑÐ¸Ñ amgetbitmap должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование индекÑа «по биÑовой каÑÑе». РпÑоÑивном ÑлÑÑае поле amgetbitmap в ÑÑÑÑкÑÑÑе IndexAmRoutine должно ÑодеÑжаÑÑ NULL.
void amendscan (IndexScanDesc scan);
ÐавеÑÑÐ°ÐµÑ ÑканиÑование и оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑеÑÑÑÑÑ. Ð¡Ð°Ð¼Ñ ÑÑÑÑкÑÑÑÑ scan оÑвобождаÑÑ Ð½Ðµ ÑледÑеÑ, но лÑбÑе блокиÑовки или закÑÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов, ÑÑÑановленнÑе внÑÑÑи меÑода доÑÑÑпа, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑнÑÑÑ.
void ammarkpos (IndexScanDesc scan);
ÐомеÑÐ°ÐµÑ ÑекÑÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑканиÑованиÑ. ÐеÑод доÑÑÑпа должен поддеÑживаÑÑ ÑÐ¾Ñ Ñанение ÑолÑко одной позиÑии в пÑоÑеÑÑе ÑканиÑованиÑ.
ФÑнкÑÐ¸Ñ ammarkpos должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование по поÑÑдкÑ. ÐÑли ÑÑо не Ñак, в поле ammarkpos в ÑÑÑÑкÑÑÑе IndexAmRoutine можно запиÑаÑÑ NULL.
void amrestrpos (IndexScanDesc scan);
ÐоÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑканиÑованиÑ, оÑмеÑеннÑÑ Ð¿Ð¾Ñледней.
ФÑнкÑÐ¸Ñ amrestrpos должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование по поÑÑдкÑ. ÐÑли ÑÑо не Ñак, в поле amrestrpos в ÑÑÑÑкÑÑÑе IndexAmRoutine можно запиÑаÑÑ NULL.