YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/yql/cql/ql/ptree/pt_type.cc
Line
Count
Source (jump to first uncovered line)
1
//--------------------------------------------------------------------------------------------------
2
// Copyright (c) YugaByte, Inc.
3
//
4
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
// in compliance with the License.  You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software distributed under the License
10
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
// or implied.  See the License for the specific language governing permissions and limitations
12
// under the License.
13
//
14
//
15
// Treenode definitions for datatypes.
16
//--------------------------------------------------------------------------------------------------
17
18
#include "yb/yql/cql/ql/ptree/pt_type.h"
19
20
#include "yb/yql/cql/ql/ptree/pt_option.h"
21
#include "yb/yql/cql/ql/ptree/sem_context.h"
22
23
namespace yb {
24
namespace ql {
25
26
//--------------------------------------------------------------------------------------------------
27
PTBaseType::SharedPtr PTBaseType::FromQLType(MemoryContext *memctx,
28
0
                                             const std::shared_ptr<QLType>& ql_type) {
29
0
  switch (ql_type->main()) {
30
0
    case DataType::INT8: return PTTinyInt::MakeShared(memctx);
31
0
    case DataType::INT16: return PTSmallInt::MakeShared(memctx);
32
0
    case DataType::INT32: return PTInt::MakeShared(memctx);
33
0
    case DataType::INT64: return PTBigInt::MakeShared(memctx);
34
0
    case DataType::STRING: return PTVarchar::MakeShared(memctx);
35
0
    case DataType::BOOL: return PTBoolean::MakeShared(memctx);
36
0
    case DataType::FLOAT: return PTFloat::MakeShared(memctx);
37
0
    case DataType::DOUBLE: return PTDouble::MakeShared(memctx);
38
0
    case DataType::BINARY: return PTBlob::MakeShared(memctx);
39
0
    case DataType::TIMESTAMP: return PTTimestamp::MakeShared(memctx);
40
0
    case DataType::DATE: return PTDate::MakeShared(memctx);
41
0
    case DataType::TIME: return PTTime::MakeShared(memctx);
42
0
    case DataType::DECIMAL: return PTDecimal::MakeShared(memctx);
43
0
    case DataType::VARINT: return PTVarInt::MakeShared(memctx);
44
0
    case DataType::INET: return PTInet::MakeShared(memctx);
45
0
    case DataType::JSONB: return PTJsonb::MakeShared(memctx);
46
0
    case DataType::UUID: return PTUuid::MakeShared(memctx);
47
0
    case DataType::TIMEUUID: return PTTimeUuid::MakeShared(memctx);
48
49
0
    case DataType::LIST: FALLTHROUGH_INTENDED;
50
0
    case DataType::MAP: FALLTHROUGH_INTENDED;
51
0
    case DataType::SET: FALLTHROUGH_INTENDED;
52
0
    case DataType::USER_DEFINED_TYPE: FALLTHROUGH_INTENDED;
53
0
    case DataType::FROZEN:
54
      // TODO: support conversion of complex type from ql_type to PT type.
55
0
      return nullptr;
56
57
0
    case DataType::TUPLE: FALLTHROUGH_INTENDED;
58
0
    case DataType::TYPEARGS: FALLTHROUGH_INTENDED;
59
0
    case DataType::UINT8: FALLTHROUGH_INTENDED;
60
0
    case DataType::UINT16: FALLTHROUGH_INTENDED;
61
0
    case DataType::UINT32: FALLTHROUGH_INTENDED;
62
0
    case DataType::UINT64: FALLTHROUGH_INTENDED;
63
0
    case DataType::GIN_NULL: FALLTHROUGH_INTENDED;
64
0
    case DataType::UNKNOWN_DATA: FALLTHROUGH_INTENDED;
65
0
    case DataType::NULL_VALUE_TYPE:
66
0
      FATAL_INVALID_ENUM_VALUE(DataType, ql_type->main());
67
0
  }
68
0
  FATAL_INVALID_ENUM_VALUE(DataType, ql_type->main());
69
0
}
70
71
//--------------------------------------------------------------------------------------------------
72
73
PTFloat::PTFloat(MemoryContext *memctx, YBLocationPtr loc, int8_t precision)
74
    : PTSimpleType<InternalType::kFloatValue, DataType::FLOAT, true>(memctx, loc),
75
51
      precision_(precision) {
76
51
}
77
78
51
PTFloat::~PTFloat() {
79
51
}
80
81
PTDouble::PTDouble(MemoryContext *memctx, YBLocationPtr loc, int8_t precision)
82
    : PTSimpleType<InternalType::kDoubleValue, DataType::DOUBLE, true>(memctx, loc),
83
75
      precision_(precision) {
84
75
}
85
86
75
PTDouble::~PTDouble() {
87
75
}
88
89
//--------------------------------------------------------------------------------------------------
90
91
PTCounter::PTCounter(MemoryContext *memctx, YBLocationPtr loc)
92
16
    : PTSimpleType<InternalType::kInt64Value, DataType::INT64, false>(memctx, loc) {
93
16
}
94
95
16
PTCounter::~PTCounter() {
96
16
}
97
98
//--------------------------------------------------------------------------------------------------
99
100
PTCharBaseType::PTCharBaseType(MemoryContext *memctx,
101
                               YBLocationPtr loc,
102
                               ssize_t max_length)
103
    : PTSimpleType<InternalType::kStringValue, DataType::STRING>(memctx, loc),
104
1.03k
      max_length_(max_length) {
105
1.03k
}
106
107
867
PTCharBaseType::~PTCharBaseType() {
108
867
}
109
110
PTChar::PTChar(MemoryContext *memctx, YBLocationPtr loc, int32_t max_length)
111
0
    : PTCharBaseType(memctx, loc, max_length) {
112
0
}
113
114
0
PTChar::~PTChar() {
115
0
}
116
117
PTVarchar::PTVarchar(MemoryContext *memctx, YBLocationPtr loc, int32_t max_length)
118
1.03k
    : PTCharBaseType(memctx, loc, max_length) {
119
1.03k
}
120
121
867
PTVarchar::~PTVarchar() {
122
867
}
123
124
//--------------------------------------------------------------------------------------------------
125
126
PTMap::PTMap(MemoryContext *memctx,
127
             YBLocationPtr loc,
128
             const PTBaseType::SharedPtr& keys_type,
129
             const PTBaseType::SharedPtr& values_type)
130
    : PTPrimitiveType<InternalType::kMapValue, DataType::MAP, false>(memctx, loc),
131
      keys_type_(keys_type),
132
89
      values_type_(values_type) {
133
89
  ql_type_ = QLType::CreateTypeMap(keys_type->ql_type(), values_type->ql_type());
134
89
}
135
136
89
PTMap::~PTMap() {
137
89
}
138
139
89
CHECKED_STATUS PTMap::Analyze(SemContext *sem_context) {
140
89
  RETURN_NOT_OK(keys_type_->Analyze(sem_context));
141
89
  RETURN_NOT_OK(values_type_->Analyze(sem_context));
142
89
  ql_type_ = QLType::CreateTypeMap(keys_type_->ql_type(), values_type_->ql_type());
143
144
  // Both key and value types cannot be collection.
145
89
  if (keys_type_->ql_type()->IsCollection() || keys_type_->ql_type()->IsUserDefined() ||
146
86
      values_type_->ql_type()->IsCollection() || values_type_->ql_type()->IsUserDefined()) {
147
7
    return sem_context->Error(this,
148
7
                              "Collection type parameters cannot be (un-frozen) collections "
149
7
                              "or UDTs",  ErrorCode::INVALID_TABLE_DEFINITION);
150
7
  }
151
152
  // Data types of map keys must be valid primary key types since they are encoded as keys in DocDB
153
82
  if (!keys_type_->IsApplicableForPrimaryKey()) {
154
0
    return sem_context->Error(this,
155
0
                              "Invalid datatype for map key or set element, "
156
0
                              "must be valid primary key type",
157
0
                              ErrorCode::INVALID_TABLE_DEFINITION);
158
0
  }
159
160
82
  return Status::OK();
161
82
}
162
163
PTSet::PTSet(MemoryContext *memctx,
164
             YBLocationPtr loc,
165
             const PTBaseType::SharedPtr& elems_type)
166
    : PTPrimitiveType<InternalType::kSetValue, DataType::SET, false>(memctx, loc),
167
72
      elems_type_(elems_type) {
168
72
  ql_type_ = QLType::CreateTypeSet(elems_type->ql_type());
169
72
}
170
171
72
PTSet::~PTSet() {
172
72
}
173
174
72
CHECKED_STATUS PTSet::Analyze(SemContext *sem_context) {
175
72
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
176
72
  ql_type_ = QLType::CreateTypeSet(elems_type_->ql_type());
177
178
  // Elems type cannot be collection.
179
72
  if (elems_type_->ql_type()->IsCollection() || elems_type_->ql_type()->IsUserDefined()) {
180
5
    return sem_context->Error(this,
181
5
                              "Collection type parameters cannot be (un-frozen) collections "
182
5
                              "or UDTs",  ErrorCode::INVALID_TABLE_DEFINITION);
183
5
  }
184
185
  // Data types of set elems must be valid primary key types since they are encoded as keys in DocDB
186
67
  if (!elems_type_->IsApplicableForPrimaryKey()) {
187
0
    return sem_context->Error(this,
188
0
                              "Invalid datatype for map key or set element, "
189
0
                              "must be valid primary key type",
190
0
                              ErrorCode::INVALID_TABLE_DEFINITION);
191
0
  }
192
193
67
  return Status::OK();
194
67
}
195
196
PTList::PTList(MemoryContext *memctx,
197
               YBLocationPtr loc,
198
               const PTBaseType::SharedPtr& elems_type)
199
    : PTPrimitiveType<InternalType::kListValue, DataType::LIST, false>(memctx, loc),
200
73
      elems_type_(elems_type) {
201
73
  ql_type_ = QLType::CreateTypeList(elems_type->ql_type());
202
73
}
203
204
73
PTList::~PTList() {
205
73
}
206
207
73
CHECKED_STATUS PTList::Analyze(SemContext *sem_context) {
208
73
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
209
73
  ql_type_ = QLType::CreateTypeList(elems_type_->ql_type());
210
211
  // Elems type cannot be collection.
212
73
  if (elems_type_->ql_type()->IsCollection() || elems_type_->ql_type()->IsUserDefined()) {
213
5
    return sem_context->Error(this,
214
5
                              "Collection type parameters cannot be (un-frozen) collections "
215
5
                              "or UDTs", ErrorCode::INVALID_TABLE_DEFINITION);
216
5
  }
217
218
68
  return Status::OK();
219
68
}
220
221
PTUserDefinedType::PTUserDefinedType(MemoryContext *memctx,
222
                                     YBLocationPtr loc,
223
                                     const PTQualifiedName::SharedPtr& name)
224
    : PTPrimitiveType<InternalType::kMapValue, DataType::USER_DEFINED_TYPE, false>(memctx, loc),
225
83
      name_(name) {
226
83
}
227
228
83
PTUserDefinedType::~PTUserDefinedType() {
229
83
}
230
231
81
CHECKED_STATUS PTUserDefinedType::Analyze(SemContext *sem_context) {
232
81
  RETURN_NOT_OK(name_->AnalyzeName(sem_context, ObjectType::TYPE));
233
81
  auto ybname = name_->ToTableName();
234
81
  ql_type_ = sem_context->GetUDType(ybname.namespace_name(), ybname.table_name());
235
81
  if (ql_type_ == nullptr) {
236
7
    return sem_context->Error(this, "Could not find user defined type", ErrorCode::TYPE_NOT_FOUND);
237
7
  }
238
239
74
  return Status::OK();
240
74
}
241
242
PTFrozen::PTFrozen(MemoryContext *memctx,
243
                   YBLocationPtr loc,
244
                   const PTBaseType::SharedPtr& elems_type)
245
    : PTPrimitiveType<InternalType::kFrozenValue, DataType::FROZEN, true>(memctx, loc),
246
92
      elems_type_(elems_type) {
247
92
  ql_type_ = QLType::CreateTypeFrozen(elems_type->ql_type());
248
92
}
249
250
92
PTFrozen::~PTFrozen() {
251
92
}
252
253
92
CHECKED_STATUS PTFrozen::Analyze(SemContext *sem_context) {
254
92
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
255
87
  ql_type_ = QLType::CreateTypeFrozen(elems_type_->ql_type());
256
257
87
  if (!elems_type_->ql_type()->IsCollection() && !elems_type_->ql_type()->IsUserDefined()) {
258
1
    return sem_context->Error(this, "Can only freeze collections or user defined types",
259
1
                              ErrorCode::INVALID_TABLE_DEFINITION);
260
1
  }
261
86
  return Status::OK();
262
86
}
263
264
}  // namespace ql
265
}  // namespace yb