71.2. 시스템 카탈로그 초기 롤 토토

수동으로 생성된 초기 롤 토토가 있는 각 카탈로그(일부는 그렇지 않음)에 해당하는.dat편집 가능한 형식의 초기 롤 토토가 포함된 파일입니다.

71.2.1. 롤 토토 파일 형식

각각.dat파일에는 카탈로그 행당 하나씩 해시 참조 배열로 구성된 메모리 내 롤 토토 구조를 생성하기 위해 간단히 평가되는 Perl 롤 토토 구조 리터럴이 포함되어 있습니다. 약간 수정된 발췌pg_database.dat주요 기능을 보여줍니다:

[

# 여기에 댓글이 나타날 수 있습니다.
 oid = '1', oid_symbol = 'TemplateDbOid',
  descr = '롤 토토베이스\의 기본 템플릿',
  datname = 'template1', 인코딩 = 'ENCODING', datcollate = 'LC_COLLATE',
  datctype = 'LC_CTYPE', datistemplate = 't', datallowconn = 't',
  datconnlimit = '-1', datlastsysoid = '0', datfrozenxid = '0',
  datminmxid = '1', dattablespace = 'pg_default', datacl = '_null_' ,

]

주의사항:

  • 전체 파일 레이아웃은 다음과 같습니다: 여는 대괄호, 각각 카탈로그 행을 나타내는 하나 이상의 중괄호 세트, 닫는 대괄호. 각 닫는 중괄호 뒤에 쉼표를 씁니다.

  • 각 카탈로그 행 내에서 쉼표로 구분하여 작성 = 쌍. 허용되는s는 카탈로그 열의 이름과 메타롤 토토 키입니다.oid, oid_symbol, array_type_oid설명. (사용oid그리고oid_symbol다음에 설명되어 있습니다.섹션 71.2.2아래, 동안array_type_oid다음에 설명되어 있습니다.섹션 71.2.4. 설명삽입될 개체에 대한 설명 문자열을 제공합니다.pg_description또는pg_shdescription적절합니다.) 메타롤 토토 키는 선택사항이지만 카탈로그의 정의된 열은 모두 제공되어야 합니다. 단, 카탈로그의.h파일은 열의 기본값을 지정합니다. (위의 예에서는다트바다음 이유로 필드가 생략되었습니다.pg_database.h적절한 기본값을 제공합니다.)

  • 모든 값은 작은따옴표로 묶어야 합니다. 백슬래시를 사용하여 값 내에 사용된 작은따옴표를 이스케이프합니다. 롤 토토를 의미하는 백슬래시는 두 배가 될 수 있지만 반드시 그럴 필요는 없습니다. 이는 간단한 인용 리터럴에 대한 Perl의 규칙을 따릅니다. 롤 토토로 나타나는 백슬래시는 이스케이프 문자열 상수와 동일한 규칙에 따라 부트스트랩 스캐너에 의해 이스케이프로 처리됩니다(참조)섹션 4.1.2.2); 예를 들어\t탭 문자로 변환됩니다. 실제로 최종 값에 백슬래시를 추가하려면 그 중 4개를 작성해야 합니다. Perl은 2개를 제거하고 남겨둡니다.\\부트스트랩 스캐너가 볼 수 있도록 합니다.

  • Null 값은 다음으로 표시됩니다._null_. (해당 문자열만으로 값을 생성할 수 있는 방법은 없습니다.)

  • 댓글 앞에는#, 자체 라인에 있어야 합니다.

  • 다른 카탈로그 항목의 OID인 필드 값은 실제 숫자 OID가 아닌 기호 이름으로 표시되어야 합니다. (위의 예에서는,dattablespace이러한 참조가 포함되어 있습니다.) 이에 대한 설명은섹션 71.2.3아래.

  • 해시는 순서가 지정되지 않은 롤 토토 구조이므로 필드 순서와 줄 레이아웃은 의미상 중요하지 않습니다. 그러나 일관된 모양을 유지하기 위해 서식 지정 스크립트에 적용되는 몇 가지 규칙을 설정했습니다.reformat_dat_file.pl:

    • 각 중괄호 쌍 내에는 메타롤 토토 필드oid, oid_symbol, array_type_oid설명(존재하는 경우) 해당 순서대로 먼저 오면 카탈로그의 자체 필드가 정의된 순서대로 나타납니다.

    • 가능한 경우 줄 길이를 80자로 제한하기 위해 필요에 따라 필드 사이에 줄 바꿈이 삽입됩니다. 메타롤 토토 필드와 일반 필드 사이에도 줄바꿈이 삽입됩니다.

    • 카탈로그의 경우.h파일은 열의 기본값을 지정하고 롤 토토 항목은 동일한 값을 갖습니다.reformat_dat_file.pl롤 토토 파일에서 이를 생략합니다. 이렇게 하면 롤 토토 표현이 간결하게 유지됩니다.

    • reformat_dat_file.pl빈 줄과 주석 줄을 그대로 유지합니다.

    실행을 권장합니다reformat_dat_file.pl카탈로그 데이터 패치를 제출하기 전. 편의상 간단히 다음과 같이 변경할 수 있습니다.src/include/카탈로그/그리고 실행reformat-dat-files 만들기.

  • 데이터 표현을 더 작게 만드는 새로운 방법을 추가하려면 다음에서 구현해야 합니다.reformat_dat_file.pl또한 가르치기도 합니다카탈로그::ParseData()롤 토토를 다시 전체 표현으로 확장하는 방법.

