diff --git a/NEWS b/NEWS index 77b53a6dea..3a6ae9b160 100644 --- a/NEWS +++ b/NEWS @@ -201,6 +201,9 @@ New Functionality - Environment variables for the execution of log rotation postprocessors can be set via ``Log::default_rotation_postprocessor_cmd_env``. +- The ``record_field`` record was extended by ``optional`` and ``record_fields()`` + can now be used to determine the optionality of record fields. + Changed Functionality --------------------- diff --git a/scripts/base/init-bare.zeek b/scripts/base/init-bare.zeek index a02f3e38e7..ac356d471a 100644 --- a/scripts/base/init-bare.zeek +++ b/scripts/base/init-bare.zeek @@ -891,6 +891,7 @@ type record_field: record { ## :zeek:see:`record_fields` (if it has one). value: any &optional; default_val: any &optional; ##< The value of the :zeek:attr:`&default` attribute if defined. + optional: bool; ##< True if the field is :zeek:attr:`&optional`, else false. }; ## Table type used to map record field declarations to meta-information diff --git a/src/Type.cc b/src/Type.cc index e624809b62..97542ee008 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -1348,6 +1348,7 @@ TableValPtr RecordType::GetRecordFieldsVal(const RecordVal* rv) const nr->Assign(1, logged); nr->Assign(2, std::move(fv)); nr->Assign(3, FieldDefault(i)); + nr->Assign(4, fd->GetAttr(detail::ATTR_OPTIONAL) != detail::Attr::nil); auto field_name = make_intrusive(FieldName(i)); rval->Assign(std::move(field_name), std::move(nr)); } diff --git a/testing/btest/Baseline/bifs.records_fields/out b/testing/btest/Baseline/bifs.records_fields/out index 5d4f16243e..6a6921fc6a 100644 --- a/testing/btest/Baseline/bifs.records_fields/out +++ b/testing/btest/Baseline/bifs.records_fields/out @@ -1,66 +1,68 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. [a=42, b=Foo, c=, d=Bar, e=tt] { -[a] = [type_name=count, log=F, value=42, default_val=], -[d] = [type_name=string, log=T, value=Bar, default_val=], -[b] = [type_name=string, log=F, value=Foo, default_val=Foo], -[c] = [type_name=double, log=F, value=, default_val=], -[e] = [type_name=any, log=F, value=tt, default_val=] +[a] = [type_name=count, log=F, value=42, default_val=, optional=F], +[d] = [type_name=string, log=T, value=Bar, default_val=, optional=F], +[b] = [type_name=string, log=F, value=Foo, default_val=Foo, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[e] = [type_name=any, log=F, value=tt, default_val=, optional=F] } -F +c value, F +c default , F +c optional, T { -[a] = [type_name=bool, log=F, value=, default_val=], -[d] = [type_name=string, log=T, value=, default_val=], -[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=], -[b] = [type_name=string, log=F, value=, default_val=Bar], -[c] = [type_name=double, log=F, value=, default_val=], -[m] = [type_name=record myrec, log=F, value=, default_val=], -[e] = [type_name=enum color, log=F, value=, default_val=BLUE] +[a] = [type_name=bool, log=F, value=, default_val=, optional=F], +[d] = [type_name=string, log=T, value=, default_val=, optional=F], +[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=, optional=F], +[b] = [type_name=string, log=F, value=, default_val=Bar, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[m] = [type_name=record myrec, log=F, value=, default_val=, optional=F], +[e] = [type_name=enum color, log=F, value=, default_val=BLUE, optional=T] } { -[a] = [type_name=bool, log=F, value=, default_val=], -[d] = [type_name=string, log=T, value=, default_val=], -[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=], -[b] = [type_name=string, log=F, value=, default_val=Bar], -[c] = [type_name=double, log=F, value=, default_val=], -[m] = [type_name=record myrec, log=F, value=, default_val=], -[e] = [type_name=enum color, log=F, value=, default_val=BLUE] +[a] = [type_name=bool, log=F, value=, default_val=, optional=F], +[d] = [type_name=string, log=T, value=, default_val=, optional=F], +[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=, optional=F], +[b] = [type_name=string, log=F, value=, default_val=Bar, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[m] = [type_name=record myrec, log=F, value=, default_val=, optional=F], +[e] = [type_name=enum color, log=F, value=, default_val=BLUE, optional=T] } { -[a] = [type_name=count, log=F, value=42, default_val=], -[d] = [type_name=string, log=T, value=Bar, default_val=], -[b] = [type_name=string, log=F, value=Foo, default_val=Foo], -[c] = [type_name=double, log=F, value=, default_val=], -[e] = [type_name=any, log=F, value=mystring, default_val=] +[a] = [type_name=count, log=F, value=42, default_val=, optional=F], +[d] = [type_name=string, log=T, value=Bar, default_val=, optional=F], +[b] = [type_name=string, log=F, value=Foo, default_val=Foo, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[e] = [type_name=any, log=F, value=mystring, default_val=, optional=F] } { } { -[myfield] = [type_name=bool, log=F, value=, default_val=] +[myfield] = [type_name=bool, log=F, value=, default_val=, optional=F] } { -[a] = [type_name=bool, log=F, value=, default_val=], -[d] = [type_name=string, log=T, value=, default_val=], -[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=], -[b] = [type_name=string, log=F, value=, default_val=Bar], -[c] = [type_name=double, log=F, value=, default_val=], -[m] = [type_name=record myrec, log=F, value=, default_val=], -[e] = [type_name=enum color, log=F, value=, default_val=BLUE] +[a] = [type_name=bool, log=F, value=, default_val=, optional=F], +[d] = [type_name=string, log=T, value=, default_val=, optional=F], +[f] = [type_name=enum Monochrome::color, log=T, value=, default_val=, optional=F], +[b] = [type_name=string, log=F, value=, default_val=Bar, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[m] = [type_name=record myrec, log=F, value=, default_val=, optional=F], +[e] = [type_name=enum color, log=F, value=, default_val=BLUE, optional=T] } { -[a] = [type_name=count, log=F, value=, default_val=], -[d] = [type_name=string, log=T, value=, default_val=], -[b] = [type_name=string, log=F, value=, default_val=Foo], -[c] = [type_name=double, log=F, value=, default_val=], -[e] = [type_name=any, log=F, value=, default_val=] +[a] = [type_name=count, log=F, value=, default_val=, optional=F], +[d] = [type_name=string, log=T, value=, default_val=, optional=F], +[b] = [type_name=string, log=F, value=, default_val=Foo, optional=T], +[c] = [type_name=double, log=F, value=, default_val=, optional=T], +[e] = [type_name=any, log=F, value=, default_val=, optional=F] } { -[a] = [type_name=set[double], log=F, value=, default_val=], -[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=, default_val=], -[f] = [type_name=vector of enum color, log=F, value=, default_val=], -[b] = [type_name=set[double,string], log=F, value=, default_val=], -[c] = [type_name=set[double,record tt], log=F, value=, default_val=], -[g] = [type_name=table[string] of enum color, log=F, value=, default_val=], -[e] = [type_name=vector of vector of string, log=F, value=, default_val=] +[a] = [type_name=set[double], log=F, value=, default_val=, optional=F], +[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=, default_val=, optional=F], +[f] = [type_name=vector of enum color, log=F, value=, default_val=, optional=F], +[b] = [type_name=set[double,string], log=F, value=, default_val=, optional=F], +[c] = [type_name=set[double,record tt], log=F, value=, default_val=, optional=F], +[g] = [type_name=table[string] of enum color, log=F, value=, default_val=, optional=F], +[e] = [type_name=vector of vector of string, log=F, value=, default_val=, optional=F] } diff --git a/testing/btest/Baseline/core.record-field-redef/output b/testing/btest/Baseline/core.record-field-redef/output index da877cddd0..f35518cafa 100644 --- a/testing/btest/Baseline/core.record-field-redef/output +++ b/testing/btest/Baseline/core.record-field-redef/output @@ -1,10 +1,10 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. Info record_fields\x0a, { -[extra1] = [type_name=string, log=F, value=, default_val=], -[extra2] = [type_name=string, log=F, value=, default_val=], -[ts] = [type_name=time, log=T, value=, default_val=], -[extra3] = [type_name=string, log=T, value=, default_val=], -[msg] = [type_name=string, log=T, value=, default_val=], -[extra4] = [type_name=string, log=T, value=, default_val=] +[extra1] = [type_name=string, log=F, value=, default_val=, optional=T], +[extra2] = [type_name=string, log=F, value=, default_val=, optional=T], +[ts] = [type_name=time, log=T, value=, default_val=, optional=F], +[extra3] = [type_name=string, log=T, value=, default_val=, optional=T], +[msg] = [type_name=string, log=T, value=, default_val=, optional=F], +[extra4] = [type_name=string, log=T, value=, default_val=, optional=T] } Info record, [ts=XXXXXXXXXX.XXXXXX, msg=msg, extra1=extra1 value, extra2=extra2 value, extra3=extra3 value, extra4=extra4 value] diff --git a/testing/btest/bifs/records_fields.zeek b/testing/btest/bifs/records_fields.zeek index 72120b5015..ad54afe534 100644 --- a/testing/btest/bifs/records_fields.zeek +++ b/testing/btest/bifs/records_fields.zeek @@ -52,7 +52,9 @@ event zeek_init() local t: record_field_table; t = record_fields(x); print t; - print t["c"]?$value; + print "c value", t["c"]?$value; + print "c default ", t["c"]?$default_val; + print "c optional", t["c"]$optional; t = record_fields(x$e); print t;