이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 53.2. 와이즈 토토 흐름버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

46.2. 토토 결과 흐름

이 섹션은 토토 결과 흐름과 의미를 설명합니다. 각 토토 결과 유형. (각각의 정확한 표현에 대한 세부 사항 토토 결과가 나타납니다PostgreSQL : 문서 : 9.1 : 토토 사이트 추천 형식.)에 따라 여러 가지 하위 프로토콜이 있습니다 연결 상태 : 시작, 쿼리, 기능 호출,copy및 종료. 또한 있습니다 비동기 운영을위한 특별 조항 (포함 알림 응답 및 명령 취소) 시작 단계 후 언제든지.

46.2.1. 스타트 업

세션을 시작하려면 프론트 엔드는 서버 및 시작 메시지를 보냅니다. 이 메시지에는 다음이 포함됩니다 사용자가 연결하려는 사용자와 데이터베이스의 이름 에게; 또한 특정 프로토콜 버전을 식별합니다 사용된. (선택적으로 시작 메시지에는 추가가 포함될 수 있습니다 런타임 매개 변수에 대한 설정.) 서버는 이것을 사용합니다 구성 파일의 정보 및 내용 (예 : 처럼pg_hba.conf) 여부를 결정합니다 연결은 잠정적으로 수용 가능하며 추가 추가 인증이 필요합니다 (있는 경우)

서버는 적절한 인증 요청을 보냅니다 프론트 엔드가 적절한 인증 응답 토토 결과 (예 : 비밀번호). 모두를 위해 GSSAPI 및 SSPI를 제외한 인증 방법은 최대 하나의 요청과 하나의 응답. 일부 방법에서는 응답이 없습니다 모두 프론트 엔드에서 필요하므로 인증이 없습니다. 요청이 발생합니다. GSSAPI 및 SSPI의 경우 여러 교환 인증을 완료하려면 패킷이 필요할 수 있습니다.

인증주기는 서버로 끝납니다 연결 시도 (ErrorResponse)를 거부하거나 보내기 Authenticationok.

이 단계에서 서버의 가능한 메시지는 다음과 같습니다.

ErrorResponse

연결 시도가 거부되었습니다. 서버 그런 다음 즉시 연결을 닫습니다.

Authenticationok

인증 교환이 성공적으로 이루어집니다 완전한.

AuthenticationKerberoSV5

프론트 엔드는 이제 Kerberos v5에 참여해야합니다. 인증 대화 상자 (여기에 설명되지 않음, 일부 Kerberos 사양) 서버와 함께. 이것이 있다면 성공적으로 서버는 Authenticationok으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

AuthenticationClearTextPassword

프론트 엔드는 이제 passwordMessage를 보내야합니다 Clear-Text 양식으로 비밀번호를 포함합니다. 이것이 있다면 올바른 비밀번호, 서버는 다음에 응답합니다 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.

AuthenticationMd5password

프론트 엔드는 이제 PasswordMessage를 보내야합니다 MD5를 통해 암호화 된 암호를 포함합니다 4- 특성 소금 AuthenticationMd5password 메시지. 이것이 맞다면 비밀번호, 서버는 AuthenticationOk으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

Authenticationscmcredential

이 응답은 로컬 유닉스 도메인에 대해서만 가능합니다 SCM 자격 증명을 지원하는 플랫폼의 연결 메시지. 프론트 엔드는 SCM 자격 증명을 발행해야합니다 메시지를 보내서 단일 데이터 바이트를 보내십시오. (내용 데이터 바이트는 흥미롭지 않습니다. 익숙합니다 서버가 자격 증명 메시지.) 자격 증명이 허용되는 경우 서버는 Authenticationok으로 응답합니다 ErrorResponse로 응답합니다. (이 메시지 유형입니다 Pre-9.1 서버에서만 발행됩니다. 결국 그럴 수도 있습니다 프로토콜 사양에서 제거되었습니다.)

AuthenticationGSS

프론트 엔드는 이제 GSSAPI 협상을 시작해야합니다. 프론트 엔드는 첫 번째와 함께 암호 메신스를 보냅니다 이에 대한 응답으로 GSSAPI 데이터 스트림의 일부. 만약에 추가 토토 결과가 필요하며 서버가 응답합니다 AuthenticationgsScontinue.

AuthenticationsSpi

프론트 엔드는 이제 SSPI 협상을 시작해야합니다. 그만큼 Frontend는 첫 번째 부분과 함께 PasswordMessage를 보냅니다 이에 대한 응답으로 SSPI 데이터 스트림. 더라도 토토 결과가 필요하고 서버가 응답합니다 AuthenticationgsScontinue.

AuthenticationgsScontinue

이 메시지에는 응답 데이터가 포함되어 있습니다 GSSAPI 또는 SSPI 협상의 이전 단계 (AuthenticationGSS, AuthenticationSSPI 또는 이전 AuthenticationgsScontinue). GSSAPI 또는 SSPI 데이터가 이 메시지는 완료하기 위해 더 많은 데이터가 필요하다는 것을 나타냅니다 인증, 프론트 엔드는 해당 데이터를 다음과 같이 보내야합니다 다른 passwordMessage. GSSAPI 또는 SSPI 인증 인 경우 이 메시지에 의해 완료되면 서버는 다음으로 보내집니다. 성공적인 인증을 나타내는 인증 또는 실패를 나타내는 ErrorResponse.

