Skip to content

DynamoDB AttributeValue's MarshallMap() Does Not Support time.Time Correctly #2383

Closed
@kmacmcfarlane

Description

Describe the bug

I am seeing that it's not possible to use omitempty on time.Time struct fields with attributevalue.MarshalMap() from github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue.

This behavior was observed on the latest version: github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.12.3

Expected Behavior

When MarshalMap() is supplied with a struct containing a time.Time field with the tag omitempty whos value is the zero value, the output map should not contain a key for that struct field.

Current Behavior

Output attribute value map includes a key and value for the field that should be omitted.

Reproduction Steps

repro_test.go

package service

import (
	"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	"time"
)

var _ = Describe("Serialize Struct", func() {

	Context("Struct with omitempty on a time.Time field", func() {
		It("Does not serialize the field", func() {

			e := struct {
				Created time.Time `dynamodbav:"created,omitempty"`
			}{
				Created: time.Time{},
			}
			av, err := attributevalue.MarshalMap(e)
			Ω(err).ShouldNot(HaveOccurred())

			Ω(av).ShouldNot(HaveKey("created"))
		})
	})
})

service_test_suite.go

package service_test

import (
	"testing"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

func TestService(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "Service Suite")
}

Possible Solution

As far as I've been able to reason by stepping through the repro above in a debugger, there should probably be a check for fieldTag.OmitEmpty in this code block in encode.go (just like the fieldTag.AsUnixTime tag is checked).

if v.Type().ConvertibleTo(timeType) {

Additional Information/Context

No response

AWS Go SDK V2 Module Versions Used

        github.com/aws/aws-lambda-go v1.34.1
        github.com/aws/aws-sdk-go v1.44.128
        github.com/aws/aws-sdk-go-v2 v1.23.1
        github.com/aws/aws-sdk-go-v2/config v1.17.10
        github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.12.3
        github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.35
        github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.3
        github.com/aws/aws-sdk-go-v2/service/sfn v1.19.7
        github.com/aws/aws-xray-sdk-go v1.8.0
        github.com/awslabs/aws-lambda-go-api-proxy v0.13.3
        github.com/aws/aws-sdk-go-v2/credentials v1.12.23 // indirect
        github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 // indirect
        github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 // indirect
        github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 // indirect
        github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 // indirect
        github.com/aws/aws-sdk-go-v2/service/cloudwatchevents v1.9.2 // indirect
        github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.17.3 // indirect
        github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect
        github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.4 // indirect
        github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 // indirect
        github.com/aws/aws-sdk-go-v2/service/kms v1.18.5 // indirect
        github.com/aws/aws-sdk-go-v2/service/sns v1.20.1 // indirect
        github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 // indirect
        github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 // indirect
        github.com/aws/aws-sdk-go-v2/service/sts v1.17.1 // indirect
        github.com/aws/smithy-go v1.17.0 // indirect

Compiler and Version used

go version go1.20.6 linux/amd64

Operating System and version

Fedora Linux 37

Metadata

Assignees

Labels

feature-requestA feature should be added or improved.feature/dynamodb/attributevaluePertains to dynamodb attributevalue marshaler HLL (feature/dynamodb/attributevalue).p3This is a minor priority issuequeuedThis issues is on the AWS team's backlog

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions