YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/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
53
      precision_(precision) {
76
53
}
77
78
53
PTFloat::~PTFloat() {
79
53
}
80
81
PTDouble::PTDouble(MemoryContext *memctx, YBLocationPtr loc, int8_t precision)
82
    : PTSimpleType<InternalType::kDoubleValue, DataType::DOUBLE, true>(memctx, loc),
83
77
      precision_(precision) {
84
77
}
85
86
77
PTDouble::~PTDouble() {
87
77
}
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.27k
      max_length_(max_length) {
105
1.27k
}
106
107
928
PTCharBaseType::~PTCharBaseType() {
108
928
}
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.27k
    : PTCharBaseType(memctx, loc, max_length) {
119
1.27k
}
120
121
928
PTVarchar::~PTVarchar() {
122
928
}
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
90
      values_type_(values_type) {
133
90
  ql_type_ = QLType::CreateTypeMap(keys_type->ql_type(), values_type->ql_type());
134
90
}
135
136
90
PTMap::~PTMap() {
137
90
}
138
139
90
CHECKED_STATUS PTMap::Analyze(SemContext *sem_context) {
140
90
  RETURN_NOT_OK(keys_type_->Analyze(sem_context));
141
90
  RETURN_NOT_OK(values_type_->Analyze(sem_context));
142
90
  ql_type_ = QLType::CreateTypeMap(keys_type_->ql_type(), values_type_->ql_type());
143
144
  // Both key and value types cannot be collection.
145
90
  if (keys_type_->ql_type()->IsCollection() || 
keys_type_->ql_type()->IsUserDefined()87
||
146
90
      
values_type_->ql_type()->IsCollection()87
||
values_type_->ql_type()->IsUserDefined()84
) {
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
83
  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
83
  return Status::OK();
161
83
}
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
74
      elems_type_(elems_type) {
168
74
  ql_type_ = QLType::CreateTypeSet(elems_type->ql_type());
169
74
}
170
171
74
PTSet::~PTSet() {
172
74
}
173
174
74
CHECKED_STATUS PTSet::Analyze(SemContext *sem_context) {
175
74
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
176
74
  ql_type_ = QLType::CreateTypeSet(elems_type_->ql_type());
177
178
  // Elems type cannot be collection.
179
74
  if (elems_type_->ql_type()->IsCollection() || 
elems_type_->ql_type()->IsUserDefined()71
) {
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
69
  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
69
  return Status::OK();
194
69
}
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
74
      elems_type_(elems_type) {
201
74
  ql_type_ = QLType::CreateTypeList(elems_type->ql_type());
202
74
}
203
204
74
PTList::~PTList() {
205
74
}
206
207
74
CHECKED_STATUS PTList::Analyze(SemContext *sem_context) {
208
74
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
209
74
  ql_type_ = QLType::CreateTypeList(elems_type_->ql_type());
210
211
  // Elems type cannot be collection.
212
74
  if (elems_type_->ql_type()->IsCollection() || 
elems_type_->ql_type()->IsUserDefined()71
) {
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
69
  return Status::OK();
219
74
}
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
84
      name_(name) {
226
84
}
227
228
84
PTUserDefinedType::~PTUserDefinedType() {
229
84
}
230
231
82
CHECKED_STATUS PTUserDefinedType::Analyze(SemContext *sem_context) {
232
82
  RETURN_NOT_OK(name_->AnalyzeName(sem_context, ObjectType::TYPE));
233
82
  auto ybname = name_->ToTableName();
234
82
  ql_type_ = sem_context->GetUDType(ybname.namespace_name(), ybname.table_name());
235
82
  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
75
  return Status::OK();
240
82
}
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
97
      elems_type_(elems_type) {
247
97
  ql_type_ = QLType::CreateTypeFrozen(elems_type->ql_type());
248
97
}
249
250
97
PTFrozen::~PTFrozen() {
251
97
}
252
253
97
CHECKED_STATUS PTFrozen::Analyze(SemContext *sem_context) {
254
97
  RETURN_NOT_OK(elems_type_->Analyze(sem_context));
255
92
  ql_type_ = QLType::CreateTypeFrozen(elems_type_->ql_type());
256
257
92
  if (!elems_type_->ql_type()->IsCollection() && 
!elems_type_->ql_type()->IsUserDefined()45
) {
258
1
    return sem_context->Error(this, "Can only freeze collections or user defined types",
259
1
                              ErrorCode::INVALID_TABLE_DEFINITION);
260
1
  }
261
91
  return Status::OK();
262
92
}
263
264
}  // namespace ql
265
}  // namespace yb