프론트 엔드가 인증 방법을 지원하지 않는 경우 서버에서 요청한 다음 즉시 닫아야합니다. 연결.

Authenticationok을받은 후, 프론트 엔드는해야합니다 서버에서 추가 메시지를 기다립니다. 이 단계에서 a 백엔드 프로세스가 시작되고 있으며 프론트 엔드는 관심있는 방관자. 스타트 업에는 여전히 가능합니다 실패 (ErrorResponse)를 시도하지만 정상적인 경우 Backend는 일부 Parameterstatus 메시지를 보냅니다. BackendkeyData 및 마지막으로 ReadyForquery.

이 단계에서 백엔드는 어떤 적용을 적용하려고 시도합니다. 추가 런타임 매개 변수 설정에 제공된 추가 런타임 매개 변수 설정 시작 메시지. 성공하면 이러한 값은 세션이됩니다 기본값. 오류는 ErrorResponse 및 종료를 유발합니다.

이 단계에서 백엔드의 가능한 토토 결과 이다:

BackendKeyData

이 토토 결과는 비밀 키 데이터를 제공합니다 취소를 발행하려면 프론트 엔드를 저장해야합니다. 나중에 요청합니다. 프론트 엔드는 이에 응답해서는 안됩니다 토토 결과이지만 계속 듣어야합니다 readyforquery 토토 결과.

Parameterstatus

