zoukankan      html  css  js  c++  java
  • PostgreSQL在何处处理 sql查询之四

    看看portal生成完毕后,干了什么(PortalDefineQuery):

     1         /*
     2          * Create unnamed portal to run the query or queries in. If there
     3          * already is one, silently drop it.
     4          */
     5         portal = CreatePortal("", true, true);
     6         /* Don't display the portal in pg_cursors */
     7         portal->visible = false;
     8 
     9         /*
    10          * We don't have to copy anything into the portal, because everything
    11          * we are passing here is in MessageContext, which will outlive the
    12          * portal anyway.
    13          */
    14         PortalDefineQuery(portal,
    15                           NULL,
    16                           query_string,
    17                           commandTag,
    18                           plantree_list,
    19                           NULL);

    再来看PortalDefineQuery的定义:

     1 /*
     2  * PortalDefineQuery
     3  *        A simple subroutine to establish a portal's query.
     4  *
     5  * Notes: as of PG 8.4, caller MUST supply a sourceText string; it is not
     6  * allowed anymore to pass NULL.  (If you really don't have source text,
     7  * you can pass a constant string, perhaps "(query not available)".)
     8  *
     9  * commandTag shall be NULL if and only if the original query string
    10  * (before rewriting) was an empty string.    Also, the passed commandTag must
    11  * be a pointer to a constant string, since it is not copied.
    12  *
    13  * If cplan is provided, then it is a cached plan containing the stmts, and
    14  * the caller must have done GetCachedPlan(), causing a refcount increment.
    15  * The refcount will be released when the portal is destroyed.
    16  *
    17  * If cplan is NULL, then it is the caller's responsibility to ensure that
    18  * the passed plan trees have adequate lifetime.  Typically this is done by
    19  * copying them into the portal's heap context.
    20  *
    21  * The caller is also responsible for ensuring that the passed prepStmtName
    22  * (if not NULL) and sourceText have adequate lifetime.
    23  *
    24  * NB: this function mustn't do much beyond storing the passed values; in
    25  * particular don't do anything that risks elog(ERROR).  If that were to
    26  * happen here before storing the cplan reference, we'd leak the plancache
    27  * refcount that the caller is trying to hand off to us.
    28  */
    29 void
    30 PortalDefineQuery(Portal portal,
    31                   const char *prepStmtName,
    32                   const char *sourceText,
    33                   const char *commandTag,
    34                   List *stmts,
    35                   CachedPlan *cplan)
    36 {
    37     AssertArg(PortalIsValid(portal));
    38     AssertState(portal->status == PORTAL_NEW);
    39 
    40     AssertArg(sourceText != NULL);
    41     AssertArg(commandTag != NULL || stmts == NIL);
    42 
    43     portal->prepStmtName = prepStmtName;
    44     portal->sourceText = sourceText;
    45     portal->commandTag = commandTag;
    46     portal->stmts = stmts;
    47     portal->cplan = cplan;
    48     portal->status = PORTAL_DEFINED;
    49 }

    根据参数调用的情况:

    *prepStmtName是NULL,sourceText是 query_string,commandTag传递了。
    Lits *stmts 是 exec_simple_query中生成的 plantree_list,CachedPlan *cplan 是空值。

    在我使用 select * from tab01 这种语句的时候,commandTag是 SELECT。

  • 相关阅读:
    简易四则运算
    对GitHub的认识
    对‘前辈’们的博文有感
    javascript中的JSON序列化与反序列化
    初步体验javascript try catch机制
    JQuery拾遗
    直面Javascript面试题算法思路
    ECMAScript5下Array的方法
    浅谈javascript中的数据类型和引用类型
    ECMAScript 5.1中对属性的操作
  • 原文地址:https://www.cnblogs.com/gaojian/p/3092323.html
Copyright © 2011-2022 走看看