-- DDS: подмена одного дня заказов собранной партицией двойника. -- -- Это и есть идемпотентность слоя. Повтор прогона безопасен, а «дыхание» -- статусов внутри окна выражается сменой всей партиции, а не правкой строк. -- -- Замена идёт по локальным таблицам, шард за шардом: ON CLUSTER рассылает её -- на обе ноды, а по Distributed то же самое не работает — операции с -- партициями отвечают кодом 48 (docs/architecture/storage.md, «Что -- проверено»). Правильность пошардовой замены держится на том, что двойник -- шардирован тем же ключом, что цель, — см. sql/ddl/45-dds-tables.sql. -- -- Отсюда граница обещания: атомарность здесь пошардовая. Внутри шарда подмена -- мгновенна — читатель видит либо прежний день целиком, либо новый; но две -- локальные замены независимы, и в зазоре между ними чтение через Distributed -- соберёт ответ из нового дня одного шарда и прежнего дня другого. Зазор -- короткий, а отказ одной из двух замен растягивает его до повторного прогона. -- -- Пустая партиция двойника — законный случай, а не сбой: день, в котором -- заказов нет, снимает день из цели, и слой перестаёт показывать то, чего в -- источнике больше нет. -- -- День подставляет Jinja, а не параметр ClickHouse: в ALTER … PARTITION -- сервер параметров не подставляет — замерено, отвечает синтаксической -- ошибкой. Общее правило репозитория «параметры передаются отдельно, а не -- строкой» здесь не нарушено по существу: значение пришло из ответа самого -- ClickHouse на запрос объёма, а не снаружи стенда. ALTER TABLE dds.order_rep ON CLUSTER clickstream_cluster REPLACE PARTITION '{{ params.day }}' FROM dds.order_stage_rep;