Come posso risolvere l'errore PostgreSQL, “non poteva determinare quale di confronto da utilizzare per il confronto stringa”?

dba.stackexchange https://dba.stackexchange.com/questions/17604

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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top