이 메시지는 현재에 대한 프론트 엔드를 알려줍니다 (초기) 백엔드 매개 변수 설정 (예 :client_encoding또는Datestyle. 프론트 엔드는이 토토 결과를 무시하거나 기록 할 수 있습니다 향후 사용을위한 설정; 보다섹션 46.2.6자세한 내용은. 프론트 엔드는 이에 응답해서는 안됩니다 토토 결과이지만 계속 듣어야합니다 readyforquery 토토 결과.

ReadyForquery

스타트 업이 완료되었습니다. 프론트 엔드는 이제 발행 할 수 있습니다 명령.

ErrorResponse

스타트 업 실패. 연결이 닫힙니다 이 토토 결과 보내기.

NoticerPonse

경고 메시지가 발행되었습니다. 프론트 엔드 메시지를 표시하지만 계속 듣습니다 ReadyForquery 또는 ErrorResponse.

ReadyForquery 메시지는 백엔드와 동일합니다. 각 명령주기 후에 발행됩니다. 코딩에 따라 프론트 엔드의 필요, 고려해야 할 것이 합리적입니다 명령주기를 시작하거나 고려할 때 ReadyForquery 스타트 업 단계를 종식시키는 데 따른 기성 쿼리 및 각 후속 명령주기.

46.2.2. 간단한 쿼리

간단한 쿼리주기는 프론트 엔드가 백엔드에 대한 쿼리 메시지. 메시지에는 SQL이 포함됩니다 텍스트 문자열로 표현 된 명령 (또는 명령). 백엔드 그런 다음에 따라 하나 이상의 응답 메시지를 보냅니다. 쿼리 명령 문자열의 내용 및 마지막으로 a ReadyForquery 응답 메시지. ReadyForquery는 다음을 알려줍니다 새 명령을 안전하게 보낼 수있는 프론트 엔드. (그렇지 않습니다 실제로 프론트 엔드가 ReadyForquery를 기다리는 데 필요합니다 다른 명령을 발행하기 전에, 그러나 프론트 엔드는 이전에 어떤 일이 발생하는지 알아내는 책임 명령이 실패하고 이미 발행 된 이후에 발행 된 명령이 성공합니다.)

백엔드의 가능한 응답 메시지는 다음과 같습니다.

CommandComplete

정상적으로 완료된 SQL 명령.

CopyInResponse

백엔드는 프론트 엔드에서 데이터를 복사 할 준비가되었습니다. 테이블; 보다섹션 46.2.5.

CopyOUtResponse

백엔드는 테이블에서 데이터를 복사 할 준비가되었습니다. 프론트 엔드; 보다섹션 46.2.5.

RowDescription

행이 반환 될 것임을 나타냅니다 A에 대한 응답select, fetch등 쿼리. 이것의 내용 토토 결과 행의 열 레이아웃을 설명합니다. 이것은 할 것입니다 각 행에 대한 Datarow 토토 결과가이어야합니다. 프론트 엔드로 돌아 왔습니다.

Datarow

a에 의해 반환 된 행 세트 중 하나입니다.select, fetch, 등 쿼리.

EmptyQueryResponse

빈 쿼리 문자열이 인식되었습니다.

ErrorResponse

오류가 발생했습니다.

ReadyForquery

쿼리 문자열의 처리가 완료되었습니다. 별도 쿼리 문자열이 있으므로이를 표시하기 위해 메시지가 전송됩니다. 여러 SQL 명령이 포함될 수 있습니다. (CommandComplete 하나의 SQL 명령을 처리하는 종료가 전체 문자열.) ReadyForquery는 항상 전송됩니다 처리 처리는 성공적으로 또는 오류가 발생합니다.

NoticerPonse

경고 토토 결과가 질문. 통지는 다른 응답에 추가됩니다. 백엔드는 계속해서 명령을 처리합니다.

A에 대한 응답select쿼리 (또는 와 같은 행을 반환하는 다른 쿼리설명또는show) 일반적으로 rowdescription, 0 이상의 Datarow로 구성됩니다 메시지 및 CommandComplete.COPY또는 프론트 엔드에서 특별한 특별한 발자국을 호출합니다 에 설명 된 프로토콜섹션 46.2.5. 모두 다른 쿼리 유형은 일반적으로 CommandComplete 만 생성합니다 메시지.

쿼리 문자열에는 여러 쿼리가 포함될 수 있으므로 (세미콜론으로 분리), 그러한 반응이 몇 가지있을 수 있습니다 백엔드가 쿼리 처리를 완료하기 전에 시퀀스 끈. 전체 문자열이있을 때 ReadyForquery가 발행됩니다 처리되고 백엔드는 새 쿼리를 수락 할 준비가되었습니다. 끈.

완전히 비어있는 경우 (공백 이외의 내용 없음) 쿼리 문자열이 수신되고 응답은 emptyQueryResponse입니다 그 다음에는 ReadyForquery가 뒤 따릅니다.

오류가 발생하면 ErrorResponse가 발행됩니다. readyforquery에 의해. 쿼리 문자열의 모든 추가 처리는 다음과 같습니다 ErrorResponse에 의해 중단됩니다 (더 많은 쿼리가 남아 있더라도). 이것은 순서를 통해 부분적으로 발생할 수 있습니다. 개별 쿼리에 의해 생성 된 메시지.

간단한 쿼리 모드에서 검색된 값의 형식은 다음과 같습니다. 주어진 명령이 A를 제외하고는 항상 텍스트입니다.fetchbinary옵션. 이 경우 검색되었습니다 값은 이진 형식입니다. 에 주어진 형식 코드 rowdescription 토토 결과가 사용되는 형식을 알려줍니다.

ErrorResponse를 수락하기 위해 프론트 엔드를 준비해야합니다 다른 유형이 예상 될 때마다 alicerponse 메시지 메시지의. 참조 참조섹션 46.2.6백엔드가 생성 할 수있는 토토 결과와 관련하여 외부 이벤트.

권장되는 관행은 State-Machine의 Frontendend를 코딩하는 것입니다 언제든지 모든 토토 결과 유형을 수락하는 스타일 에 대한 가정의 배선보다는 의미가있을 수 있습니다. 정확한 토토 결과 순서.

46.2.3. 확장 쿼리

확장 쿼리 프로토콜은 위에서 설명한 것을 분해합니다 여러 단계로 간단한 쿼리 프로토콜. 결과 개선을 위해 준비 단계를 여러 번 재사용 할 수 있습니다 능률. 또한 추가 기능을 사용할 수 있으며 데이터 값을 별도로 공급할 가능성과 같은 직접 삽입하는 대신 매개 변수 쿼리 문자열.

확장 프로토콜에서 프론트 엔드는 먼저 구문 분석을 보냅니다. 텍스트 쿼리 문자열이 포함 된 메시지는 선택적으로 일부입니다 매개 변수 자리 표시 자의 데이터 유형에 대한 정보 대상 준비 대상 개체의 이름 (빈 문자열은 이름이없는 준비된 진술을 선택합니다). 응답은입니다 Parsecomplete 또는 ErrorResponse. 매개 변수 데이터 유형이 가능합니다 OID에 의해 지정됩니다. 주어지지 않으면 파서는 추론을 시도합니다 데이터 유형은 Untyped와 같은 방식으로 문자 그대로 문자열 상수.

참고 :매개 변수 데이터 유형을 남길 수 있습니다 0으로 설정하거나 배열을 만들어 지정되지 않음 매개 변수 유형 OID의 매개 변수 수보다 짧은 OID 기호 ($n25693_25807void(즉,voidPseudotype). 이것은 의미합니다 함수 매개 변수에 매개 변수 기호를 사용할 수 있습니다 실제로 매개 변수입니다. 일반적으로 아니요 A의 맥락void매개 변수 사용할 수 있지만 그러한 매개 변수 기호가 함수의 매개 변수 목록은 효과적으로 무시됩니다. 을 위한 예,와 같은 함수 호출foo ($ 1, $ 2, $ 3, $ 4)함수와 일치 할 수 있습니다 2 인치와 두 개의 논쟁, if$ 3and$ 4are 유형이있는 것으로 지정void.

참고 :구문 분석에 포함 된 쿼리 문자열 메시지에는 둘 이상의 SQL 문을 포함 할 수 없습니다. 그렇지 않으면 a 구문 오류 가보고됩니다. 이 제한은 존재하지 않습니다 단순한 쿼리 프로토콜에서는 준비된 진술을 허용하기 때문에 확장 프로토콜 또는 여러 명령을 포함하는 포털은 과도하게 프로토콜.

성공적으로 생성 된 경우 명명 된 준비된 개체 명시 적으로가 아니라면 현재 세션이 끝날 때까지 지속됩니다. 의해 파괴됨. 이름이없는 준비된 진술은 다음 구문 분석 명령문은 이름이없는 진술을 지정합니다 목적지가 발행됩니다. (간단한 쿼리 메시지도 마찬가지입니다 이름이없는 진술을 파괴합니다.) 명명 된 준비된 진술은해야합니다 구문 분석에 의해 재정의되기 전에 명시 적으로 닫힙니다. 메시지이지만 이름이없는 진술에는 필요하지 않습니다. 명명 된 준비된 진술은 또한 SQL 명령 레벨 사용준비andexecute.

준비된 진술이 있으면 다시 확인할 수 있습니다. 바인드 메시지를 사용하여 실행. 바인드 메시지는 이름을 부여합니다 소스 준비 된 문의 (빈 문자열은 다음을 나타냅니다 이름이없는 준비된 진술), 대상 포털의 이름 (빈 문자열은 이름없는 포털을 나타냅니다), 값은 준비된 매개 변수 자리 소유자에 사용됩니다 성명. 제공된 매개 변수 세트는 필요한 것과 일치해야합니다 준비된 진술에 의해. (당신이 선언 한 경우void파라스 메시지의 매개 변수는 NULL을 통과합니다 바인드 메시지에서 그들에 대한 값.) 바인드는 또한 쿼리에서 반환 된 모든 데이터에 사용할 형식; 형식 전체적으로 또는 열 당 지정할 수 있습니다. 응답도 마찬가지입니다 bindcomplete 또는 errorResponse.

참고 :텍스트와 이진 출력 사이의 선택 BAND에 주어진 형식 코드에 의해 결정됩니다. 관련된 SQL 명령의 그만큼BINAGE커서 선언의 속성입니다 확장 쿼리 프로토콜을 사용할 때 관련이 없습니다.

명명 된 준비된 개체에 대한 쿼리 계획이 발생합니다 구문 분석 메시지가 처리 될 때. 쿼리가있는 경우 다른 매개 변수로 반복적으로 실행되면 가능할 수 있습니다 포함 된 단일 구문 분석 메시지를 보내는 것이 좋습니다 매개 변수화 된 쿼리, 다중 바인드 및 실행이 이어집니다 메시지. 이렇게하면 각각의 쿼리를 회복하지 않습니다 실행.

이름이없는 준비된 진술도 마찬가지로 계획됩니다 구문 분석 메시지가 매개 변수를 정의하지 않으면 처리됩니다. 그러나 매개 변수가있는 경우 매번 쿼리 계획이 발생합니다. 바인드 파라미터가 제공됩니다. 이를 통해 플래너는 만들 수 있습니다 각각에 의해 제공된 매개 변수의 실제 값 사용 일반적인 추정치를 사용하는 대신 메시지를 바인딩합니다.

참고 :매개 변수에서 생성 된 쿼리 계획 쿼리는 생성 된 쿼리 계획보다 덜 효율적 일 수 있습니다 실제 매개 변수 값과 동등한 쿼리에서 대체. 쿼리 플래너는 결정에 따라 결정을 내릴 수 없습니다 실제 매개 변수 값 (예 : 인덱스 선택성)에서 지정된 매개 변수화 된 쿼리를 계획 할 때 준비된 진술 객체. 이 가능한 벌금은 피합니다 이름이없는 진술을 사용할 때 계획되지 않았기 때문에 실제 매개 변수 값을 사용할 수있을 때까지. 비용은입니다 해당 계획은 쿼리는 동일하게 유지됩니다.

성공적으로 생성되면, 이름이 지정된 포털 객체는 끝납니다 명시 적으로 현재 거래의 끝 의해 파괴됨. 이름이없는 포털이 끝날 때 파괴됩니다. 거래 또는 다음 바인드 명령문이 지정하자마자 대상으로 이름이없는 포털이 발행됩니다. (a 간단한 쿼리 메시지는 이름이없는 포털을 파괴합니다.) 포털은 재정의되기 전에 명시 적으로 닫아야합니다. 바인드 메시지로, 그러나 이것은 이름이없는 것에 필요하지 않습니다. 문. 이름이 지정된 포털은 SQL 명령 레벨 사용선언 커서Fetch.

포털이 존재하면 실행을 사용하여 실행할 수 있습니다. 토토 결과. 실행 토토 결과는 포털 이름을 지정합니다 (빈 문자열은 이름이없는 포털을 나타냅니다)와 최대 결과 행을 나타냅니다 count (0 의미"모두 가져 오십시오 줄 "). 결과 열 수는 만 의미가 있습니다 행 세트를 반환하는 명령을 포함하는 포털; 다른 사례는 명령이 항상 완료되고 행을 실행합니다. 수는 무시됩니다. 실행할 가능한 응답은 다음과 같습니다 Simple을 통해 발행 된 쿼리에 대해 위에서 설명한 것과 동일합니다. 실행을 제외한 쿼리 프로토콜은 ReadyForquery를 유발하지 않습니다 또는 발행 될로드 설명.

실행이 a의 실행을 완료하기 전에 종료되는 경우 포털 (0이 아닌 결과 행 카운트에 도달하기 때문에 PortalSuspended 메시지를 보냅니다. 이 메시지의 모양 프론트 엔드에 다른 처형이 발행되어야한다고 말합니다 동일한 포털에 대해 작업을 완료합니다. 그만큼 소스 SQL의 완료를 나타내는 CommandComplete 메시지 포털의 실행이 완료 될 때까지 명령이 전송되지 않습니다. 따라서 실행 단계는 항상 종료됩니다 이 메시지 중 하나의 모양 : CommandComplete, EmptyQueryResponse (포털이 빈에서 생성 된 경우 쿼리 문자열), ErrorResponse 또는 PortalSuspended.

각 시리즈의 확장 쿼리 메시지를 완성 할 때 프론트 엔드는 동기화 메시지를 발행해야합니다. 이 매개 변수가 없습니다 메시지가 백엔드가 현재 트랜잭션을 종료하게합니다. 안에 있지 않아시작/커밋트랜잭션 블록 ("Close"오류가 없거나 롤이없는 경우 커밋하는 것을 의미합니다 뒤로 오류가 있으면). 그런 다음 ReadyForquery 응답이 발행됩니다. 그만큼 동기화의 목적은 다시 동기화 지점을 제공하는 것입니다. 오류 복구. 처리 중에 오류가 감지 될 때 확장 쿼리 메시지, 백엔드는 ErrorResponse를 발행합니다 동기화에 도달 할 때까지 메시지를 읽고 폐기합니다. ReadyForquery를 발행하고 일반 메시지 처리로 돌아갑니다. (그러나 오류가 감지되면 건너 뛰기가 발생하지 않습니다while처리 동기 - 이것은 하나의 readyforquery 만 있음을 보장합니다. 각 동기에 대해 전송)

참고 :SYNC는 트랜잭션 블록을 유발하지 않습니다 로 개설시작닫히려면. 그것 이후이 상황을 감지 할 수 있습니다 ReadyForquery 메시지에는 트랜잭션 상태가 포함됩니다 정보.

이러한 기본, 필요한 작업 외에도 함께 사용할 수있는 몇 가지 선택적 작업입니다 확장 쿼리 프로토콜.

설명 메시지 (포털 변형) 이름을 지정합니다 기존 포털 (또는 이름없는 포털의 빈 문자열). 응답은 행을 설명하는 RowDescription 메시지입니다 포털을 실행하여 반환됩니다. 또는 nodata 포털에 반환 될 쿼리가 포함되어 있지 않은 경우 행; 또는 그러한 포털이없는 경우 ErrorResponse.

설명 메시지 (Statement)는 이름을 지정합니다 기존 준비 된 진술 (또는 빈 문자열 이름이없는 준비된 진술). 응답은 a 필요한 매개 변수를 설명하는 ParameterDescription 메시지 성명서에 따르면, rowdescription 메시지가 이어집니다 진술이있을 때 반환 될 행을 설명합니다. 결국 실행되었습니다 (또는 진술이 반환 행이 아닙니다). 그러한 것이없는 경우 ErrorResponse가 발행됩니다 준비된 진술. Bind는 아직 없었기 때문에 주목하십시오 발행 된, 반환 된 열에 사용될 형식은 아직 없습니다. 백엔드에 알려져 있습니다. 형식 코드 필드 이 경우 rowdescription 메시지가 제로가됩니다.

팁 :대부분의 시나리오에서 프론트 엔드가 발행해야합니다 발급하기 전에 설명의 하나 또는 다른 변형 실행, 해석 방법을 알고 있는지 확인하십시오. 결과가 돌아올 것입니다.

닫기 메시지는 기존 준비 된 진술을 닫습니다 포털 및 릴리스 리소스. 발행하는 것은 오류가 아닙니다 존재하지 않는 진술 또는 포털 이름에 대해 닫습니다. 그만큼 응답은 일반적으로 Closecomplete이지만 ErrorResponse 일 수 있습니다 자원을 공개하는 동안 약간의 어려움이 발생하는 경우. 준비된 진술을 닫으면 암시 적으로 닫힙니다 그 진술에서 구성된 열린 포털.

플러시 토토 결과로 인해 특정 출력이 발생하지 않습니다. 생성되었지만 백엔드가 보류중인 데이터를 전달하도록 강요합니다. 출력 버퍼에서. 플러시는 어떤 후에도 보내야합니다 프론트 엔드가 원하는 경우 동기화를 제외한 확장 쿼리 명령 더 발급하기 전에 해당 명령의 결과를 검사하십시오 명령. 플러시가 없으면 백엔드가 반환 한 토토 결과가 있습니다 가능한 최소 수의 패킷 수로 결합됩니다. 네트워크 오버 헤드 최소화.

참고 :간단한 쿼리 메시지는 대략입니다 시리즈 구문 분석, 바인드, 포털 설명, 이름이없는 준비된 명령문을 사용하여 실행, 닫기, 동기화 및 포털 객체 및 매개 변수가 없습니다. 한 가지 차이점은 쿼리에서 여러 SQL 문을 수락 할 것입니다. String, Bind/Secling/Execute를 자동으로 수행합니다 연속적으로 각각의 순서. 또 다른 차이점입니다 Parsecomplete를 반환하지 않고 BindComplete, Closecomplete 또는 Nodata 메시지.

46.2.4. 함수 호출

함수 호출 서브 프로토콜을 사용하면 클라이언트가 요청할 수 있습니다 데이터베이스에 존재하는 모든 함수의 직접 호출PG_PROC시스템 카탈로그. 클라이언트 함수에 대한 권한을 실행해야합니다.

참고 :함수 호출 서브 프로토콜은 유산입니다 새 코드에서 가장 잘 피할 수있는 기능. 비슷한 준비된 것을 설정하여 결과를 달성 할 수 있습니다 말하는 진술선택 함수 ($ 1, ...). 그런 다음 함수 호출 사이클을 교체 할 수 있습니다 바인드/실행으로.

기능 호출주기는 전면 엔드에 의해 시작됩니다. 백엔드에 대한 기능을하는 메시지. 그런 다음 백엔드는 하나를 보냅니다 또는 결과에 따라 더 많은 응답 메시지 기능 호출 및 마지막으로 ReadyForquery 응답 메시지. ReadyForquery는 프론트 엔드에 안전하게 보낼 수 있음을 알려줍니다. 새 쿼리 또는 기능 호출.

백엔드의 가능한 응답 메시지는 다음과 같습니다.

ErrorResponse

오류가 발생했습니다.

functionCallResponse

함수 호출이 완료되어 반환되었습니다 메시지가 주어진 결과. (함수 호출 프로토콜은 단일 스칼라 결과 만 처리 할 수 ​​있습니다. 행 유형 또는 결과 세트.)

ReadyForquery

함수 호출 처리가 완료되었습니다. 처리 여부에 관계없이 ReadyForquery는 항상 전송됩니다 성공적으로 종료되거나 오류가 발생합니다.

NoticerPonse

경고 토토 결과가 기능 호출. 통지는 다른 것도 추가됩니다 응답, 즉 백엔드는 계속 처리됩니다 명령.

46.2.5. 복사 작업

theCOPY명령은 고속을 허용합니다 서버로 또는 대량 데이터 전송. 복사 및 복사 작동 각각 연결은 연결을 별개로 전환합니다 작업이 완료 될 때까지 지속되는 하위 프로콜.

카피인 모드 (서버로의 데이터 전송)가 시작됩니다. 백엔드가 a 실행됩니다.stdin에서 복사SQL 문. 백엔드는 CopyInResponse 메시지를 보냅니다 프론트 엔드. 그런 다음 프론트 엔드는 0 이상을 보내야합니다 입력 데이터 스트림을 형성하는 CopyData 메시지. (메시지 경계는 행과 관련이 없을 필요가 없습니다. 경계, 그것은 종종 합리적인 선택이지만.) 프론트 엔드는 복사 메시지 (성공적인 종료 허용) 또는 a CopyFail 메시지 (​​COPY오류로 실패하는 SQL 문). 그만큼 그런 다음 백엔드가있는 명령 처리 모드로 되돌아갑니다. 전COPY시작했을 것입니다 단순 또는 확장 쿼리 프로토콜. 다음으로 보내집니다 CommandComplete (성공한 경우) 또는 ErrorResponse (if 아니다).

카피 인 모드에서 백엔드 감지 오류가 발생한 경우 (CopyFail 메시지 수신 포함), 백엔드는 Will입니다 ErrorResponse 메시지를 발행하십시오. 인 경우COPY명령은 확장 쿼리를 통해 발행되었습니다 메시지, 백엔드는 이제 전면 엔드 메시지를 폐기합니다. 동기화 메시지가 수신되면 ReadyForquery를 발행하고 정상 처리로 돌아갑니다. 인 경우COPY명령은 간단한 쿼리로 발행되었습니다 메시지, 그 메시지의 나머지 부분은 폐기됩니다 ReadyForquery가 발행됩니다. 두 경우 모두 후속 프론트 엔드에서 발행 한 CopyData, CopyDone 또는 CopyFail 메시지 단순히 떨어질 것입니다.

백엔드는 수신 된 플러시 및 동기화 메시지를 무시합니다 복사 모드에서. 다른 비 코피 메시지 ​​유형의 수신 카피인 상태를 위에서 설명했습니다. (플러시 및 동기화 예외는입니다 항상 플러시 또는 동기화를 보내는 클라이언트 라이브러리의 편의 메시지를 실행 한 후 명령을 확인하지 않고 실행되는 것은 A입니다.복사 stdin.)

복사 모드 (서버에서 데이터 전송)가 시작됩니다 백엔드가 a를 실행할 때복사하십시오 stdoutSQL 문. 백엔드는 copiOUtresponse를 보냅니다 프론트 엔드에 대한 메시지, 0 이상의 카피 다다타가 이어집니다. 메시지 (항상 행당 하나), 복사기가 뒤 따릅니다. 그만큼 그런 다음 백엔드가있는 명령 처리 모드로 되돌아갑니다. 전COPY시작하여 보냅니다 CommandComplete. 프론트 엔드는 이전을 중단 할 수 없습니다 (제외 연결을 닫거나 취소 요청을 발행하여) 원치 않는 카피 데이터와 복사 메시지를 폐기 할 수 있습니다.

복사 중에 백엔드 감지 오류가 발생한 경우 모드, 백엔드는 ErrorResponse 메시지를 발행합니다 정상 처리로 되돌아갑니다. 프론트 엔드는 영수증을 처리해야합니다 카피 아웃 모드를 종료하는 ErrorResponse.

eliceResponse 및 Parameterstatus가 가능합니다 CopyData 메시지간에 산재 할 메시지; 프론트 엔드는 이러한 사례를 처리해야하며 준비해야합니다. 기타 비동기 메시지 유형 (참조섹션 46.2.6). 그렇지 않으면 CopyData 또는 Copydone 이외의 메시지 유형이 종료 카피 아웃 모드로 취급됩니다.

Copy-Both라는 다른 카피 관련 모드가 있습니다 고속 벌크 데이터 전송 허용서버에서. 카피-보스 Walsender 모드의 백엔드가 A를 실행할 때 모드가 시작됩니다.start_replication진술. 그만큼 백엔드는 CopyBothResponse 토토 결과를 프론트 엔드에 보냅니다. 둘 다 백엔드와 프론트 엔드는 카피 데이터 토토 결과를 보낼 수 있습니다. 연결이 종료 될 때까지. 보다섹션 46.3.

CopyInResponse, CopyOUTRESPONSE 및 COPYBOTHRESPONSE 메시지에는 숫자의 프론트 엔드를 알려주는 필드가 포함됩니다. 행당 열 및 각각에 사용되는 형식 코드 열. (현재 구현 시점에서 모든 열이 a 주어진COPY작동이 동일하게 사용됩니다 형식이지만 메시지 디자인은 이것을 가정하지 않습니다.)

46.2.6. 비동기 작업

백엔드가 보낼 경우 몇 가지가 있습니다. 프론트 엔드에서 구체적으로 제기되지 않은 메시지 명령 스트림. 프론트 엔드는 이것들을 다룰 준비를해야합니다 쿼리에 참여하지 않더라도 언제든지 메시지. ~에 최소, 시작하기 전에 이러한 사례를 확인해야합니다. 쿼리 응답 읽기.

주석 응답 토토 결과가 생성 될 수 있습니다 외부 활동으로 인해; 예를 들어, 데이터베이스 인 경우 관리자 명령 a"빠른"데이터베이스 종료, 백엔드는 주석에 반응을 보냅니다 연결을 닫기 전에이 사실을 나타냅니다. 따라서, 정면 엔드는 항상 수락 할 준비를해야합니다 연결이있는 경우에도 주도적 응답 메시지를 표시합니다 명목상 유휴.

Parameterstatus 메시지가 생성 될 때마다 생성됩니다 백엔서 매개 변수에 대한 활성 값 변경 프론트 엔드는 알아야한다고 믿습니다. 가장 일반적으로 이것 A에 대한 응답으로 발생합니다.SETSQL 프론트 엔드에 의해 실행 된 명령,이 사례는 효과적으로 동기 - 그러나 매개 변수 상태에도 가능합니다. 관리자가 변경하여 변경 사항이 변경됩니다 구성 파일을 보낸 다음을 보냈습니다.Sighup서버에 신호를 보냅니다. 또한, ASET명령이 롤백됩니다 적절한 Parameterstatus 메시지가 생성되어보고합니다 현재 유효 가치.

현재에는 하드 유선 매개 변수 세트가 있습니다. Parameterstatus가 생성 될 것입니다.server_version, server_encoding, client_encoding, application_name, is_superuser, Session_Authorization, Datestyle, IntervalStyle, 타임 존, integer_dateTimesStandard_Conforming_strings. (Server_encoding, 타임 존integer_dateTimes릴리스에 의해보고되지 않았습니다 8.0 전;Standard_Conforming_strings8.1 이전에 출시;IntervalStyle8.4 이전에 릴리스에 의해보고되지 않음;Application_Name릴리스에 의해보고되지 않았습니다 9.0 이전.) 참고server_version, Server_encodingandinteger_datetimes의사 파라미터입니다 시작 후 변경할 수 없습니다. 이 세트는 미래, 심지어 구성 가능하게됩니다. 따라서 프론트 엔드 매개 변수에 대한 Parameterstatus를 무시해야합니다 이해하거나 관심이 없습니다.

프론트 엔드가 발행 한 경우듣기명령에 따라 백엔드는 kalificationResponse를 보냅니다 토토 결과 (alicerponse와 혼동하지 말아야합니다!) a마다Notify명령이 실행됩니다 동일한 채널 이름.

참고 :현재, NotificationResponse는 만 할 수 있습니다 거래 밖에서 보내 져서 발생하지 않습니다. 명령-response 시리즈의 한가운데에서 ReadyForquery 직전에 발생합니다. 디자인하는 것은 현명하지 않습니다 그러나 그것을 가정하는 프론트 엔드 논리. 모범 사례입니다 어느 시점에서나 NotificationResponse를 수락 할 수 있습니다. 프로토콜.

46.2.7. 진행중인 요청 취소

쿼리 처리 중에 프론트 엔드가 요청할 수 있습니다. 쿼리 취소. 취소 요청은 전송되지 않습니다 이유 때문에 백엔드에 대한 공개 연결에 직접 구현 효율성 : 우리는 백엔드를 원하지 않습니다 지속적으로 프론트 엔드에서 새로운 입력을 확인합니다 쿼리 처리. 취소 요청은 비교적이어야합니다 드물게, 우리는 그들을 약간 번거롭게 만듭니다. 정상적인 경우 형벌을 피하십시오.

취소 요청을 발행하려면 Frontend가 새로 열립니다. 서버에 연결하고 CancelRequest 메시지를 보냅니다. 일반적으로 시작되는 startupmessage 메시지보다는 새로운 연결을 통해 보냈습니다. 서버는 이것을 처리합니다 요청한 다음 연결을 닫습니다. 보안상의 이유로, 아니요 취소 요청 메시지에 대한 직접 답장이 이루어집니다.

ConcelRequest 메시지가 포함되지 않으면 무시됩니다 동일한 키 데이터 (PID 및 비밀 키)가 프론트 엔드로 전달되었습니다. 연결 시동 중. 요청이 PID와 일치하는 경우 현재 실행중인 백엔드, 처리에 대한 비밀 키 현재 쿼리가 중단되었습니다. (기존 구현에서 이것은 백엔드 프로세스에 특수 신호를 보내어 수행됩니다. 쿼리 처리입니다.)

취소 신호는 효과가 있거나 없을 수도 있습니다. 예를 들어 백엔드가 완료된 후 도착하면 쿼리를 처리하면 효과가 없습니다. 만약 취소가 효과적이며 현재 명령을 초래합니다 오류 메시지로 일찍 종료됩니다.

이 모든 것의 상향은 두 보안의 이유로 그리고 효율성, 프론트 엔드는 취소 요청이 성공했습니다. 계속 기다려야합니다 쿼리에 응답하는 백엔드. 간단히 취소 현재 쿼리가 곧 완료 될 확률을 향상시키고 오류 메시지로 실패 할 확률이 향상됩니다. 성공하는 대신.

취소 요청이 새로운 연결을 통해 전송되기 때문에 정규 프론트 엔드/백엔드가 아닌 서버 통신 링크, 취소 요청이 가능합니다. 쿼리가있는 프론트 엔드뿐만 아니라 모든 프로세스에 의해 발행됩니다. 취소됩니다. 이것은 추가 유연성을 제공 할 수 있습니다 다중 프로세스 응용 프로그램 구축. 또한 a 승인되지 않은 사람이 취소하려고 할 수있는 보안 위험 쿼리. 보안 위험은 a 취소 중에 제공 할 비밀 키를 동적으로 생성합니다 요청.

46.2.8. 종료

정상적이고 우아한 종료 절차는 그 것입니다 프론트 엔드는 종료 토토 결과를 보내고 즉시 닫습니다 연결. 이 토토 결과를 받으면 백엔드가 닫힙니다 연결 및 종료.

드문 경우 (예 : 관리자-명령 데이터베이스와 같은 종료) 백엔드는 프론트 엔드없이 연결을 끊을 수 있습니다 그렇게 요청합니다. 그러한 경우 백엔드는 시도 할 것입니다 오류 또는 통지 메시지 보내기 이유 연결을 닫기 전에 연결이 끊어집니다.

다른 종료 시나리오는 다양한 실패에서 발생합니다 한쪽 끝 또는 다른 쪽의 코어 덤프와 같은 사례는 커뮤니케이션 링크, 메시지 바탕리 동기화 손실, Frontend 또는 Backend가 예기치 않은 폐쇄를 보는 경우 연결의 경우 정리하고 종료해야합니다. 그만큼 Frontend는 새로운 백엔드를 시작할 수있는 옵션이 있습니다. 서버가 종료되고 싶지 않은 경우 서버를 다시 연락합니다. 인식 할 수없는 경우 연결을 닫는 것이 좋습니다 메시지 유형은 수신됩니다. 아마도 이것은 아마도 손실을 나타냅니다. 메시지-발견 동기화.

정상 또는 비정상 종료의 경우, 개방 거래는 롤백되어 커밋되지 않습니다. 주목해야합니다 그러나 프론트 엔드가 연결이 끊어지면select쿼리가 처리 중입니다 알기 전에 쿼리를 완료 할 것입니다 단절. 쿼리가 트랜잭션 블록 외부에있는 경우 (시작 ... 커밋시퀀스) 그러면 결과 일 수 있습니다 단절이 인식되기 전에 커밋되었습니다.

46.2.9. SSL세션 암호화

ifPostgreSQL건축되었습니다 와 함께SSL지원, 프론트 엔드/백엔드 커뮤니케이션을 사용하여 암호화 할 수 있습니다SSL. 이것은 제공합니다 공격자가있을 수있는 환경에서의 커뮤니케이션 보안 세션 트래픽을 캡처 할 수 있습니다. 자세한 내용은 암호화PostgreSQL세션 와 함께SSL, 참조섹션 17.9.

시작하려면SSL-암호화 된 연결, 프론트 엔드 처음에는 a가 아닌 sslrequest 메시지를 보냅니다 startupmessage. 그런 다음 서버는 단일 바이트로 응답합니다 포함S또는n공연하다SSL. 프론트 엔드는이 시점에서 연결을 닫을 수 있습니다. 응답에 불만족. 계속하려면S, 수행SSL시작 핸드 셰이크 (여기에 설명되지 않음, 의 일부SSL사양) 서버와 함께. 이것이 성공하면 계속하십시오 일반적인 startupmessage를 보내면됩니다. 이 경우 startupmessage 및 모든 후속 데이터는입니다.SSL암호화. 계속하려면n, 일반적인 startupmessage를 보내고 진행하십시오 암호화없이.

프론트 엔드도 처리 할 준비를해야합니다 서버에서 sslrequest에 대한 errormessage 응답. 이것은 할 것입니다 서버가 추가를 선행하는 경우에만 발생합니다SSL지원PostgreSQL. 이 경우 연결 닫아야하지만 프론트 엔드는 신선한 것을 열도록 선택할 수 있습니다. 요청하지 않고 연결하고 진행SSL.

초기 sslRequest도 CancelRequest 토토 결과를 보내기 위해 열리고 있습니다.

프로토콜 자체가 강제로 서버SSL암호화, 관리자는 서버를 구성 할 수 있습니다 암호화되지 않은 세션을 인증의 부산물로 거부하십시오 점검.