PostgreSQL的 initdb 源代码分析之二十一

本文深入解析了PostgreSQL中创建信息模式(info_schema)的过程及其实现细节。通过具体步骤介绍了如何加载并填充信息模式,包括设置数据库版本信息及从特性文件导入特性数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续分析:

    setup_schema();

展开:

实质就是创建info_schema。

cmd 是:

"/home/pgsql/project/bin/postgres" --single -F -O -c search_path=pg_catalog -c exit_on_error=true -j template1 >/dev/null

infor_schem_file是:/home/pgsql/project/share/information_schema.sql

/*
 * load info schema and populate from features file
 */
static void
setup_schema(void)
{
    PG_CMD_DECL;
    char      **line;
    char      **lines;

    fputs(_("creating information schema ... "), stdout);
    fflush(stdout);

    lines = readfile(info_schema_file);

    ///fprintf(stderr,"\n====================info_schema_file is: %s\n", info_schema_file);

    /*
     * We use -j here to avoid backslashing stuff in information_schema.sql
     */
    snprintf(cmd, sizeof(cmd),
             "\"%s\" %s -j template1 >%s",
             backend_exec, backend_options,
             DEVNULL);

    ///fprintf(stderr,"\n=====================cmd is: %s \n",cmd);

    PG_CMD_OPEN;

    for (line = lines; *line != NULL; line++)
    {
        PG_CMD_PUTS(*line);
        free(*line);
    }

    free(lines);

    PG_CMD_CLOSE;

    snprintf(cmd, sizeof(cmd),
             "\"%s\" %s template1 >%s",
             backend_exec, backend_options,
             DEVNULL);

    PG_CMD_OPEN;

    PG_CMD_PRINTF1("UPDATE information_schema.sql_implementation_info "
                   "  SET character_value = '%s' "
                   "  WHERE implementation_info_name = 'DBMS VERSION';\n",
                   infoversion);

    PG_CMD_PRINTF1("COPY information_schema.sql_features "
                   "  (feature_id, feature_name, sub_feature_id, "
                   "  sub_feature_name, is_supported, comments) "
                   " FROM E'%s';\n",
                   escape_quotes(features_file));

    PG_CMD_CLOSE;

    check_ok();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值