diff --git a/lang/c++/impl/DataFile.cc b/lang/c++/impl/DataFile.cc index 66281ae9820..8fb4a1abaa7 100644 --- a/lang/c++/impl/DataFile.cc +++ b/lang/c++/impl/DataFile.cc @@ -183,7 +183,7 @@ void DataFileWriterBase::sync() { crc.process_bytes(reinterpret_cast(temp.data()), temp.size()); // For Snappy, add the CRC32 checksum - int32_t checksum = crc(); + auto checksum = crc(); // Now compress size_t compressed_size = snappy::Compress( @@ -408,7 +408,7 @@ void DataFileReaderBase::readDataBlock() { "Snappy Compression reported an error when decompressing"); } crc.process_bytes(uncompressed.c_str(), uncompressed.size()); - uint32_t c = crc(); + auto c = crc(); if (checksum != c) { throw Exception( "Checksum did not match for Snappy compression: Expected: {}, computed: {}", diff --git a/lang/c++/impl/Node.cc b/lang/c++/impl/Node.cc index bde556bf314..fd9ee9d6dcf 100644 --- a/lang/c++/impl/Node.cc +++ b/lang/c++/impl/Node.cc @@ -16,6 +16,7 @@ * limitations under the License. */ +#include #include #include diff --git a/lang/c++/impl/parsing/Symbol.hh b/lang/c++/impl/parsing/Symbol.hh index c8760c34dfa..bbba58e6a0e 100644 --- a/lang/c++/impl/parsing/Symbol.hh +++ b/lang/c++/impl/parsing/Symbol.hh @@ -19,6 +19,7 @@ #ifndef avro_parsing_Symbol_hh__ #define avro_parsing_Symbol_hh__ +#include #include #include #include diff --git a/lang/c++/test/SchemaTests.cc b/lang/c++/test/SchemaTests.cc index f4c4fb6af97..c9fec0ed765 100644 --- a/lang/c++/test/SchemaTests.cc +++ b/lang/c++/test/SchemaTests.cc @@ -20,6 +20,7 @@ #include "GenericDatum.hh" #include "ValidSchema.hh" +#include #include #include #include @@ -28,14 +29,14 @@ namespace avro { namespace schema { const char *basicSchemas[] = { - "\"null\"", - "\"boolean\"", - "\"int\"", - "\"long\"", - "\"float\"", - "\"double\"", - "\"bytes\"", - "\"string\"", + R"("null")", + R"("boolean")", + R"("int")", + R"("long")", + R"("float")", + R"("double")", + R"("bytes")", + R"("string")", // Primitive types - longer R"({ "type": "null" })", @@ -48,51 +49,101 @@ const char *basicSchemas[] = { R"({ "type": "string" })", // Record - R"({"type":"record","name":"Test","doc":"Doc_string","fields":[]})", - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f\",\"type\":\"long\"}]}", - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f1\",\"type\":\"long\",\"doc\":\"field_doc\"}," - "{\"name\":\"f2\",\"type\":\"int\"}]}", - "{\"type\":\"error\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f1\",\"type\":\"long\"}," - "{\"name\":\"f2\",\"type\":\"int\"}]}", - + R"({ + "type":"record", + "name":"Test", + "doc":"Doc_string", + "fields":[] + })", + R"({ + "type":"record", + "name":"Test", + "fields": [ + {"name":"f","type":"long"} + ] + })", + R"({ + "type":"record", + "name":"Test", + "fields":[ + {"name":"f1","type":"long","doc":"field_doc"}, + {"name":"f2","type":"int"} + ] + })", + R"({ + "type":"error", + "name":"Test", + "fields":[ + {"name":"f1","type":"long"}, + {"name":"f2","type":"int"} + ] + })", // Recursive. - "{\"type\":\"record\",\"name\":\"LongList\"," - "\"fields\":[{\"name\":\"value\",\"type\":\"long\",\"doc\":\"recursive_doc\"}," - "{\"name\":\"next\",\"type\":[\"LongList\",\"null\"]}]}", + R"({ + "type":"record", + "name":"LongList", + "fields":[ + {"name":"value","type":"long","doc":"recursive_doc"}, + {"name":"next","type":["LongList","null"]} + ] + })", + // Enum - R"({"type":"enum","doc":"enum_doc","name":"Test","symbols":["A","B"]})", + R"({ + "type":"enum", + "doc":"enum_doc", + "name":"Test", + "symbols":["A","B"] + })", // Array - R"({"type":"array","doc":"array_doc","items":"long"})", - "{\"type\":\"array\",\"items\":{\"type\":\"enum\"," - "\"name\":\"Test\",\"symbols\":[\"A\",\"B\"]}}", + R"({ + "type":"array", + "doc":"array_doc", + "items":"long" + })", + R"({ + "type":"array", + "items":{ + "type":"enum", + "name":"Test", + "symbols":["A","B"] + } + })", // Map R"({"type":"map","doc":"map_doc","values":"long"})", - "{\"type\":\"map\",\"values\":{\"type\":\"enum\", " - "\"name\":\"Test\",\"symbols\":[\"A\",\"B\"]}}", + R"({ + "type":"map", + "values":{ + "type":"enum", + "name":"Test", + "symbols":["A","B"] + } + })", // Union R"(["string","null","long"])", // Fixed R"({"type":"fixed","doc":"fixed_doc","name":"Test","size":1})", - "{\"type\":\"fixed\",\"name\":\"MyFixed\"," - "\"namespace\":\"org.apache.hadoop.avro\",\"size\":1}", + R"({"type":"fixed","name":"MyFixed","namespace":"org.apache.hadoop.avro","size":1})", R"({"type":"fixed","name":"Test","size":1})", R"({"type":"fixed","name":"Test","size":1})", // Extra attributes (should be ignored) R"({"type": "null", "extra attribute": "should be ignored"})", R"({"type": "boolean", "extra1": 1, "extra2": 2, "extra3": 3})", - "{\"type\": \"record\",\"name\": \"Test\",\"fields\": " - "[{\"name\": \"f\",\"type\": \"long\"}], \"extra attribute\": 1}", - "{\"type\": \"enum\", \"name\": \"Test\", \"symbols\": [\"A\", \"B\"]," - "\"extra attribute\": 1}", - R"({"type": "array", "items": "long", "extra attribute": "1"})", + R"({ + "type": "record", + "name": "Test", + "fields":[ + {"name": "f","type":"long"} + ], + "extra attribute": 1 + })", + R"({"type": "enum", "name": "Test", "symbols": ["A", "B"],"extra attribute": 1})", + R"({"type": "array", "items": "long", "extra attribute": 1})", R"({"type": "map", "values": "long", "extra attribute": 1})", R"({"type": "fixed", "name": "Test", "size": 1, "extra attribute": 1})", @@ -103,15 +154,31 @@ const char *basicSchemas[] = { R"({ "name":"test", "type": "record", "fields": [ {"name": "double","type": "double","default" : 1.2 }]})", // namespace with '$' in it. - "{\"type\":\"record\",\"name\":\"Test\",\"namespace\":\"a.b$\",\"fields\":" - "[{\"name\":\"f\",\"type\":\"long\"}]}", + R"({ + "type":"record", + "name":"Test", + "namespace":"a.b$", + "fields":[ + {"name":"f","type":"long"} + ] + })", // Custom attribute(s) for field in record - "{\"type\": \"record\",\"name\": \"Test\",\"fields\": " - "[{\"name\": \"f1\",\"type\": \"long\",\"extra field\": \"1\"}]}", - "{\"type\": \"record\",\"name\": \"Test\",\"fields\": " - "[{\"name\": \"f1\",\"type\": \"long\"," - "\"extra field1\": \"1\",\"extra field2\": \"2\"}]}"}; + R"({ + "type": "record", + "name": "Test", + "fields":[ + {"name": "f1","type": "long","extra field": "1"} + ] + })", + R"({ + "type": "record", + "name": "Test", + "fields":[ + {"name": "f1","type": "long","extra field1": "1","extra field2": "2"} + ] + })" +}; const char *basicSchemaErrors[] = { // Record @@ -121,30 +188,33 @@ const char *basicSchemaErrors[] = { R"({"type":"record","name":"LongList", "fields": "hi"})", // Undefined name - "{\"type\":\"record\",\"name\":\"LongList\"," - "\"fields\":[{\"name\":\"value\",\"type\":\"long\"}," - "{\"name\":\"next\",\"type\":[\"LongListA\",\"null\"]}]}", + R"({ + "type":"record", + "name":"LongList", + "fields":[ + {"name":"value","type":"long"}, + {"name":"next","type":["LongListA","null"]} + ] + })", // Enum // Symbols not an array - "{\"type\": \"enum\", \"name\": \"Status\", \"symbols\": " - "\"Normal Caution Critical\"}", + R"({"type": "enum", "name": "Status", "symbols":"Normal Caution Critical"})", // Name not a string - "{\"type\": \"enum\", \"name\": [ 0, 1, 1, 2, 3, 5, 8 ], " - "\"symbols\": [\"Golden\", \"Mean\"]}", + R"({"type": "enum", "name": [ 0, 1, 1, 2, 3, 5, 8 ], "symbols": ["Golden", "Mean"]})", // No name - "{\"type\": \"enum\", \"symbols\" : [\"I\", \"will\", " - "\"fail\", \"no\", \"name\"]}", + R"({"type": "enum", "symbols" : ["I", "will", "fail", "no", "name"]})", // Duplicate symbol - "{\"type\": \"enum\", \"name\": \"Test\"," - "\"symbols\" : [\"AA\", \"AA\"]}", + R"({"type": "enum", "name": "Test", "symbols" : ["AA", "AA"]})", // Union // Duplicate type R"(["string", "long", "long"])", // Duplicate type - "[{\"type\": \"array\", \"items\": \"long\"}, " - "{\"type\": \"array\", \"items\": \"string\"}]", + R"([ + {"type": "array", "items": "long"}, + {"type": "array", "items": "string"} + ])", // Fixed // No size @@ -161,50 +231,85 @@ const char *basicSchemaErrors[] = { }; const char *roundTripSchemas[] = { - "\"null\"", - "\"boolean\"", - "\"int\"", - "\"long\"", - "\"float\"", - "\"double\"", - "\"bytes\"", - "\"string\"", + R"("null")", + R"("boolean")", + R"("int")", + R"("long")", + R"("float")", + R"("double")", + R"("bytes")", + R"("string")", + // Record R"({"type":"record","name":"Test","fields":[]})", - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f\",\"type\":\"long\"}]}", - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f1\",\"type\":\"long\"}," - "{\"name\":\"f2\",\"type\":\"int\"}]}", + R"({ + "type":"record", + "name":"Test", + "fields":[ + {"name":"f","type":"long"} + ] + })", + R"({ + "type":"record", + "name":"Test", + "fields":[ + {"name":"f1","type":"long"}, + {"name":"f2","type":"int"} + ] + })", + /* Avro-C++ cannot do a round-trip on error schemas. - * "{\"type\":\"error\",\"name\":\"Test\",\"fields\":" - * "[{\"name\":\"f1\",\"type\":\"long\"}," - * "{\"name\":\"f2\",\"type\":\"int\"}]}" - */ + * R"({ + * "type":"error", + * "name":"Test", + * "fields":[ + * {"name":"f1","type":"long"}, + * {"name":"f2","type":"int"} + * ] + * })", + */ + // Recursive. - "{\"type\":\"record\",\"name\":\"LongList\"," - "\"fields\":[{\"name\":\"value\",\"type\":\"long\"}," - "{\"name\":\"next\",\"type\":[\"LongList\",\"null\"]}]}", + R"({ + "type":"record", + "name":"LongList", + "fields":[ + {"name":"value","type":"long"}, + {"name":"next","type":["LongList","null"]} + ] + })", + // Enum R"({"type":"enum","name":"Test","symbols":["A","B"]})", // Array R"({"type":"array","items":"long"})", - "{\"type\":\"array\",\"items\":{\"type\":\"enum\"," - "\"name\":\"Test\",\"symbols\":[\"A\",\"B\"]}}", + R"({ + "type":"array", + "items":{ + "type":"enum", + "name":"Test", + "symbols":["A","B"] + } + })", // Map R"({"type":"map","values":"long"})", - "{\"type\":\"map\",\"values\":{\"type\":\"enum\"," - "\"name\":\"Test\",\"symbols\":[\"A\",\"B\"]}}", + R"({ + "type":"map", + "values":{ + "type":"enum", + "name":"Test", + "symbols":["A","B"] + } + })", // Union R"(["string","null","long"])", // Fixed R"({"type":"fixed","name":"Test","size":1})", - "{\"type\":\"fixed\",\"namespace\":\"org.apache.hadoop.avro\"," - "\"name\":\"MyFixed\",\"size\":1}", + R"({"type":"fixed","namespace":"org.apache.hadoop.avro","name":"MyFixed","size":1})", R"({"type":"fixed","name":"Test","size":1})", R"({"type":"fixed","name":"Test","size":1})", @@ -225,17 +330,32 @@ const char *roundTripSchemas[] = { R"({"type":"string","logicalType":"uuid"})", // namespace with '$' in it. - "{\"type\":\"record\",\"namespace\":\"a.b$\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f\",\"type\":\"long\"}]}", + R"({ + "type":"record", + "namespace":"a.b$", + "name":"Test", + "fields":[ + {"name":"f","type":"long"} + ] + })", // Custom fields - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f1\",\"type\":\"long\",\"extra_field\":\"1\"}," - "{\"name\":\"f2\",\"type\":\"int\"}]}", - "{\"type\":\"record\",\"name\":\"Test\",\"fields\":" - "[{\"name\":\"f1\",\"type\":\"long\",\"extra_field\":\"1\"}," - "{\"name\":\"f2\",\"type\":\"int\"," - "\"extra_field1\":\"21\",\"extra_field2\":\"22\"}]}", + R"({ + "type":"record", + "name":"Test", + "fields":[ + {"name":"f1","type":"long","extra_field":"1"}, + {"name":"f2","type":"int"} + ] + })", + R"({ + "type":"record", + "name":"Test", + "fields":[ + {"name":"f1","type":"long","extra_field":"1"}, + {"name":"f2","type":"int","extra_field1":"21","extra_field2":"22"} + ] + })", R"({"type":"array","items":"long","extra":"1"})" }; @@ -259,7 +379,9 @@ const char *malformedLogicalTypes[] = { R"({"type":"fixed","logicalType":"decimal","size":4,"name":"a","precision":20})", R"({"type":"fixed","logicalType":"decimal","size":129,"name":"a","precision":311})", // Scale is larger than precision. - R"({"type":"bytes","logicalType":"decimal","precision":5,"scale":10})"}; + R"({"type":"bytes","logicalType":"decimal","precision":5,"scale":10})" +}; + const char *schemasToCompact[] = { // Schema without any whitespace R"({"type":"record","name":"Test","fields":[]})", @@ -285,7 +407,18 @@ const char *compactSchemas[] = { "\"fields\":[" "{\"name\":\"re1\",\"type\":\"long\",\"doc\":\"A \\\"quoted doc\\\"\"}," "{\"name\":\"re2\",\"type\":\"long\",\"doc\":\"extra slashes\\\\\\\\\"}" - "]}"}; + "]}" +}; + +static const std::vector whitespaces = {' ', '\f', '\n', '\r', '\t', '\v'}; + +static std::string removeWhitespaceFromSchema(const std::string& schema){ + std::string trimmedSchema = schema; + for (char toReplace : whitespaces){ + boost::algorithm::replace_all(trimmedSchema, std::string{toReplace}, ""); + } + return trimmedSchema; +} void testTypes() { BOOST_CHECK_EQUAL(isAvroType(AVRO_BOOL), true); @@ -314,13 +447,13 @@ static void testRoundTrip(const char *schema) { compileJsonSchemaFromString(std::string(schema)); std::ostringstream os; compiledSchema.toJson(os); - std::string result = os.str(); - result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end()); // Remove whitespace - BOOST_CHECK_EQUAL(result, std::string(schema)); + std::string result = removeWhitespaceFromSchema(os.str()); + std::string trimmedSchema = removeWhitespaceFromSchema(schema); + BOOST_CHECK_EQUAL(result, trimmedSchema); // Verify that the compact schema from toJson has the same content as the // schema. std::string result2 = compiledSchema.toJson(false); - BOOST_CHECK_EQUAL(result2, std::string(schema)); + BOOST_CHECK_EQUAL(result2, trimmedSchema); } static void testCompactSchemas() { @@ -336,61 +469,33 @@ static void testCompactSchemas() { } static void testLogicalTypes() { - const char *bytesDecimalType = "{\n\ - \"type\": \"bytes\",\n\ - \"logicalType\": \"decimal\",\n\ - \"precision\": 10,\n\ - \"scale\": 2\n\ - }"; - const char *fixedDecimalType = "{\n\ - \"type\": \"fixed\",\n\ - \"size\": 16,\n\ - \"name\": \"fixedDecimalType\",\n\ - \"logicalType\": \"decimal\",\n\ - \"precision\": 12,\n\ - \"scale\": 6\n\ - }"; - const char *dateType = "{\n\ - \"type\": \"int\", \"logicalType\": \"date\"\n\ - }"; - const char *timeMillisType = "{\n\ - \"type\": \"int\", \"logicalType\": \"time-millis\"\n\ - }"; - const char *timeMicrosType = "{\n\ - \"type\": \"long\", \"logicalType\": \"time-micros\"\n\ - }"; - const char *timestampMillisType = "{\n\ - \"type\": \"long\", \"logicalType\": \"timestamp-millis\"\n\ - }"; - const char *timestampMicrosType = "{\n\ - \"type\": \"long\", \"logicalType\": \"timestamp-micros\"\n\ - }"; - const char *timestampNanosType = "{\n\ - \"type\": \"long\", \"logicalType\": \"timestamp-nanos\"\n\ - }"; - const char *localTimestampMillisType = "{\n\ - \"type\": \"long\", \"logicalType\": \"local-timestamp-millis\"\n\ - }"; - const char *localTimestampMicrosType = "{\n\ - \"type\": \"long\", \"logicalType\": \"local-timestamp-micros\"\n\ - }"; - const char *localTimestampNanosType = "{\n\ - \"type\": \"long\", \"logicalType\": \"local-timestamp-nanos\"\n\ - }"; - const char *durationType = "{\n\ - \"type\": \"fixed\",\n\ - \"size\": 12,\n\ - \"name\": \"durationType\",\n\ - \"logicalType\": \"duration\"\n\ - }"; - const char *uuidType = "{\n\ - \"type\": \"string\",\n\ - \"logicalType\": \"uuid\"\n\ - }"; + const char *bytesDecimalType = R"({ + "type": "bytes", + "logicalType": "decimal", + "precision": 10, + "scale": 2 + })"; + const char *fixedDecimalType = R"({ + "type": "fixed", + "size": 16, + "name": "fixedDecimalType", + "logicalType": "decimal", + "precision": 12, + "scale": 6 + })"; + const char *dateType = R"({"type": "int", "logicalType": "date"})"; + const char *timeMillisType = R"({"type": "int", "logicalType": "time-millis"})"; + const char *timeMicrosType = R"({"type": "long", "logicalType": "time-micros"})"; + const char *timestampMillisType = R"({"type": "long", "logicalType": "timestamp-millis"})"; + const char *timestampMicrosType = R"({"type": "long", "logicalType": "timestamp-micros"})"; + const char *timestampNanosType = R"({"type": "long", "logicalType": "timestamp-nanos"})"; + const char *localTimestampMillisType = R"({"type": "long", "logicalType": "local-timestamp-millis"})"; + const char *localTimestampMicrosType = R"({"type": "long", "logicalType": "local-timestamp-micros"})"; + const char *localTimestampNanosType = R"({"type": "long", "logicalType": "local-timestamp-nanos"})"; + const char *durationType = R"({"type": "fixed","size": 12,"name": "durationType","logicalType": "duration"})"; + const char *uuidType = R"({"type": "string","logicalType": "uuid"})"; // AVRO-2923 Union with LogicalType - const char *unionType = "[\n\ - {\"type\":\"string\", \"logicalType\":\"uuid\"},\"null\"\n\ - ]"; + const char *unionType = R"([{"type":"string", "logicalType":"uuid"},"null"]})"; { BOOST_TEST_CHECKPOINT(bytesDecimalType); ValidSchema schema1 = compileJsonSchemaFromString(bytesDecimalType); diff --git a/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java b/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java index 9238fd78c65..6de9ebb22c5 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java +++ b/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java @@ -158,6 +158,10 @@ public boolean equals(Object o) { Utf8 that = (Utf8) o; if (!(this.length == that.length)) return false; + // For longer strings, leverage vectorization (JDK 9+) to determine equality + // For shorter strings, the overhead of this method defeats the value + if (this.length > 7) + return Arrays.equals(this.bytes, 0, this.length, that.bytes, 0, that.length); byte[] thatBytes = that.bytes; for (int i = 0; i < this.length; i++) if (bytes[i] != thatBytes[i]) diff --git a/lang/rust/Cargo.lock b/lang/rust/Cargo.lock index e5e55c0165f..97d5772fb8f 100644 --- a/lang/rust/Cargo.lock +++ b/lang/rust/Cargo.lock @@ -64,9 +64,9 @@ checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anyhow" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "apache-avro" @@ -935,9 +935,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -1682,9 +1682,9 @@ dependencies = [ [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" diff --git a/lang/rust/avro/Cargo.toml b/lang/rust/avro/Cargo.toml index 0d018c81a0e..7043f622870 100644 --- a/lang/rust/avro/Cargo.toml +++ b/lang/rust/avro/Cargo.toml @@ -83,12 +83,12 @@ quad-rand = { default-features = false, version = "0.2.2" } rand = { default-features = false, version = "0.8.5", features = ["default"] } [dev-dependencies] -anyhow = { default-features = false, version = "1.0.88", features = ["std"] } +anyhow = { default-features = false, version = "1.0.89", features = ["std"] } apache-avro-test-helper = { default-features = false, version = "0.18.0", path = "../avro_test_helper" } criterion = { default-features = false, version = "0.5.1" } hex-literal = { default-features = false, version = "0.4.1" } md-5 = { default-features = false, version = "0.10.6" } -pretty_assertions = { default-features = false, version = "1.4.0", features = ["std"] } +pretty_assertions = { default-features = false, version = "1.4.1", features = ["std"] } serial_test = "3.1.1" sha2 = { default-features = false, version = "0.10.8" } paste = { default-features = false, version = "1.0.15" } diff --git a/lang/rust/avro_test_helper/Cargo.toml b/lang/rust/avro_test_helper/Cargo.toml index 171318ec9d0..4bb01603ea8 100644 --- a/lang/rust/avro_test_helper/Cargo.toml +++ b/lang/rust/avro_test_helper/Cargo.toml @@ -31,7 +31,7 @@ readme = "README.md" [dependencies] -anyhow = { default-features = false, version = "1.0.88", features = ["std"] } +anyhow = { default-features = false, version = "1.0.89", features = ["std"] } better-panic = { default-features = false, version = "0.3.0" } ctor = { default-features = false, version = "0.2.8" } env_logger = { default-features = false, version = "0.11.5" }