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

📄 ordering.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/*------------------------------------------------------------------------- * * ordering.c *	  Routines to manipulate and compare merge and path orderings * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/util/Attic/ordering.c,v 1.16.2.1 1999/08/02 06:27:08 scrappy Exp $ * *------------------------------------------------------------------------- */#include <sys/types.h>#include "postgres.h"#include "optimizer/ordering.h"static bool sortops_order_match(Oid *ordering1, Oid *ordering2,					int *better_sort);/* * equal_path_ordering *	  Returns t iff two path orderings are equal. * */boolpathorder_match(PathOrder *path_ordering1,				PathOrder *path_ordering2,				int *better_sort){	*better_sort = 0;	if (path_ordering1 == path_ordering2)		return true;	if (!path_ordering2)	{		*better_sort = 1;		return true;	}	if (!path_ordering1)	{		*better_sort = 2;		return true;	}	if (path_ordering1->ordtype == MERGE_ORDER &&		path_ordering2->ordtype == MERGE_ORDER)		return equal(path_ordering1->ord.merge, path_ordering2->ord.merge);	else if (path_ordering1->ordtype == SORTOP_ORDER &&			 path_ordering2->ordtype == SORTOP_ORDER)	{		return sortops_order_match(path_ordering1->ord.sortop,								   path_ordering2->ord.sortop,								   better_sort);	}	else if (path_ordering1->ordtype == MERGE_ORDER &&			 path_ordering2->ordtype == SORTOP_ORDER)	{		if (!path_ordering2->ord.sortop)		{			*better_sort = 1;			return true;		}		return path_ordering1->ord.merge->left_operator == path_ordering2->ord.sortop[0];	}	else	{		if (!path_ordering1->ord.sortop)		{			*better_sort = 2;			return true;		}		return path_ordering1->ord.sortop[0] == path_ordering2->ord.merge->left_operator;	}}/* * equal_path_merge_ordering *	  Returns t iff a path ordering is usable for ordering a merge join. * * XXX	Presently, this means that the first sortop of the path matches *		either of the merge sortops.  Is there a "right" and "wrong" *		sortop to match? * */boolequal_path_merge_ordering(Oid *path_ordering,						  MergeOrder *merge_ordering){	if (path_ordering == NULL || merge_ordering == NULL)		return false;	if (path_ordering[0] == merge_ordering->left_operator ||		path_ordering[0] == merge_ordering->right_operator)		return true;	else		return false;}/* * equal_merge_ordering *	  Returns t iff two merge orderings are equal. * */boolequal_merge_ordering(MergeOrder *merge_ordering1,					 MergeOrder *merge_ordering2){	return equal(merge_ordering1, merge_ordering2);}/* *	sortops * *//* * equal_sort_ops_order - *	  Returns true iff the sort operators are in the same order. */static boolsortops_order_match(Oid *ordering1, Oid *ordering2, int *better_sort){	int			i = 0;	*better_sort = 0;	if (ordering1 == ordering2)		return true;	if (!ordering2)	{		*better_sort = 1;		return true;	}	if (!ordering1)	{		*better_sort = 2;		return true;	}	while (ordering1[i] != 0 && ordering2[i] != 0)	{		if (ordering1[i] != ordering2[i])			break;		i++;	}	if (ordering1[i] != 0 && ordering2[i] == 0)	{		*better_sort = 1;		return true;	}	if (ordering1[i] == 0 && ordering2[i] != 0)	{		*better_sort = 2;		return true;	}	return ordering1[i] == 0 && ordering2[i] == 0;}

⌨️ 快捷键说明

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