MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / parseAndInsertValues

Function parseAndInsertValues

src/TableFunctions/TableFunctionValues.cpp:37–73  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

35{
36
37void parseAndInsertValues(MutableColumns & res_columns, const ASTs & args, const Block & sample_block, size_t start, ContextPtr context)
38{
39 if (res_columns.size() == 1) /// Parsing arguments as Fields
40 {
41 for (size_t i = start; i < args.size(); ++i)
42 {
43 const auto & [value_field, value_type_ptr] = evaluateConstantExpression(args[i], context);
44
45 Field value = convertFieldToTypeOrThrow(value_field, *sample_block.getByPosition(0).type, value_type_ptr.get());
46 res_columns[0]->insert(value);
47 }
48 }
49 else /// Parsing arguments as Tuples
50 {
51 for (size_t i = start; i < args.size(); ++i)
52 {
53 const auto & [value_field, value_type_ptr] = evaluateConstantExpression(args[i], context);
54
55 const DataTypeTuple * type_tuple = typeid_cast<const DataTypeTuple *>(value_type_ptr.get());
56 if (!type_tuple)
57 throw Exception(ErrorCodes::BAD_ARGUMENTS,
58 "Table function VALUES requires all but the first argument (rows specification) to be either tuples or single values");
59
60 const Tuple & value_tuple = value_field.safeGet<Tuple>();
61
62 if (value_tuple.size() != sample_block.columns())
63 throw Exception(ErrorCodes::BAD_ARGUMENTS, "Values size should match with the number of columns");
64
65 const DataTypes & value_types_tuple = type_tuple->getElements();
66 for (size_t j = 0; j < value_tuple.size(); ++j)
67 {
68 Field value = convertFieldToTypeOrThrow(value_tuple[j], *sample_block.getByPosition(j).type, value_types_tuple[j].get());
69 res_columns[j]->insert(value);
70 }
71 }
72 }
73}
74
75DataTypes getTypesFromArgument(const ASTPtr & arg, ContextPtr context)
76{

Callers 1

executeImplMethod · 0.85

Calls 8

columnsMethod · 0.80
ExceptionClass · 0.50
sizeMethod · 0.45
getMethod · 0.45
insertMethod · 0.45
getElementsMethod · 0.45

Tested by

no test coverage detected