John Karp created AVRO-1521:
-------------------------------
Summary: Inconsistent behavior of Perl API with 'boolean' type
Key: AVRO-1521
URL: https://issues.apache.org/jira/browse/AVRO-1521
Project: Avro
Issue Type: Bug
Components: perl
Reporter: John Karp
Assignee: John Karp
h1. Boolean Serialization
The boolean serialization code in BinaryEncoder.pm is:
{noformat}
$data ? \0x1 : \0x0
{noformat}
intending that anything false to perl, such as 0, '0', '', () and undef are
encoded as zero, and everything else is encoded as one. However, this code
doesn't work, as these unit tests would indicate:
{noformat}
primitive_ok boolean => 0, "\x0";
primitive_ok boolean => 1, "\x1";
{noformat}
which print:
{noformat}
# Failed test 'primitive boolean encoded correctly'
# at t/02_bin_encode.t line 40.
# got: '30'
# expected: '00'
# Failed test 'primitive boolean encoded correctly'
# at t/02_bin_encode.t line 40.
# got: '31'
# expected: '01'
{noformat}
h1. Booleans in Unions
Inconsistent with the above serialization, the code used in Schema.pm to
determine which union branch to use, is attempting to check for boolean-ness
with:
{noformat}
m{yes|no|y|n|t|f|true|false}i
{noformat}
meaning only those particular strings are considered booleans, however they
will all get encoded as '0' by BinaryEncoder.pm.
I say 'attempts' because its actually matching this regex against the data type
name $type, which in this context will always be 'boolean', instead of of the
value $data.
h1. Suggested Fix
Perl has no boolean type, so there's no ideal solution for the inconsistency.
But we could keep it simple, and have only the numbers 0 and 1 accepted as
boolean values.
--
This message was sent by Atlassian JIRA
(v6.2#6252)