71.2.2. OID 할당

초기 데이터에 나타나는 카탈로그 행에는 다음을 작성하여 수동으로 할당된 OID를 부여할 수 있습니다.oid =nnnn메타롤 토토 필드. 또한 OID가 할당된 경우 해당 OID에 대한 C 매크로는 다음을 작성하여 생성할 수 있습니다.oid_symbol =이름메타롤 토토 필드.

미리 로드된 다른 행에 OID 참조가 있는 경우 미리 로드된 카탈로그 행에 OID가 미리 할당되어 있어야 합니다. 행의 OID를 C 코드에서 참조해야 하는 경우에도 미리 할당된 OID가 필요합니다. 두 경우 모두 적용되지 않으면,oid메타롤 토토 필드를 생략할 수 있으며, 이 경우 부트스트랩 코드가 자동으로 OID를 할당합니다. 실제로는 실제로 상호 참조되는 행 중 일부만 있더라도 일반적으로 특정 카탈로그에 미리 로드된 행 전체에 대해 OID를 사전 할당하거나 전혀 OID를 할당하지 않습니다.

C 코드에서 OID의 실제 숫자 값을 쓰는 것은 매우 나쁜 형식으로 간주됩니다. 대신 항상 매크로를 사용하세요. 직접 참조pg_procOID는 필요한 매크로를 자동으로 생성하는 특별한 메커니즘이 있을 정도로 일반적입니다. 참조src/backend/utils/Gen_fmgrtab.pl. 유사하지만 역사적인 이유로 동일한 방식으로 수행되지는 않습니다. 다음에 대한 매크로를 자동으로 생성하는 방법이 있습니다.pg_typeOID.oid_symbol17533_17620pg_class시스템 카탈로그 및 색인의 OID가 자동으로 설정됩니다. 다른 모든 시스템 카탈로그의 경우 다음을 통해 필요한 매크로를 수동으로 지정해야 합니다.oid_symbol항목.

새 사전 로드된 행에 사용 가능한 OID를 찾으려면 스크립트를 실행하세요.src/include/catalog/unused_oids. 사용되지 않은 OID의 범위를 모두 인쇄합니다(예: 출력 라인45-900OID 45~900이 아직 할당되지 않았음을 의미합니다.) 현재 OID 1~9999는 수동 할당용으로 예약되어 있습니다.unused_oids스크립트는 단순히 카탈로그 헤더를 살펴보고.dat파일이 나타나지 않는지 확인하세요. 다음을 사용할 수도 있습니다.duplicate_oids실수를 확인하는 스크립트입니다. (genbki.pl직접 할당되지 않은 모든 행에 OID를 할당하고 컴파일 시 중복 OID도 감지합니다.)

