Опишите ошибку
Несоответствие схемы при любых вставках.
ошибка: столбец «значение» имеет тип jsonb, но выражение имеет тип текста
Воспроизводить
Используйте последний источник и postgres. Пробовал с v12 и v13.
Ожидаемое поведение
Сделать вставку без ошибок.
Скриншоты
etherpad_1 | [2020-09-08 20: 37: 50.541] [ОШИБКА] консоль - ошибка: столбец «значение» имеет тип jsonb, но выражение имеет тип текста
etherpad_1 | в Parser.parseErrorMessage (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
etherpad_1 | в Parser.handlePacket (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
etherpad_1 | в Parser.parse (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
etherpad_1 | в Socket.stream.on (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
etherpad_1 | в Socket.emit (events.js: 198: 13)
etherpad_1 | в Socket.EventEmitter.emit (domain.js: 448: 20)
etherpad_1 | в addChunk (_stream_readable.js: 288: 12)
etherpad_1 | в readableAddChunk (_stream_readable.js: 269: 11)
etherpad_1 | в Socket.Readable.push (_stream_readable.js: 224: 10)
etherpad_1 | в TCP.onStreamRead [как onread] (internal / stream_base_commons.js: 94: 17)
Рабочий стол (заполните следующую информацию):
NA
Смартфон (заполните следующую информацию):
NA
Дополнительный контекст
Это было протестировано с контейнерами докеров.
В основном это проблема, когда я использовал последний исходный код, хотя должен был использовать выпуск.
Я пробовал это с 1.8.4 и могу подтвердить, что не получаю этой ошибки. Я обновил проблему соответствующим образом.
За исключением того, что в 1.8.5 есть эта ошибка, так что упс.
Исправлено в c8361a211a1e6bfbbc006933f48d48ca51857c71
Исправлено в c8361a2
Я все еще понимаю.
Вы git pull затем bin / run.sh?
Вам нужно будет обновить ueber, и bin / run.sh сделает это. Не используйте fastrun
Да, я всегда придумываю bin/run.sh
.
Он обновлен до "ueberdb2": "^0.5.2"
Тесты проходят нормально.
Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.
Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.
конечно, позволь мне попробовать.
Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.
Фактически, из-за моей среды разработки я получаю новый pg db при каждой сборке.
Затем просмотрите конфигурацию Travis, чтобы увидеть, как мы создаем базу данных для тестов ueberdb. Вам понадобится репо ueber dB, которого здесь нет
Кажется, нам следует использовать репо ниже?
https://github.com/ether/ueberDB#dirtyref
master
Привет, у меня тоже есть эта проблема с 1.8.5. Можете ли вы повторно открыть эту проблему, пока не будет найдено решение? (так проще найти!)
Благодаря!
cc @Gared
У меня все еще есть эта проблема, даже если я поменяю репо https://github.com/ether/ueberDB (master)
Тоже самое:
[2020-09-11 11:36:24.449] [ERROR] console - error: column "value" is of type jsonb but expression is of type text
at Parser.parseErrorMessage (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:278:15)
at Parser.handlePacket (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:126:29)
at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:39:38)
at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
at Socket.emit (events.js:315:20)
at Socket.EventEmitter.emit (domain.js:483:12)
at addChunk (_stream_readable.js:295:12)
at readableAddChunk (_stream_readable.js:271:9)
at Socket.Readable.push (_stream_readable.js:212:10)
at TCP.onStreamRead (internal/stream_base_commons.js:186:23)
[2020-09-11 11:36:24.463] [ERROR] console - TypeError: Cannot read property 'name' of null
at Client._handleParseComplete (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/client.js:358:26)
at Connection.emit (events.js:315:20)
at Connection.EventEmitter.emit (domain.js:483:12)
at /usr/local/var/etherpad/repo/src/node_modules/pg/lib/connection.js:109:12
at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:40:17)
at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
at Socket.emit (events.js:315:20)
at Socket.EventEmitter.emit (domain.js:483:12)
at addChunk (_stream_readable.js:295:12)
at readableAddChunk (_stream_readable.js:271:9)
settings.json
:{
"dbSettings" : {
"user" : "etherpad",
"host" : "localhost",
"port" : 5432,
"password": "xxx",
"database": "etherpad",
},
"padOptions": {
"noColors": false,
"showControls": true,
"showChat": true,
"showLineNumbers": true,
"useMonospaceFont": false,
"userName": false,
"userColor": false,
"rtl": false,
"alwaysShowChat": false,
"chatAndUsers": false,
"lang": "de-de"
},
"suppressErrorsInPadText": false,
"requireSession": false,
"editOnly": true,
"sessionNoPassword": false,
"minify": true,
"maxAge": 21600,
"abiword": null,
"soffice": null,
"tidyHtml": null,
"allowUnknownFileEnds": true,
"requireAuthentication": false,
"requireAuthorization": false,
"trustProxy": true,
"disableIPlogging": true,
"automaticReconnectionTimeout": 5,
"users": {
"admin": {
"hash": "xxx",
"is_admin": true
}
},
"socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
"loadTest": false,
"exposeVersion": false,
"loglevel": "WARN",
"logconfig" :
{ "appenders": [
{ "type": "console" }
]
}
}
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
CREATE FUNCTION public.ueberdb_insert_or_update(character varying, text) RETURNS void
LANGUAGE plpgsql
AS $_$ BEGIN IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN UPDATE store SET value = $2 WHERE key = $1; ELSE INSERT INTO store(key,value) VALUES( $1, $2 ); END IF; RETURN; END; $_$;
ALTER FUNCTION public.ueberdb_insert_or_update(character varying, text) OWNER TO etherpad;
CREATE FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) RETURNS void
LANGUAGE plpgsql
AS $_$ BEGIN IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN UPDATE store SET value = $2 WHERE key = $1; ELSE INSERT INTO store(key,value) VALUES( $1, $2 ); END IF; RETURN; END; $_$;
ALTER FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) OWNER TO etherpad;
SET default_tablespace = '';
SET default_with_oids = false;
CREATE TABLE public.store (
key character varying(100) NOT NULL,
value jsonb NOT NULL
);
ALTER TABLE public.store OWNER TO etherpad;
ALTER TABLE ONLY public.store
ADD CONSTRAINT store_pkey PRIMARY KEY (key);
Я пошел откатной дорогой. Я попытался откатить только etherpad до 1.8.4, но не вышло:
[2020-09-11 20:55:44.494] [ERROR] console - JSON-PROBLEM:[object Object]
[2020-09-11 20:55:44.495] [ERROR] console - (node:1) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at /opt/etherpad-lite/src/node_modules/ueberdb2/CacheAndBufferLayer.js:169:24
at Query.<anonymous> (/opt/etherpad-lite/src/node_modules/ueberdb2/postgres_common.js:99:5)
at Query.handleReadyForQuery (/opt/etherpad-lite/src/node_modules/pg/lib/query.js:128:10)
at Connection.<anonymous> (/opt/etherpad-lite/src/node_modules/pg/lib/client.js:247:19)
at Connection.emit (events.js:198:13)
at Connection.EventEmitter.emit (domain.js:448:20)
at Socket.<anonymous> (/opt/etherpad-lite/src/node_modules/pg/lib/connection.js:134:12)
at Socket.emit (events.js:198:13)
at Socket.EventEmitter.emit (domain.js:448:20)
[2020-09-11 20:55:44.496] [ERROR] console - (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
[2020-09-11 20:55:44.496] [ERROR] console - (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Итак, я восстановил дамп pgsql, и теперь 1.8.4 снова работает (что на самом деле не удивительно, поскольку он работал нормально).
причина: с 1.8.4 до 1.8.5 значение столбца изменено с типа text на jsonb.
Должен быть крупный релиз ...
Есть ли сценарий миграции, который можно применить?
Я просто собираюсь отменить эти коммиты. ИМХО, все это было плохо обработано.
В журнале изменений написано: «ВАЖНО: это устраняет серьезную проблему с postgresql в 1.8.5» для 1.8.6, но я обновился и все еще получаю исключения, упомянутые выше. Я также заметил эти исключения, которые выводятся сразу после перезапуска службы:
[2020-09-19 17:47:45.482] [ERROR] console - JSON-PROBLEM:[object Object]
[2020-09-19 17:47:45.496] [ERROR] console - (node:30613) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at /usr/local/var/etherpad/repo/src/node_modules/ueberdb2/lib/CacheAndBufferLayer.js:169:24
at Query.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/ueberdb2/databases/postgres_common.js:99:5)
at Query.handleReadyForQuery (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/query.js:122:12)
at Client._handleReadyForQuery (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/client.js:281:19)
at Connection.emit (events.js:315:20)
at Connection.EventEmitter.emit (domain.js:483:12)
at /usr/local/var/etherpad/repo/src/node_modules/pg/lib/connection.js:109:12
at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:40:17)
at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
[2020-09-19 17:47:45.497] [ERROR] console - (node:30613) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
[2020-09-19 17:47:45.497] [ERROR] console - (node:30613) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
@ c7hm4r ваша база данных изменилась или что-то в этом роде? Если вы запустите новый tarble / базу данных, все в порядке?
@JohnMcLear При перезапуске Etherpad 1.8.6 с пустой базой данных создается новая схема, которая работает без исключений.
Когда я сравниваю новую схему со старой, я получаю следующее:
diff --git a/etherpad_schema.sql b/etherpad_schema_new.sql
index 9baf5f4..ad3c08b 100644
--- a/etherpad_schema.sql
+++ b/etherpad_schema_new.sql
@@ -41,17 +41,6 @@ CREATE FUNCTION public.ueberdb_insert_or_update(character varying, text) RETURNS
ALTER FUNCTION public.ueberdb_insert_or_update(character varying, text) OWNER TO etherpad;
---
--- Name: ueberdb_insert_or_update_jsonb(character varying, jsonb); Type: FUNCTION; Schema: public; Owner: etherpad
---
-
-CREATE FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) RETURNS void
- LANGUAGE plpgsql
- AS $_$ BEGIN IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN UPDATE store SET value = $2 WHERE key = $1; ELSE INSERT INTO store(key,value) VALUES( $1, $2 ); END IF; RETURN; END; $_$;
-
-
-ALTER FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) OWNER TO etherpad;
-
SET default_tablespace = '';
SET default_with_oids = false;
@@ -62,7 +51,7 @@ SET default_with_oids = false;
CREATE TABLE public.store (
key character varying(100) NOT NULL,
- value jsonb NOT NULL
+ value text NOT NULL
);
Итак, вопрос: когда тип столбца изменился и как его перенести / отменить?
Я настроил автоматические обновления для своего экземпляра Etherpad из основной ветки.
@ c7hm4r @qsuscs был автором оскорбительных коммитов. Я надеюсь, что он возьмет на себя ответственность и поможет :)
https://github.com/ether/ueberDB/commit/b9e786e2c8753f4cbbe09d3695a92a1a03904ead#diff -f1b8245dd259fa912c33cb2db527f609R31 - альтернативный оператор.
var updateValueColumnType = "ALTER TABLE store " +
"ALTER COLUMN value " +
"TYPE jsonb " +
"USING value::jsonb";
Можно было бы предположить, что изменение jsonb на текст сделает это?
Спасибо @JohnMcLear , запуск следующего снова заставил его работать:
alter table "store" alter column "value" type text;
@ c7hm4r не беспокойтесь, надеюсь, горстка людей, которых это затронет, найдет эту ветку и выполнит эту команду. Спасибо за написание и тестирование! :) Я был бы готов принять PR, чтобы исправить, если бы вы или первоначальный автор захотели. В данный момент у меня есть другие приоритетные задачи.
Самый полезный комментарий
Спасибо @JohnMcLear , запуск следующего снова заставил его работать: