gpt4 book ai didi

PostgreSQL Schema 长度和 Search_Path

转载 作者:行者123 更新时间:2023-12-04 17:01:41 25 4
gpt4 key购买 nike

我在 Postgres 上创建了一个长度大于 63 bytes 的新模式人物。

CREATE SCHEMA "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz";

上面的语句创建了一个架构 abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghi
Postgres 自动删除了额外的字节并创建了只有 63 个字节的模式(我期待一个错误)。

然后我运行了以下命令:
SET search_path TO 'abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz';
SHOW search_path;

CREATE TABLE deepak(item varchar);
INSERT INTO deepak SELECT 'a';

TABLE "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz".deepak;

我的问题是
  • 显示search_path返回全名但使新的 63 字节名称架构处于事件状态。这是怎么发生的?
  • select语句可以选择 table deepak即使在给出错误的架构名称之后。这怎么可能?

  • 我查了 information_schema.schematapg_tables还。这些表中存在 63 字节的名称。

    最佳答案

    这背后的原因是所有对象名称都是数据类型 name .比较pg_namespace的定义,这是包含模式的系统目录:

    \d pg_namespace
    Table "pg_catalog.pg_namespace"
    Column | Type | Collation | Nullable | Default
    ----------+-----------+-----------+----------+---------
    nspname | name | | not null |
    nspowner | oid | | not null |
    nspacl | aclitem[] | | |
    Indexes:
    "pg_namespace_nspname_index" UNIQUE, btree (nspname)
    "pg_namespace_oid_index" UNIQUE, btree (oid)
    namesrc/include/c.h 中定义( NAMEDATALEN为64,但最后一个字节为0,所以有效长度为63):

    /*
    * Representation of a Name: effectively just a C string, but null-padded to
    * exactly NAMEDATALEN bytes. The use of a struct is historical.
    */
    typedef struct nameData
    {
    char data[NAMEDATALEN];
    } NameData;
    typedef NameData *Name;

    #define NameStr(name) ((name).data)

    当解析器处理一个标识符时,它会将其截断为 NAMEDATALEN-1 .

    此截断引发了 NOTICE从一开始( commit 0672a3c081 来自 2000 年 6 月),所以如果您没有看到该通知,我会感到惊讶(除非您将 client_min_messages 设置为 warningerror )。
    search_path是一个没有长度限制的常规 C 字符串,因此它可以包含超过 63 个字节的模式名称,但由于条目被强制转换为 name ,额外的字符被有效地忽略。

    这不太好,我认为该消息应该是 WARNING至少。您可能希望将其与黑客邮件列表一起提出(或为其编写补丁)。将级别提高到 ERROR将是最干净的解决方案,但不利于向后兼容性。

    关于PostgreSQL Schema 长度和 Search_Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55488902/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com