Hi, On 2022-02-19 18:35:18 -0500, Tom Lane wrote: > Here's an initial patch that gets rid of the need for initdb to > change the contents of postgres.bki before feeding it to the > bootstrap backend. After this, we could look at having the > backend read the file directly.
Cool! > I don't really detect any speed change from getting rid of initdb's > string manipulations, but TBH I was not expecting any. On my machine, > that was lost in the noise already, according to perf(1). Yea, I'd not expect much either. The slowdown around the string stuff that I did see was on windows. I would however expect some, but not huge, speedup by getting rid of the line-by-line reading/writing of postgres.bki, even without moving the handling to the backend. A quick way to prototype the moving the handlign to the backend would be to just call postgres with input redirection from postgres.bki... > + /* > + * Ideally we'd change the superuser name with ALTER USER, but the > backend > + * will reject that with "session user cannot be renamed", so we must > + * cheat. (In any case, we'd need a function to escape an identifier, > not > + * a string literal.) Likewise, we can't change template1's > + * locale/encoding without cheating. > + */ > + static char *final_details[] = { > + "UPDATE pg_authid SET rolname = E'SUPERUSER_NAME' WHERE rolname > = 'POSTGRES';\n\n", > + "UPDATE pg_database SET encoding = E'ENCODING', datcollate = > E'LC_COLLATE', datctype = E'LC_CTYPE';\n\n", > + NULL > + }; > + > + detail_lines = replace_token(final_details, "SUPERUSER_NAME", > + > escape_quotes(username)); > + detail_lines = replace_token(detail_lines, "ENCODING", > + > encodingid_to_string(encodingid)); > + detail_lines = replace_token(detail_lines, "LC_COLLATE", > + > escape_quotes(lc_collate)); > + detail_lines = replace_token(detail_lines, "LC_CTYPE", > + > escape_quotes(lc_ctype)); Hm, wouldn't it be less code to just use printf? Greetings, Andres Freund