亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? explain.c

?? PostgreSQL7.4.6 for Linux
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*------------------------------------------------------------------------- * * explain.c *	  Explain query execution plans * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.117 2003/10/17 01:14:26 tgl Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/genam.h"#include "access/heapam.h"#include "catalog/pg_type.h"#include "commands/explain.h"#include "commands/prepare.h"#include "executor/executor.h"#include "executor/instrument.h"#include "lib/stringinfo.h"#include "nodes/print.h"#include "optimizer/clauses.h"#include "optimizer/planner.h"#include "optimizer/var.h"#include "parser/parsetree.h"#include "rewrite/rewriteHandler.h"#include "tcop/pquery.h"#include "utils/builtins.h"#include "utils/guc.h"#include "utils/lsyscache.h"typedef struct ExplainState{	/* options */	bool		printCost;		/* print cost */	bool		printNodes;		/* do nodeToString() too */	bool		printAnalyze;	/* print actual times */	/* other states */	List	   *rtable;			/* range table */} ExplainState;static void ExplainOneQuery(Query *query, ExplainStmt *stmt,				TupOutputState *tstate);static double elapsed_time(struct timeval * starttime);static void explain_outNode(StringInfo str,				Plan *plan, PlanState *planstate,				Plan *outer_plan,				int indent, ExplainState *es);static void show_scan_qual(List *qual, bool is_or_qual, const char *qlabel,			   int scanrelid, Plan *outer_plan,			   StringInfo str, int indent, ExplainState *es);static void show_upper_qual(List *qual, const char *qlabel,				const char *outer_name, int outer_varno, Plan *outer_plan,				const char *inner_name, int inner_varno, Plan *inner_plan,				StringInfo str, int indent, ExplainState *es);static void show_sort_keys(List *tlist, int nkeys, AttrNumber *keycols,			   const char *qlabel,			   StringInfo str, int indent, ExplainState *es);static Node *make_ors_ands_explicit(List *orclauses);/* * ExplainQuery - *	  execute an EXPLAIN command */voidExplainQuery(ExplainStmt *stmt, DestReceiver *dest){	Query	   *query = stmt->query;	TupOutputState *tstate;	List	   *rewritten;	List	   *l;	/* prepare for projection of tuples */	tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt));	if (query->commandType == CMD_UTILITY)	{		/* Rewriter will not cope with utility statements */		if (query->utilityStmt && IsA(query->utilityStmt, DeclareCursorStmt))			ExplainOneQuery(query, stmt, tstate);		else if (query->utilityStmt && IsA(query->utilityStmt, ExecuteStmt))			ExplainExecuteQuery(stmt, tstate);		else			do_text_output_oneline(tstate, "Utility statements have no plan structure");	}	else	{		/* Rewrite through rule system */		rewritten = QueryRewrite(query);		if (rewritten == NIL)		{			/* In the case of an INSTEAD NOTHING, tell at least that */			do_text_output_oneline(tstate, "Query rewrites to nothing");		}		else		{			/* Explain every plan */			foreach(l, rewritten)			{				ExplainOneQuery(lfirst(l), stmt, tstate);				/* put a blank line between plans */				if (lnext(l) != NIL)					do_text_output_oneline(tstate, "");			}		}	}	end_tup_output(tstate);}/* * ExplainResultDesc - *	  construct the result tupledesc for an EXPLAIN */TupleDescExplainResultDesc(ExplainStmt *stmt){	TupleDesc	tupdesc;	/* need a tuple descriptor representing a single TEXT column */	tupdesc = CreateTemplateTupleDesc(1, false);	TupleDescInitEntry(tupdesc, (AttrNumber) 1, "QUERY PLAN",					   TEXTOID, -1, 0, false);	return tupdesc;}/* * ExplainOneQuery - *	  print out the execution plan for one query */static voidExplainOneQuery(Query *query, ExplainStmt *stmt, TupOutputState *tstate){	Plan	   *plan;	QueryDesc  *queryDesc;	bool		isCursor = false;	int			cursorOptions = 0;	/* planner will not cope with utility statements */	if (query->commandType == CMD_UTILITY)	{		if (query->utilityStmt && IsA(query->utilityStmt, DeclareCursorStmt))		{			DeclareCursorStmt *dcstmt;			List	   *rewritten;			dcstmt = (DeclareCursorStmt *) query->utilityStmt;			query = (Query *) dcstmt->query;			isCursor = true;			cursorOptions = dcstmt->options;			/* Still need to rewrite cursor command */			Assert(query->commandType == CMD_SELECT);			rewritten = QueryRewrite(query);			if (length(rewritten) != 1)				elog(ERROR, "unexpected rewrite result");			query = (Query *) lfirst(rewritten);			Assert(query->commandType == CMD_SELECT);			/* do not actually execute the underlying query! */			stmt->analyze = false;		}		else if (query->utilityStmt && IsA(query->utilityStmt, NotifyStmt))		{			do_text_output_oneline(tstate, "NOTIFY");			return;		}		else		{			do_text_output_oneline(tstate, "UTILITY");			return;		}	}	/* plan the query */	plan = planner(query, isCursor, cursorOptions);	/* Create a QueryDesc requesting no output */	queryDesc = CreateQueryDesc(query, plan, None_Receiver, NULL,								stmt->analyze);	ExplainOnePlan(queryDesc, stmt, tstate);}/* * ExplainOnePlan - *		given a planned query, execute it if needed, and then print *		EXPLAIN output * * This is exported because it's called back from prepare.c in the * EXPLAIN EXECUTE case * * Note: the passed-in QueryDesc is freed when we're done with it */voidExplainOnePlan(QueryDesc *queryDesc, ExplainStmt *stmt,			   TupOutputState *tstate){	struct timeval starttime;	double		totaltime = 0;	ExplainState *es;	StringInfo	str;	gettimeofday(&starttime, NULL);	/* call ExecutorStart to prepare the plan for execution */	ExecutorStart(queryDesc, false, !stmt->analyze);	/* Execute the plan for statistics if asked for */	if (stmt->analyze)	{		/* run the plan */		ExecutorRun(queryDesc, ForwardScanDirection, 0L);		/* We can't clean up 'till we're done printing the stats... */		totaltime += elapsed_time(&starttime);	}	es = (ExplainState *) palloc0(sizeof(ExplainState));	es->printCost = true;		/* default */	es->printNodes = stmt->verbose;	es->printAnalyze = stmt->analyze;	es->rtable = queryDesc->parsetree->rtable;	if (es->printNodes)	{		char	   *s;		char	   *f;		s = nodeToString(queryDesc->plantree);		if (s)		{			if (Explain_pretty_print)				f = pretty_format_node_dump(s);			else				f = format_node_dump(s);			pfree(s);			do_text_output_multiline(tstate, f);			pfree(f);			if (es->printCost)				do_text_output_oneline(tstate, "");		/* separator line */		}	}	str = makeStringInfo();	if (es->printCost)	{		explain_outNode(str, queryDesc->plantree, queryDesc->planstate,						NULL, 0, es);	}	/*	 * Close down the query and free resources.  Include time for this in	 * the total runtime.	 */	gettimeofday(&starttime, NULL);	ExecutorEnd(queryDesc);	FreeQueryDesc(queryDesc);	CommandCounterIncrement();	totaltime += elapsed_time(&starttime);	if (es->printCost)	{		if (stmt->analyze)			appendStringInfo(str, "Total runtime: %.3f ms\n",							 1000.0 * totaltime);		do_text_output_multiline(tstate, str->data);	}	pfree(str->data);	pfree(str);	pfree(es);}/* Compute elapsed time in seconds since given gettimeofday() timestamp */static doubleelapsed_time(struct timeval * starttime){	struct timeval endtime;	gettimeofday(&endtime, NULL);	endtime.tv_sec -= starttime->tv_sec;	endtime.tv_usec -= starttime->tv_usec;	while (endtime.tv_usec < 0)	{		endtime.tv_usec += 1000000;		endtime.tv_sec--;	}	return (double) endtime.tv_sec +		(double) endtime.tv_usec / 1000000.0;}/* * explain_outNode - *	  converts a Plan node into ascii string and appends it to 'str' * * planstate points to the executor state node corresponding to the plan node. * We need this to get at the instrumentation data (if any) as well as the * list of subplans. * * outer_plan, if not null, references another plan node that is the outer * side of a join with the current node.  This is only interesting for * deciphering runtime keys of an inner indexscan. */static voidexplain_outNode(StringInfo str,				Plan *plan, PlanState *planstate,				Plan *outer_plan,				int indent, ExplainState *es){	List	   *l;	char	   *pname;	int			i;	if (plan == NULL)	{		appendStringInfoChar(str, '\n');		return;	}	switch (nodeTag(plan))	{		case T_Result:			pname = "Result";			break;		case T_Append:			pname = "Append";			break;		case T_NestLoop:			switch (((NestLoop *) plan)->join.jointype)			{				case JOIN_INNER:					pname = "Nested Loop";					break;				case JOIN_LEFT:					pname = "Nested Loop Left Join";					break;				case JOIN_FULL:					pname = "Nested Loop Full Join";					break;				case JOIN_RIGHT:					pname = "Nested Loop Right Join";					break;				case JOIN_IN:					pname = "Nested Loop IN Join";					break;				default:					pname = "Nested Loop ??? Join";					break;			}			break;		case T_MergeJoin:			switch (((MergeJoin *) plan)->join.jointype)			{				case JOIN_INNER:					pname = "Merge Join";					break;				case JOIN_LEFT:					pname = "Merge Left Join";					break;				case JOIN_FULL:					pname = "Merge Full Join";					break;				case JOIN_RIGHT:					pname = "Merge Right Join";					break;				case JOIN_IN:					pname = "Merge IN Join";					break;				default:					pname = "Merge ??? Join";					break;			}			break;		case T_HashJoin:			switch (((HashJoin *) plan)->join.jointype)			{				case JOIN_INNER:					pname = "Hash Join";					break;				case JOIN_LEFT:					pname = "Hash Left Join";					break;				case JOIN_FULL:					pname = "Hash Full Join";					break;				case JOIN_RIGHT:					pname = "Hash Right Join";					break;				case JOIN_IN:					pname = "Hash IN Join";					break;				default:					pname = "Hash ??? Join";					break;			}			break;		case T_SeqScan:			pname = "Seq Scan";			break;		case T_IndexScan:			pname = "Index Scan";			break;		case T_TidScan:			pname = "Tid Scan";			break;		case T_SubqueryScan:			pname = "Subquery Scan";			break;		case T_FunctionScan:			pname = "Function Scan";			break;		case T_Material:			pname = "Materialize";			break;		case T_Sort:			pname = "Sort";			break;		case T_Group:			pname = "Group";			break;		case T_Agg:			switch (((Agg *) plan)->aggstrategy)			{				case AGG_PLAIN:					pname = "Aggregate";					break;				case AGG_SORTED:					pname = "GroupAggregate";					break;				case AGG_HASHED:					pname = "HashAggregate";					break;				default:					pname = "Aggregate ???";					break;			}			break;		case T_Unique:			pname = "Unique";			break;		case T_SetOp:			switch (((SetOp *) plan)->cmd)			{				case SETOPCMD_INTERSECT:					pname = "SetOp Intersect";					break;				case SETOPCMD_INTERSECT_ALL:					pname = "SetOp Intersect All";					break;				case SETOPCMD_EXCEPT:					pname = "SetOp Except";					break;				case SETOPCMD_EXCEPT_ALL:					pname = "SetOp Except All";					break;				default:					pname = "SetOp ???";					break;			}			break;		case T_Limit:			pname = "Limit";			break;		case T_Hash:			pname = "Hash";			break;		default:			pname = "???";			break;	}	appendStringInfoString(str, pname);	switch (nodeTag(plan))	{		case T_IndexScan:			if (ScanDirectionIsBackward(((IndexScan *) plan)->indxorderdir))				appendStringInfoString(str, " Backward");			appendStringInfoString(str, " using ");			i = 0;			foreach(l, ((IndexScan *) plan)->indxid)			{				Relation	relation;				relation = index_open(lfirsto(l));				appendStringInfo(str, "%s%s",								 (++i > 1) ? ", " : "",					quote_identifier(RelationGetRelationName(relation)));				index_close(relation);			}			/* FALL THRU */		case T_SeqScan:		case T_TidScan:			if (((Scan *) plan)->scanrelid > 0)			{				RangeTblEntry *rte = rt_fetch(((Scan *) plan)->scanrelid,											  es->rtable);				char	   *relname;				/* Assume it's on a real relation */				Assert(rte->rtekind == RTE_RELATION);				/* We only show the rel name, not schema name */				relname = get_rel_name(rte->relid);				appendStringInfo(str, " on %s",								 quote_identifier(relname));				if (strcmp(rte->eref->aliasname, relname) != 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
三级一区在线视频先锋| 欧美色网一区二区| 久久只精品国产| 狠狠色2019综合网| 久久一区二区三区国产精品| 国产精品18久久久久久久网站| 精品国产一区二区亚洲人成毛片| 久久精品国产999大香线蕉| 3d成人动漫网站| 麻豆一区二区三区| 久久综合狠狠综合久久综合88| 国产一区二区三区电影在线观看| 国产亚洲欧洲一区高清在线观看| 成人免费视频一区| 亚洲丝袜自拍清纯另类| 在线一区二区三区做爰视频网站| 看片网站欧美日韩| 精品久久久久久无| 国产一区二区0| 中文字幕国产精品一区二区| 在线视频观看一区| 日韩国产精品久久久| 欧美不卡视频一区| 99在线热播精品免费| 午夜免费久久看| 久久夜色精品国产噜噜av| 91亚洲国产成人精品一区二三 | 日韩欧美中文字幕制服| 国产在线看一区| 亚洲欧美偷拍卡通变态| 日韩视频免费观看高清完整版在线观看| 国产一区二区三区免费| 最新日韩av在线| 欧美一级国产精品| 成人av电影在线网| 日韩激情一二三区| 国产精品国产精品国产专区不蜜| 欧美精品第1页| av网站一区二区三区| 日本不卡中文字幕| 中文字幕一区二区三区精华液| 欧美区一区二区三区| 国产suv精品一区二区三区| 亚洲成人综合网站| 国产精品乱码一区二区三区软件| 欧美电影一区二区三区| 99久久久精品| 国产一区二区三区精品视频| 亚洲香肠在线观看| 国产精品久久久久婷婷二区次| 欧美日本一区二区三区| 成人va在线观看| 狠狠色狠狠色综合系列| 亚洲国产日韩a在线播放| 国产精品免费aⅴ片在线观看| 欧美一区二区久久| 欧美三片在线视频观看 | 亚洲视频一区在线| 2023国产精品视频| 欧美高清视频一二三区 | 国产精品免费视频观看| 欧美精品一二三| 在线观看日韩av先锋影音电影院| 成人小视频免费在线观看| 久久爱www久久做| 三级不卡在线观看| 一个色综合av| 亚洲精品v日韩精品| 国产精品国产三级国产普通话蜜臀| 精品国精品国产尤物美女| 欧美一级免费大片| 欧美精品久久一区二区三区| 91成人免费在线视频| 日本精品裸体写真集在线观看 | 一区二区三区在线视频播放| 国产精品婷婷午夜在线观看| 国产欧美视频在线观看| 久久久精品国产免大香伊 | 欧美日韩国产精品自在自线| 色欧美乱欧美15图片| 99在线热播精品免费| av在线不卡免费看| 国产99精品视频| 国产福利一区二区三区视频在线 | 午夜在线成人av| 亚洲综合色噜噜狠狠| 亚洲精品高清视频在线观看| 亚洲最新视频在线播放| 亚洲国产成人tv| 午夜精品福利在线| 人妖欧美一区二区| 精品在线播放午夜| 欧美在线一二三| 欧美性猛交xxxxxxxx| 欧美疯狂性受xxxxx喷水图片| 欧美一区二区三区爱爱| 精品久久久久久久一区二区蜜臀| 久久久国产精品麻豆| 国产精品久久久爽爽爽麻豆色哟哟| 中文字幕一区二区三区在线观看 | 亚洲一区视频在线| 五月婷婷激情综合网| 免费在线观看一区二区三区| 精品一区二区三区香蕉蜜桃| 粉嫩av一区二区三区粉嫩| 91年精品国产| 69久久夜色精品国产69蝌蚪网| 欧美成人午夜电影| 国产精品免费人成网站| 亚洲第一搞黄网站| 国内偷窥港台综合视频在线播放| 粉嫩欧美一区二区三区高清影视 | 欧美一二三区精品| 久久久九九九九| 亚洲综合久久久久| 久久99国产精品麻豆| 成人精品gif动图一区| 欧美日韩三级在线| 国产亚洲精品福利| 一区二区高清视频在线观看| 久久99蜜桃精品| 色综合久久综合网97色综合| 欧美日韩激情一区二区三区| 久久色.com| 亚洲一区二区三区视频在线播放 | 丁香天五香天堂综合| 精品视频资源站| 国产欧美综合色| 日本不卡一区二区| 99精品1区2区| 亚洲精品一区二区三区四区高清| 亚洲女与黑人做爰| 黄色日韩三级电影| 欧美丝袜自拍制服另类| 久久精品欧美一区二区三区麻豆 | 免费的成人av| 99re视频精品| 久久久久久黄色| 午夜a成v人精品| gogo大胆日本视频一区| 欧美r级电影在线观看| 亚洲一区二区三区视频在线播放| 粉嫩av一区二区三区在线播放| 欧美成人a视频| 亚洲电影中文字幕在线观看| 高清在线不卡av| 欧美成人高清电影在线| 亚洲国产成人91porn| 91丨porny丨最新| 国产婷婷色一区二区三区| 日韩高清一区在线| 欧美三级日韩三级国产三级| 综合在线观看色| 国产91综合一区在线观看| 26uuu久久天堂性欧美| 日本欧美大码aⅴ在线播放| 欧美网站大全在线观看| 亚洲精品日韩专区silk| av不卡在线观看| 国产精品麻豆99久久久久久| 国产精品一区在线观看你懂的| 精品国产a毛片| 九九国产精品视频| 欧美成人一区二区三区在线观看| 婷婷一区二区三区| 欧美日韩一二区| 亚洲午夜一区二区三区| 欧亚一区二区三区| 亚洲女同一区二区| 91麻豆免费观看| 一区二区视频在线| 日本久久一区二区| 一区二区三区欧美久久| 不卡一二三区首页| 中文字幕精品在线不卡| 成人av影院在线| 国产精品久久久久久久久久免费看| 高清免费成人av| 中文字幕一区在线观看视频| av一本久道久久综合久久鬼色| ...xxx性欧美| 欧美亚男人的天堂| 午夜日韩在线电影| 欧美一级黄色片| 国产成人精品亚洲777人妖| 国产日韩综合av| 99久精品国产| 午夜国产不卡在线观看视频| 欧美日本免费一区二区三区| 99热国产精品| 亚洲天堂2014| 欧美日韩国产bt| 精品写真视频在线观看| 日本一区二区三区四区在线视频| 9色porny自拍视频一区二区| 亚洲国产一区二区三区青草影视| 欧美一区二区不卡视频| 国产激情视频一区二区三区欧美| 亚洲欧美在线视频观看| 欧美人妇做爰xxxⅹ性高电影|