A non-NULL default can satisfy NOT NULL while explicit NULL still rejects.

highlighted = computed this step

Default plus NOT NULL boundary

A non-NULL default can satisfy NOT NULL, but explicit NULL still fails.

boundary visible\text{boundary visible}

Omit status

The omitted status candidate is accepted because status gets the non-NULL default.

default accepted\text{default accepted}

DEFAULT examples are tiny finite insert checks; SQL dialect completeness, generated defaults, identity columns, triggers, constraints beyond visible NOT NULL, indexes, transactions, performance, and product behavior are out of scope.

Default plus NOT NULL accepts: base rowsidnamestatusnotescore1Adaactiveseed102BennewNULL0 Schema defaultscolumnnotNulldefaultidyesNO_DEFAULTnameyesNO_DEFAULTstatusyesnewnotenononescoreyes0 Candidate resolutioncolumnsupplieddefaultresultsourcestatusreasonidyesNO_DEFAULT3explicitokoknameyesNO_DEFAULTCyexplicitokokstatusnonewnewdefaultokoknotenononenonedefaultokokscoreno00defaultokok Candidate checkfieldvaluedecisionacceptedresolvedRow(3, Cy, new, none, 0)reasons()insertedRowIndex2 Rows after candidateidnamestatusnotescore1Adaactiveseed102BennewNULL03Cynewnone0 DEFAULT factsfactvaluebaseRowCount2schemaColumnCount5defaultColumnCount3suppliedColumnCount2omittedColumnCount3appliedDefaultCount3explicitValueCount2explicitNullCount0rejectedReasonCount0candidateDecisionacceptedfinalRowCount3explicitNullInvokesDefaultno_toy_rule

Supply NULL status

The explicit NULL status candidate is rejected because explicit NULL does not invoke the default.

NULL rejected\text{NULL rejected}

DEFAULT examples are tiny finite insert checks; SQL dialect completeness, generated defaults, identity columns, triggers, constraints beyond visible NOT NULL, indexes, transactions, performance, and product behavior are out of scope.

Explicit NULL still rejects: base rowsidnamestatusnotescore1Adaactiveseed102BennewNULL0 Schema defaultscolumnnotNulldefaultidyesNO_DEFAULTnameyesNO_DEFAULTstatusyesnewnotenononescoreyes0 Candidate resolutioncolumnsupplieddefaultresultsourcestatusreasonidyesNO_DEFAULT3explicitokoknameyesNO_DEFAULTCyexplicitokokstatusyesnewNULLexplicit_NULLrejectednot_null_violationnotenononenonedefaultokokscoreno00defaultokok Candidate checkfieldvaluedecisionrejectedresolvedRow()reasons({column:status, reason:not_null_violation})insertedRowIndexnone Rows after candidateidnamestatusnotescore1Adaactiveseed102BennewNULL0 DEFAULT factsfactvaluebaseRowCount2schemaColumnCount5defaultColumnCount3suppliedColumnCount3omittedColumnCount2appliedDefaultCount2explicitValueCount3explicitNullCount1rejectedReasonCount1candidateDecisionrejectedfinalRowCount2explicitNullInvokesDefaultno_toy_rule

Summary

The same schema shows both sides of the boundary.

same rule, different input\text{same rule, different input}