68.2. 시스템 카탈로그 초기 스포츠 토토#

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

68.2.1. 스포츠 토토 파일 형식#

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

[

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

]

주의사항:

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

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

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

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

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

  • 다른 카탈로그 항목의 OID인 필드 값은 실제 숫자 OID가 아닌 기호 이름으로 표시되어야 합니다. (위의 예에서는,dattablespace이러한 참조가 포함되어 있습니다.) 이에 대한 설명은섹션 68.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()스포츠 토토를 다시 전체 표현으로 확장하는 방법.

68.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_symbol17777_17864pg_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 카운터는 부트스트랩 실행 시작 시 10000으로 설정되므로 부트스트랩 처리 중에 즉석에서 생성된 모든 개체도 이 범위의 OID를 받습니다. (일반적인 OID 할당 메커니즘은 충돌을 방지합니다.)

아래 OID가 있는 개체FirstUnpinnedObjectId(12000)이 고려됩니다.고정, 삭제되지 않도록 방지합니다. (내장된 소수의 예외가 있습니다.IsPinnedObject().) initdbOID 카운터를 최대로 강제합니다FirstUnpinnedObjectId고정 해제된 객체를 생성할 준비가 되자마자. 따라서 이후 단계에서 생성된 객체는initdb, 예: 실행 중에 생성된 개체 등information_schema.sql스크립트는 고정되지 않지만 모든 개체는 고정되지 않습니다.genbki.pl그러겠습니다.

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

68.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.

  • 함수는 다음으로 표현될 수 있습니다.이름, 그것이 다음 중 고유한 경우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(일반적으로 다중 열 외래 키).

68.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.) 그러면타입렘그리고typarray두 항목의 필드는 서로 상호 참조하도록 설정되어 있습니다.

68.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

수정 사항 제출

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