2017-12-29 7 views
1

Ich versuche, nach einem leeren Array zu testen. Ich verstehe die Begründung hinter array_length zurückgeben NULL, da es eine 0-dimensionale Array ist, aber warum ist array_ndims(array[]::int array) nicht 0, sondern NULL?Warum erzeugt `array_ndims (array [])` NULL?

+0

http://www.postgresql-archive.org/array-ndims-never-returns-zero-td5998579.html Bitte akzeptieren Sie @Lukasz Antwort - wie es die richtige (zumindest heute) und in der Tat nicht (zumindest heute) richtig dokumentiert –

Antwort

1

Sieht aus wie es nie 0 zurück:

/* Sanity check: does it look like an array at all? */ 
    if (AARR_NDIM(v) <= 0 || AARR_NDIM(v) > MAXDIM) 
     PG_RETURN_NULL(); 

Sie könnten Ihre eigene C-Funktion für dieses schreiben, einfach <= 0 in < 0 ändern. Als Gründe dafür kann ich nichts finden.

Quelle ist in: https://www.postgresql.org/ftp/source/v10.1/ (gleicher Sache für 9.6.2, mit dem, was ich zunächst überprüft)

Datei: ./src/backend/utils/adt/arrayfuncs.c

Blick für einfache, 10 Linienfunktion: array_ndims

+0

Bitte geben Sie einen Link zur Codebasis ein. Ich würde auch erwarten, dass die Anzahl der leeren Arrays Null ist. Vielleicht wollte smbd nur nicht überprüfen, ob ein leeres Array Array ist? –

+0

@VaoTsun Ich nehme an, Dimensionen wieder zählen (Funktion hält es nicht in Variable) und sie zurück zu bringen ist ein bisschen zeitaufwendiger als nur NULL zurückgeben und jemand dies schreiben Funktion wurde nicht benötigt, um 0-dimensionale Arrays zu überprüfen. –

+0

Entschuldigung, ich meinte etw wie https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/arrayfuncs.c#L1635 :) –

Verwandte Themen