수동으로 제작 된 초기 롤 토토가있는 각 카탈로그 (일부는 해당하지 않음).dat
편집 가능한 형식의 초기 롤 토토를 포함하는 파일.
각.dat
파일에는 Catalog Row 당 하나씩 해시 참조 배열로 구성된 메모리 내 롤 토토 구조를 생성하기 위해 단순히 평가되는 Perl 롤 토토 구조 리터럴이 포함되어 있습니다. 약간 수정 된 발췌문pg_database.dat
주요 기능을 보여줍니다.
[ # 여기에 댓글이 나타날 수 있습니다. oid = '1', oid_symbol = 'template1dboid', descr = 'database \'s default 템플릿 ', datname = 'template1', encoding = '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_', ]
참고 사항 :
전체 파일 레이아웃은 다음과 같습니다. 개방형 사각형 브래킷, 각각 하나 이상의 곱슬 브레이스 세트가 카탈로그 행, 닫기 사각형 브래킷을 나타냅니다. 닫는 곱슬 버팀대 후에 쉼표를 쓰십시오.
각 카탈로그 행 안에 쉼표로 구분 된 쓰기키
=
value
쌍. 허용키
s는 카탈로그 열의 이름이며 메타 롤 토토 키OID
, OID_SYMBOL
, array_type_oid
및descr
. (사용OID
및OID_SYMBOL
섹션 67.2.2아래, whilearray_type_oid
섹션 67.2.4. descr
개체에 대한 설명 문자열을 제공합니다.pg_description
또는pg_shdescription
적절한 경우) 메타 롤 토토 키는 선택 사항이지만 카탈로그의 정의 된 열은 모두 제공되어야합니다. 카탈로그의 경우를 제외하고..h
파일 열에 대한 기본값을 지정합니다. (위의 예에서datdba
필드는 생략 되었기 때문에pg_database.h
적절한 기본값을 제공합니다.)
모든 값은 단일 인용해야합니다. 백 슬래시가있는 값 내에서 사용 된 단일 따옴표를 피하십시오. 백 슬래시는 롤 토토가 2 배가 될 수 있지만 필요하지는 않습니다. 이것은 간단한 인용 리터럴에 대한 Perl의 규칙을 따릅니다. Escape String 상수와 동일한 규칙에 따라 롤 토토로 표시되는 백 슬래시는 Bootstrap 스캐너에 의해 이스케이프로 취급됩니다 (참조.섹션 4.1.2.2); 예를 들어\ t
탭 문자로 변환합니다. 실제로 최종 값의 백 슬래시를 원한다면 4 개 중 4 개를 작성해야합니다. Perl Strips, Leave\\
부트 스트랩 스캐너를 볼 수 있습니다.
널 값은로 표시됩니다._null_
. (그 문자열 인 값을 만들 수있는 방법이 없습니다.)
댓글이 앞서#
, 그리고 자신의 라인에 있어야합니다.
다른 카탈로그 항목의 OID 인 필드 값은 실제 숫자 OID가 아닌 상징적 이름으로 표시되어야합니다. (위의 예에서dattablespace
그러한 참조를 포함합니다.) 이것은에 설명되어 있습니다.섹션 67.2.3아래.
해시는 정렬되지 않은 롤 토토 구조이므로 현장 순서 및 라인 레이아웃이 의미 적으로 중요하지 않습니다. 그러나 일관된 모양을 유지하기 위해 서식 스크립트에 의해 적용되는 몇 가지 규칙을 설정합니다.Reformat_dat_file.pl
:
각 곱슬 버팀대 쌍 안에 메타 롤 토토 필드OID
, OID_SYMBOL
, array_type_oid
및descr
(현재) 먼저, 순서대로 카탈로그의 자체 필드는 정의 된 순서로 나타납니다.
가능한 경우 라인 길이를 80 자로 제한하기 위해 필요한 경우 필드간에 Newlines가 삽입됩니다. 메타 롤 토토 필드와 일반 필드 사이에 Newline도 삽입됩니다.
카탈로그 인 경우.h
파일 열에 대한 기본값을 지정하고 롤 토토 입력에 동일한 값이 있습니다.Reformat_dat_file.pl
롤 토토 파일에서 생략합니다. 이것은 롤 토토 표현을 컴팩트하게 유지합니다.
Reformat_dat_file.pl
빈 줄과 주석 선이 보존됩니다.
실행하는 것이 좋습니다Reformat_dat_file.pl
카탈로그 롤 토토 패치를 제출하기 전에. 편의를 위해 단순히로 변경할 수 있습니다.SRC/포함/카탈로그/
and runReformat-dat-files 만들기
.
롤 토토 표현을 더 작게 만드는 새로운 방법을 추가하려면을 구현해야합니다.Reformat_dat_file.pl
그리고 또한 가르치는카탈로그 :: parsedata ()
롤 토토를 전체 표현으로 다시 확장하는 방법.
초기 데이터에 나타나는 카탈로그 행에 an을 작성하여 수동으로 할당 된 OID를 제공 할 수 있습니다OID =
메타 롤 토토 필드. 또한 OID가 할당되면 해당 OID에 대한 C 매크로를 작성하여 생성 할 수 있습니다.nnnn
OID_SYMBOL =
메타 롤 토토 필드.이름
사전로드 된 카탈로그 행에는 다른 사전로드 된 행에 OID 참조가 있으면 사전 설정된 OID가 있어야합니다. 행의 OID를 C 코드에서 참조 해야하는 경우 사전 설정된 OID도 필요합니다. 어떤 경우도 적용되지 않으면OID
메타 데이터 필드를 생략 할 수 있으며,이 경우 부트 스트랩 코드는 자동으로 OID를 할당합니다. 실제로 우리는 일반적으로 주어진 카탈로그에서 사전로드 된 행 중 전부 또는 전혀없는 OID를 전혀 사전 할 수 있습니다.
C 코드에서 OID의 실제 숫자 값을 작성하는 것은 매우 나쁜 형태로 간주됩니다. 대신 항상 매크로를 사용하십시오. 직접 참조PG_PROC
OIDS는 필요한 매크로를 자동으로 만들기위한 특별한 메커니즘이있을 정도로 일반적입니다. 보다src/backend/utils/gen_fmgrtab.pl
. 마찬가지로 - 그러나 역사적 이유로 똑같은 방식으로 수행되지 않은 경우 - 매크로를 만들기위한 자동 방법이 있습니다pg_type
oids.OID_SYMBOL
따라서이 두 카탈로그에는 항목이 필요하지 않습니다. 마찬가지로, 매크로pg_class
시스템 카탈로그 및 인덱스의 OID가 자동으로 설정됩니다. 다른 모든 시스템 카탈로그의 경우를 통해 필요한 매크로를 수동으로 지정해야합니다.OID_SYMBOL
출품작.
새 사전로드 행에 사용 가능한 OID를 찾으려면 스크립트를 실행하십시오SRC/포함/카탈로그/UNUSED_OIDS
. 사용하지 않는 OID의 포괄적 인 범위 (예 : 출력 라인을 인쇄합니다.45-900
의미는 OIDS 45 ~ 900이 아직 할당되지 않았다는 것을 의미합니다). 현재 OIDS 1-9999는 수동 할당을 위해 예약되어 있습니다. 그만큼unused_oids
스크립트는 단순히 카탈로그 헤더를 통해 봅니다.dat
어떤 것이 나타나지 않는지 확인하는 파일. 당신은 또한를 사용할 수 있습니다.duplical_oids
실수를 확인하는 스크립트. (genbki.pl
하나의 손으로 할당되지 않은 행에 대해 OIDS를 할당하고 컴파일 시간에 중복 OID를 감지합니다.)
즉시 커밋되지 않을 패치에 대한 OID를 선택할 때 모범 사례는 8000-9999 범위에서 임의의 선택으로 시작하여보다 연속적인 OID 그룹을 사용하는 것입니다. 이것은 다른 패치가 동시에 개발되는 OID 충돌의 위험을 최소화합니다. 개발 목적으로 8000-9999 범위를 무료로 유지하려면 패치가 마스터 git 저장소에 전념 한 후 OID를 해당 범위 아래의 사용 가능한 공간으로 흡수해야합니다. 일반적으로, 이것은 각 개발주기의 끝 근처에서 이루어지며, 그주기에 저지른 패치로 소비 된 모든 OID를 동시에 움직입니다. 스크립트Renumb_oids.pl
이 목적으로 사용될 수 있습니다. 커밋되지 않은 패치가 최근에 커밋 된 패치와 OID 충돌이있는 것으로 밝혀지면Renumb_oids.pl
그 상황에서 회복하는 데 유용 할 수도 있습니다.
패치에 의해 할당 된이 OID를 흡수 할 수있는이 협약으로 인해 패치에 의해 할당 된 OID는 패치가 공식 릴리스에 포함될 때까지 안정적으로 간주되어서는 안됩니다. 그러나 수동으로 할당 된 오브젝트 OIDS는 한 번 릴리스되지만 분류 된 호환성 문제를 일으킬 것이므로
ifgenbki.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는 안정적으로 간주되지 않으며 하나의 설치에서 다른 설치로 변경 될 수 있습니다.
원칙적으로, 한 초기 카탈로그 행에서 다른 초기 카탈로그 행으로의 상호 참조는 참조 필드에서 참조 행의 사전 지정된 OID를 작성하여 작성할 수 있습니다. 그러나 이는 프로젝트 정책에 위배됩니다. 오류가 발생하기 쉽고 읽기가 어렵고 새로 할당 된 OID가 흡수되면 파손 될 수 있기 때문입니다. 그러므로genbki.pl
대신 상징적 참조를 작성하는 메커니즘을 제공합니다. 규칙은 다음과 같습니다.
기호 참조의 사용은 특정 카탈로그 열에서 첨부하여 활성화됩니다BKI_LOOKUP (
열의 정의에LookUprule
)LookUprule
참조 카탈로그의 이름입니다 (예 :PG_PROC
. BKI_LOOKUP
유형 열에 첨부 될 수 있습니다OID
, Regproc
, oidvector
또는OID []
; 후자의 두 경우에서는 배열의 각 요소에 대한 조회를 수행한다는 것을 의미합니다.
첨부 할 수 있습니다BKI_LOOKUP (인코딩)
문자 세트 인코딩을 참조하기 위해 정수 열로, 현재 카탈로그 OID로 표시되지는 않지만 알려진 값 세트가 있습니다genbki.pl
.
일부 카탈로그 열에서는 유효한 참조 대신 항목이 0이 될 수 있습니다. 이것이 허용되면 쓰기BKI_LOOKUP_OPT
대신BKI_LOOKUP
. 그런 다음 쓸 수 있습니다0
항목. (열이 선언 된 경우Regproc
, 선택적으로 쓸 수 있습니다-
대신0
.)이 특별한 경우를 제외하고 A의 모든 항목.bki_lookup
열은 상징적 참조 여야합니다.genbki.pl
인식되지 않은 이름에 대해 경고 할 것입니다.
대부분의 종류의 카탈로그 개체는 단순히 이름으로 참조됩니다. 유형 이름은 참조 된와 정확히 일치해야합니다.PG_TYPE
Entry 'stypname
; 와 같은 별칭을 사용하지 않습니다.정수
forint4
.
함수는 그로 표현할 수 있습니다Proname
, 그것이 독특하다면pg_proc.dat
entries (이것은 레지프로 입력과 같습니다). 그렇지 않으면Proname (Argtypename, Argtypename, ...)
, 레지 절차. 인수 유형 이름은에있는 것처럼 정확하게 철자를 써야합니다.pg_proc.dat
Entry 'sproArgTypes
필드. 공백을 삽입하지 마십시오.
운영자는oprname (LeftType, Righttype)
, 유형 이름을 정확하게 작성하여pg_operator.dat
Entry 'soprleft
및oprright
필드. (쓰다0
단지 연산자의 생략 된 피연산자의 경우)
opclass 및 opfamilies의 이름은 액세스 방법 내에서만 고유하므로access_method_name
/
Object_Name
.
이 경우 스키마 자격을위한 조항이 없습니다. 부트 스트랩 중에 생성 된 모든 객체는에있을 것으로 예상됩니다.PG_CATALOG
스키마
genbki.pl
실행 중에 모든 상징적 참조를 해결하고 방출 된 BKI 파일에 간단한 숫자 OID를 넣습니다. 따라서 부트 스트랩 백엔드가 상징적 참조를 처리 할 필요가 없습니다.
OID 참조 열을 표시하는 것이 바람직합니다BKI_LOOKUP
또는bki_lookup_opt
카탈로그에 조회가 필요한 초기 롤 토토가 없더라도. 이것은 허용genbki.pl
시스템 카탈로그에 존재하는 외국의 주요 관계를 기록합니다. 이 정보는 회귀 테스트에 사용되어 잘못된 항목을 확인합니다. Macros 참조deplare_foreign_key
, deplare_foreign_key_opt
, deplare_array_foreign_key
및deplare_array_foreign_key_opt
, 이것은 너무 복잡한 외국의 주요 관계를 선언하는 데 사용됩니다BKI_LOOKUP
(일반적으로 다중 열 외국 키).
대부분의 스칼라 롤 토토 유형은 해당 배열 유형을 가져야합니다 (즉, 요소 유형이 스칼라 유형이고의 표준 Varlena 배열 유형은typarray
스칼라 유형의 필드PG_TYPE
Entry).genbki.pl
생성 할 수 있습니다pg_type
28166_28222
이 시설을 사용하려면을 작성하십시오.array_type_oid =
스칼라 유형의 메타 롤 토토 필드nnnn
pg_type
항목, 배열 유형에 사용할 OID를 지정합니다. 그런 다음 생략 할 수 있습니다.typarray
필드, 해당 OID로 자동으로 채워지기 때문에
생성 된 배열 유형의 이름은 밑줄이 선불 된 스칼라 유형의 이름입니다. 배열 항목의 다른 필드는에서 채워졌습니다.bki_array_default (
주석value
)pg_type.h
또는 스칼라 유형에서 복사 한 경우. (특별한 경우도 있습니다typalign
.) 그런 다음Typelem
및TypArray
두 항목의 필드는 서로 교차 참조하도록 설정되어 있습니다.
카탈로그 롤 토토 파일을 업데이트 할 때 일반적인 작업을 수행하는 가장 쉬운 방법에 대한 제안이 있습니다.
카탈로그에 기본값이있는 새 열을 추가 :a가있는 헤더 파일에 열을 추가합니다.bki_default (
주석. 데이터 파일은 기존 값이 필요한 기존 행에 필드를 추가 하여만 조정하면됩니다.value
)
기존 열에 기본값을 추가하지 않는 기존 열에 기본값 추가 :추가bki_default
헤더 파일에 대한 주석, 실행Reformat-dat-files 만들기
현재 중복 필드 항목을 제거하려면.
기본값이 있는지 여부에 관계없이 열을 제거합니다.헤더에서 열을 제거한 다음 실행Reformat-dat-files 만들기
지금은 없음 필드 항목을 제거하려면
기존 기본값 변경 또는 제거 :헤더 파일을 단순히 변경할 수는 없습니다. 현재 데이터가 잘못 해석되므로. 첫 번째 실행확장-파일 만들기
모든 기본값을 명시 적으로 삽입 한 상태에서 데이터 파일을 다시 작성 한 다음를 변경하거나 제거합니다.bki_default
주석, 실행Reformat-dat-files 만들기
불필요한 필드를 다시 제거하려면
Ad-Hoc Bulk Editing : Reformat_dat_file.pl
많은 종류의 벌크 변경을 수행하도록 조정할 수 있습니다. 일회성 코드를 삽입 할 수있는 위치를 보여주는 블록 주석을 찾으십시오. 다음 예에서는 두 개의 부울 필드를 통합 할 것입니다.PG_PROC
숯불로 :
기본값으로 새 열을 추가하여pg_proc.h
:
+ / * 아래 Prokind_ 카테고리 참조 * / + char prokind bki_default (f);
Reformat_dat_file.pl
즉시 적절한 값을 삽입하려면 :
- #이 시점에서 우리는 메모리에 해시로 전체 행이 있습니다. - # 그리고 우리가 원하는 모든 작업을 수행 할 수 있습니다. 서면으로 만 - # 기본값을 제거하지만이 스크립트는 - # 일회성 벌크 편집을 수행합니다. + # Prokind로 마이그레이션하기위한 일회성 변경 + # 기본값은 지금 이미 채워 졌으므로 다른 사람으로 변경하십시오. + # 적절한 값 + if ($ value proisagg eq 't') + + $ 값 prokind = 'a'; +
새 스크립트 실행 :
$ cd src/include/catalog $ perl rewrite_dat_with_prokind.pl pg_proc.dat
이 시점에서pg_proc.dat
세 열이 모두 있습니다Prokind
, proisagg
및ProisWindow
, 비 디폴트 값이있는 행에만 나타납니다.
이전 열 제거pg_proc.h
:
- /* 집계입니까? */ - bool proisagg bki_default (f); - - /* 창 함수입니까? */ -Ool proiswindow bki_default (f);
드디어, runReformat-dat-files 만들기
쓸모없는 오래된 항목을 제거하려면pg_proc.dat
.
대량 편집에 사용되는 스크립트의 추가 예는 참조convert_oid2name.pl
및remove_pg_type_oid_symbols.pl
이 메시지에 첨부 :/message-id/cajvsvgvgvx8gxnpm+xa=dxr7kfyprc1tncct5d0o3shfnm6jeha@mail.gmail.com
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면