Scope
- Platform: Snowflake
- Scope: account xy12345, database CANOT_LAB
- Privilege level: 3 (+ privileges and tools (pseudonymized))
- SQL mode: read-only
- Reads: 33 done out of 35
- Content read: 12 tables, 25 objects, 6 query families
- Versions: canot X, duckdb X, sqlglot X
Capabilities
This report is an inventory: inventoried, neither exported nor replayed.
| Level | This report | Canot on Snowflake |
|---|---|---|
| Inventory | done by this scan (level 3) | full, levels 1 to 3 |
| Export | not done by this scan | iceberg, with canot drill |
| Evidence | not done by this scan | P1 data parity; P2 query replay, with canot drill |
Snowflake connector: tested; recorded test: canot drill, 2026-10-17: Snowflake trial account, TPC-H SF10 (docs/banc-essai.md).
What Canot cannot prove here: the declared forms (P1, P2) cover tables and queries; objects to rebuild besides tables are counted, not proven.
Observed costs
Window: 365 days. Credits measured; in dollars, only with the price provided or a dated list-price range.
| Item | Value | Nature and basis |
|---|---|---|
| Credits consumed | 43.50 credits | computed · S05 sum of credits per service over 365 days |
| In dollars | $113.10 to $226.20
| estimated, low confidence · S05 credits × list price of the credit, from lowest to highest |
Per service
| Service | Credits |
|---|---|
| WAREHOUSE_METERING | 41.50 credits |
| SERVERLESS_TASK | 1.20 credits |
| AUTO_CLUSTERING | 0.80 credits |
Per warehouse
| Warehouse | Credits |
|---|---|
| CANOT_WH | 40.00 credits |
| COMPUTE_WH | 1.50 credits |
Storage
| Item | Value | Nature and basis |
|---|---|---|
| Average billed storage | 24 GB | measured · S04 |
| Storage in dollars | Not estimated: your contract price not read. | not estimated |
Movements
3 frozen, 7 live, 1 recreated, 1 not determined.
recreated: DDL less than 7 days old with no later write; live: write less than 30 days old; frozen: older last write; not determined: writes not read. Based on: S01, S08, S25.
| Table | Type | Volume | Movement | Evidence |
|---|---|---|---|---|
| CANOT_LAB.RAW.ARCHIVE_1 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ARCHIVE_2 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ARCHIVE_3 | TABLE | 5 GB | frozen | last write on 2025-01-10 |
| CANOT_LAB.RAW.ORDERS | TABLE | 2 GB | live | last write on 2026-10-16 |
| CANOT_LAB.MART.FCT_ORDERS | TABLE | 1.5 GB | recreated | last DDL on 2026-10-17, no later write |
| CANOT_LAB.RAW.CUSTOMERS | TABLE | 800 MB | live | last write on 2026-10-15 |
| CANOT_LAB.RAW.ORDERS_CLONE | CLONE | 100 MB | live | last write on 2026-10-15 |
| CANOT_LAB.MART.DIM_LEGACY | TABLE | 10 MB | not determined | writes not read |
| CANOT_LAB.OPS.EVENTS_LOG | TABLE | 10 MB | live | last write on 2026-10-17 |
| CANOT_LAB.SANDBOX.OLD_EXPORT_2023 | TABLE | 10 MB | live | last write on 2026-10-15 |
| CANOT_LAB.SANDBOX.TEAM_WORK | TABLE | 10 MB | live | last write on 2026-10-15 |
| CANOT_LAB.EXT.US_STATES | EXTERNAL | not read | live | last write on 2026-10-15 |
What does not leave with the copy
Objects to rebuild or describe
| Type | Count | Examples |
|---|---|---|
| imported database | 2 | SNOWFLAKE, SNOWFLAKE_SAMPLE_DATA |
| tag | 1 | CANOT_LAB.OPS.PII |
| stream | 1 | CANOT_LAB.OPS.ORDERS_STREAM |
| function | 3 | CANOT_LAB.MART.CLEAN_NAME, CANOT_LAB.MART.FX_TO_CENTS, CANOT_LAB.MART.SLUG |
| share | 2 | S_CLIENTS, S_PARTNER |
| pipe | 1 | CANOT_LAB.OPS.P_EVENTS |
| row access policy | 1 | CANOT_LAB.OPS.RAP_COUNTRY |
| masking policy | 1 | CANOT_LAB.OPS.MP_EMAIL |
| procedure | 3 | CANOT_LAB.MART.SP_DYNAMIC_JS, CANOT_LAB.MART.SP_DYNAMIC_PY, CANOT_LAB.MART.SP_REFRESH_MART |
| stage | 2 | CANOT_LAB.EXT.S3_PUBLIC, CANOT_LAB.RAW.INT_STAGE |
| dynamic table | 1 | CANOT_LAB.MART.DT_COUNTRY_REVENUE |
| task | 4 | CANOT_LAB.OPS.T_DAILY, CANOT_LAB.OPS.T_EXPORT_NIGHTLY, CANOT_LAB.OPS.T_REFRESH, CANOT_LAB.OPS.T_SERVERLESS |
| view | 3 | CANOT_LAB.MART.V_KPI, CANOT_LAB.STAGING.STG_ORDERS, CANOT_LAB.STG.V_STATES |
Routines per language: JAVASCRIPT 2, PYTHON 2, SQL 2.
Columns with a platform-specific type (2)
| Table | Column | Type |
|---|---|---|
| CANOT_LAB.RAW.CUSTOMERS | profile | VARIANT |
| CANOT_LAB.RAW.CUSTOMERS | geo | GEOGRAPHY |
Billed history
| Item | Value | Nature and basis |
|---|---|---|
| Time Travel and Fail-safe (2 tables) | 6.3 GB | computed · S03 Time Travel + Fail-safe of present tables, + bytes still billed for dropped tables |
Dependencies
External dependencies (F01)
| Object | Type | Location |
|---|---|---|
| CANOT_LAB.EXT.S3_PUBLIC | stage | s3://canot-lab-public |
| SNOWFLAKE_SAMPLE_DATA | imported database | not read |
| CANOT_LAB.EXT.US_STATES | table | s3://canot-lab-public |
Hidden external dependencies (F02)
| Object | Path | Location |
|---|---|---|
| CANOT_LAB.MART.V_KPI | CANOT_LAB.MART.V_KPI → CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES | s3://canot-lab-public |
| CANOT_LAB.STG.V_STATES | CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES | s3://canot-lab-public |
Writes outside the platform (F03)
| Source | Mode | Destination |
|---|---|---|
| family 5cf082fb4538 | observed | s3://canot-lab-public |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | declared | s3://canot-lab-export |
External consumers (F09)
| Share | Accounts |
|---|---|
| S_CLIENTS | 2 |
Tools seen in queries
| Tool | Families | Executions |
|---|---|---|
| dbt | 1 | 40 |
| unidentified | 4 | 21 |
| tableau | 1 | 2 |
Connected clients (sessions)
| Client | Sessions |
|---|---|
| dbt-snowflake | 2,190 |
| looker | 310 |
Query replayability
| Category | Meaning | Families | Executions | Weight |
|---|---|---|---|---|
| C0 | translated and accepted by DuckDB | 0 | 0 | 0.00 credits |
| C1 | not parseable | 0 | 0 | 0.00 credits |
| C2 | command, not analyzed | 1 | 1 | 0.00 credits |
| C3 | translation impossible | 0 | 0 | 0.00 credits |
| C4 | DuckDB parse error | 1 | 5 | not read |
| C5 | binding error (platform-specific object or function) | 3 | 54 | 3.00 credits |
| C6 | variable | 0 | 0 | 0.00 credits |
| C7 | DDL, COPY, MERGE, metadata queries: counted separately | 1 | 3 | 0.20 credits |
| Item | Value | Nature and basis |
|---|---|---|
| C0 rate, by families | 0.0% | computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
| C0 rate, by executions | 0.0% | computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
| C0 rate, weighted | 0.0%
| computed · S24 translated and accepted by DuckDB (C0) / C0 to C6; C7 counted separately |
Based on: 0/5 families, window not read, sqlglot X, duckdb X.
accepted ≠ identical result. Translated to DuckDB, not compared.
1 family containing a secret, counted then set aside.
Platform-specific functions
| Function | Families |
|---|---|
| moteur:LAST_QUERY_ID | 1 |
| moteur:MY_UDF | 1 |
| moteur:RESULT_SCAN | 1 |
| stage | 1 |
| tablefromrows | 1 |
Most executed families (normalized forms)
| Category | Executions | Tool | Normalized form |
|---|---|---|---|
| C5 | 40 | dbt | SELECT o.id, o.amount FROM CANOT_LAB.RAW.ORDERS AS o WHERE o.id > ? |
| C5 | 12 | SELECT COUNT(*) FROM CANOT_LAB.RAW.ORDERS WHERE id = ? | |
| C4 | 5 | SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) | |
| C7 | 3 | COPY INTO @CANOT_LAB.EXT.S3_PUBLIC/out/ FROM (SELECT * FROM CANOT_LAB.RAW.ORDERS) | |
| C5 | 2 | tableau | SELECT MY_UDF(id) FROM CANOT_LAB.RAW.ARCHIVE_1 |
| C2 | 1 | EXECUTE |
Ranges
Planning estimates: each range carries its assumptions. A canot drill replaces the assumed throughput with a measurement.
| Item | Value | Nature and basis |
|---|---|---|
| Volume to copy | 19.4 GB
| computed · S03 sum of active bytes |
| Copy read time | 4 min to 16 min
| estimated, low confidence · S03 volume ÷ assumed throughput |
| Copy read credits | 0.07 credits to 0.27 credits
| estimated, low confidence · S03 time × credits per hour |
| Copy read cost | $0.18 to $1.40
| estimated, low confidence · S03 credits × list price of the credit, from lowest to highest |
| Rework | 5.2 d to 31.0 d
| estimated, low confidence · S02, S11, S12, S13, S14, S17 objects × days per object + columns × days per column |
Findings
Each finding is labeled "To review", with no severity level. It states what is observed and what is not.
F01 · External dependencyTo review
3 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.EXT.S3_PUBLIC | External stage (s3://canot-lab-public). |
| object SNOWFLAKE_SAMPLE_DATA | Database imported from an inbound share. |
| table CANOT_LAB.EXT.US_STATES | External table: data outside the platform (s3://canot-lab-public). |
F02 · Hidden external dependencyTo review
2 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.V_KPI | Depends on CANOT_LAB.EXT.US_STATES, outside the platform, through 2 levels: CANOT_LAB.MART.V_KPI → CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES (s3://canot-lab-public). |
| object CANOT_LAB.STG.V_STATES | Depends on CANOT_LAB.EXT.US_STATES, outside the platform, through 1 level: CANOT_LAB.STG.V_STATES → CANOT_LAB.EXT.US_STATES (s3://canot-lab-public). |
F03 · Write outside the platformTo review
2 findings
| Target | Observed |
|---|---|
| family 5cf082fb4538 | Write outside the platform observed: 3 executions; destination: s3://canot-lab-public. |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | Task that writes outside the platform (declared in its definition); destination: s3://canot-lab-export. |
F04 · Owner role with no holderTo review
1 finding
| Target | Observed |
|---|---|
| role LAB_ORPHAN | Role LAB_ORPHAN owns 1 object and is granted to no user, neither directly nor through another role. |
F05 · Storage with no observed readTo review
3 findings
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.ARCHIVE_1 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. Shared with 2 external consumers: their reads are not seen. |
| table CANOT_LAB.RAW.ARCHIVE_2 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. |
| table CANOT_LAB.RAW.ARCHIVE_3 | 5 GB stored. No read observed in ACCESS_HISTORY from 2025-10-18 to 2026-10-17; blind spots: share consumers, RESULT_SCAN. |
F06 · Billed history that does not transferTo review
1 finding
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.ORDERS | 6 GB of billed history (Time Travel and Fail-safe), retention 30 days, for 2 GB active; this history does not leave with the copy. |
F07 · Dropped table still billedTo review
1 finding
| Target | Observed |
|---|---|
| table CANOT_LAB.RAW.TMP_DROPPED | Dropped on 2026-10-10; 300 MB still billed (Time Travel and Fail-safe). |
F08 · Dynamic SQLTo review
2 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.SP_DYNAMIC_JS | Procedure (JAVASCRIPT): builds SQL at run time; the objects it touches cannot be read from the code. |
| object CANOT_LAB.MART.SP_DYNAMIC_PY | Procedure (PYTHON): builds SQL at run time; the objects it touches cannot be read from the code. |
F09 · External consumersTo review
1 finding
| Target | Observed |
|---|---|
| object S_CLIENTS | Share to 2 target accounts; 2 shared objects. Consumer reads are not seen by this scan. |
F10 · Security to rebuildTo review
5 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.OPS.MP_EMAIL | Masking policy applied to 1 object; it does not leave with the copy; the copy requires an unfiltered principal. |
| object CANOT_LAB.OPS.PII | Tag applied to 1 object; it does not leave with the copy. |
| object CANOT_LAB.OPS.RAP_COUNTRY | Row access policy applied to 1 object; it does not leave with the copy; the copy requires an unfiltered principal. |
| table CANOT_LAB.MART.FCT_ORDERS | Policies: OPS.RAP_COUNTRY. They do not leave with the copy; the copy requires a principal not filtered by these policies. |
| table CANOT_LAB.RAW.CUSTOMERS | Policies: OPS.MP_EMAIL; 1 tag. They do not leave with the copy; the copy requires a principal not filtered by these policies. |
F11 · Scheduled chain and its failuresTo review
7 findings
| Target | Observed |
|---|---|
| object CANOT_LAB.MART.DT_COUNTRY_REVENUE | Dynamic table, schedule 1 day; runs not read. |
| object CANOT_LAB.OPS.ORDERS_STREAM | Stream; on CANOT_LAB.RAW.ORDERS. |
| object CANOT_LAB.OPS.P_EVENTS | Pipe, state RUNNING; runs not read. |
| object CANOT_LAB.OPS.T_DAILY | Task, schedule USING CRON 0 3 * * * Europe/Paris, state started; 365 runs, 2 failures, last on 2026-10-17. |
| object CANOT_LAB.OPS.T_EXPORT_NIGHTLY | Task, schedule USING CRON 0 2 * * * UTC, state started; 30 runs, 30 failures, last on 2026-10-17. |
| object CANOT_LAB.OPS.T_REFRESH | Task, state started; 365 runs, 0 failures, last on 2026-10-17; chain: CANOT_LAB.OPS.T_DAILY → CANOT_LAB.OPS.T_REFRESH. |
| object CANOT_LAB.OPS.T_SERVERLESS | Task, schedule 60 MINUTE, state suspended; 0 runs, 0 failures. |
F12 · Incomplete readTo review
3 findings
| Target | Observed |
|---|---|
| read S33 | STREAMS not read (missing privilege); limits: streams (F11). |
| read S34 | TASK_VERSIONS not read (missing privilege); limits: task versions (F11). |
| read lectures_par_table | Reads not determined for 1 table; limits: storage with no observed read (F05). |
What this report does not quantify
- Storage cost: your contract price not read.
- Your contract rate: your contract price not read.
- Destination storage, running both platforms in parallel, operations after the exit: depend on your contract and your architecture.
- Identical results of translated queries: accepted ≠ identical result: translated to DuckDB, not compared; a canot drill compares the results.
- Cost projections provided by the platform: not used: they cannot be verified from the scan.
Method
33 reads done out of 35. Each read is recorded with its status and its reason; a value that was not read stays empty, never 0.
| Id | View | Status | Reason | Rows | Window | Latency |
|---|---|---|---|---|---|---|
| S33 | STREAMS | not read | missing privilege; limits: streams (F11) | not read | ||
| S34 | TASK_VERSIONS | not read | missing privilege; limits: task versions (F11) | not read | ||
| S01 | TABLES | read | 10 | 1.5 h | ||
| S02 | COLUMNS | read | 10 | |||
| S03 | TABLE_STORAGE_METRICS | read | 10 | 2 h | ||
| S04 | STORAGE_USAGE | read | 10 | from 2025-10-18 to 2026-10-17 | ||
| S05 | METERING_DAILY_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 3 h | |
| S06 | WAREHOUSE_METERING_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 3 h | |
| S07 | QUERY_ATTRIBUTION_HISTORY | read | 10 | |||
| S08 | TABLE_DML_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 6 h | |
| S09 | TABLE_QUERY_PRUNING_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | 4 h | |
| S10 | OBJECT_DEPENDENCIES | read | 10 | |||
| S11 | VIEWS | read | 10 | |||
| S12 | FUNCTIONS | read | 10 | |||
| S13 | PROCEDURES | read | 10 | |||
| S14 | TASKS | read | 10 | |||
| S15 | TASK_HISTORY | read | 10 | from 2025-10-18 to 2026-10-17 | ||
| S16 | SERVERLESS_TASK_HISTORY | read | 10 | |||
| S17 | PIPES | read | 10 | |||
| S18 | COPY_HISTORY | read | 10 |
… and 15 more in reads.csv.
Privileges used
Level 3: SNOWFLAKE.OBJECT_VIEWER, SNOWFLAKE.USAGE_VIEWER, SNOWFLAKE.GOVERNANCE_VIEWER, SNOWFLAKE.SECURITY_VIEWER. Never requested: IMPORTED PRIVILEGES, MANAGE GRANTS, IMPORT SHARE, USAGE on functions, READ on stages.
Cost of the scan
| Item | Value | Nature and basis |
|---|---|---|
| Queries sent | 35 queries | measured |
| Read time | 412 s | measured |
Safeguards
- Every SQL statement sent goes through a read-only guard: only SELECT, SHOW, DESCRIBE and ALTER SESSION SET statements go out. No write, no API activation, no parameter change.
- Query users and roles pseudonymized with HMAC, using a salt drawn for this scan and never written; tag values hashed; locations reduced to the bucket.
- Raw SQL text is never written: only normalized forms, with literals masked, leave collection.
Rules
- Movement: recreated: DDL less than 7 days old with no later write; live: write less than 30 days old; frozen: older last write; not determined: writes not read.
- Storage with no read: actual window of the view read, compared with 365 days; the blind spots of each view are listed in the finding.
- Copy time: assumed throughput of 20 to 80 MB/s.
- List prices are dated and sourced; they do not replace your contract price.
Next steps
This report describes your platform; it recommends neither leaving nor staying.
To measure an exit on a chosen scope: canot drill copies to Apache Iceberg, compares source and copy, and signs an evidence report.
To go further, the q4o assessment, from €22,000 excl. VAT: your contract rate, actual execution, scenarios, the steps to follow. canot.io