Come posso risolvere l'errore PostgreSQL, “non poteva determinare quale di confronto da utilizzare per il confronto stringa”?
-
22-10-2019 - |
Domanda
Quando mai ho eseguito questo script SQL ottengo:
errore: Impossibile determinare quale di confronto da utilizzare per il confronto di stringhe
Questo è ciò che si trova sulla linea 34:
CREATE TEMPORARY TABLE weight_options AS
SELECT
io.lot_id
, io.vin
, map.fkey_style AS chrome_styleid
, SUM( CASE WHEN co.code = io.code THEN 1 ELSE 0 END ) AS exact_option
, SUM( CASE WHEN length(io.code) = 2 AND co.code LIKE io.code || '%' THEN 1 ELSE 0 END ) AS appx_option
, (
SUM( CASE WHEN co.code = io.code THEN 2 ELSE 0 END )
+ SUM( CASE WHEN length(io.code) = 2 AND co.code LIKE io.code || '%' THEN 1 ELSE 0 END )
) AS option_weight
FROM inventory.options AS io
-- options *must* have same index as inventory.vehicles
JOIN chrome_vinmatch_best_match AS vd
USING ( vin )
JOIN chrome_vinmatch.style AS map
ON ( vd.chrome_patternid = map.fkey_pattern )
JOIN chrome_nvd.options AS co
ON ( io.code = co.code AND map.fkey_style = co.fkey_style AND io.code IS NOT NULL )
GROUP BY io.lot_id, io.vin, map.fkey_style
;
Ho appena fatto una migrazione da un'installazione di 8.4.11
ad un'installazione di 9.1.3
usando pg_dump
.
Soluzione
Trovato l'errore nelle note Stampa per 9.1. 2
make contrib / aggiornamento collations sceneggiatura fix di Citext di colonne Citext e gli indici (Tom Lane)
esistenti colonne Citext e gli indici non siano correttamente contrassegnati come di un tipo di dati collatable durante pg_upgrade da un server pre-9.1. Che porta a operazioni su di essi in mancanza di errori come "potrebbe Non determinare quale le regole di confronto da utilizzare per il confronto stringa". Questa modifica consente loro di essere fissati dallo stesso script che gli aggiornamenti delle Modulo citext in una vera e propria estensione 9,1 durante CREATE ESTENSIONE citext DA imballati.
Se si dispone di un database in precedenza aggiornato che soffre di questo problema, e che già ha eseguito il comando di estensione CREATE, è possibile eseguire manualmente (come superutente) i comandi UPDATE trovano alla fine Sharedir / estensione / citext - non imballati - 1.0.sql. (Run pg_config --sharedir Se siete incerti dove sharedir è.)
Così ho guardato in quel file per i comandi UPDATE
e trovato questi:
UPDATE pg_catalog.pg_type SET typcollation = 100
WHERE oid = 'citext'::pg_catalog.regtype;
UPDATE pg_catalog.pg_attribute SET attcollation = 100
WHERE atttypid = 'citext'::pg_catalog.regtype;
UPDATE pg_catalog.pg_index SET indcollation[0] = 100
WHERE indclass[0] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[1] = 100
WHERE indclass[1] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[2] = 100
WHERE indclass[2] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[3] = 100
WHERE indclass[3] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[4] = 100
WHERE indclass[4] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[5] = 100
WHERE indclass[5] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[6] = 100
WHERE indclass[6] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);
UPDATE pg_catalog.pg_index SET indcollation[7] = 100
WHERE indclass[7] IN (SELECT oid FROM pg_catalog.pg_opclass
WHERE opcintype = 'citext'::pg_catalog.regtype);