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

    看代码:

    /*
     *    mdopen() -- Open the specified relation.
     *
     * Note we only open the first segment, when there are multiple segments.
     *
     * If first segment is not present, either ereport or return NULL according
     * to "behavior".  We treat EXTENSION_CREATE the same as EXTENSION_FAIL;
     * EXTENSION_CREATE means it's OK to extend an existing relation, not to
     * invent one out of whole cloth.
     */
    static MdfdVec *
    mdopen(SMgrRelation reln, ForkNumber forknum, ExtensionBehavior behavior)
    {
        MdfdVec    *mdfd;
        char       *path;
        File        fd;
    
        /* No work if already open */
        if (reln->md_fd[forknum])
            return reln->md_fd[forknum];
    
        path = relpath(reln->smgr_rnode, forknum);
    
        fd = PathNameOpenFile(path, O_RDWR | PG_BINARY, 0600);
    
        if (fd < 0)
        {
            /*
             * During bootstrap, there are cases where a system relation will be
             * accessed (by internal backend processes) before the bootstrap
             * script nominally creates it.  Therefore, accept mdopen() as a
             * substitute for mdcreate() in bootstrap mode only. (See mdcreate)
             */
            if (IsBootstrapProcessingMode())
                fd = PathNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, 
    0600);
    if (fd < 0) { if (behavior == EXTENSION_RETURN_NULL && FILE_POSSIBLY_DELETED(errno)) { pfree(path); return NULL; } ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); } } pfree(path); reln->md_fd[forknum] = mdfd = _fdvec_alloc(); mdfd->mdfd_vfd = fd; mdfd->mdfd_segno = 0; mdfd->mdfd_chain = NULL; Assert(_mdnblocks(reln, forknum, mdfd) <= ((BlockNumber) RELSEG_SIZE)); return mdfd; }

    看这一段:

        /* No work if already open */
        if (reln->md_fd[forknum])
            return reln->md_fd[forknum];

    可以知道,如果文件已经打开过,就不需要再次调用  PathNameOpenFile 了。

    不过,这应该是限定于一个特定的  SMgrRelation 对象而言。

  • 相关阅读:
    详细解释ISupportInitialize接口
    微软发布了VS2005 IDE增强工具
    Oracle中无法解析TNS的陷阱
    Oracle临时表空间为何暴涨?
    欧洲游回来
    树比较的一个另类方法
    控件的Archor属性没有作用,是.Net的BUG?
    Oracle中取字段唯一值的一个sql语句的写法
    Qt程序的翻译
    Qt程序运行到Symbian手机上
  • 原文地址:https://www.cnblogs.com/gaojian/p/3102067.html
Copyright © 2011-2022 走看看