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。

  • 相关阅读:
    程序返回插入数据库成功,但是数据库内却没有数据
    C++ 使用动态二维数组参数
    深入理解.Net中的内存释放,以及有关的注意事项
    用数据集时,错误:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值
    关于堆和栈
    C#加密方法总汇
    const与readonly
    struts 将上传文件保存到数据库中
    java Annotation注解的运用
    转:获取汉字的拼音(包括一级和二级)
  • 原文地址:https://www.cnblogs.com/gaojian/p/3092323.html
Copyright © 2011-2022 走看看