Skip to content

Commit

Permalink
MB-51136 skip system xattrs on fetch
Browse files Browse the repository at this point in the history
Change-Id: I6a8b0f37ede4aaf57e0b3ac945c08fd4a317b38e
Reviewed-on: https://review.couchbase.org/c/query/+/171277
Tested-by: Marco Greco <marco.greco@couchbase.com>
Reviewed-by: Donald Haggart <donald.haggart@couchbase.com>
Reviewed-by: Sitaram Vemulapalli <sitaram.vemulapalli@couchbase.com>
  • Loading branch information
Marco Greco committed Feb 25, 2022
1 parent 2c4d444 commit dd9560d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
3 changes: 2 additions & 1 deletion datastore/couchbase/couchbase.go
Expand Up @@ -1757,7 +1757,8 @@ func getSubDocFetchResults(k string, v *gomemcached.MCResponse, subPaths []strin
// When xattr value not defined for a doc, set missing
tmpVal := value.NewValue(xattrValue)

if xattrError != gomemcached.SUBDOC_PATH_NOT_FOUND {
// MB-51136 skip system xattrs
if xattrError != gomemcached.SUBDOC_PATH_NOT_FOUND && subPaths[i][0] != '_' {
xVal[subPaths[i]] = tmpVal.Actual()
}

Expand Down
19 changes: 15 additions & 4 deletions planner/build_select_from.go
Expand Up @@ -196,11 +196,22 @@ func (this *builder) visitFrom(node *algebra.Subselect, group *algebra.Group,
}

func isValidXattrs(names []string) bool {
if len(names) > 2 {

// MB-51136 disallow system Xattrs
switch len(names) {
case 0:
return true
case 1:
return !strings.HasPrefix(names[0], "_")
case 2:
if strings.HasPrefix(names[0], "_") || strings.HasPrefix(names[1], "_") {
return false
}
return (strings.HasPrefix(names[0], "$") && !strings.HasPrefix(names[1], "$")) ||
(!strings.HasPrefix(names[0], "$") && strings.HasPrefix(names[1], "$"))
default:
return false
}
return len(names) <= 1 || (strings.HasPrefix(names[0], "$") && !strings.HasPrefix(names[1], "$")) ||
(!strings.HasPrefix(names[0], "$") && strings.HasPrefix(names[1], "$"))
}

func (this *builder) collectAliases(node *algebra.Subselect) {
Expand All @@ -220,7 +231,7 @@ func (this *builder) GetSubPaths(keyspace string) (names []string, err error) {
if this.node != nil {
_, names = expression.XattrsNames(this.node.Expressions(), keyspace)
if ok := isValidXattrs(names); !ok {
return nil, errors.NewPlanInternalError("Can only retrieve virtual xattr and user xattr or virtual xattr and system xattr")
return nil, errors.NewPlanInternalError("Can only retrieve virtual xattr and user xattr")
}
if len(names) == 0 {
var exprs expression.Expressions
Expand Down

0 comments on commit dd9560d

Please sign in to comment.