CREATE TABLE test ( ts timestamp(3) time index, host STRING, idc STRING, val BIGINT, PRIMARY KEY(host, idc), ); Affected Rows: 0 INSERT INTO TABLE test VALUES (0, 'host1', 'idc1', 1), (0, 'host2', 'idc1', 2), (5000, 'host1', 'idc2:zone1',3), (5000, 'host2', 'idc2',4), (10000, 'host1', 'idc3:zone2',5), (10000, 'host2', 'idc3',6), (15000, 'host1', 'idc4:zone3',7), (15000, 'host2', 'idc4',8); Affected Rows: 8 -- Missing source labels -- TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "new_host", "-"); Error: 1004(InvalidArguments), Invalid function argument for label_join -- dst_label is equal to source label -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "host", "-", "host"); +---------------------+-----+-------+------------+ | ts | val | host | idc | +---------------------+-----+-------+------------+ | 1970-01-01T00:00:00 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | host1 | idc4:zone3 | +---------------------+-----+-------+------------+ -- dst_label is in source labels -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "host", "-", "idc", "host"); +---------------------+-----+------------------+------------+ | ts | val | host | idc | +---------------------+-----+------------------+------------+ | 1970-01-01T00:00:00 | 1 | idc1-host1 | idc1 | | 1970-01-01T00:00:05 | 1 | idc1-host1 | idc1 | | 1970-01-01T00:00:05 | 3 | idc2:zone1-host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | idc1-host1 | idc1 | | 1970-01-01T00:00:10 | 3 | idc2:zone1-host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | idc3:zone2-host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | idc1-host1 | idc1 | | 1970-01-01T00:00:15 | 3 | idc2:zone1-host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | idc3:zone2-host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | idc4:zone3-host1 | idc4:zone3 | +---------------------+-----+------------------+------------+ -- test the empty source label -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "host", "-", ""); +---------------------+-----+------+------------+ | ts | val | host | idc | +---------------------+-----+------+------------+ | 1970-01-01T00:00:00 | 1 | | idc1 | | 1970-01-01T00:00:05 | 1 | | idc1 | | 1970-01-01T00:00:05 | 3 | | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | | idc1 | | 1970-01-01T00:00:10 | 3 | | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | | idc1 | | 1970-01-01T00:00:15 | 3 | | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | | idc4:zone3 | +---------------------+-----+------+------------+ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "new_host", "-", "idc", "host"); +---------------------+-----+------------------+-------+------------+ | ts | val | new_host | host | idc | +---------------------+-----+------------------+-------+------------+ | 1970-01-01T00:00:00 | 1 | idc1-host1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | idc1-host1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | idc1-host1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | idc3:zone2-host1 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | idc1-host1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | idc3:zone2-host1 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | idc4:zone3-host1 | host1 | idc4:zone3 | +---------------------+-----+------------------+-------+------------+ -- Should return empty result instead of error tql eval label_join(demo_num_cpus, "new_label", "-", "instance", "job"); ++ ++ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host1"}, "new_idc", "$2", "idc", "(.*):(.*)"); +---------------------+-----+---------+-------+------------+ | ts | val | new_idc | host | idc | +---------------------+-----+---------+-------+------------+ | 1970-01-01T00:00:00 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | zone1 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | zone1 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | zone2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | zone1 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | zone2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | zone3 | host1 | idc4:zone3 | +---------------------+-----+---------+-------+------------+ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host1"}, "new_idc", "idc99", "idc", "idc2.*"); +---------------------+-----+------------+-------+------------+ | ts | val | new_idc | host | idc | +---------------------+-----+------------+-------+------------+ | 1970-01-01T00:00:00 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | idc99 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | idc99 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | idc3:zone2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | idc99 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | idc3:zone2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | idc4:zone3 | host1 | idc4:zone3 | +---------------------+-----+------------+-------+------------+ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host2"}, "new_idc", "$2", "idc", "(.*):(.*)"); +---------------------+-----+---------+-------+------+ | ts | val | new_idc | host | idc | +---------------------+-----+---------+-------+------+ | 1970-01-01T00:00:00 | 2 | idc1 | host2 | idc1 | | 1970-01-01T00:00:05 | 2 | idc1 | host2 | idc1 | | 1970-01-01T00:00:05 | 4 | idc2 | host2 | idc2 | | 1970-01-01T00:00:10 | 2 | idc1 | host2 | idc1 | | 1970-01-01T00:00:10 | 4 | idc2 | host2 | idc2 | | 1970-01-01T00:00:10 | 6 | idc3 | host2 | idc3 | | 1970-01-01T00:00:15 | 2 | idc1 | host2 | idc1 | | 1970-01-01T00:00:15 | 4 | idc2 | host2 | idc2 | | 1970-01-01T00:00:15 | 6 | idc3 | host2 | idc3 | | 1970-01-01T00:00:15 | 8 | idc4 | host2 | idc4 | +---------------------+-----+---------+-------+------+ -- dst_label is equal to source label -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host2"}, "idc", "$2", "idc", "(.*):(.*)"); Error: 1004(InvalidArguments), vector cannot contain metrics with the same labelset -- test the empty source label -- -- TODO(dennis): we can't remove the label currently -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host2"}, "idc2", "", "", ""); +---------------------+-----+-------+------+ | ts | val | host | idc | +---------------------+-----+-------+------+ | 1970-01-01T00:00:00 | 2 | host2 | idc1 | | 1970-01-01T00:00:05 | 2 | host2 | idc1 | | 1970-01-01T00:00:05 | 4 | host2 | idc2 | | 1970-01-01T00:00:10 | 2 | host2 | idc1 | | 1970-01-01T00:00:10 | 4 | host2 | idc2 | | 1970-01-01T00:00:10 | 6 | host2 | idc3 | | 1970-01-01T00:00:15 | 2 | host2 | idc1 | | 1970-01-01T00:00:15 | 4 | host2 | idc2 | | 1970-01-01T00:00:15 | 6 | host2 | idc3 | | 1970-01-01T00:00:15 | 8 | host2 | idc4 | +---------------------+-----+-------+------+ -- Issue 5726 -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') label_replace(vector(1), "host", "host1", "", ""); +---------------------+----------------+-------+ | time | greptime_value | host | +---------------------+----------------+-------+ | 1970-01-01T00:00:00 | 1.0 | host1 | | 1970-01-01T00:00:05 | 1.0 | host1 | | 1970-01-01T00:00:10 | 1.0 | host1 | | 1970-01-01T00:00:15 | 1.0 | host1 | +---------------------+----------------+-------+ -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') {__name__="test",host="host1"} * label_replace(vector(1), "host", "host1", "", ""); ++ ++ -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') {__name__="test",host="host1"} + label_replace(vector(1), "host", "host1", "", ""); ++ ++ -- Empty regex with existing source label -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') label_replace(test{host="host1"}, "host2", "host2", "host", ""); +---------------------+-----+-------+------------+ | ts | val | host | idc | +---------------------+-----+-------+------------+ | 1970-01-01T00:00:00 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | host1 | idc4:zone3 | +---------------------+-----+-------+------------+ -- Empty regex with not existing source label -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') label_replace(test{host="host1"}, "host2", "host2", "instance", ""); +---------------------+-----+-------+-------+------------+ | ts | val | host2 | host | idc | +---------------------+-----+-------+-------+------------+ | 1970-01-01T00:00:00 | 1 | host2 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | host2 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | host2 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | host2 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | host2 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | host2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | host2 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | host2 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | host2 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | host2 | host1 | idc4:zone3 | +---------------------+-----+-------+-------+------------+ -- Empty regex with not existing source label, but replacement is empty -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') label_replace(test{host="host1"}, "host2", "", "instance", ""); +---------------------+-----+-------+------------+ | ts | val | host | idc | +---------------------+-----+-------+------------+ | 1970-01-01T00:00:00 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | host1 | idc1 | | 1970-01-01T00:00:05 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 1 | host1 | idc1 | | 1970-01-01T00:00:10 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 1 | host1 | idc1 | | 1970-01-01T00:00:15 | 3 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 5 | host1 | idc3:zone2 | | 1970-01-01T00:00:15 | 7 | host1 | idc4:zone3 | +---------------------+-----+-------+------------+ -- Empty regex and different label value -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') {__name__="test",host="host1"} * label_replace(vector(1), "host", "host2", "host", ""); ++ ++ -- Empty regex and not existing label in left expression -- SQLNESS SORT_RESULT 3 1 TQL EVAL(0, 15, '5s') {__name__="test",host="host1"} * label_replace(vector(1), "addr", "host1", "instance", ""); ++ ++ TQL EVAL label_replace(demo_num_cpus, "~invalid", "", "src", "(.*)"); Error: 1004(InvalidArguments), Invalid destination label name in label_replace(): ~invalid TQL EVAL label_replace(demo_num_cpus, "job", "value", "src", "(.*"); Error: 1004(InvalidArguments), Invalid regular expression in label_replace(): (.* -- Issue 6438 -- -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_replace(test{host="host1"}, "new_idc", "idc99", "idc", "idc2.*") == 1.0; +---------------------+-----+---------+-------+------+ | ts | val | new_idc | host | idc | +---------------------+-----+---------+-------+------+ | 1970-01-01T00:00:00 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:05 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:10 | 1 | idc1 | host1 | idc1 | | 1970-01-01T00:00:15 | 1 | idc1 | host1 | idc1 | +---------------------+-----+---------+-------+------+ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 15, '5s') label_join(test{host="host1"}, "new_host", "-", "idc", "host") == 3; +---------------------+-----+------------------+-------+------------+ | ts | val | new_host | host | idc | +---------------------+-----+------------------+-------+------------+ | 1970-01-01T00:00:05 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | | 1970-01-01T00:00:10 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | | 1970-01-01T00:00:15 | 3 | idc2:zone1-host1 | host1 | idc2:zone1 | +---------------------+-----+------------------+-------+------------+ DROP TABLE test; Affected Rows: 0 CREATE TABLE test ( ts timestamp(3) time index, host STRING, val BIGINT, PRIMARY KEY(host), ); Affected Rows: 0 INSERT INTO TABLE test VALUES (0, 'host1', 1), (0, 'host2', 2); Affected Rows: 2 SELECT * FROM test; +---------------------+-------+-----+ | ts | host | val | +---------------------+-------+-----+ | 1970-01-01T00:00:00 | host1 | 1 | | 1970-01-01T00:00:00 | host2 | 2 | +---------------------+-------+-----+ -- test the non-existent matchers -- TQL EVAL (0, 1, '5s') test{job=~"host1|host3"}; ++ ++ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 1, '5s') test{job=~".*"}; +---------------------+-------+-----+ | ts | host | val | +---------------------+-------+-----+ | 1970-01-01T00:00:00 | host1 | 1 | | 1970-01-01T00:00:00 | host2 | 2 | +---------------------+-------+-----+ TQL EVAL (0, 1, '5s') test{job=~".+"}; ++ ++ -- SQLNESS SORT_RESULT 3 1 TQL EVAL (0, 1, '5s') test{job=""}; +---------------------+-------+-----+ | ts | host | val | +---------------------+-------+-----+ | 1970-01-01T00:00:00 | host1 | 1 | | 1970-01-01T00:00:00 | host2 | 2 | +---------------------+-------+-----+ TQL EVAL (0, 1, '5s') test{job!=""}; ++ ++ DROP TABLE test; Affected Rows: 0