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。

  • 相关阅读:
    程序员跳槽到对手公司,被前老板设计陷害
    创业码农被公司套路最惨的一次经历
    记录一次由屁股决定研发的狗血经历
    不去培训班,你凭什么觉得自己能学会编程,嗯?!
    毕业生是怎么一步步给培训班骗去学编程的
    我的一次被骗去培训班狗血的经历
    不去培训班,你凭什么觉得自己能学会编程
    Phabricatori 之项目管理软件
    kvm之virt-manage 管理功能
    debian 10 安装apache 和php
  • 原文地址:https://www.cnblogs.com/gaojian/p/3092323.html
Copyright © 2011-2022 走看看