2011/3/15 Robert Haas <robertmh...@gmail.com>: > On Tue, Mar 15, 2011 at 2:19 AM, Pavel Stehule <pavel.steh...@gmail.com> > wrote: >> 2011/3/15 Robert Haas <robertmh...@gmail.com>: >>> On Mon, Mar 14, 2011 at 4:34 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: >>>> Pavel Stehule <pavel.steh...@gmail.com> writes: >>>>> there was a discussion about impact of number of keyword for parser >>>>> speed. I did some synthetic tests and I didn't see any slowness on >>>>> pgbench when I increased a number of keywords. >>>> >>>> I don't see any particular reason to suppose that pgbench would be a >>>> good framework for stressing parsing speed. The queries it issues >>>> are of trivial length. >>> >>> I found that it was actually a fairly measurable component of the >>> select-only test when running with shared_buffers cranked up to a >>> reasonable value. But it'd probably be a lot easier to measure on a >>> benchmark specifically targeted at the parser. >>> >> >> When I tested it - all data was in memory, there was a minimal (near >> zero IO) and I run read only test. >> >> It doesn't mean, so parser is gratis, but my numbers doesn't show any >> potential problem with 60 new keywords. > > That's an interesting result, although it would be more interesting if > you posted the patch and benchmark methodology. It's important for us > not to overestimate the cost of adding keywords, and I don't object to > adding them where it adds meaningful clarity that is not otherwise > available or where it is necessary to comply with the SQL spec. But I > do think it is worth being disciplined about. We should think about > wording commands in a way that won't require new keywords; if there's > not a reasonable way to do it, then we add a keyword. Our preference > should be not to add keywords where that's reasonably possible. > > It is particularly important for us to avoid keywords that are > partially or fully reserved. In that case, the issue is not parser > overhead but the fact that it breaks compatibility with previous > releases. pg_dump files can't be loaded, PL/pgsql procedures break, > and so on. I have been here and it isn't fun. >
I agree and I understand well a problems with keywords. Just I would to know a real limits of bison and I can say so 60 keywords are not a problem. Real test of parser's speed should be done on short and quick queries. It can be unexpected so parser should be a bottle neck on long OLAP queries. Patch is added Pavel p.s. I am sure so this test depends on platform. > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company >
*** ./src/backend/parser/gram.y.orig 2011-03-15 17:01:59.000000000 +0100 --- ./src/backend/parser/gram.y 2011-03-14 20:54:02.000000000 +0100 *************** *** 568,573 **** --- 568,585 ---- ZONE + AAAAAA AAABBB ABBBBB BAAAAA BAAAAB BAAABB + CAAAAA CAAAAC CAAACC DAAAAA DAAAAD DAAADD + IAAAAA IAAAAI IAAAII IAAIII IAIIII NAAAAA + NAAAAN NAAANN SAAAAA SAAAAS SAAASS SAASSS + SASSSS VAAAAA VAAAAV VAAAVV VAAVVV VABVVV + + EAAAAA EAAAAE EAAAEE EAAEEE FAAAAA FAAAAF + FAAAFF FAAFFF OAAAAA OAAAAO OAAAOO OAAOOO + TAAAAA TAAAAT TAAATT TAATTT TATTTT UAAAAA + UAAAAU UAAAUU UAAUUU WAAAAA WAAAAW WAAAWW + WAAWWW WAWWWW XAAAAA XAAAAX XAAAXX XAAXXX + /* * The grammar thinks these are keywords, but they are not in the kwlist.h * list and so can never be entered directly. The filter in parser.c *************** *** 12071,12076 **** --- 12083,12119 ---- | YEAR_P | YES_P | ZONE + + | EAAAAA + | EAAAAE + | EAAAEE + | EAAEEE + | FAAAAA + | FAAAAF + | FAAAFF + | FAAFFF + | OAAAAA + | OAAAAO + | OAAAOO + | OAAOOO + | TAAAAA + | TAAAAT + | TAAATT + | TAATTT + | TATTTT + | UAAAAA + | UAAAAU + | UAAAUU + | UAAUUU + | WAAAAA + | WAAAAW + | WAAAWW + | WAAWWW + | WAWWWW + | XAAAAA + | XAAAAX + | XAAAXX + | XAAXXX ; /* Column identifier --- keywords that can be column, table, etc names. *************** *** 12251,12256 **** --- 12294,12330 ---- | WHERE | WINDOW | WITH + + | AAAAAA + | AAABBB + | ABBBBB + | BAAAAA + | BAAAAB + | BAAABB + | CAAAAA + | CAAAAC + | CAAACC + | DAAAAA + | DAAAAD + | DAAADD + | IAAAAA + | IAAAAI + | IAAAII + | IAAIII + | IAIIII + | NAAAAA + | NAAAAN + | NAAANN + | SAAAAA + | SAAAAS + | SAAASS + | SAASSS + | SASSSS + | VAAAAA + | VAAAAV + | VAAAVV + | VAAVVV + | VABVVV ; %% *** ./src/include/parser/kwlist.h.orig 2011-03-15 17:00:33.207733416 +0100 --- ./src/include/parser/kwlist.h 2011-03-14 20:49:53.000000000 +0100 *************** *** 26,31 **** --- 26,34 ---- */ /* name, value, category */ + PG_KEYWORD("aaaaaa", AAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("aaabbb", AAABBB, RESERVED_KEYWORD) + PG_KEYWORD("abbbbb", ABBBBB, RESERVED_KEYWORD) PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD) PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD) PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD) *************** *** 51,56 **** --- 54,62 ---- PG_KEYWORD("at", AT, UNRESERVED_KEYWORD) PG_KEYWORD("attribute", ATTRIBUTE, UNRESERVED_KEYWORD) PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD) + PG_KEYWORD("baaaaa", BAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("baaaab", BAAAAB, RESERVED_KEYWORD) + PG_KEYWORD("baaabb", BAAABB, RESERVED_KEYWORD) PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD) PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD) PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD) *************** *** 61,66 **** --- 67,75 ---- PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD) PG_KEYWORD("both", BOTH, RESERVED_KEYWORD) PG_KEYWORD("by", BY, UNRESERVED_KEYWORD) + PG_KEYWORD("caaaaa", CAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("caaaac", CAAAAC, RESERVED_KEYWORD) + PG_KEYWORD("caaacc", CAAACC, RESERVED_KEYWORD) PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD) PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD) PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD) *************** *** 111,116 **** --- 120,128 ---- PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD) PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD) PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD) + PG_KEYWORD("daaaaa", DAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("daaaad", DAAAAD, RESERVED_KEYWORD) + PG_KEYWORD("daaadd", DAAADD, RESERVED_KEYWORD) PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD) PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD) PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD) *************** *** 136,141 **** --- 148,157 ---- PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD) PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD) PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD) + PG_KEYWORD("eaaaaa", EAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("eaaaae", EAAAAE, UNRESERVED_KEYWORD) + PG_KEYWORD("eaaaee", EAAAEE, UNRESERVED_KEYWORD) + PG_KEYWORD("eaaeee", EAAEEE, UNRESERVED_KEYWORD) PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD) PG_KEYWORD("else", ELSE, RESERVED_KEYWORD) PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD) *************** *** 154,159 **** --- 170,179 ---- PG_KEYWORD("extension", EXTENSION, UNRESERVED_KEYWORD) PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD) PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD) + PG_KEYWORD("faaaaa", FAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("faaaaf", FAAAAF, UNRESERVED_KEYWORD) + PG_KEYWORD("faaaff", FAAAFF, UNRESERVED_KEYWORD) + PG_KEYWORD("faafff", FAAFFF, UNRESERVED_KEYWORD) PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD) PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD) PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD) *************** *** 179,184 **** --- 199,209 ---- PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD) PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD) PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD) + PG_KEYWORD("iaaaaa", IAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("iaaaai", IAAAAI, RESERVED_KEYWORD) + PG_KEYWORD("iaaaii", IAAAII, RESERVED_KEYWORD) + PG_KEYWORD("iaaiii", IAAIII, RESERVED_KEYWORD) + PG_KEYWORD("iaiiii", IAIIII, RESERVED_KEYWORD) PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD) PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD) PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD) *************** *** 239,244 **** --- 264,272 ---- PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD) PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD) PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD) + PG_KEYWORD("naaaaa", NAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("naaaan", NAAAAN, RESERVED_KEYWORD) + PG_KEYWORD("naaann", NAAANN, RESERVED_KEYWORD) PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD) PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD) PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD) *************** *** 263,268 **** --- 291,300 ---- PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD) PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD) PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD) + PG_KEYWORD("oaaaaa", OAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("oaaaao", OAAAAO, UNRESERVED_KEYWORD) + PG_KEYWORD("oaaaoo", OAAAOO, UNRESERVED_KEYWORD) + PG_KEYWORD("oaaooo", OAAOOO, UNRESERVED_KEYWORD) PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD) PG_KEYWORD("of", OF, UNRESERVED_KEYWORD) PG_KEYWORD("off", OFF, UNRESERVED_KEYWORD) *************** *** 329,334 **** --- 361,371 ---- PG_KEYWORD("row", ROW, COL_NAME_KEYWORD) PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD) PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD) + PG_KEYWORD("saaaaa", SAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("saaaas", SAAAAS, RESERVED_KEYWORD) + PG_KEYWORD("saaass", SAAASS, RESERVED_KEYWORD) + PG_KEYWORD("saasss", SAASSS, RESERVED_KEYWORD) + PG_KEYWORD("sassss", SASSSS, RESERVED_KEYWORD) PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD) PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD) PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD) *************** *** 365,370 **** --- 402,412 ---- PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD) PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD) PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD) + PG_KEYWORD("taaaaa", TAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("taaaat", TAAAAT, UNRESERVED_KEYWORD) + PG_KEYWORD("taaatt", TAAATT, UNRESERVED_KEYWORD) + PG_KEYWORD("taattt", TAATTT, UNRESERVED_KEYWORD) + PG_KEYWORD("tatttt", TATTTT, UNRESERVED_KEYWORD) PG_KEYWORD("table", TABLE, RESERVED_KEYWORD) PG_KEYWORD("tables", TABLES, UNRESERVED_KEYWORD) PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD) *************** *** 385,390 **** --- 427,436 ---- PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD) PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD) PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD) + PG_KEYWORD("uaaaaa", UAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("uaaaau", UAAAAU, UNRESERVED_KEYWORD) + PG_KEYWORD("uaaauu", UAAAUU, UNRESERVED_KEYWORD) + PG_KEYWORD("uaauuu", UAAUUU, UNRESERVED_KEYWORD) PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD) PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD) PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD) *************** *** 397,402 **** --- 443,453 ---- PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD) PG_KEYWORD("user", USER, RESERVED_KEYWORD) PG_KEYWORD("using", USING, RESERVED_KEYWORD) + PG_KEYWORD("vaaaaa", VAAAAA, RESERVED_KEYWORD) + PG_KEYWORD("vaaaav", VAAAAV, RESERVED_KEYWORD) + PG_KEYWORD("vaaavv", VAAAVV, RESERVED_KEYWORD) + PG_KEYWORD("vaavvv", VAAVVV, RESERVED_KEYWORD) + PG_KEYWORD("vabvvv", VABVVV, RESERVED_KEYWORD) PG_KEYWORD("vacuum", VACUUM, UNRESERVED_KEYWORD) PG_KEYWORD("valid", VALID, UNRESERVED_KEYWORD) PG_KEYWORD("validate", VALIDATE, UNRESERVED_KEYWORD) *************** *** 410,415 **** --- 461,471 ---- PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD) PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD) PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD) + PG_KEYWORD("waaaaa", WAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("waaaaw", WAAAAW, UNRESERVED_KEYWORD) + PG_KEYWORD("waaaww", WAAAWW, UNRESERVED_KEYWORD) + PG_KEYWORD("waawww", WAAWWW, UNRESERVED_KEYWORD) + PG_KEYWORD("wawwww", WAWWWW, UNRESERVED_KEYWORD) PG_KEYWORD("when", WHEN, RESERVED_KEYWORD) PG_KEYWORD("where", WHERE, RESERVED_KEYWORD) PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD) *************** *** 419,424 **** --- 475,484 ---- PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD) PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD) PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD) + PG_KEYWORD("xaaaaa", XAAAAA, UNRESERVED_KEYWORD) + PG_KEYWORD("xaaaax", XAAAAX, UNRESERVED_KEYWORD) + PG_KEYWORD("xaaaxx", XAAAXX, UNRESERVED_KEYWORD) + PG_KEYWORD("xaaxxx", XAAXXX, UNRESERVED_KEYWORD) PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD) PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD) PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD)
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers