Skip to content

Track parameters up to the sharded columns

Problem Description

На данный момент, в структуре Plan, есть метод collect_parameter_types и поле relations.

Метод позволяет узнать типы переданных параметров в рамках extended query запроса,
а в relations хранится информация о целевых таблицах из запроса.
Для корректного расчета bucket_id, нам нужна информация о параметрах,
являющихся distributed by ключами в колонках целевых таблиц.

Согласно этому ADR, мы хотим перенести логику вычисления bucket_id на сторону клиента.
Для этого, необходимо отправлять ему информацию о параметрах запроса, а именно
о distributed by параметрах в запросе. Причем, если параметров недостаточно для
вычисления bucket_id, то отправляется пустой массив, чтобы клиент отправил запрос
на рандомный инстанс.

В идеальном мире, если бы метод collect_parameter_types возвращал массив структур

struct Param{
  param_col_name: String, //a=$1 and b=$2...
  param_type: Enum<Type>,
}

то мы могли бы соотнести имена и типы параметров с видом и схемой соответствующей таблицы.
Если колонка distributed by и типы соответствуют, то этот ключ добавляется в результируюший массив.

Если несколько таблиц распределены по одной колонке, то параметр будет транслирован как distributed by
ключ в каждую из таблиц. Данный случай тоже необходимо обработать корректно.

Proposal Description

Для достижения цели необходимо:

  • соотнести параметры с колонками, к которым они относятся
  • проверить достаточность для вычисления bucket_id для запроса
  • собрать результирующий массив с параметрами

Feature Checklist

  • Introduces breaking changes?
  • Needs documentation updates?
  • Test coverage required?
Edited by Konstantin Osipov
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information