즉시 커밋될 것으로 예상되지 않는 패치에 대해 OID를 선택할 때 가장 좋은 방법은 8000~9999 범위에서 무작위 선택으로 시작하는 다소 연속적인 OID 그룹을 사용하는 것입니다. 이는 동시에 개발 중인 다른 패치와의 OID 충돌 위험을 최소화합니다. 개발 목적으로 8000~9999 범위를 무료로 유지하려면 패치가 마스터 git 저장소에 커밋된 후 해당 OID의 번호를 해당 범위 아래의 사용 가능한 공간으로 다시 지정해야 합니다. 일반적으로 이 작업은 각 개발 주기가 끝날 무렵에 수행되며 해당 주기에 커밋된 패치에서 사용하는 모든 OID를 동시에 이동합니다. 스크립트renumber_oids.pl이 목적으로 사용될 수 있습니다. 커밋되지 않은 패치가 최근 커밋된 패치와 OID 충돌이 있는 것으로 발견되면,renumber_oids.pl또한 해당 상황에서 복구하는 데 유용할 수 있습니다.

패치에 의해 할당된 OID 번호를 다시 매기는 이러한 규칙 때문에 패치에 의해 할당된 OID는 패치가 공식 릴리스에 포함될 때까지 안정적인 것으로 간주되어서는 안 됩니다. 그러나 일단 릴리스되면 수동으로 할당된 개체 OID를 변경하지 않습니다. 그렇게 하면 다양한 호환성 문제가 발생할 수 있습니다.

만약genbki.pl수동으로 할당된 OID가 없는 카탈로그 항목에 OID를 할당해야 하며, 10000~11999 범위의 값을 사용합니다. 서버의 OID 카운터는 부트스트랩 실행 시작 시 12000으로 설정됩니다. 따라서 부트스트랩의 후반 단계에서 일반 SQL 명령으로 생성된 객체(예:information_schema.sql스크립트, 12000 이상의 OID를 수신합니다.

정상적인 롤 토토베이스 작업 중에 할당된 OID는 16384 이상으로 제한됩니다. 이렇게 하면 10000~16383 범위가 자동으로 할당된 OID에 대해 사용 가능합니다.genbki.pl또는 부트스트랩 중. 자동으로 할당된 이러한 OID는 안정적인 것으로 간주되지 않으며 설치마다 변경될 수 있습니다.

71.2.3. OID 참조 조회

원칙적으로, 하나의 초기 카탈로그 행에서 다른 행으로의 상호 참조는 참조 필드에서 참조 행의 사전 할당된 OID를 작성하는 것만으로 작성될 수 있습니다. 그러나 이는 오류가 발생하기 쉽고 읽기 어렵고 새로 할당된 OID의 번호를 다시 매길 경우 파손될 수 있으므로 프로젝트 정책에 위배됩니다. 그러므로genbki.pl대신 기호 참조를 작성하는 메커니즘을 제공합니다. 규칙은 다음과 같습니다.

  • 첨부하여 특정 카탈로그 열에서 기호 참조 사용이 활성화됩니다.BKI_LOOKUP(조회 규칙)열의 정의에, 여기서조회 규칙는 참조된 카탈로그의 이름입니다. 예:pg_proc. BKI_LOOKUP다음 유형의 열에 첨부 가능오이드, regproc, oidVector, 또는오이드[]; 후자의 두 경우에는 배열의 각 요소에 대한 조회를 수행하는 것을 의미합니다.

  • 부착도 허용됩니다BKI_LOOKUP(인코딩)현재 카탈로그 OID로 표시되지 않지만 알려진 값 세트가 있는 문자 세트 인코딩을 참조하기 위한 정수 열genbki.pl.

  • 일부 카탈로그 열에서는 유효한 참조 대신 항목이 0이 되는 것이 허용됩니다. 허용되는 경우 다음을 작성하세요.BKI_LOOKUP_OPT대신에BKI_LOOKUP. 그러면 쓸 수 있습니다0항목용. (컬럼이 선언된 경우)regproc, 선택적으로 쓸 수 있습니다.-대신0.) 이 특별한 경우를 제외하고 a의 모든 항목은BKI_LOOKUP열은 기호 참조여야 합니다.genbki.pl알 수 없는 이름에 대해 경고합니다.

  • 대부분의 카탈로그 개체는 단순히 이름으로 참조됩니다. 유형 이름은 참조된 이름과 정확히 일치해야 합니다.pg_type항목일반 이름; 다음과 같은 별칭을 사용할 수 없습니다.정수forint4.

  • 함수는 다음으로 표현될 수 있습니다.proname, 그것이 다음 중 고유한 경우pg_proc.dat항목(regproc 입력처럼 작동함). 그렇지 않으면 다음과 같이 작성하세요.proname(argtypename,argtypename,...), regprocedure와 같습니다. 인수 유형 이름은pg_proc.dat항목proargtypes필드. 공백을 삽입하지 마십시오.

  • 연산자는 다음으로 표시됩니다.oprname(lefttype,righttype), 유형 이름을 다음과 같이 정확하게 작성합니다.pg_operator.dat항목oprleft그리고oprright필드. (쓰기)0단항 연산자의 생략된 피연산자의 경우.)

  • opclasses 및 opfamilies의 이름은 액세스 방법 내에서만 고유하므로 다음과 같이 표시됩니다.access_method_name/객체_이름.

  • 이러한 경우에는 스키마 자격에 대한 조항이 없습니다. 부트스트랩 중에 생성된 모든 개체는pg_catalog스키마.

