Как разрешить ошибку PostgreSQL, «не смог определить, какую сопоставление использовать для сравнения строк»?

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

Вопрос

Когда я запускаю этот сценарий SQL, я получаю:

Ошибка: не удалось определить, какую сопоставление использовать для сравнения строк

Это то, что находится в линии 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
;

Я только что сделал миграцию с установки 8.4.11 на установку 9.1.3 с использованием pg_dump.

Это было полезно?

Решение

Нашел ошибку в Заметки о выпуске для 9.1.2

Сделайте сценарии сценария COPRIB/CITEXT, COLLATIONS CITEXT столбцов и индексов (TOM LANE)

Существующие столбцы CITEXT и индексы неправильно помечены как совместимый тип данных во время PG_UPGRADE с сервера Pre-9.1. Это приводит к тому, что они не сняты с ошибками, такими как «не смог определить, какую коллекцию использовать для сравнения строк». Это изменение позволяет их исправить с помощью того же сценария, который переворачивает модуль CITEXT в правильное расширение 9.1 во время Create Extension Citext из Unquackeded.

Если у вас есть ранее обновляемая база данных, которая страдает от этой проблемы, и вы уже запустили команду Create Extension, вы можете вручную запустить (в качестве суперпользователя) команды обновления, найденные в конце Sharedir/Extension/Citext-Unpacked- 1.0.sql. (Запустите PG_CONFIG -SHAREDIR, если вы не уверены, где находится Sharedir.)

Итак, я посмотрел в этом файле для UPDATE команды и нашли это:

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top