2016-10-05 7 views
1

PostgreSQL 9.5에서 C 함수에서 작성한 ARR_ELEMTYPE(PG_GETARG_ARRAYTYPE_P(0))입니다. 여기서 (0)은 28642010이 반환 한 복합 유형 (즉, CREATE TYPE으로 정의 됨)의 배열입니다.이 숫자는 소스 코드에 나타나지 않으며 문서화되어 있지 않습니다.PostgreSQL에서 복합 유형의 배열에 대한 올바른 OID는 무엇입니까?

오늘 PG 9.6으로 업그레이드하고 C 함수가 오류를 던졌습니다. elemtype은 이제 16396으로보고됩니다. 이것은 소스 코드에도 나타나지 않습니다.

위키와 소스 모두에서 10 진수와 16 진수를 모두 검색했습니다.

a) 소스 코드에 OID가 정의되어 있지 않고 b) PG가 변경되면서 번호가 변경되는 것을 볼 수 없습니다.

여기에 뭔가가 있습니까?

+1

'어디 typname = 'pg_type에서 OID 선택 .. . "? –

+0

그래, 16396이라는 새로운 번호를 알려준다. – IamIC

+0

나는 그것을 이해했다고 생각한다. DB가 9.6의 변경으로 인해 다시 만들어 져야하기 때문에 OID가 다릅니다. 그것은 C에서 일관성을 유지하는 것이 매우 흥미로울 것입니다. – IamIC

답변

1

유형을 포함하여 데이터베이스에 작성한 모든 오브젝트의 OID는 시스템에 의해 지정되며 데이터베이스를 덤프하고 다른 데이터베이스로 복원하면 변경됩니다. 이름과 스키마의 OID에서 C 함수 형태의 OID를 알아낼

, 당신은 같은 것을 할 수 있습니다

typoid = GetSysCacheOid2(TYPENAMENSP, 
         CStringGetDatum(typeName), 
         ObjectIdGetDatum(typeNamespace)); 
+0

감사합니다. SPI를 사용하여 쿼리하는 것이 훨씬 더 우아합니다. – IamIC

+0

지금 코드에서이 작업을 시도하고 있습니다. 나는 첫 번째 매개 변수에 어떤 값을 넣을 지 명확하지 않다. 예를 들어 주시겠습니까? – IamIC

+0

소스를 살펴보면 첫 번째 매개 변수는 "cacheId"로 제공됩니다. 그게 뭔지 잘 모르겠습니다. 또한이 함수는 typeNamespace를 필요로하기 때문에 필자는 이와 비슷한 함수를 사용하는 것으로 살펴볼 필요가있을 것입니다. – IamIC