genbki.pl은 실행되는 동안 모든 기호 참조를 확인하고 간단한 숫자 OID를 내보낸 BKI 파일에 넣습니다. 따라서 부트스트랩 백엔드에서 기호 참조를 처리할 필요가 없습니다.

OID 참조 열을 다음으로 표시하는 것이 바람직합니다.BKI_LOOKUP또는BKI_LOOKUP_OPT카탈로그에 조회가 필요한 초기 롤 토토가 없는 경우에도 마찬가지입니다. 이것은 허용합니다genbki.pl시스템 카탈로그에 존재하는 외래 키 관계를 기록합니다. 해당 정보는 회귀 테스트에서 잘못된 항목을 확인하는 데 사용됩니다. 매크로도 참조하세요.DECLARE_FOREIGN_KEY, DECLARE_FOREIGN_KEY_OPT, DECLARE_ARRAY_FOREIGN_KEYDECLARE_ARRAY_FOREIGN_KEY_OPT, 이는 너무 복잡한 외래 키 관계를 선언하는 데 사용됩니다.BKI_LOOKUP(일반적으로 다중 열 외래 키).

71.2.4. 배열 유형 자동 생성

대부분의 스칼라 데이터 유형에는 해당 배열 유형이 있어야 합니다(즉, 요소 유형이 스칼라 유형이고 다음에서 참조되는 표준 varlena 배열 유형입니다.typarray스칼라 유형의 필드pg_type항목).genbki.pl생성할 수 있는pg_type대부분의 경우 자동으로 배열 유형 항목을 입력합니다.

이 기능을 사용하려면 다음을 작성하세요.array_type_oid =nnnn스칼라 유형의 메타롤 토토 필드pg_type항목, 배열 유형에 사용할 OID를 지정합니다. 그러면 다음을 생략할 수 있습니다.typarray필드, 해당 OID로 자동으로 채워지기 때문입니다.

생성된 배열 유형의 이름은 밑줄이 붙은 스칼라 유형의 이름입니다. 배열 항목의 다른 필드는 다음에서 채워집니다.BKI_ARRAY_DEFAULT()주석pg_type.h, 또는 없는 경우 스칼라 유형에서 복사됩니다. (특별한 경우도 있습니다.)typalign.) 그러면typelem그리고typarray두 항목의 필드는 서로 상호 참조하도록 설정되어 있습니다.

