| 211 | |
| 212 | |
| 213 | Names extractPrimaryKeyColumnNames(const ASTPtr & storage_ast) |
| 214 | { |
| 215 | const auto sorting_key_ast = extractOrderBy(storage_ast); |
| 216 | const auto primary_key_ast = extractPrimaryKey(storage_ast); |
| 217 | |
| 218 | const auto sorting_key_expr_list = extractKeyExpressionList(sorting_key_ast); |
| 219 | const auto primary_key_expr_list = primary_key_ast |
| 220 | ? extractKeyExpressionList(primary_key_ast) : sorting_key_expr_list->clone(); |
| 221 | |
| 222 | /// Maybe we have to handle VersionedCollapsing engine separately. But in our case in looks pointless. |
| 223 | |
| 224 | size_t primary_key_size = primary_key_expr_list->children.size(); |
| 225 | size_t sorting_key_size = sorting_key_expr_list->children.size(); |
| 226 | |
| 227 | if (primary_key_size > sorting_key_size) |
| 228 | throw Exception("Primary key must be a prefix of the sorting key, but its length: " |
| 229 | + toString(primary_key_size) + " is greater than the sorting key length: " + toString(sorting_key_size), |
| 230 | ErrorCodes::BAD_ARGUMENTS); |
| 231 | |
| 232 | Names primary_key_columns; |
| 233 | NameSet primary_key_columns_set; |
| 234 | |
| 235 | for (size_t i = 0; i < sorting_key_size; ++i) |
| 236 | { |
| 237 | /// Column name could be represented as a f_1(f_2(...f_n(column_name))). |
| 238 | /// Each f_i could take one or more parameters. |
| 239 | /// We will wrap identifiers with backticks to allow non-standart identifier names. |
| 240 | String sorting_key_column = sorting_key_expr_list->children[i]->getColumnName(); |
| 241 | |
| 242 | if (i < primary_key_size) |
| 243 | { |
| 244 | String pk_column = primary_key_expr_list->children[i]->getColumnName(); |
| 245 | if (pk_column != sorting_key_column) |
| 246 | throw Exception("Primary key must be a prefix of the sorting key, but the column in the position " |
| 247 | + toString(i) + " is " + sorting_key_column +", not " + pk_column, |
| 248 | ErrorCodes::BAD_ARGUMENTS); |
| 249 | |
| 250 | if (!primary_key_columns_set.emplace(pk_column).second) |
| 251 | throw Exception("Primary key contains duplicate columns", ErrorCodes::BAD_ARGUMENTS); |
| 252 | |
| 253 | primary_key_columns.push_back(wrapIdentifiersWithBackticks(primary_key_expr_list->children[i])); |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | return primary_key_columns; |
| 258 | } |
| 259 | |
| 260 | bool isReplicatedTableEngine(const ASTPtr & storage_ast) |
| 261 | { |
no test coverage detected