mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-31 03:56:42 +00:00
The main goal of this patch is to fully support UpdateTable's ability to add a GSI to an existing table, and delete a GSI from an existing table. But to achieve this, this patch first needs to overhaul how GSIs are implemented: Remember that in Alternator's data model, key attributes in a table are stored as real CQL columns (with a known type), but all other attributes of an item are stored in one map called ":attrs". * Before this patch, the GSI's key columns were made into real columns in the table's schema, and the materialized view used that column as the view's key. * After this patch, the GSI's key columns usually (when they are not the base table's keys, and not any LSI's key) are left in the ":attrs" map, just like any other non-key column. We use a new type of computed column (added in the previous patch) to extract the desired element from this map. This overhaul of the GSI implementation doesn't change anything in the functionality of GSIs (and the Alternator test suite tries very hard to ensure that), but finally allows us to add a GSI to an already-existing table. This is now possible because the GSI will be able to pick up existing data from inside the ":attrs" map where it is stored, instead of requiring the data in the map to be moved to a stand-alone column as the previous implementation needed. So this patch also finally implements the UpdateTable operations (Create and Delete) to add or delete a GSI on an existing table, as this is now fairly straightfoward. For the process of "backfilling" the existing data into the new GSI we don't need to do anything - this is just the materialized-view "view building" process that already exists. Fixes #11567. Signed-off-by: Nadav Har'El <nyh@scylladb.com>