Как разрешить ошибку PostgreSQL, «не смог определить, какую сопоставление использовать для сравнения строк»?
-
22-10-2019 - |
Вопрос
Когда я запускаю этот сценарий 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);