diff --git a/datastore/couchbase/couchbase.go b/datastore/couchbase/couchbase.go index f824b22cc..612189cdd 100644 --- a/datastore/couchbase/couchbase.go +++ b/datastore/couchbase/couchbase.go @@ -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() } diff --git a/planner/build_select_from.go b/planner/build_select_from.go index ec6bc8846..ee350a78a 100644 --- a/planner/build_select_from.go +++ b/planner/build_select_from.go @@ -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) { @@ -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