71.2.5. 롤 토토 파일 편집 레시피

다음은 카탈로그 데이터 파일을 업데이트할 때 일반적인 작업을 수행하는 가장 쉬운 방법에 대한 몇 가지 제안 사항입니다.

카탈로그에 기본값이 있는 새 열 추가: 다음을 사용하여 헤더 파일에 열을 추가하세요.BKI_DEFAULT()주석. 기본값이 아닌 값이 필요한 기존 행에 필드를 추가하여 데이터 파일을 조정하기만 하면 됩니다.

기본값이 없는 기존 열에 기본값 추가: 추가BKI_DEFAULT해더 파일에 주석을 추가한 후 실행reformat-dat-files 만들기현재 중복된 필드 항목을 제거합니다.

기본값 여부에 관계없이 열 제거: 헤더에서 열을 제거한 후 실행reformat-dat-files 만들기지금은 쓸모없는 필드 항목을 제거합니다.

기존 기본값 변경 또는 제거: 단순히 헤더 파일을 변경할 수는 없습니다. 그렇게 하면 현재 데이터가 잘못 해석될 수 있기 때문입니다. 첫 번째 실행확장-dat-파일 만들기모든 기본값이 명시적으로 삽입된 데이터 파일을 다시 작성한 다음 변경하거나 제거하려면BKI_DEFAULT주석을 추가한 후 실행reformat-dat-files 만들기불필요한 필드를 다시 제거합니다.

임시 대량 편집:  reformat_dat_file.pl다양한 종류의 대량 변경을 수행하도록 조정할 수 있습니다. 일회용 코드를 삽입할 수 있는 위치를 보여주는 블록 주석을 찾아보세요. 다음 예에서는 두 개의 부울 필드를 통합합니다.pg_proc문자 필드로:

  1. 새 열을 기본값으로 추가하세요.pg_proc.h:

    + /* 아래 PROKIND_ 카테고리 참조 */
    + 문자 BKI_DEFAULT(f);
  2. 다음을 기반으로 새 스크립트 생성reformat_dat_file.pl적절한 값을 즉시 삽입하려면:

    - # 이 시점에서 메모리에 해시로 전체 행이 있습니다.
    - # 우리가 원하는 모든 작업을 수행할 수 있습니다. 쓰여진 대로만
    - #은 기본값을 제거하지만 이 스크립트는 다음에 맞게 조정할 수 있습니다.
    - # 일회성 대량 편집을 수행합니다.
    + # prokind로 마이그레이션하기 위한 일회성 변경
    + # 기본값은 지금까지 이미 채워져 있으므로 다른 것으로 변경합니다.
    + # 적절한 값
    + if ($valuesproisagg eq 't')
    + 
    + $valuesprokind = 'a';
    +
  3. 새 스크립트를 실행하세요:

    $ cd src/include/카탈로그
    $ 펄 rewrite_dat_with_prokind.pl pg_proc.dat

    이 시점에서pg_proc.dat세 개의 열이 모두 있습니다.프로카인드, proisaggproiswindow, 하지만 기본값이 아닌 값이 있는 행에만 표시됩니다.

  4. 다음에서 이전 열을 제거pg_proc.h:

    - /* 집합체입니까? */
    - bool proisagg BKI_DEFAULT(f);
    -
    - /* 윈도우 함수인가요? */
    - bool proiswindow BKI_DEFAULT(f);
  5. 마지막으로, 달리세요reformat-dat-files 만들기쓸데없는 오래된 항목을 제거하려면pg_proc.dat.

대량 편집에 사용되는 스크립트의 추가 예를 보려면 다음을 참조하세요.convert_oid2name.pl그리고remove_pg_type_oid_symbols.pl이 메시지에 첨부됨:/message-id/CAJVSVGVX8gXnPm+Xa=DxR7kFYprcQ1tNcCT5D0O3ShfnM6jehA@mail.gmail.com

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.