-
Notifications
You must be signed in to change notification settings - Fork 654
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature/dynamodb/attributevalue: Inconsistent struct field name marshaled #1569
Comments
Thanks for clarifying the behavior and the situation that you're running into @moogacs. The concurrency example was very helpful in demonstrating this issue. I have a hunch this bug is attributed to the attribute value marshaler field caching of a struct field. This cache is a sync map of the parsed struct fields for the first usage of structs with the DDB attribute value (un)marshalers. The DDB We'll be investigating the best way to fix this. There are two parts that need to be investigated in order to fix this issue I think. type fieldCacheKey struct{
typ reflect.Type
opts structFieldOptions
} |
This will potentially be an issue with the v1 SDK as well. |
Updates the `attributevalue` and `expression` package's handling of AttributeValue marshaling fixing several bugs in the packages. * Fixes aws#1569 `Inconsistent struct field name marshaled`. Fields will now be consistent with the EncoderOptions or DecoderOptions the Go struct was used with. Previously the Go struct fields would be cached with the first options used for the type. Causes subsequent usages to have the wrong field names if the encoding options used different TagKeys. * Fixes aws#645, aws#411 `Support more than string types for map keys`. Updates (un)marshaler to support number, bool, and types that implement encoding.Text(Un)Marshaler interfaces. * Fixes Support for expression Names with literal dots in name. Adds new function NameNoDotSplit to expression package. This function allows you to provide a literal expression Name containing dots. Also adds a new method to NameBuilder, AppendName, for joining multiple name path components together. Helpful for joining names with literal dots with subsequent object path fields. * Fixes bug with AttributeValue marshaler struct struct tag usage that caused TagKey to be ignored if the member had a struct tag with `dynamodbav` struct tag. Now both tags will be read as documented, with the TagKey struct tag options taking precedence.
Updates the `attributevalue` and `expression` package's handling of AttributeValue marshaling fixing several bugs in the packages. * Fixes #1569 `Inconsistent struct field name marshaled`. Fields will now be consistent with the EncoderOptions or DecoderOptions the Go struct was used with. Previously the Go struct fields would be cached with the first options used for the type. Causes subsequent usages to have the wrong field names if the encoding options used different TagKeys. * Fixes #645, #411 `Support more than string types for map keys`. Updates (un)marshaler to support number, bool, and types that implement encoding.Text(Un)Marshaler interfaces. * Fixes Support for expression Names with literal dots in name. Adds new function NameNoDotSplit to expression package. This function allows you to provide a literal expression Name containing dots. Also adds a new method to NameBuilder, AppendName, for joining multiple name path components together. Helpful for joining names with literal dots with subsequent object path fields. * Fixes bug with AttributeValue marshaler struct struct tag usage that caused TagKey to be ignored if the member had a struct tag with `dynamodbav` struct tag. Now both tags will be read as documented, with the TagKey struct tag options taking precedence.
|
The DynamoDB's
attributevalue
module's caching of a struct type's resolvedreflect.Type
values and field names based on struct tags does not consider theTagKey
option when creating the cache entry. This causes theattributevalue
module to cache the first occurrence of a struct type and theTagKey
that type was cached with. If subsequent usages of that struct type are used with the (un)marshalers the original cached version will be used. Even if subsequent usages are configured for differentTagKey
options.The following items posed in #1486 demonstrate this issue.
Originally posted by @moogacs in #1486 (comment)
I have encountered the same bug which
json
tag is not respected when marshalling astruct
and it has inconsistent behaviour that it's sometimes respected and sometimes notOriginally posted by @moogacs in #1486 (comment)
To proof what we are talking about, here a demonstration of different behaviours for the same pkg
case 1 :
IDLE case expected behavior using custom marshaler
https://go.dev/play/p/zoqHVu5tVjN
case 2 :
2 go routines do the same thing but one of them using
custom tag marshaler
and other isnot
and they lead to the same resultshttps://go.dev/play/p/HvpkhgDUl63
case 3 :
simply case 2 without go routines and it seems the custom tag marshaler doesn't work and affected by the other one
https://go.dev/play/p/ruZGAaWAgtx
all what you need to look at the printed keys
Data
andUserID
The text was updated successfully, but these errors were encountered: