Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
e879cdd
start off the blueprints
sungchun12 Nov 7, 2022
bd1afc7
Merge branch 'main' of https://github.com/dbt-labs/dbt into feature/d…
sungchun12 Nov 9, 2022
4b2a881
Merge branch 'main' of https://github.com/dbt-labs/dbt into feature/d…
sungchun12 Nov 16, 2022
e8b52e0
test commit
sungchun12 Nov 16, 2022
01a07d3
working snowflake env
sungchun12 Nov 16, 2022
3b31a15
update manifest expectation
sungchun12 Nov 17, 2022
1a1f46a
add error handling
sungchun12 Nov 17, 2022
ebaa54c
clean up language
sungchun12 Nov 17, 2022
fd7a47a
constraints validator
sungchun12 Nov 17, 2022
7e3a9be
cleaner example
sungchun12 Nov 17, 2022
6df02da
better terminal output
sungchun12 Nov 17, 2022
bc3c5bc
add python error handling
sungchun12 Nov 17, 2022
4b901fd
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Nov 17, 2022
e29b571
add to manifest schema
sungchun12 Nov 17, 2022
7d085dc
add to schema config
sungchun12 Nov 17, 2022
e6559d4
clean up comments
sungchun12 Nov 18, 2022
ca89141
backwards compatible nodeconfig
sungchun12 Nov 18, 2022
2c4a4cf
remove comments
sungchun12 Nov 18, 2022
1975c6b
clean up more comments
sungchun12 Nov 18, 2022
f088a03
add changelog
sungchun12 Nov 18, 2022
7421caa
clarify error message
sungchun12 Nov 21, 2022
a7395bb
constraints list type
sungchun12 Nov 21, 2022
5d06524
fix grammar
sungchun12 Nov 21, 2022
380bd96
add global macros
sungchun12 Nov 21, 2022
e6e490d
clearer compile error
sungchun12 Nov 21, 2022
9c498ef
remove comments
sungchun12 Nov 21, 2022
bed1fec
fix tests in this file
sungchun12 Nov 21, 2022
8c466b0
conditional compile errors
sungchun12 Nov 22, 2022
547ad9e
add conditional check in ddl
sungchun12 Nov 22, 2022
52bd35b
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Nov 22, 2022
7582531
add macro to dispatch
sungchun12 Nov 22, 2022
7291094
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Nov 28, 2022
b87f57d
fix regressions in parsed
sungchun12 Nov 28, 2022
5529334
fix regressions in manifest tests
sungchun12 Nov 28, 2022
00f12c2
fix manifest test regressions
sungchun12 Nov 28, 2022
76bf69c
fix test_list regressions
sungchun12 Nov 28, 2022
2e51246
concise data_type terminal error
sungchun12 Nov 29, 2022
5891eb3
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Nov 29, 2022
5d2867f
remove placeholder function
sungchun12 Nov 29, 2022
801b2fd
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Nov 29, 2022
5d59cc1
fix failed regressions finally
sungchun12 Dec 2, 2022
92d2ea7
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Dec 2, 2022
4f747b0
Revert "Merge branch 'main' of https://github.com/dbt-labs/dbt into d…
sungchun12 Dec 2, 2022
eba0b6d
Revert "Revert "Merge branch 'main' of https://github.com/dbt-labs/db…
sungchun12 Dec 2, 2022
ae56da1
remove tmp.csv
sungchun12 Dec 2, 2022
de653e4
template test plans
sungchun12 Dec 5, 2022
cfc53b0
postgres columns spec macro
sungchun12 Dec 5, 2022
fc7230b
schema does not exist error handling
sungchun12 Dec 7, 2022
e1c72ac
update postgres adapter
sungchun12 Dec 7, 2022
b215b6c
remove comments
sungchun12 Dec 7, 2022
d550de4
first passing test
sungchun12 Dec 7, 2022
9d87463
fix postgres macro
sungchun12 Dec 7, 2022
ce85c96
add more passing tests
sungchun12 Dec 7, 2022
49a4120
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Dec 7, 2022
8ffb654
Add generated CLI API docs
FishtownBuildBot Dec 7, 2022
f2f2707
add disabled config test
sungchun12 Dec 7, 2022
096f3fd
column configs match
sungchun12 Dec 7, 2022
eae4e76
Merge branch 'dbt-constraints' of https://github.com/dbt-labs/dbt int…
sungchun12 Dec 7, 2022
b8c3812
test python error handling
sungchun12 Dec 7, 2022
bb1a6c3
adjust macro with rollback
sungchun12 Dec 7, 2022
b6dbcf6
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Dec 7, 2022
751cdc8
start postgres tests
sungchun12 Dec 8, 2022
6bbd797
remove begin commit
sungchun12 Dec 15, 2022
d364eeb
remove begin commit comments
sungchun12 Dec 15, 2022
4a58ece
passing expected compiled sql test
sungchun12 Dec 15, 2022
ac795dd
passing rollback test
sungchun12 Dec 15, 2022
d452cae
update changelog
sungchun12 Dec 16, 2022
baf18f0
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Dec 16, 2022
76c0e4f
fix artifacts regression
sungchun12 Dec 16, 2022
10ab3cb
modularize validator
sungchun12 Dec 18, 2022
6253ed0
PR feedback
sungchun12 Dec 18, 2022
307809d
verify database error occurs
sungchun12 Dec 19, 2022
ab4f396
focus on generic outcomes
sungchun12 Dec 19, 2022
b99e9be
fix global macro
sungchun12 Dec 20, 2022
5935201
rename to constraints_check
sungchun12 Dec 20, 2022
f59c9dd
missed a check rename
sungchun12 Dec 20, 2022
7e28a31
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Dec 24, 2022
3ddd666
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 4, 2023
fabe2ce
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 4, 2023
ffec7d7
validate at parse time
sungchun12 Jan 4, 2023
d338f33
raise error for modelparser only
sungchun12 Jan 5, 2023
e34c467
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 5, 2023
44b2f18
better spacing in terminal output
sungchun12 Jan 5, 2023
17b1f8e
fix test regressions
sungchun12 Jan 6, 2023
c652367
fix manifest test regressions
sungchun12 Jan 6, 2023
f9e020d
these are parsing errors now
sungchun12 Jan 9, 2023
926e555
merge main
sungchun12 Jan 11, 2023
c6bd674
fix tests
sungchun12 Jan 11, 2023
bcc35fc
test passes in json log format
sungchun12 Jan 11, 2023
880ed43
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 13, 2023
426789e
add column compile error handling
sungchun12 Jan 13, 2023
3d61eda
update global macros for column handling
sungchun12 Jan 13, 2023
f163b2c
remove TODO
sungchun12 Jan 13, 2023
bf45243
uppercase columns for consistency
sungchun12 Jan 17, 2023
dbef42b
more specific error handling
sungchun12 Jan 17, 2023
c4de8f3
migrate tests
sungchun12 Jan 17, 2023
ad07ced
clean up core tests
sungchun12 Jan 17, 2023
a501c29
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 17, 2023
59b0298
Update core/dbt/include/global_project/macros/materializations/models…
sungchun12 Jan 17, 2023
e46066b
Revert "Update core/dbt/include/global_project/macros/materialization…
sungchun12 Jan 17, 2023
e80b8cd
update for pre-commit hooks
sungchun12 Jan 17, 2023
257eacd
update for black formatter
sungchun12 Jan 17, 2023
391bd3b
update for black formatter on all files
sungchun12 Jan 17, 2023
0441417
Merge remote-tracking branch 'origin/main' into dbt-constraints
jtcohen6 Jan 23, 2023
e0bcb25
Refactor functional tests
jtcohen6 Jan 30, 2023
dcf7062
Fixup formatting
jtcohen6 Jan 30, 2023
903a2cb
Dave feedback
jtcohen6 Jan 30, 2023
c40ee92
another one - dave
jtcohen6 Jan 30, 2023
111683a
the hits keep coming
jtcohen6 Jan 30, 2023
f8b16bc
adjust whitespace
dave-connors-3 Jan 30, 2023
97f0c6b
Merge branch 'main' of https://github.com/dbt-labs/dbt into dbt-const…
sungchun12 Jan 31, 2023
2a33baf
Light touchup
jtcohen6 Feb 1, 2023
6806a7c
Merge remote-tracking branch 'origin/main' into dbt-constraints
jtcohen6 Feb 1, 2023
1256e7b
Add more flexibility for spark
jtcohen6 Feb 2, 2023
0304dbf
Nearly there for spark
jtcohen6 Feb 2, 2023
b5b1699
Merge main
jtcohen6 Feb 14, 2023
d338faa
Try regenerating docs
jtcohen6 Feb 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/dbt/contracts/graph/model_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@ class NodeConfig(NodeAndTestConfig):
default_factory=Docs,
metadata=MergeBehavior.Update.meta(),
)
constraints_enabled: Optional[bool] = False
Copy link
Contributor

@jtcohen6 jtcohen6 Jan 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm okay with this nomenclature for now. I'll be curious to hear feedback from beta testers.

One thing that's potentially misleading: In addition to enabling constraints (if they're defined), this also enables (requires) the verification of the number, order, and data types of columns.

A long time ago, there was an idea to call this strict: #1570. (While searching for this issue, I was proud to find that I still know @jwerderits' GitHub handle by memory.)

Copy link
Contributor Author

@sungchun12 sungchun12 Jan 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm open to changing it after community feedback! There are exceptions that I flow through into DatabaseErrors vs. ParsingErrors because we get error handling for free(think: data type validation, number of columns mismatch SQL).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[For follow-up issues, out of scope for this PR]

After a bit more discussion, I'm thinking about renaming constraints_enabled to either:

  • stable: true|false
  • contracted: true|false

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: If it has a default value False then it doesn't need to be an Option type, it could just be bool.

It's a shame the python typing lib uses the word Optional as a keyword; it's the default value that makes providing the attribute optional when instantiating the class.

On another note, a bool with a default value of None forces the use of Optional[bool] which only makes sense if you must have a lenient (public) API or if there's inheritance compatibility issues.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@davehowell Good catch! It looks like @gshank already had the same thought, and implemented this change over in #7002, along with the config rename :)


# we validate that node_color has a suitable value to prevent dbt-docs from crashing
def __post_init__(self):
Expand Down
29 changes: 29 additions & 0 deletions core/dbt/contracts/graph/parsed.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

from dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin

from dbt.exceptions import CompilationException
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed no exceptions exist in this file except for the one I introduce. Is that intentional?

from dbt.clients.system import write_file
from dbt.contracts.files import FileHash
from dbt.contracts.graph.unparsed import (
Expand Down Expand Up @@ -70,6 +71,8 @@ class ColumnInfo(AdditionalPropertiesMixin, ExtensibleDbtClassMixin, Replaceable
description: str = ""
meta: Dict[str, Any] = field(default_factory=dict)
data_type: Optional[str] = None
constraint: Optional[str] = None
check: Optional[str] = None
quote: Optional[bool] = None
tags: List[str] = field(default_factory=list)
_extra: Dict[str, Any] = field(default_factory=dict)
Expand Down Expand Up @@ -222,7 +225,33 @@ class ParsedNodeDefaults(NodeInfoMixin, ParsedNodeMandatory):
created_at: float = field(default_factory=lambda: time.time())
config_call_dict: Dict[str, Any] = field(default_factory=dict)

def constraints_validator(self):
materialization_error = {}
language_error = {}
data_type_errors = {}

if self.resource_type == "model" and self.config.constraints_enabled is True:
if self.config.materialized != "table":
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be so restrictive to table?

Some folks may be bold enough to create their own incremental materializations based on the the new configs available.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's leave it alone as table only for now and see what can be done for incremental after we get more user feedback

materialization_error = {"materialization": self.config.materialized}

language = str(self.language)
if language != "sql":
language_error = {"language": language}

for column, column_info in self.columns.items():
if column_info.data_type is None:
data_type_error = {column: {"data_type": column_info.data_type}}
data_type_errors.update(data_type_error)

if materialization_error or language_error or data_type_errors:
raise CompilationException(
f"Only the SQL table materialization is supported for constraints and data_type values must NOT be null or blank.\n Materialization Error: {materialization_error}\n Language Error: {language_error}\n Data Type Errors: {data_type_errors}"
)

# TODO: this is where we see the columninfo object display the data_type and constraint values
def write_node(self, target_path: str, subdirectory: str, payload: str):
self.constraints_validator()

if os.path.basename(self.path) == os.path.basename(self.original_file_path):
# One-to-one relationship of nodes to files.
path = self.original_file_path
Expand Down
2 changes: 2 additions & 0 deletions core/dbt/contracts/graph/unparsed.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class HasDocs(AdditionalPropertiesMixin, ExtensibleDbtClassMixin, Replaceable):
description: str = ""
meta: Dict[str, Any] = field(default_factory=dict)
data_type: Optional[str] = None
constraint: Optional[str] = None
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It only needs to be inserted here as external tables and sources are not in scope for this feature

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could there ever be multiple constraints? Should this be a list (or either a string or a list)?

Copy link
Contributor Author

@sungchun12 sungchun12 Nov 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ooooo great question. For developer UX, I'd bias towards a list even though it may be more "efficient" to allow arbitrary strings, developer mental load better reasons about multiple constraints as a list.

And yes, postgres allows multiple constraints: https://www.postgresql.org/docs/current/ddl-constraints.html#id-1.5.4.6.6

I'll make the change for the constraints config to be an optional list

String Format:
Harder to reason about separate constraints

# models/my_custom_model_config.yml
models:
  - name: my_model
    columns:
      - name: email
        data_type: string
        constraints: not null unique 

List Format:
Easier to reason about separate constraints

# models/my_custom_model_config.yml
models:
  - name: my_model
    columns:
      - name: email
        data_type: string
        constraints: ['not null','unique']

check: Optional[str] = None
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See nodes.py

docs: Docs = field(default_factory=Docs)
_extra: Dict[str, Any] = field(default_factory=dict)

Expand Down
6 changes: 6 additions & 0 deletions core/dbt/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1000,6 +1000,12 @@ def warn(msg, node=None):
return ""


# TODO: remove this later as Sung created this to avoid errors with running dbt-snowflake==1.3.0
def warn_or_error(msg, node=None):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason this function was removed from the main branch while 1.3.latest still has it? https://github.com/dbt-labs/dbt-core/blob/1.3.latest/core/dbt/exceptions.py#L1090

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also notice that there looks to be a regression error that any selected models give an incorrect warning on the main branch.

image

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, this was related to work that Emily has been doing on more structured logging/exceptions. Just opened a ticket for it: #6297

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the selector error message was fixed, but is there a reason warn_or_error doesn't exist in the main branch but in 1.3.latest? @jtcohen6

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sungchun12 It still exists, it just moved:

- from dbt.exceptions import warn_or_error
+ from dbt.events.functions import warn_or_error

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahhhh I know what happened, I needed to update my snowflake adapter to the main branch vs. relying on 1.3.latest Thanks Jerco! I'm unblocked!

dbt.events.functions.warn_or_error(GeneralMacroWarning(msg=msg), node=node)
return ""


# Update this when a new function should be added to the
# dbt context's `exceptions` key!
CONTEXT_EXPORTS = {
Expand Down
7 changes: 7 additions & 0 deletions core/dbt/parser/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,13 @@ def update_parsed_node_config(
else:
parsed_node.docs = Docs(show=docs_show)

# TODO: Do I need this here similar to what we did for node_color above?
# If we have constraints_enabled in the config, copy to node level, for backwards
# compatibility with earlier node-only config.
# if "constraints_enabled" in config_dict and config_dict["constraints_enabled"]:
# parsed_node.constraints_enabled = config_dict["constraints_enabled"]
# print("constraints_enabled: {}".format(parsed_node.constraints_enabled))

# unrendered_config is used to compare the original database/schema/alias
# values and to handle 'same_config' and 'same_contents' calls
parsed_node.unrendered_config = config.build_config_dict(
Expand Down
2 changes: 2 additions & 0 deletions core/dbt/parser/generic_test_builders.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ def from_test_block(
)


# TODO: create a ConstraintsBuilder equivalent
class TestBuilder(Generic[Testable]):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should NOT need to build a ConstraintsBuilder because the configs extend column_info within the schemas.py file.

"""An object to hold assorted test settings and perform basic parsing

Expand All @@ -194,6 +195,7 @@ class TestBuilder(Generic[Testable]):
r"((?P<test_namespace>([a-zA-Z_][0-9a-zA-Z_]*))\.)?"
r"(?P<test_name>([a-zA-Z_][0-9a-zA-Z_]*))"
)
# TODO: add config args like: "default", "data_type", "constraint", "check"
# args in the test entry representing test configs
CONFIG_ARGS = (
"severity",
Expand Down
15 changes: 15 additions & 0 deletions core/dbt/parser/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,21 @@ def verify_python_model_code(node):
raise ParsingException("No jinja in python model code is allowed", node=node)


# TODO: Do we need to do this?
# def verify_model_constraints(node):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need to verify within this model because that happens parsed.py

# try:
# rendered_model = get_rendered(
# node.raw_code,
# {},
# node,
# )
# print(rendered_model)
# if rendered_model != node.raw_code:
# raise ParsingException("")
# except (UndefinedMacroException, ParsingException):
# raise ParsingException("No jinja in python model code is allowed", node=node)


class ModelParser(SimpleSQLParser[ParsedModelNode]):
def parse_from_dict(self, dct, validate=True) -> ParsedModelNode:
if validate:
Expand Down
10 changes: 9 additions & 1 deletion core/dbt/parser/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ def add(
column: Union[HasDocs, UnparsedColumn],
description: str,
data_type: Optional[str],
constraint: Optional[str],
check: Optional[str],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See nodes.py

meta: Dict[str, Any],
):
tags: List[str] = []
Expand All @@ -145,6 +147,8 @@ def add(
name=column.name,
description=description,
data_type=data_type,
constraint=constraint,
check=check,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See nodes.py

meta=meta,
tags=tags,
quote=quote,
Expand All @@ -157,8 +161,10 @@ def from_target(cls, target: Union[HasColumnDocs, HasColumnTests]) -> "ParserRef
for column in target.columns:
description = column.description
data_type = column.data_type
constraint = column.constraint
check = column.check
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See nodes.py

meta = column.meta
refs.add(column, description, data_type, meta)
refs.add(column, description, data_type, constraint, check, meta)
return refs


Expand All @@ -168,6 +174,7 @@ def _trimmed(inp: str) -> str:
return inp[:44] + "..." + inp[-3:]


# TODO: I'll likely need to add a ConstraintsBuilder class similar to TestBuilder within SchemaParser. Test Comment
class SchemaParser(SimpleParser[GenericTestBlock, ParsedGenericTestNode]):
def __init__(
self,
Expand Down Expand Up @@ -310,6 +317,7 @@ def _parse_generic_test(
raise CompilationException(msg) from exc

original_name = os.path.basename(target.original_file_path)
# print(f"original_name: {original_name}")
compiled_path = get_pseudo_test_path(builder.compiled_name, original_name)

# fqn is the relative path of the yaml file where this generic test is defined,
Expand Down
26 changes: 25 additions & 1 deletion schemas/dbt/manifest/v8.json
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,10 @@
"type": "boolean",
"default": true
},
"constraints_enabled": {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How do you test the manifest?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

quis verificat ipsos verificantia? quis manifestat ipsos manifesta?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

google translate:

Who verifies the verifiers? Who makes them manifest?

"type": "boolean",
"default": false
},
"alias": {
"oneOf": [
{
Expand Down Expand Up @@ -830,6 +834,26 @@
}
]
},
"constraint": {
"oneOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"check": {
"oneOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"quote": {
"oneOf": [
{
Expand All @@ -849,7 +873,7 @@
}
},
"additionalProperties": true,
"description": "ColumnInfo(name: str, description: str = '', meta: Dict[str, Any] = <factory>, data_type: Optional[str] = None, quote: Optional[bool] = None, tags: List[str] = <factory>, _extra: Dict[str, Any] = <factory>)"
"description": "ColumnInfo(name: str, description: str = '', meta: Dict[str, Any] = <factory>, data_type: Optional[str] = None, constraint: Optional[str] = None, check: Optional[str] = None, quote: Optional[bool] = None, tags: List[str] = <factory>, _extra: Dict[str, Any] = <factory>)"
},
"InjectedCTE": {
"type": "object",
Expand Down