Skip to content

Commit

Permalink
Add a dedicated sql-introspection patch type (#6634)
Browse files Browse the repository at this point in the history
This lets us refresh sql introspection views without needing to do an
edgeql+schema patch.

It up applying it to 100 dbs from ~90s to ~65s, which isn't as much as
I hoped but is still nicer.
  • Loading branch information
msullivan authored Dec 22, 2023
1 parent 627227c commit 755fa91
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 17 deletions.
1 change: 1 addition & 0 deletions edb/pgsql/patches.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ def _setup_patches(patches: list[tuple[str, str]]) -> list[tuple[str, str]]:
* ...+config - updates config views
* ext-pkg - installs an extension package given a name
* repair - fix up inconsistencies in *user* schemas
* sql-introspection - refresh all sql introspection views
"""
PATCHES: list[tuple[str, str]] = _setup_patches([
])
51 changes: 34 additions & 17 deletions edb/server/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,29 @@ async def gather_patch_info(
return None


def _generate_drop_views(
group: dbops.CommandGroup,
preblock: dbops.PLBlock,
) -> None:
for cv in reversed(list(group)):
dv: Any
if isinstance(cv, dbops.CreateView):
dv = dbops.DropView(
cv.view.name,
conditions=[dbops.ViewExists(cv.view.name)],
)
elif isinstance(cv, dbops.CreateFunction):
dv = dbops.DropFunction(
cv.function.name,
args=cv.function.args or (),
has_variadic=bool(cv.function.has_variadic),
if_exists=True,
)
else:
raise AssertionError(f'unsupported support view command {cv}')
dv.generate(preblock)


def prepare_patch(
num: int,
kind: str,
Expand Down Expand Up @@ -829,6 +852,16 @@ def prepare_patch(

metadata_user_schema = cschema.get_top_schema()

elif kind == 'sql-introspection':
support_view_commands = dbops.CommandGroup()
support_view_commands.add_commands(
metaschema._generate_sql_information_schema())
support_view_commands.generate(subblock)

_generate_drop_views(support_view_commands, preblock)

metadata_user_schema = reflschema

else:
raise AssertionError(f'unknown patch type {kind}')

Expand Down Expand Up @@ -877,23 +910,7 @@ def prepare_patch(
support_view_commands.add_commands(
metaschema._generate_sql_information_schema())

for cv in reversed(list(support_view_commands)):
dv: Any
if isinstance(cv, dbops.CreateView):
dv = dbops.DropView(
cv.view.name,
conditions=[dbops.ViewExists(cv.view.name)],
)
elif isinstance(cv, dbops.CreateFunction):
dv = dbops.DropFunction(
cv.function.name,
args=cv.function.args or (),
has_variadic=bool(cv.function.has_variadic),
if_exists=True,
)
else:
raise AssertionError(f'unsupported support view command {cv}')
dv.generate(preblock)
_generate_drop_views(support_view_commands, preblock)

# We want to limit how much unconditional work we do, so only recreate
# extension views if requested.
Expand Down

0 comments on commit 755fa91

Please sign in to comment.