@@ -130,7 +130,11 @@ public void execute(SqlCreateView create, CalcitePrepare.Context context) {
130130 throw new DdlException (create ,
131131 "View " + pair .right + " already exists. Use CREATE OR REPLACE to update." );
132132 }
133- pair .left .removeFunction (pair .right );
133+ // Only mutate the in-memory schema when we are actually deploying. In dry-run
134+ // (VALIDATE) we leave the existing definition untouched.
135+ if (mode .mutable ()) {
136+ pair .left .removeFunction (pair .right );
137+ }
134138 }
135139 }
136140
@@ -152,16 +156,20 @@ public void execute(SqlCreateView create, CalcitePrepare.Context context) {
152156 deployers = DeploymentService .deployers (view , connection );
153157 ValidationService .validateOrThrow (deployers , connection );
154158 logger .info ("Validated view {}" , viewName );
155- if (mode == HoptimatorDdlUtils .DdlMode .UPDATE ) {
156- logger .info ("Deploying update view {}" , viewName );
157- DeploymentService .update (deployers );
159+ if (mode == HoptimatorDdlUtils .DdlMode .VALIDATE ) {
160+ logger .info ("Validated view (dry-run) {}; skipping deployment" , viewName );
158161 } else {
159- logger .info ("Deploying create view {}" , viewName );
160- DeploymentService .create (deployers );
162+ if (mode == HoptimatorDdlUtils .DdlMode .UPDATE ) {
163+ logger .info ("Deploying update view {}" , viewName );
164+ DeploymentService .update (deployers );
165+ } else {
166+ logger .info ("Deploying create view {}" , viewName );
167+ DeploymentService .create (deployers );
168+ }
169+ logger .info ("Deployed view {}" , viewName );
170+ schemaPlus .add (viewName , viewTable );
171+ logger .info ("Added view {} to schema {}" , viewName , schemaPlus .getName ());
161172 }
162- logger .info ("Deployed view {}" , viewName );
163- schemaPlus .add (viewName , viewTable );
164- logger .info ("Added view {} to schema {}" , viewName , schemaPlus .getName ());
165173 } catch (SQLException | RuntimeException e ) {
166174 logger .info ("Failed to deploy view {}" , viewName );
167175 if (deployers != null ) {
@@ -241,14 +249,18 @@ public void execute(SqlCreateTrigger create, CalcitePrepare.Context context) {
241249 ValidationService .validateOrThrow (deployers , connection );
242250 logger .info ("Validated trigger {}" , name );
243251 HoptimatorDdlUtils .DdlMode mode = HoptimatorDdlUtils .effectiveMode (create .getReplace (), connection );
244- if (mode == HoptimatorDdlUtils .DdlMode .UPDATE ) {
245- logger .info ("Updating trigger {}" , name );
246- DeploymentService .update (deployers );
252+ if (mode == HoptimatorDdlUtils .DdlMode .VALIDATE ) {
253+ logger .info ("Validated trigger (dry-run) {}; skipping deployment" , name );
247254 } else {
248- logger .info ("Creating trigger {}" , name );
249- DeploymentService .create (deployers );
255+ if (mode == HoptimatorDdlUtils .DdlMode .UPDATE ) {
256+ logger .info ("Updating trigger {}" , name );
257+ DeploymentService .update (deployers );
258+ } else {
259+ logger .info ("Creating trigger {}" , name );
260+ DeploymentService .create (deployers );
261+ }
262+ logger .info ("Deployed trigger {}" , name );
250263 }
251- logger .info ("Deployed trigger {}" , name );
252264 logger .info ("CREATE TRIGGER {} completed" , name );
253265 } catch (Exception e ) {
254266 if (deployers != null ) {
@@ -336,7 +348,11 @@ public void execute(SqlFireTrigger fire, CalcitePrepare.Context context) {
336348 try {
337349 logger .info ("Firing trigger {} with {} option(s)" , name , options .size () - 1 );
338350 deployers = DeploymentService .deployers (trigger , connection );
339- DeploymentService .update (deployers );
351+ if (HoptimatorDdlUtils .isValidateMode (connection )) {
352+ logger .info ("Validated FIRE TRIGGER (dry-run) {}; skipping deployment" , name );
353+ } else {
354+ DeploymentService .update (deployers );
355+ }
340356 logger .info ("FIRE TRIGGER {} completed" , name );
341357 } catch (Exception e ) {
342358 if (deployers != null ) {
@@ -366,8 +382,12 @@ public void execute(SqlDropTrigger drop, CalcitePrepare.Context context) {
366382 try {
367383 logger .info ("Deleting trigger {}" , name );
368384 deployers = DeploymentService .deployers (trigger , connection );
369- DeploymentService .delete (deployers );
370- logger .info ("Deleted trigger {}" , name );
385+ if (HoptimatorDdlUtils .isValidateMode (connection )) {
386+ logger .info ("Validated DROP TRIGGER (dry-run) {}; skipping deletion" , name );
387+ } else {
388+ DeploymentService .delete (deployers );
389+ logger .info ("Deleted trigger {}" , name );
390+ }
371391 logger .info ("DROP TRIGGER {} completed" , name );
372392 } catch (Exception e ) {
373393 if (deployers != null ) {
@@ -403,7 +423,11 @@ private void updateTriggerPausedState(SqlNode sqlNode, SqlIdentifier triggerName
403423 try {
404424 logger .info ("Updating trigger {} with paused state: {}" , name , paused );
405425 deployers = DeploymentService .deployers (trigger , connection );
406- DeploymentService .update (deployers );
426+ if (HoptimatorDdlUtils .isValidateMode (connection )) {
427+ logger .info ("Validated paused-state update (dry-run) for trigger {}; skipping deployment" , name );
428+ } else {
429+ DeploymentService .update (deployers );
430+ }
407431 logger .info ("Successfully updated trigger {} with paused state: {}" , name , paused );
408432 } catch (Exception e ) {
409433 if (deployers != null ) {
@@ -450,6 +474,7 @@ public void execute(SqlDropObject drop, CalcitePrepare.Context context) {
450474 tablePath .add (tableName );
451475
452476 Collection <Deployer > deployers = null ;
477+ final boolean dryRun = HoptimatorDdlUtils .isValidateMode (connection );
453478 try {
454479 if (table instanceof MaterializedViewTable ) {
455480 if (!(drop instanceof SqlDropMaterializedView )) {
@@ -459,10 +484,14 @@ public void execute(SqlDropObject drop, CalcitePrepare.Context context) {
459484 MaterializedViewTable materializedViewTable = (MaterializedViewTable ) table ;
460485 View view = new View (tablePath , materializedViewTable .viewSql ());
461486 deployers = DeploymentService .deployers (view , connection );
462- logger .info ("Deleting materialized view {}" , tableName );
463- DeploymentService .delete (deployers );
464- schemaPlus .removeTable (tableName );
465- logger .info ("Removed materialized table {} from schema {}" , tableName , schemaPlus .getName ());
487+ if (dryRun ) {
488+ logger .info ("Validated DROP (dry-run) for materialized view {}; skipping deletion" , tableName );
489+ } else {
490+ logger .info ("Deleting materialized view {}" , tableName );
491+ DeploymentService .delete (deployers );
492+ schemaPlus .removeTable (tableName );
493+ logger .info ("Removed materialized table {} from schema {}" , tableName , schemaPlus .getName ());
494+ }
466495 } else if (table instanceof ViewTable ) {
467496 if (!(drop instanceof SqlDropView )) {
468497 throw new DdlException (drop ,
@@ -471,10 +500,14 @@ public void execute(SqlDropObject drop, CalcitePrepare.Context context) {
471500 ViewTable viewTable = (ViewTable ) table ;
472501 View view = new View (tablePath , viewTable .getViewSql ());
473502 deployers = DeploymentService .deployers (view , connection );
474- logger .info ("Deleting view {}" , tableName );
475- DeploymentService .delete (deployers );
476- schemaPlus .removeTable (tableName );
477- logger .info ("Removed view {} from schema {}" , tableName , schemaPlus .getName ());
503+ if (dryRun ) {
504+ logger .info ("Validated DROP (dry-run) for view {}; skipping deletion" , tableName );
505+ } else {
506+ logger .info ("Deleting view {}" , tableName );
507+ DeploymentService .delete (deployers );
508+ schemaPlus .removeTable (tableName );
509+ logger .info ("Removed view {} from schema {}" , tableName , schemaPlus .getName ());
510+ }
478511 } else if (table instanceof HoptimatorJdbcTable || table instanceof TemporaryTable ) {
479512 if (!(drop instanceof SqlDropTable )) {
480513 throw new DdlException (drop ,
@@ -491,13 +524,17 @@ public void execute(SqlDropObject drop, CalcitePrepare.Context context) {
491524 }
492525 // Pre-delete dependency guard. PendingDelete is the explicit "delete intent" signal
493526 // — only validators that key off it (the K8s dep checker) fire here. The check throws
494- // before any deployer-level state change.
527+ // before any deployer-level state change. This validation runs in dry-run too.
495528 ValidationService .validateOrThrow (new PendingDelete <>(source ), connection );
496529 deployers = DeploymentService .deployers (source , connection );
497- logger .info ("Deleting table {}" , tableName );
498- DeploymentService .delete (deployers );
499- schemaPlus .removeTable (tableName );
500- logger .info ("Removed table {} from schema {}" , tableName , schemaPlus .getName ());
530+ if (dryRun ) {
531+ logger .info ("Validated DROP (dry-run) for table {}; skipping deletion" , tableName );
532+ } else {
533+ logger .info ("Deleting table {}" , tableName );
534+ DeploymentService .delete (deployers );
535+ schemaPlus .removeTable (tableName );
536+ logger .info ("Removed table {} from schema {}" , tableName , schemaPlus .getName ());
537+ }
501538 } else {
502539 throw new SQLException (String .format ("Unsupported drop type %s." , table .getClass ().getSimpleName ()));
503540 }
0 commit comments