diff --git a/src/codec/RowReaderV1.cpp b/src/codec/RowReaderV1.cpp index 877e1e35cee..b56b831a228 100644 --- a/src/codec/RowReaderV1.cpp +++ b/src/codec/RowReaderV1.cpp @@ -198,11 +198,11 @@ Value RowReaderV1::getValueByName(const std::string& prop) const noexcept { Value RowReaderV1::getValueByIndex(const int64_t index) const noexcept { if (index < 0 || static_cast(index) >= schema_->getNumFields()) { - return Value(NullType::UNKNOWN_PROP); + return Value(NullType::__NULL__); } auto vType = getSchema()->getFieldType(index); if (PropertyType::UNKNOWN == vType) { - return Value(NullType::UNKNOWN_PROP); + return Value(NullType::__NULL__); } switch (vType) { case PropertyType::BOOL: diff --git a/src/codec/RowReaderV2.cpp b/src/codec/RowReaderV2.cpp index fc213cbf568..91db3933fec 100644 --- a/src/codec/RowReaderV2.cpp +++ b/src/codec/RowReaderV2.cpp @@ -52,7 +52,7 @@ Value RowReaderV2::getValueByName(const std::string& prop) const noexcept { Value RowReaderV2::getValueByIndex(const int64_t index) const noexcept { if (index < 0 || static_cast(index) >= schema_->getNumFields()) { - return Value(NullType::UNKNOWN_PROP); + return Value(NullType::__NULL__); } auto field = schema_->field(index); diff --git a/src/common/datatypes/Map.h b/src/common/datatypes/Map.h index 91134a48387..9a55f28318c 100644 --- a/src/common/datatypes/Map.h +++ b/src/common/datatypes/Map.h @@ -69,7 +69,7 @@ struct Map { const Value& at(const std::string& key) const { auto iter = kvs.find(key); if (iter == kvs.end()) { - return Value::kNullUnknownProp; + return Value::kNullValue; } return iter->second; } diff --git a/src/common/datatypes/Value.cpp b/src/common/datatypes/Value.cpp index 7de3ece5103..c49adf90290 100644 --- a/src/common/datatypes/Value.cpp +++ b/src/common/datatypes/Value.cpp @@ -29,7 +29,6 @@ const Value Value::kNullNaN(NullType::NaN); const Value Value::kNullBadData(NullType::BAD_DATA); const Value Value::kNullBadType(NullType::BAD_TYPE); const Value Value::kNullOverflow(NullType::ERR_OVERFLOW); -const Value Value::kNullUnknownProp(NullType::UNKNOWN_PROP); const Value Value::kNullDivByZero(NullType::DIV_BY_ZERO); const Value Value::kNullOutOfRange(NullType::OUT_OF_RANGE); @@ -320,7 +319,6 @@ const std::string& Value::typeName() const { {NullType::BAD_DATA, "BAD_DATA"}, {NullType::BAD_TYPE, "BAD_TYPE"}, {NullType::ERR_OVERFLOW, "ERR_OVERFLOW"}, - {NullType::UNKNOWN_PROP, "UNKNOWN_PROP"}, {NullType::DIV_BY_ZERO, "DIV_BY_ZERO"}, }; @@ -1564,8 +1562,6 @@ std::string Value::toString() const { return "__NULL_OVERFLOW__"; case NullType::NaN: return "__NULL_NaN__"; - case NullType::UNKNOWN_PROP: - return "__NULL_UNKNOWN_PROP__"; case NullType::OUT_OF_RANGE: return "__NULL_OUT_OF_RANGE__"; } diff --git a/src/common/datatypes/Value.h b/src/common/datatypes/Value.h index 06f4e8b2241..b55397a1566 100644 --- a/src/common/datatypes/Value.h +++ b/src/common/datatypes/Value.h @@ -40,7 +40,6 @@ enum class NullType { BAD_DATA = 2, BAD_TYPE = 3, ERR_OVERFLOW = 4, - UNKNOWN_PROP = 5, DIV_BY_ZERO = 6, OUT_OF_RANGE = 7, }; @@ -52,7 +51,6 @@ struct Value { static const Value kNullBadData; static const Value kNullBadType; static const Value kNullOverflow; - static const Value kNullUnknownProp; static const Value kNullDivByZero; static const Value kNullOutOfRange; @@ -157,8 +155,8 @@ struct Value { } auto& null = value_.nVal; return null == NullType::NaN || null == NullType::BAD_DATA || null == NullType::BAD_TYPE || - null == NullType::ERR_OVERFLOW || null == NullType::UNKNOWN_PROP || - null == NullType::DIV_BY_ZERO || null == NullType::OUT_OF_RANGE; + null == NullType::ERR_OVERFLOW || null == NullType::DIV_BY_ZERO || + null == NullType::OUT_OF_RANGE; } bool isNumeric() const { return type_ == Type::INT || type_ == Type::FLOAT; diff --git a/src/common/datatypes/test/ValueTest.cpp b/src/common/datatypes/test/ValueTest.cpp index 73abce84640..571c74f463f 100644 --- a/src/common/datatypes/test/ValueTest.cpp +++ b/src/common/datatypes/test/ValueTest.cpp @@ -1565,7 +1565,6 @@ TEST(Value, typeName) { EXPECT_EQ("BAD_DATA", Value::kNullBadData.typeName()); EXPECT_EQ("BAD_TYPE", Value::kNullBadType.typeName()); EXPECT_EQ("ERR_OVERFLOW", Value::kNullOverflow.typeName()); - EXPECT_EQ("UNKNOWN_PROP", Value::kNullUnknownProp.typeName()); EXPECT_EQ("DIV_BY_ZERO", Value::kNullDivByZero.typeName()); } @@ -1582,7 +1581,6 @@ TEST(Value, DecodeEncode) { Value(NullType::BAD_DATA), Value(NullType::ERR_OVERFLOW), Value(NullType::OUT_OF_RANGE), - Value(NullType::UNKNOWN_PROP), // int Value(0), diff --git a/src/common/datatypes/test/ValueToJsonTest.cpp b/src/common/datatypes/test/ValueToJsonTest.cpp index 457b666051d..a2e8923e2a5 100644 --- a/src/common/datatypes/test/ValueToJsonTest.cpp +++ b/src/common/datatypes/test/ValueToJsonTest.cpp @@ -225,7 +225,7 @@ TEST(ValueToJson, DecodeEncode) { Value(NullType::BAD_DATA), Value(NullType::ERR_OVERFLOW), Value(NullType::OUT_OF_RANGE), - Value(NullType::UNKNOWN_PROP), + Value(NullType::__NULL__), // int Value(0), diff --git a/src/common/expression/AttributeExpression.cpp b/src/common/expression/AttributeExpression.cpp index 92425be7892..4f8f7b9c147 100644 --- a/src/common/expression/AttributeExpression.cpp +++ b/src/common/expression/AttributeExpression.cpp @@ -33,7 +33,7 @@ const Value &AttributeExpression::eval(ExpressionContext &ctx) { return iter->second; } } - return Value::kNullUnknownProp; + return Value::kNullValue; } case Value::Type::EDGE: { DCHECK(!rvalue.getStr().empty()); diff --git a/src/common/expression/test/AttributeExpressionTest.cpp b/src/common/expression/test/AttributeExpressionTest.cpp index 5b3dbbe5870..1258e953bfa 100644 --- a/src/common/expression/test/AttributeExpressionTest.cpp +++ b/src/common/expression/test/AttributeExpressionTest.cpp @@ -134,7 +134,7 @@ TEST_F(AttributeExpressionTest, DateTimeAttribute) { auto *right = LabelExpression::make(&pool, "not exist attribute"); auto expr = AttributeExpression::make(&pool, left, right); auto value = Expression::eval(expr, gExpCtxt); - ASSERT_EQ(Value::kNullUnknownProp, value); + ASSERT_EQ(Value::kNullValue, value); } { auto *left = ConstantExpression::make(&pool, Value(dt)); @@ -148,7 +148,7 @@ TEST_F(AttributeExpressionTest, DateTimeAttribute) { auto *right = LabelExpression::make(&pool, "not exist attribute"); auto expr = AttributeExpression::make(&pool, left, right); auto value = Expression::eval(expr, gExpCtxt); - ASSERT_EQ(Value::kNullUnknownProp, value); + ASSERT_EQ(Value::kNullValue, value); } { auto *left = ConstantExpression::make(&pool, Value(d)); @@ -162,7 +162,7 @@ TEST_F(AttributeExpressionTest, DateTimeAttribute) { auto *right = LabelExpression::make(&pool, "not exist attribute"); auto expr = AttributeExpression::make(&pool, left, right); auto value = Expression::eval(expr, gExpCtxt); - ASSERT_EQ(Value::kNullUnknownProp, value); + ASSERT_EQ(Value::kNullValue, value); } { auto *left = ConstantExpression::make(&pool, Value(t)); diff --git a/src/common/expression/test/SubscriptExpressionTest.cpp b/src/common/expression/test/SubscriptExpressionTest.cpp index 622557d7b5a..7d7f7ead0cf 100644 --- a/src/common/expression/test/SubscriptExpressionTest.cpp +++ b/src/common/expression/test/SubscriptExpressionTest.cpp @@ -338,7 +338,6 @@ TEST_F(SubscriptExpressionTest, MapSubscript) { auto expr = SubscriptExpression::make(&pool, map, key); auto value = Expression::eval(expr, gExpCtxt); ASSERT_TRUE(value.isNull()); - ASSERT_TRUE(value.isBadNull()); } // {"key1":1,"key2":2, "key3":3}[0] { diff --git a/src/common/time/TimeUtils.h b/src/common/time/TimeUtils.h index 94570877ad3..e2c4bba09ed 100644 --- a/src/common/time/TimeUtils.h +++ b/src/common/time/TimeUtils.h @@ -124,7 +124,7 @@ class TimeUtils { } else if (lowerProp == "microsecond") { return static_cast(dt.microsec); } else { - return Value::kNullUnknownProp; + return Value::kNullValue; } } @@ -160,7 +160,7 @@ class TimeUtils { } else if (lowerProp == "day") { return d.day; } else { - return Value::kNullUnknownProp; + return Value::kNullValue; } } @@ -203,7 +203,7 @@ class TimeUtils { } else if (lowerProp == "microsecond") { return t.microsec; } else { - return Value::kNullUnknownProp; + return Value::kNullValue; } } diff --git a/src/common/utils/IndexKeyUtils.cpp b/src/common/utils/IndexKeyUtils.cpp index 3707d85f52e..5e984ddb54e 100644 --- a/src/common/utils/IndexKeyUtils.cpp +++ b/src/common/utils/IndexKeyUtils.cpp @@ -204,7 +204,7 @@ StatusOr IndexKeyUtils::readValueWithLatestSche(RowReader* reader, const std::string propName, const meta::SchemaProviderIf* latestSchema) { auto value = reader->getValueByName(propName); - if (latestSchema == nullptr || !value.isNull() || value.getNull() != NullType::UNKNOWN_PROP) { + if (latestSchema == nullptr || !value.isNull() || value.getNull() != NullType::__NULL__) { return value; } auto field = latestSchema->field(propName); @@ -230,9 +230,6 @@ Status IndexKeyUtils::checkValue(const Value& v, bool isNullable) { } switch (v.getNull()) { - case nebula::NullType::UNKNOWN_PROP: { - return Status::Error("Unknown prop"); - } case nebula::NullType::__NULL__: { if (!isNullable) { return Status::Error("Not allowed to be null"); diff --git a/src/interface/common.thrift b/src/interface/common.thrift index 808ffaf769f..8b55a4e4030 100644 --- a/src/interface/common.thrift +++ b/src/interface/common.thrift @@ -95,7 +95,6 @@ enum NullType { BAD_DATA = 2, BAD_TYPE = 3, ERR_OVERFLOW = 4, - UNKNOWN_PROP = 5, DIV_BY_ZERO = 6, OUT_OF_RANGE = 7, } (cpp.enum_strict, cpp.type = "nebula::NullType") diff --git a/src/storage/exec/IndexEdgeScanNode.cpp b/src/storage/exec/IndexEdgeScanNode.cpp index 9eb9fb26cb2..d4dcfd67ecd 100644 --- a/src/storage/exec/IndexEdgeScanNode.cpp +++ b/src/storage/exec/IndexEdgeScanNode.cpp @@ -122,7 +122,7 @@ Map IndexEdgeScanNode::decodeFromBase(const std::string& key case QueryUtils::ReturnColType::kOther: { auto field = edge_.back()->field(col); if (field == nullptr) { - values[col] = Value::kNullUnknownProp; + values[col] = Value::kNullValue; } else { auto retVal = QueryUtils::readValue(reader.get(), col, field); if (!retVal.ok()) { diff --git a/src/storage/exec/IndexVertexScanNode.cpp b/src/storage/exec/IndexVertexScanNode.cpp index 4dcfd01075c..fd2eed2ae0c 100644 --- a/src/storage/exec/IndexVertexScanNode.cpp +++ b/src/storage/exec/IndexVertexScanNode.cpp @@ -99,7 +99,7 @@ Map IndexVertexScanNode::decodeFromBase(const std::string& k case QueryUtils::ReturnColType::kOther: { auto field = tag_.back()->field(col); if (field == nullptr) { - values[col] = Value::kNullUnknownProp; + values[col] = Value::kNullValue; } else { auto retVal = QueryUtils::readValue(reader.get(), col, field); if (!retVal.ok()) { diff --git a/src/storage/exec/QueryUtils.h b/src/storage/exec/QueryUtils.h index 4a3c1499727..1fe1103cf17 100644 --- a/src/storage/exec/QueryUtils.h +++ b/src/storage/exec/QueryUtils.h @@ -79,7 +79,7 @@ class QueryUtils final { // read null value auto nullType = value.getNull(); - if (nullType == NullType::UNKNOWN_PROP) { + if (nullType == NullType::__NULL__) { VLOG(1) << "Fail to read prop " << propName; if (!field) { return value; diff --git a/src/tools/db-upgrade/DbUpgrader.cpp b/src/tools/db-upgrade/DbUpgrader.cpp index c0834d87339..822f9cc7899 100644 --- a/src/tools/db-upgrade/DbUpgrader.cpp +++ b/src/tools/db-upgrade/DbUpgrader.cpp @@ -867,7 +867,7 @@ std::string UpgraderSpace::encodeRowVal(const RowReader* reader, LOG(ERROR) << "Write rowWriterV2 failed"; return ""; } - } else if (nullType != NullType::UNKNOWN_PROP) { + } else if (nullType != NullType::__NULL__) { // nullType == NullType::kNullUnknownProp, indicates that the field is // only in the latest schema, maybe use default value or null value. LOG(ERROR) << "Data is illegal in " << name << " field"; diff --git a/tests/common/nebula_test_suite.py b/tests/common/nebula_test_suite.py index 83b746704b3..efc0c1f128c 100644 --- a/tests/common/nebula_test_suite.py +++ b/tests/common/nebula_test_suite.py @@ -34,8 +34,8 @@ T_NULL_BAD_DATA.set_nVal(CommonTtypes.NullType.BAD_DATA) T_NULL_BAD_TYPE = CommonTtypes.Value() T_NULL_BAD_TYPE.set_nVal(CommonTtypes.NullType.BAD_TYPE) -T_NULL_UNKNOWN_PROP = CommonTtypes.Value() -T_NULL_UNKNOWN_PROP.set_nVal(CommonTtypes.NullType.UNKNOWN_PROP) +T_NULL___NULL__ = CommonTtypes.Value() +T_NULL___NULL__.set_nVal(CommonTtypes.NullType.__NULL__) T_NULL_UNKNOWN_DIV_BY_ZERO = CommonTtypes.Value() T_NULL_UNKNOWN_DIV_BY_ZERO.set_nVal(CommonTtypes.NullType.DIV_BY_ZERO) diff --git a/tests/tck/features/expression/Attribute.feature b/tests/tck/features/expression/Attribute.feature index c471c3554c4..bfff234892f 100644 --- a/tests/tck/features/expression/Attribute.feature +++ b/tests/tck/features/expression/Attribute.feature @@ -61,8 +61,8 @@ Feature: Attribute RETURN {k1 : 1, k2: true}.K1 AS k """ Then the result should be, in any order: - | k | - | UNKNOWN_PROP | + | k | + | __NULL__ | When executing query: """ MATCH (v) WHERE id(v) == 'Tim Duncan' RETURN v.player.name @@ -101,28 +101,28 @@ Feature: Attribute """ Then the result should be, in any order: | not_exists_attr | - | UNKNOWN_PROP | + | __NULL__ | When executing query: """ RETURN time("02:59:40").not_exists_attr AS not_exists_attr """ Then the result should be, in any order: | not_exists_attr | - | UNKNOWN_PROP | + | __NULL__ | When executing query: """ RETURN datetime("2021-07-19T02:59:40").not_exists_attr AS not_exists_attr """ Then the result should be, in any order: | not_exists_attr | - | UNKNOWN_PROP | + | __NULL__ | When executing query: """ RETURN {k1 : 1, k2: true}.not_exists_attr AS not_exists_attr """ Then the result should be, in any order: | not_exists_attr | - | UNKNOWN_PROP | + | __NULL__ | When executing query: """ MATCH (v) WHERE id(v) == 'Tim Duncan' RETURN v.player.not_exists_attr diff --git a/tests/tck/features/match/With.feature b/tests/tck/features/match/With.feature index 8cf68f1edd1..9f76a59e9b7 100644 --- a/tests/tck/features/match/With.feature +++ b/tests/tck/features/match/With.feature @@ -94,8 +94,8 @@ Feature: With clause RETURN x.c """ Then the result should be, in any order: - | x.c | - | UNKNOWN_PROP | + | x.c | + | __NULL__ | Scenario: match with return When executing query: diff --git a/tests/tck/features/optimizer/PrunePropertiesRule.feature b/tests/tck/features/optimizer/PrunePropertiesRule.feature index 5429bf2fb82..856301020e9 100644 --- a/tests/tck/features/optimizer/PrunePropertiesRule.feature +++ b/tests/tck/features/optimizer/PrunePropertiesRule.feature @@ -747,9 +747,9 @@ Feature: Prune Properties rule """ Then the result should be, in order, with relax comparison: | properties(src_v).age | properties(e).degree | name | src_v.player.sex | e.start_year | dst_v.player.age | - | 41 | UNKNOWN_PROP | "Dejounte Murray" | "男" | 2022 | 29 | + | 41 | __NULL__ | "Dejounte Murray" | "男" | 2022 | 29 | | 41 | 88 | "Spurs" | "男" | 2002 | NULL | - | 41 | UNKNOWN_PROP | "Tiago Splitter" | "男" | 2022 | 34 | + | 41 | __NULL__ | "Tiago Splitter" | "男" | 2022 | 34 | When executing query: """ match (src_v:player{name:"Manu Ginobili"})-[e*2]-(dst_v) @@ -759,10 +759,10 @@ Feature: Prune Properties rule Then the result should be, in order, with relax comparison: | properties(src_v).sex | properties(e[0]).degree | properties(dst_v).name | age | e[1].start_year | dst_v.player.age | | "男" | 88 | "Danny Green" | 41 | 2010 | 31 | - | "男" | UNKNOWN_PROP | "Danny Green" | 41 | 2022 | 31 | - | "男" | UNKNOWN_PROP | "LeBron James" | 41 | 2022 | 34 | + | "男" | __NULL__ | "Danny Green" | 41 | 2022 | 31 | + | "男" | __NULL__ | "LeBron James" | 41 | 2022 | 34 | | "男" | 88 | "Cory Joseph" | 41 | 2011 | 27 | - | "男" | UNKNOWN_PROP | "76ers" | 41 | 2017 | NULL | + | "男" | __NULL__ | "76ers" | 41 | 2017 | NULL | When executing query: """ match (src_v:player{name:"Manu Ginobili"})-[e:like*2..3]-(dst_v) @@ -771,11 +771,11 @@ Feature: Prune Properties rule """ Then the result should be, in order, with relax comparison: | properties(src_v).sex | properties(e[0]).degree | properties(dst_v).name | age | e[1].start_year | dst_v.player.age | - | "男" | UNKNOWN_PROP | "Danny Green" | 41 | 2022 | 31 | - | "男" | UNKNOWN_PROP | "Danny Green" | 41 | 2022 | 31 | - | "男" | UNKNOWN_PROP | "Kyle Anderson" | 41 | 2022 | 25 | - | "男" | UNKNOWN_PROP | "LeBron James" | 41 | 2022 | 34 | - | "男" | UNKNOWN_PROP | "Kevin Durant" | 41 | 2022 | 30 | + | "男" | __NULL__ | "Danny Green" | 41 | 2022 | 31 | + | "男" | __NULL__ | "Danny Green" | 41 | 2022 | 31 | + | "男" | __NULL__ | "Kyle Anderson" | 41 | 2022 | 25 | + | "男" | __NULL__ | "LeBron James" | 41 | 2022 | 34 | + | "男" | __NULL__ | "Kevin Durant" | 41 | 2022 | 30 | When executing query: """ match (v1)-->(v2)-->(v3) where id(v1)=="Manu Ginobili" @@ -841,9 +841,9 @@ Feature: Prune Properties rule Then the result should be, in order, with relax comparison: | properties(e).degree | degree | | 88 | 88 | - | UNKNOWN_PROP | 88 | + | __NULL__ | 88 | | 88 | 88 | - | UNKNOWN_PROP | 88 | + | __NULL__ | 88 | | 88 | 88 | When executing query: """ @@ -851,9 +851,9 @@ Feature: Prune Properties rule """ Then the result should be, in order, with relax comparison: | properties(e).degree1 | properties(e).degree1 | e2.a | dst_v.p.name | dst_v.player.sex1 | properties(src_v).name2 | - | UNKNOWN_PROP | UNKNOWN_PROP | NULL | NULL | NULL | UNKNOWN_PROP | - | UNKNOWN_PROP | UNKNOWN_PROP | NULL | NULL | NULL | UNKNOWN_PROP | - | UNKNOWN_PROP | UNKNOWN_PROP | NULL | NULL | NULL | UNKNOWN_PROP | - | UNKNOWN_PROP | UNKNOWN_PROP | NULL | NULL | NULL | UNKNOWN_PROP | - | UNKNOWN_PROP | UNKNOWN_PROP | NULL | NULL | NULL | UNKNOWN_PROP | + | __NULL__ | __NULL__ | NULL | NULL | NULL | __NULL__ | + | __NULL__ | __NULL__ | NULL | NULL | NULL | __NULL__ | + | __NULL__ | __NULL__ | NULL | NULL | NULL | __NULL__ | + | __NULL__ | __NULL__ | NULL | NULL | NULL | __NULL__ | + | __NULL__ | __NULL__ | NULL | NULL | NULL | __NULL__ | Then drop the used space diff --git a/tests/tck/features/parser/nebula.feature b/tests/tck/features/parser/nebula.feature index 7e802ce4155..9d9fc4e09e1 100644 --- a/tests/tck/features/parser/nebula.feature +++ b/tests/tck/features/parser/nebula.feature @@ -17,7 +17,7 @@ Feature: Value parsing | BAD_DATA | BAD_DATA | | BAD_TYPE | BAD_TYPE | | OVERFLOW | ERR_OVERFLOW | - | UNKNOWN_PROP | UNKNOWN_PROP | + | __NULL__ | NULL | | DIV_BY_ZERO | DIV_BY_ZERO | | OUT_OF_RANGE | OUT_OF_RANGE | | 123 | iVal | diff --git a/tests/tck/utils/nbv.py b/tests/tck/utils/nbv.py index 6bc4e3a1714..fb75b0569ae 100644 --- a/tests/tck/utils/nbv.py +++ b/tests/tck/utils/nbv.py @@ -42,7 +42,7 @@ 'BAD_DATA', 'BAD_TYPE', 'OVERFLOW', - 'UNKNOWN_PROP', + '__NULL__', 'DIV_BY_ZERO', 'OUT_OF_RANGE', 'FLOAT', @@ -100,9 +100,9 @@ def t_OVERFLOW(t): return t -def t_UNKNOWN_PROP(t): - r'UNKNOWN_PROP' - t.value = Value(nVal=NullType.UNKNOWN_PROP) +def t___NULL__(t): + r'__NULL__' + t.value = Value(nVal=NullType.__NULL__) return t @@ -239,7 +239,7 @@ def p_expr(p): | BAD_DATA | BAD_TYPE | OVERFLOW - | UNKNOWN_PROP + | __NULL__ | DIV_BY_ZERO | OUT_OF_RANGE | INT @@ -587,7 +587,7 @@ def parse_row(row): expected['BAD_DATA'] = Value(nVal=NullType.BAD_DATA) expected['BAD_TYPE'] = Value(nVal=NullType.BAD_TYPE) expected['OVERFLOW'] = Value(nVal=NullType.ERR_OVERFLOW) - expected['UNKNOWN_PROP'] = Value(nVal=NullType.UNKNOWN_PROP) + expected['__NULL__'] = Value(nVal=NullType.__NULL__) expected['DIV_BY_ZERO'] = Value(nVal=NullType.DIV_BY_ZERO) expected['OUT_OF_RANGE'] = Value(nVal=NullType.OUT_OF_RANGE) expected['123'] = Value(iVal=123)