From d4f8bebda089d609460fdd13cc32f4b47612b805 Mon Sep 17 00:00:00 2001 From: Xinyi Rong Date: Thu, 7 Aug 2025 01:46:29 -0700 Subject: [PATCH] Fix label selector parsing for consecutive commas Allow parsing of expressions like 'x in (a,,)' by removing unnecessary token consumption in parseIdentifiersList. Previously, when encountering consecutive commas in selector value lists, the parser would incorrectly consume an extra comma token, causing 'expected identifier' errors. This change removes the p.consume(Values) call on line 851 that was preventing proper handling of empty values in selector lists while maintaining correct comma handling. Added test cases like "x in (a,,)" to verify the fix works correctly. --- .../k8s.io/apimachinery/pkg/labels/selector.go | 1 - .../apimachinery/pkg/labels/selector_test.go | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/labels/selector.go b/staging/src/k8s.io/apimachinery/pkg/labels/selector.go index 067bcac0a0d..e83cdae0e1e 100644 --- a/staging/src/k8s.io/apimachinery/pkg/labels/selector.go +++ b/staging/src/k8s.io/apimachinery/pkg/labels/selector.go @@ -848,7 +848,6 @@ func (p *Parser) parseIdentifiersList() (sets.String, error) { return s, nil } if tok2 == CommaToken { - p.consume(Values) s.Insert("") // to handle ,, Double "" removed by StringSet } default: // it can be operator diff --git a/staging/src/k8s.io/apimachinery/pkg/labels/selector_test.go b/staging/src/k8s.io/apimachinery/pkg/labels/selector_test.go index 91dfd51d56c..abe066154d1 100644 --- a/staging/src/k8s.io/apimachinery/pkg/labels/selector_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/labels/selector_test.go @@ -636,9 +636,24 @@ func TestSetSelectorParser(t *testing.T) { {"x in (abc,)", internalSelector{ getRequirement("x", selection.In, sets.NewString("abc", ""), t), }, true, true}, + {"x in (abc,abc)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("abc"), t), + }, true, true}, {"x in ()", internalSelector{ getRequirement("x", selection.In, sets.NewString(""), t), }, true, true}, + {"x in (a,,)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("a", ""), t), + }, true, true}, + {"x in (a,,,)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("a", ""), t), + }, true, true}, + {"x in (a,,,,,,)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("a", ""), t), + }, true, true}, + {"x in (a,,a,,a,,a,,)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("a", ""), t), + }, true, true}, {"x notin (abc,,def),bar,z in (),w", internalSelector{ getRequirement("bar", selection.Exists, nil, t), getRequirement("w", selection.Exists, nil, t),