X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=t%2Funit%2Ffrontend%2Fparser_test.c;h=3ca27ba19ffb47ec637575469b398c7d85d10961;hb=b9bc76b71c4e4e1174ba1a8af3e13d53840b7e16;hp=cb3a2ad7d48b56ef2b15b77a75e7f37a5e5581ea;hpb=cf17313d62dcf1c10df0fe19287e354ede68206b;p=sysdb.git diff --git a/t/unit/frontend/parser_test.c b/t/unit/frontend/parser_test.c index cb3a2ad..3ca27ba 100644 --- a/t/unit/frontend/parser_test.c +++ b/t/unit/frontend/parser_test.c @@ -58,24 +58,86 @@ START_TEST(test_parse) { "LIST;", -1, 1, CONNECTION_LIST }, { "LIST; INVALID", 5, 1, CONNECTION_LIST }, - { "LOOKUP hosts WHERE " - "host.name = 'host'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " - "host.name = 'host'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " - "host.name =~ 'p' AND " - "service.name =~ 'p'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " - "host.name =~ 'p' AND " - "service.name =~ 'p'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE " - "host.name =~ 'p' AND " - "service.name =~ 'p' OR " - "service.name =~ 'r'", -1, 1, CONNECTION_LOOKUP }, - { "LOOKUP hosts WHERE NOT " - "host.name =~ 'p' AND " - "service.name =~ 'p' OR " - "service.name =~ 'r'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host = 'host'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING NOT " + "host = 'host'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host =~ 'p' AND " + "service =~ 'p'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING NOT " + "host =~ 'p' AND " + "service =~ 'p'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host =~ 'p' AND " + "service =~ 'p' OR " + "service =~ 'r'", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING NOT " + "host =~ 'p' AND " + "service =~ 'p' OR " + "service =~ 'r'", -1, 1, CONNECTION_LOOKUP }, + + /* numeric constants */ + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "1234", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo != " + "+234", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo < " + "-234", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo > " + "12.4", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo <= " + "12.", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo >= " + ".4", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "+12e3", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "+12e-3", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "-12e+3", -1, 1, CONNECTION_LOOKUP }, + + /* NULL */ + { "LOOKUP hosts MATCHING " + "attribute.foo " + "IS NULL", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "attribute.foo " + "IS NOT NULL", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "NOT attribute.foo " + "IS NULL", -1, 1, CONNECTION_LOOKUP }, + { "LOOKUP hosts MATCHING " + "host IS NULL", -1, -1, 0 }, + { "LOOKUP hosts MATCHING " + "service IS NULL", -1, -1, 0 }, + + /* invalid numeric constants */ + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "+-12e+3", -1, -1, 0 }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "-12e-+3", -1, -1, 0 }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "e+3", -1, -1, 0 }, + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "3e", -1, -1, 0 }, + /* following SQL standard, we don't support hex numbers */ + { "LOOKUP hosts MATCHING " + "attribute.foo = " + "0x12", -1, -1, 0 }, /* comments */ { "/* some comment */", -1, 0, 0 }, @@ -88,8 +150,8 @@ START_TEST(test_parse) { "/* some incomplete", -1, -1, 0 }, { "LOOKUP hosts", -1, -1, 0 }, - { "LOOKUP foo WHERE " - "host.name = 'host'", -1, -1, 0 }, + { "LOOKUP foo MATCHING " + "host = 'host'", -1, -1, 0 }, }; size_t i; @@ -137,60 +199,70 @@ START_TEST(test_parse_matcher) int expected; } golden_data[] = { /* empty expressions */ - { NULL, -1, -1 }, - { "", -1, -1 }, + { NULL, -1, -1 }, + { "", -1, -1 }, /* valid expressions */ - { "host.name = 'localhost'", -1, MATCHER_HOST }, - { "host.name != 'localhost'", -1, MATCHER_NOT }, - { "host.name =~ 'host'", -1, MATCHER_HOST }, - { "host.name !~ 'host'", -1, MATCHER_NOT }, - { "host.name = 'localhost' -- foo", -1, MATCHER_HOST }, - { "host.name = 'host' ", 18, MATCHER_HOST }, + { "host = 'localhost'", -1, MATCHER_NAME }, + { "host != 'localhost'", -1, MATCHER_NOT }, + { "host =~ 'host'", -1, MATCHER_NAME }, + { "host !~ 'host'", -1, MATCHER_NOT }, + { "host = 'localhost' -- foo", -1, MATCHER_NAME }, + { "host = 'host' ", 13, MATCHER_NAME }, /* match hosts by service */ - { "service.name = 'name'", -1, MATCHER_HOST }, - { "service.name != 'name'", -1, MATCHER_NOT }, - { "service.name =~ 'pattern'", -1, MATCHER_HOST }, - { "service.name !~ 'pattern'", -1, MATCHER_NOT }, + { "service = 'name'", -1, MATCHER_NAME }, + { "service != 'name'", -1, MATCHER_NOT }, + { "service =~ 'pattern'", -1, MATCHER_NAME }, + { "service !~ 'pattern'", -1, MATCHER_NOT }, /* match hosts by attribute */ - { "attribute.name = 'name'", -1, MATCHER_HOST }, - { "attribute.name != 'name'", -1, MATCHER_NOT }, - { "attribute.name =~ 'pattern'", -1, MATCHER_HOST }, - { "attribute.name !~ 'pattern'", -1, MATCHER_NOT }, + { "attribute = 'name'", -1, MATCHER_NAME }, + { "attribute != 'name'", -1, MATCHER_NOT }, + { "attribute =~ 'pattern'", -1, MATCHER_NAME }, + { "attribute !~ 'pattern'", -1, MATCHER_NOT }, /* composite expressions */ - { "host.name =~ 'pattern' AND " - "service.name =~ 'pattern'", -1, MATCHER_AND }, - { "host.name =~ 'pattern' OR " - "service.name =~ 'pattern'", -1, MATCHER_OR }, - { "NOT host.name = 'host'", -1, MATCHER_NOT }, + { "host =~ 'pattern' AND " + "service =~ 'pattern'", -1, MATCHER_AND }, + { "host =~ 'pattern' OR " + "service =~ 'pattern'", -1, MATCHER_OR }, + { "NOT host = 'host'", -1, MATCHER_NOT }, + /* numeric expressions */ + { "attribute.foo < 123", -1, MATCHER_LT }, + { "attribute.foo <= 123", -1, MATCHER_LE }, + { "attribute.foo = 123", -1, MATCHER_EQ }, + { "attribute.foo >= 123", -1, MATCHER_GE }, + { "attribute.foo > 123", -1, MATCHER_GT }, + /* NULL; while this is an implementation detail, + * IS NULL currently maps to an equality matcher */ + { "attribute.foo IS NULL", -1, MATCHER_ISNULL }, + { "attribute.foo IS NOT NULL", -1, MATCHER_NOT }, /* check operator precedence */ - { "host.name = 'name' OR " - "service.name = 'name' AND " - "attribute.name = 'name' OR " - "attribute.foo = 'bar'", -1, MATCHER_OR }, - { "host.name = 'name' AND " - "service.name = 'name' AND " - "attribute.name = 'name' OR " - "attribute.foo = 'bar'", -1, MATCHER_OR }, - { "host.name = 'name' AND " - "service.name = 'name' OR " - "attribute.name = 'name' AND " - "attribute.foo = 'bar'", -1, MATCHER_OR }, - { "(host.name = 'name' OR " - "service.name = 'name') AND " - "(attribute.name = 'name' OR " - "attribute.foo = 'bar')", -1, MATCHER_AND }, - { "NOT host.name = 'name' OR " - "service.name = 'name'", -1, MATCHER_OR }, - { "NOT host.name = 'name' OR " - "NOT service.name = 'name'", -1, MATCHER_OR }, - { "NOT (host.name = 'name' OR " - "NOT service.name = 'name')", -1, MATCHER_NOT }, + { "host = 'name' OR " + "service = 'name' AND " + "attribute = 'name' OR " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "host = 'name' AND " + "service = 'name' AND " + "attribute = 'name' OR " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "host = 'name' AND " + "service = 'name' OR " + "attribute = 'name' AND " + "attribute.foo = 'bar'", -1, MATCHER_OR }, + { "(host = 'name' OR " + "service = 'name') AND " + "(attribute = 'name' OR " + "attribute.foo = 'bar')", -1, MATCHER_AND }, + { "NOT host = 'name' OR " + "service = 'name'", -1, MATCHER_OR }, + { "NOT host = 'name' OR " + "NOT service = 'name'", -1, MATCHER_OR }, + { "NOT (host = 'name' OR " + "NOT service = 'name')", -1, MATCHER_NOT }, /* syntax errors */ - { "LIST", -1, -1 }, - { "foo &^ bar", -1, -1 }, + { "LIST", -1, -1 }, + { "foo &^ bar", -1, -1 }, }; size_t i;