diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/internal')
-rw-r--r-- | vendor/github.com/uptrace/bun/internal/tagparser/parser.go | 19 | ||||
-rw-r--r-- | vendor/github.com/uptrace/bun/internal/time.go | 54 |
2 files changed, 56 insertions, 17 deletions
diff --git a/vendor/github.com/uptrace/bun/internal/tagparser/parser.go b/vendor/github.com/uptrace/bun/internal/tagparser/parser.go index 8ef89248c..eb3246536 100644 --- a/vendor/github.com/uptrace/bun/internal/tagparser/parser.go +++ b/vendor/github.com/uptrace/bun/internal/tagparser/parser.go @@ -93,6 +93,8 @@ func (p *parser) parseValue() string { return p.parseQuotedValue() case ',': return p.s[start : p.i-1] + case '(': + p.skipPairs('(', ')') } } @@ -125,6 +127,23 @@ func (p *parser) parseQuotedValue() string { return "" } +func (p *parser) skipPairs(start, end byte) { + var lvl int + for p.valid() { + switch c := p.read(); c { + case '"': + _ = p.parseQuotedValue() + case start: + lvl++ + case end: + if lvl == 0 { + return + } + lvl-- + } + } +} + func (p *parser) valid() bool { return p.i < len(p.s) } diff --git a/vendor/github.com/uptrace/bun/internal/time.go b/vendor/github.com/uptrace/bun/internal/time.go index e4e0804b0..2cb69b46a 100644 --- a/vendor/github.com/uptrace/bun/internal/time.go +++ b/vendor/github.com/uptrace/bun/internal/time.go @@ -8,34 +8,54 @@ import ( const ( dateFormat = "2006-01-02" timeFormat = "15:04:05.999999999" + timetzFormat1 = "15:04:05.999999999-07:00:00" + timetzFormat2 = "15:04:05.999999999-07:00" + timetzFormat3 = "15:04:05.999999999-07" timestampFormat = "2006-01-02 15:04:05.999999999" - timestamptzFormat = "2006-01-02 15:04:05.999999999-07:00:00" + timestamptzFormat1 = "2006-01-02 15:04:05.999999999-07:00:00" timestamptzFormat2 = "2006-01-02 15:04:05.999999999-07:00" timestamptzFormat3 = "2006-01-02 15:04:05.999999999-07" ) func ParseTime(s string) (time.Time, error) { - switch l := len(s); { - case l < len("15:04:05"): - return time.Time{}, fmt.Errorf("bun: can't parse time=%q", s) - case l <= len(timeFormat): - if s[2] == ':' { - return time.ParseInLocation(timeFormat, s, time.UTC) - } - return time.ParseInLocation(dateFormat, s, time.UTC) - default: - if s[10] == 'T' { + l := len(s) + + if l >= len("2006-01-02 15:04:05") { + switch s[10] { + case ' ': + if c := s[l-6]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat2, s) + } + if c := s[l-3]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat3, s) + } + if c := s[l-9]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat1, s) + } + return time.ParseInLocation(timestampFormat, s, time.UTC) + case 'T': return time.Parse(time.RFC3339Nano, s) } - if c := s[l-9]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat, s) - } + } + + if l >= len("15:04:05-07") { if c := s[l-6]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat2, s) + return time.Parse(timetzFormat2, s) } if c := s[l-3]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat3, s) + return time.Parse(timetzFormat3, s) } - return time.ParseInLocation(timestampFormat, s, time.UTC) + if c := s[l-9]; c == '+' || c == '-' { + return time.Parse(timetzFormat1, s) + } + } + + if l < len("15:04:05") { + return time.Time{}, fmt.Errorf("bun: can't parse time=%q", s) + } + + if s[2] == ':' { + return time.ParseInLocation(timeFormat, s, time.UTC) } + return time.ParseInLocation(dateFormat, s, time.UTC) } |