Дизайн схемы DuckDB CPG (CPG Spec v1.1)¶
Содержание¶
- Содержание
- Обзор
- Основные принципы проектирования
- Таблицы узлов
- nodes_method
- nodes_call
- nodes_identifier
- nodes_field_identifier
- nodes_literal
- nodes_local
- nodes_param
- nodes_method_parameter_out
- nodes_method_return
- nodes_return
- nodes_block
- nodes_control_structure
- nodes_member
- nodes_type_decl
- nodes_metadata
- nodes_file
- nodes_namespace_block
- nodes_method_ref
- nodes_type_ref
- nodes_unknown
- nodes_jump_target
- nodes_type_param
- nodes_type_argument
- nodes_binding
- nodes_closure_binding
- nodes_comment
- nodes_modifier
- nodes_annotation
- nodes_type
- nodes_jump_label
- nodes_tag_v2
- nodes_finding
- nodes_macro
- nodes_macro_param
- nodes_namespace
- nodes_annotation_literal
- nodes_annotation_parameter
- nodes_annotation_parameter_assign
- nodes_key_value_pair
- nodes_location
- nodes_config_file
- nodes_import
- nodes_collection_decl
- Таблицы рёбер
- edges_ast
- edges_cfg
- edges_call
- edges_ref
- edges_reaching_def
- edges_argument
- edges_receiver
- edges_condition
- edges_dominate
- edges_post_dominate
- edges_cdg
- edges_binds
- edges_binds_to
- edges_source_file
- edges_alias_of
- edges_inherits_from
- edges_contains
- edges_eval_type
- edges_tagged_by
- edges_parameter_link
- edges_pdg
- edges_ddg
- edges_capture
- edges_vtable
- edges_documents
- Представления
- call_containment
- method_docstrings
- Таблицы состояния
- Таблицы доменов и шаблонов
- Определение графа свойств
- Шаг 1: Создание материализованной объединённой таблицы узлов
- Шаг 2: Создание комплексного графа свойств
- Примеры запросов
- Стандартный SQL-запрос: Поиск всех вызовов определённого метода
- DuckDB PGQ-запрос: Поиск прямых цепочек вызовов (вызывающий -> вызываемый)
- DuckDB PGQ-запрос: Поиск методов и их дочерних элементов в AST
- DuckDB PGQ-запрос: Пути потока данных с использованием REACHING_DEF
- DuckDB PGQ-запрос: Пути CFG (управляющий поток)
- DuckDB PGQ-запрос: Поиск всех идентификаторов и их ссылок
- DuckDB PGQ-запрос: Иерархия типов (наследование)
- Комбинированный запрос: Методы с наибольшим количеством входящих вызовов
- Соображения по производительности
- Версия схемы
- Журнал изменений
- v7.0 (2026-02-28) — Полное соответствие schema.go
- v6.0 (2026-02-26) — Предвычисленные метрики и флаги шаблонов
- v5.0 (2025-11-16) — Полное соответствие
- v4.0 (2025-11-16) — Поддержка пространств имён и файлов
- v3.0 (2025-11-16) — Поддержка ООП
- v2.0 (2025-11-16) — Критические обновления
- v1.0 (2025-11-15) — Первоначальный выпуск
- Расширение: Система семантических меток
- Обзор
- nodes_tag_v2
- edges_tagged_by
- Категории меток
- Примеры запросов с метками
- Статистика по меткам
- Примечания по интеграции
Обзор¶
Эта схема реализует спецификацию графа свойств кода (CPG) версии 1.1 в DuckDB с использованием расширения duckpgq для эффективного выполнения запросов к графам свойств.
Основные принципы проектирования¶
- Таблицы узлов: Отдельные таблицы для каждого основного типа узлов (METHOD, CALL, IDENTIFIER и т.д.)
- Таблицы рёбер: Отдельные таблицы для каждого типа рёбер (AST, CFG, CALL, REF, REACHING_DEF и т.д.)
- Граф свойств: Использование команды CREATE PROPERTY GRAPH из duckpgq для объединённых графовых запросов
- Эффективное индексирование: Индексы B-дерева по полям id, full_name и другим часто используемым свойствам
- Пакетная обработка: Поддержка массового импорта CPG (50K+ методов)
GoCPG vs устаревшая схема¶
GoCPG генерирует DuckDB напрямую и создаёт дополнительные таблицы, отсутствующие в устаревших экспортах Joern:
| Таблица только в GoCPG | Назначение |
|---|---|
nodes_import |
Операторы импорта/включения с разрешёнными путями |
nodes_finding |
Результаты статического анализа (безопасность, качество) |
nodes_macro |
Макросы препроцессора (C/C++) |
edges_ddg |
Рёбра графа зависимостей по данным |
edges_pdg |
Рёбра графа программных зависимостей |
edges_contains |
Рёбра вложенности (метод→узел) |
edges_parameter_link |
Связи параметров с аргументами |
edges_eval_type |
Рёбра вычисления типов |
GoCPG также предварительно вычисляет cyclomatic_complexity в nodes_method и method_id в nodes_param.
Примечание о
cpg_nodes: Материализованная таблицаcpg_nodes(UNION ALL всех таблиц узлов) используется только для определения графа свойств DuckPGQ. Её не следует использовать в прикладном коде — используйте конкретные таблицыnodes_*. Базы данных GoCPG не генерируютcpg_nodes; слой совместимости создаёт её по требованию, когда нужны запросы к графу свойств.
Таблицы узлов¶
nodes_method¶
Основная таблица для объявлений функций/методов.
CREATE TABLE nodes_method (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
full_name VARCHAR NOT NULL,
signature VARCHAR,
filename VARCHAR,
line_number INTEGER,
line_number_end INTEGER,
column_number INTEGER,
column_number_end INTEGER,
code VARCHAR,
is_external BOOLEAN DEFAULT FALSE,
ast_parent_type VARCHAR,
ast_parent_full_name VARCHAR,
loc INTEGER,
parameter_count INTEGER,
-- Предвычисленные флаги паттернов (v6.0)
has_disabled_code BOOLEAN DEFAULT FALSE,
has_deprecated BOOLEAN DEFAULT FALSE,
has_todo_fixme BOOLEAN DEFAULT FALSE,
has_debug_code BOOLEAN DEFAULT FALSE,
-- Классификационные флаги (v6.0)
is_test BOOLEAN DEFAULT FALSE,
is_entry_point BOOLEAN DEFAULT FALSE,
is_nested BOOLEAN DEFAULT FALSE,
-- Предвычисленные метрики (v6.0)
cyclomatic_complexity INTEGER DEFAULT 0,
fan_in INTEGER DEFAULT 0,
fan_out INTEGER DEFAULT 0,
-- Эмбеддинги (заполняются внешним импортом ChromaDB)
embedding FLOAT[],
embedding_model VARCHAR,
embedding_updated_at TIMESTAMP,
-- Хеш AST (для инкрементального обнаружения изменений)
ast_hash VARCHAR
);
Свойства (из спецификации CPG): - FULL_NAME, NAME, SIGNATURE: Идентификация метода - IS_EXTERNAL: Определён ли в исходном коде - AST_PARENT_FULL_NAME, AST_PARENT_TYPE: Контекст типа - FILENAME, LINE_NUMBER, COLUMN_NUMBER: Расположение в исходном коде - CODE: Исходный код метода (усечён до 1000 символов) - LOC: Количество строк кода - PARAMETER_COUNT: Количество параметров - AST_HASH: SHA256-хеш структуры AST (для инкрементального обнаружения изменений)
Предвычисленные флаги шаблонов (v6.0 – GoCPG):
- HAS_DISABLED_CODE: Содержит #if 0, if false или закомментированные блоки
- HAS_DEPRECATED: Содержит @Deprecated, [[deprecated]] или аналогичные аннотации
- HAS_TODO_FIXME: Содержит комментарии TODO, FIXME, HACK, XXX
- HAS_DEBUG_CODE: Содержит отладочный вывод, console.log, отладочные операторы
Классификационные флаги (v6.0 – GoCPG): - IS_TEST: Метод идентифицирован как тестовая функция (кросс-языковое определение) - IS_ENTRY_POINT: Метод является точкой входа публичного API (экспортируемый, HTTP-обработчик, main и т.д.) - IS_NESTED: Метод определён внутри другого метода (замыкание/вложенная функция)
Предвычисленные метрики (v6.0 – GoCPG): - CYCLOMATIC_COMPLEXITY: Цикломатическая сложность по Маккейбу - FAN_IN: Количество методов, вызывающих данный метод - FAN_OUT: Количество методов, вызываемых данным методом
Примеры запросов с предвычисленными флагами:
-- Поиск сложных методов с высоким fan-out (потенциальные «god-методы»)
SELECT full_name, cyclomatic_complexity, fan_out
FROM nodes_method
WHERE cyclomatic_complexity > 20 AND fan_out > 15
ORDER BY cyclomatic_complexity DESC;
-- Поиск устаревших методов, которые всё ещё вызываются
SELECT m.full_name, m.fan_in
FROM nodes_method m
WHERE m.has_deprecated = TRUE AND m.fan_in > 0;
-- Соотношение тестового и продуктивного кода
SELECT is_test, COUNT(*) as count
FROM nodes_method
GROUP BY is_test;
-- Поиск точек входа API с высокой сложностью
SELECT full_name, cyclomatic_complexity, fan_in
FROM nodes_method
WHERE is_entry_point = TRUE AND cyclomatic_complexity > 10
ORDER BY cyclomatic_complexity DESC;
nodes_call¶
Представляет вызовы функций/методов.
CREATE TABLE nodes_call (
id BIGINT NOT NULL,
name VARCHAR,
method_full_name VARCHAR,
signature VARCHAR,
dispatch_type VARCHAR,
code VARCHAR,
line_number INTEGER,
column_number INTEGER,
argument_index INTEGER,
filename VARCHAR,
type_full_name VARCHAR,
containing_method_id BIGINT,
callee_method_id BIGINT,
type_origin VARCHAR DEFAULT '',
type_confidence DOUBLE DEFAULT 0.0,
embedding FLOAT[],
embedding_model VARCHAR,
embedding_updated_at TIMESTAMP
);
Свойства (из спецификации CPG): - METHOD_FULL_NAME: Целевой метод - DISPATCH_TYPE: Механизм вызова (STATIC_DISPATCH, DYNAMIC_DISPATCH) - TYPE_FULL_NAME: Возвращаемый тип - SIGNATURE: Типы параметров - CONTAINING_METHOD_ID: Идентификатор метода, содержащего место вызова - CALLEE_METHOD_ID: Идентификатор разрешённого вызываемого метода - TYPE_ORIGIN: Источник вывода типов (например, TypeRecoveryPass) - TYPE_CONFIDENCE: Уровень уверенности вывода типов (0.0-1.0)
nodes_identifier¶
Имена переменных и ссылок.
CREATE TABLE nodes_identifier (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
type_full_name VARCHAR,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
Свойства (из спецификации CPG): - NAME: Идентификатор переменной - TYPE_FULL_NAME: Тип переменной - CONTAINING_METHOD_ID: Идентификатор содержащего метода
nodes_field_identifier¶
Идентификаторы доступа к полям (ООП — например, obj.field).
CREATE TABLE nodes_field_identifier (
id BIGINT NOT NULL,
canonical_name VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
Свойства (из спецификации CPG): - CANONICAL_NAME: Нормализованное имя (например, “myField” для a.myField и b.myField) - CODE: Доступ к полю в исходном виде (например, “obj.field”) - Назначение: Определение обращений к полям в ООП-коде (критично для анализа псевдонимов)
Пример:
struct Point { int x, y; };
Point p;
p.x = 10; // <- "x" — FIELD_IDENTIFIER с canonical_name="x"
nodes_literal¶
Константные значения.
CREATE TABLE nodes_literal (
id BIGINT NOT NULL,
code VARCHAR NOT NULL,
type_full_name VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
Свойства (из спецификации CPG): - TYPE_FULL_NAME: Тип литерала - CODE: Значение литерала
nodes_local¶
Объявления локальных переменных.
CREATE TABLE nodes_local (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
type_full_name VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
Свойства (из спецификации CPG): - NAME: Имя локальной переменной - TYPE_FULL_NAME: Объявленный тип
nodes_param¶
Параметры метода (формальные параметры).
CREATE TABLE nodes_param (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
type_full_name VARCHAR,
index INTEGER,
is_variadic BOOLEAN DEFAULT FALSE,
evaluation_strategy VARCHAR,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
method_id BIGINT,
parent_param_id BIGINT,
typedef_id BIGINT,
struct_member_id BIGINT
);
Свойства (из спецификации CPG): - INDEX: Позиция параметра - IS_VARIADIC: Параметр переменной длины - EVALUATION_STRATEGY: BY_VALUE, BY_REFERENCE, BY_SHARING - METHOD_ID: Идентификатор содержащего метода - PARENT_PARAM_ID: Идентификатор родительского параметра (для вложенных/деструктурированных параметров) - TYPEDEF_ID: Идентификатор узла typedef (для разрешения C typedef) - STRUCT_MEMBER_ID: Идентификатор члена структуры (для разрешения членов C struct)
nodes_method_parameter_out¶
Выходные параметры метода (для анализа SSA/потока данных). Множественные возвращаемые значения Go.
CREATE TABLE nodes_method_parameter_out (
id BIGINT NOT NULL,
name VARCHAR,
type_full_name VARCHAR,
code VARCHAR,
index INTEGER,
evaluation_strategy VARCHAR,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
method_id BIGINT
);
Свойства (из спецификации CPG): - Соответствует METHOD_PARAMETER_IN для анализа потока данных - INDEX: Позиция параметра (совпадает с входным параметром) - EVALUATION_STRATEGY: BY_VALUE, BY_REFERENCE, BY_SHARING - METHOD_ID: Идентификатор содержащего метода - Требуется для анализа SSA (Static Single Assignment)
nodes_method_return¶
Параметр возврата метода (формальный возврат).
CREATE TABLE nodes_method_return (
id BIGINT NOT NULL,
type_full_name VARCHAR,
code VARCHAR,
evaluation_strategy VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
method_id BIGINT
);
Свойства (из спецификации CPG): - TYPE_FULL_NAME: Тип возврата - CODE: Обычно “RET” или пусто - EVALUATION_STRATEGY: Способ передачи возвращаемого значения - METHOD_ID: Идентификатор содержащего метода - Один на метод (формальный параметр возврата, не оператор return)
nodes_return¶
Операторы возврата (фактический return в коде).
CREATE TABLE nodes_return (
id BIGINT NOT NULL,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
Примечание: Это узел оператора RETURN. Отличается от METHOD_RETURN, который является формальным параметром возврата.
nodes_block¶
Составные операторы (блоки кода).
CREATE TABLE nodes_block (
id BIGINT NOT NULL,
type_full_name VARCHAR,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
nodes_control_structure¶
Конструкции управления потоком (if, while, for и т.д.).
CREATE TABLE nodes_control_structure (
id BIGINT NOT NULL,
control_structure_type VARCHAR NOT NULL,
parser_type_name VARCHAR,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
containing_method_id BIGINT
);
Свойства (из спецификации CPG): - CONTROL_STRUCTURE_TYPE: BREAK, CONTINUE, DO, WHILE, FOR, GOTO, IF, ELSE, TRY, THROW, SWITCH
nodes_member¶
Члены типов (поля классов/структур).
CREATE TABLE nodes_member (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
type_full_name VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
Свойства (из спецификации CPG): - NAME: Имя члена (например, “x”, “y”) - TYPE_FULL_NAME: Тип члена (например, “int”, “std::string”) - AST_PARENT_FULL_NAME: Содержащий тип - Назначение: Представление полей/членов классов/структур
Пример:
struct Point {
int x; // <- MEMBER: name="x", type_full_name="int"
int y; // <- MEMBER: name="y", type_full_name="int"
};
nodes_type_decl¶
Объявления типов (классы, структуры).
CREATE TABLE nodes_type_decl (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
full_name VARCHAR NOT NULL,
alias_type_full_name VARCHAR,
inherits_from_type_full_name VARCHAR[],
is_external BOOLEAN DEFAULT FALSE,
filename VARCHAR,
line_number INTEGER,
ast_parent_type VARCHAR,
ast_parent_full_name VARCHAR,
code VARCHAR
);
Свойства (из спецификации CPG): - FULL_NAME, NAME: Идентификация типа - IS_EXTERNAL: Определён ли в исходном коде - INHERITS_FROM_TYPE_FULL_NAME: Базовые типы (массив) - ALIAS_TYPE_FULL_NAME: Псевдоним типа - AST_PARENT_TYPE, AST_PARENT_FULL_NAME: Контекст родительского типа
nodes_metadata¶
Метаданные CPG (требуются спецификацией).
CREATE TABLE nodes_metadata (
id BIGINT NOT NULL,
language VARCHAR NOT NULL,
version VARCHAR DEFAULT '1.1',
root VARCHAR,
overlays VARCHAR[],
hash VARCHAR
);
Свойства (из спецификации CPG): - LANGUAGE: Язык исходного кода - VERSION: Версия спецификации CPG (по умолчанию “1.1”) - ROOT: Корневой путь - OVERLAYS: Применённые оверлеи - HASH: Хеш содержимого
nodes_file¶
Узлы исходных файлов (требуются спецификацией).
CREATE TABLE nodes_file (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
hash VARCHAR,
ast_hash VARCHAR,
content VARCHAR,
size_bytes BIGINT,
language VARCHAR
);
Свойства (из спецификации CPG): - NAME: Путь к файлу относительно корня (из METADATA.ROOT) - HASH: Хеш SHA-256 или MD5 содержимого файла - AST_HASH: Хеш структуры AST (для инкрементального обнаружения изменений) - CONTENT: Необязательно — полный исходный код файла - SIZE_BYTES: Размер файла в байтах - LANGUAGE: Определённый язык программирования
Назначение: - Индекс для поиска всех элементов кода по файлу - Корневые узлы деревьев синтаксического анализа (AST) - Хранение метаданных исходных файлов - Требуется для рёбер SOURCE_FILE
Пример:
name="src/main.c", hash="abc123...", order_index=0
Примечание: Каждый исходный файл ДОЛЖЕН иметь ровно один узел FILE. Узлы FILE служат корнями AST и позволяют переходить от файла ко всем содержащимся в нём элементам кода.
nodes_namespace_block¶
Узлы блоков пространств имён (области видимости пространств имён).
CREATE TABLE nodes_namespace_block (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
full_name VARCHAR NOT NULL,
filename VARCHAR,
order_index INTEGER
);
Свойства (из спецификации CPG): - NAME: Человекочитаемое имя пространства имён (например, “foo.bar”) - С точками: “foo.bar” означает пространство имён “bar” внутри “foo” - FULL_NAME: Уникальный идентификатор, объединяющий файл и пространство имён - Должен включать информацию о файле для обеспечения уникальности - FILENAME: Исходный файл, содержащий этот блок пространства имён - ORDER_INDEX: Позиция в родительском AST
Назначение:
- Представление блоков пространств имён (C++ namespace{}, Java package)
- Структурирование кода на логические единицы
- Возможность запросов к коду по пространству имён
- Поддержка анализа многокомпонентных пространств имён
Примеры:
// C++:
namespace foo {
namespace bar {
// код
}
}
// NAME="foo.bar", FULL_NAME="main.cpp:foo.bar"
// Java:
package com.example.myapp;
// NAME="com.example.myapp", FULL_NAME="Main.java:com.example.myapp"
Примечание: Узлы NAMESPACE (индексы) автоматически генерируются из узлов NAMESPACE_BLOCK при загрузке CPG.
nodes_method_ref¶
Узлы ссылок на методы (метод как значение).
CREATE TABLE nodes_method_ref (
id BIGINT NOT NULL,
method_full_name VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
Свойства (из спецификации CPG): - METHOD_FULL_NAME: Полное имя ссылочного метода - CODE: Как ссылка отображается в исходном коде
Назначение: - Представление методов, передаваемых как аргументы (функции высшего порядка)
nodes_type_ref¶
Ссылки на типы (тип как значение).
CREATE TABLE nodes_type_ref (
id BIGINT NOT NULL,
type_full_name VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_unknown¶
Узлы неизвестных конструкций AST (универсальный тип).
CREATE TABLE nodes_unknown (
id BIGINT NOT NULL,
parser_type_name VARCHAR NOT NULL,
code VARCHAR,
type_full_name VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_jump_target¶
Цели переходов (метки для goto/break/continue).
CREATE TABLE nodes_jump_target (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
argument_index INTEGER,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_type_param¶
Параметры типов (формальные параметры дженериков/шаблонов).
CREATE TABLE nodes_type_param (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
constraint_type VARCHAR,
“index” INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
method_id BIGINT,
type_decl_id BIGINT
);
nodes_type_argument¶
Аргументы типов (фактические аргументы дженериков/шаблонов).
CREATE TABLE nodes_type_argument (
id BIGINT NOT NULL,
code VARCHAR,
order_index INTEGER
);
nodes_binding¶
Привязки имён и сигнатур (разрешение методов).
CREATE TABLE nodes_binding (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
signature VARCHAR,
method_full_name VARCHAR
);
nodes_closure_binding¶
Захват переменных замыканиями.
CREATE TABLE nodes_closure_binding (
id BIGINT NOT NULL,
closure_binding_id VARCHAR,
closure_original_name VARCHAR,
evaluation_strategy VARCHAR,
filename VARCHAR
);
nodes_comment¶
Комментарии в исходном коде.
CREATE TABLE nodes_comment (
id BIGINT NOT NULL,
code VARCHAR NOT NULL,
filename VARCHAR,
hash VARCHAR,
line_number INTEGER,
line_number_end INTEGER,
column_number INTEGER,
column_number_end INTEGER,
“offset” INTEGER,
“offset_end” INTEGER,
order_index INTEGER,
containing_method_id BIGINT,
comment_type VARCHAR,
documented_node_id BIGINT,
binding_type VARCHAR
);
nodes_modifier¶
Модификаторы доступа.
CREATE TABLE nodes_modifier (
id BIGINT NOT NULL,
modifier_type VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER
);
nodes_annotation¶
Аннотации и декораторы методов/классов.
CREATE TABLE nodes_annotation (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
full_name VARCHAR,
code VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_type¶
Экземпляры типов.
CREATE TABLE nodes_type (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
full_name VARCHAR NOT NULL,
type_decl_full_name VARCHAR
);
nodes_jump_label¶
Метки переходов (для операторов goto).
CREATE TABLE nodes_jump_label (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_tag_v2¶
Теги внешнего контекста (система обогащения).
CREATE TABLE nodes_tag_v2 (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
value VARCHAR,
external_source VARCHAR,
external_id VARCHAR,
external_url VARCHAR,
confidence FLOAT,
metadata JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
nodes_finding¶
Результаты статического анализа (безопасность, качество).
CREATE TABLE nodes_finding (
id BIGINT NOT NULL,
title VARCHAR NOT NULL,
description VARCHAR,
severity VARCHAR,
category VARCHAR,
confidence FLOAT DEFAULT 1.0,
source VARCHAR,
rule_id VARCHAR,
status VARCHAR DEFAULT 'open',
metadata JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
nodes_macro¶
Макросы препроцессора C.
CREATE TABLE nodes_macro (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
body VARCHAR,
is_function_like BOOLEAN DEFAULT FALSE,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_macro_param¶
Параметры функциональных макросов.
CREATE TABLE nodes_macro_param (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
index_ INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR,
macro_id BIGINT
);
nodes_namespace¶
Индексные узлы пространств имён (отличаются от NAMESPACE_BLOCK).
CREATE TABLE nodes_namespace (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
code VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_annotation_literal¶
Литеральные значения в аннотациях.
CREATE TABLE nodes_annotation_literal (
id BIGINT NOT NULL,
name VARCHAR,
code VARCHAR,
order_index INTEGER,
argument_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_annotation_parameter¶
Формальные параметры аннотаций.
CREATE TABLE nodes_annotation_parameter (
id BIGINT NOT NULL,
code VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_annotation_parameter_assign¶
Присвоение аргументов параметрам аннотаций.
CREATE TABLE nodes_annotation_parameter_assign (
id BIGINT NOT NULL,
code VARCHAR,
order_index INTEGER,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
nodes_key_value_pair¶
Пары ключ-значение для находок.
CREATE TABLE nodes_key_value_pair (
id BIGINT NOT NULL,
key VARCHAR NOT NULL,
value VARCHAR
);
nodes_location¶
Сводка расположения в исходном коде.
CREATE TABLE nodes_location (
id BIGINT NOT NULL,
class_name VARCHAR,
class_short_name VARCHAR,
method_short_name VARCHAR,
node_label VARCHAR,
package_name VARCHAR,
symbol VARCHAR,
filename VARCHAR,
line_number INTEGER,
method_full_name VARCHAR
);
nodes_collection_decl¶
Именованные объявления коллекций (dict, list, set, tuple, enum).
CREATE TABLE nodes_collection_decl (
id BIGINT NOT NULL,
parent_id BIGINT,
class_id BIGINT,
name VARCHAR,
full_name VARCHAR,
collection_type VARCHAR,
element_count INTEGER,
filename VARCHAR,
line_number INTEGER,
keys_json VARCHAR,
value_type_hint VARCHAR
);
Свойства:
- NAME: Имя переменной (напр. CWE_DATABASE)
- FULL_NAME: FQN (напр. src/security/kb.py:CWE_DATABASE)
- COLLECTION_TYPE: dict, list, set, tuple, enum
- ELEMENT_COUNT: Количество элементов верхнего уровня
- KEYS_JSON: JSON-массив ключей словаря (макс. 256, только для dict)
- VALUE_TYPE_HINT: Предполагаемый тип значений (если однородный)
Поддержка: только Python-фронтенд. JS/TS/Go/Java — планируется.
nodes_config_file¶
Содержимое конфигурационных файлов.
CREATE TABLE nodes_config_file (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
content VARCHAR
);
nodes_import¶
Операторы импорта/включения.
CREATE TABLE nodes_import (
id BIGINT NOT NULL,
imported_entity VARCHAR NOT NULL,
imported_as VARCHAR,
is_wildcard BOOLEAN DEFAULT FALSE,
is_explicit BOOLEAN DEFAULT TRUE,
code VARCHAR,
line_number INTEGER,
column_number INTEGER,
filename VARCHAR
);
Таблицы рёбер¶
edges_ast¶
Рёбра дерева абстрактного синтаксиса (отношения «родитель-потомок»).
CREATE TABLE edges_ast (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_ast_src ON edges_ast(src);
CREATE INDEX idx_ast_dst ON edges_ast(dst);
edges_cfg¶
Рёбра графа потока управления (Control Flow Graph).
CREATE TABLE edges_cfg (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_cfg_src ON edges_cfg(src);
CREATE INDEX idx_cfg_dst ON edges_cfg(dst);
edges_call¶
Рёбра от вызова метода к его объявлению.
CREATE TABLE edges_call (
src BIGINT NOT NULL,
dst BIGINT NOT NULL,
cross_language BOOLEAN DEFAULT FALSE,
binding_type VARCHAR DEFAULT ''
);
CREATE INDEX idx_call_edge_src ON edges_call(src);
CREATE INDEX idx_call_edge_dst ON edges_call(dst);
Свойства: - CROSS_LANGUAGE: Является ли вызов кросс-языковым (например, CGO Go->C, ctypes Python->C) - BINDING_TYPE: Способ разрешения вызова (например, “exact”, “name_only”, “import_path”)
edges_ref¶
Рёбра ссылок (идентификатор → объявление).
CREATE TABLE edges_ref (
src BIGINT NOT NULL, -- ID узла IDENTIFIER/CALL
dst BIGINT NOT NULL -- ID узла DECLARATION (LOCAL, PARAM, METHOD, TYPE_DECL)
);
CREATE INDEX idx_ref_src ON edges_ref(src);
CREATE INDEX idx_ref_dst ON edges_ref(dst);
edges_reaching_def¶
Рёбра потока данных (достижимые определения).
CREATE TABLE edges_reaching_def (
src BIGINT NOT NULL,
dst BIGINT NOT NULL,
variable VARCHAR -- Имя переменной
);
CREATE INDEX idx_reaching_def_src ON edges_reaching_def(src);
CREATE INDEX idx_reaching_def_dst ON edges_reaching_def(dst);
CREATE INDEX idx_reaching_def_var ON edges_reaching_def(variable);
Свойства (из спецификации CPG): - VARIABLE: имя отслеживаемой переменной
edges_argument¶
Рёбра аргументов (вызов → выражения аргументов, возврат → возвращаемое выражение).
CREATE TABLE edges_argument (
src BIGINT NOT NULL,
dst BIGINT NOT NULL,
argument_index INTEGER,
argument_name VARCHAR
);
CREATE INDEX idx_argument_src ON edges_argument(src);
CREATE INDEX idx_argument_dst ON edges_argument(dst);
Свойства: - ARGUMENT_INDEX: Позиция аргумента в списке аргументов - ARGUMENT_NAME: Имя именованного аргумента (для языков с ключевыми аргументами)
edges_receiver¶
Рёбра получателя (вызов → выражение-получатель).
CREATE TABLE edges_receiver (
src BIGINT NOT NULL, -- ID узла CALL
dst BIGINT NOT NULL -- ID выражения-получателя
);
edges_condition¶
Рёбра условия (управляющая структура → условное выражение).
CREATE TABLE edges_condition (
src BIGINT NOT NULL, -- ID узла CONTROL_STRUCTURE
dst BIGINT NOT NULL -- ID узла выражения
);
edges_dominate¶
Рёбра непосредственного доминирования (доминирование в потоке управления).
CREATE TABLE edges_dominate (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_dominate_src ON edges_dominate(src);
CREATE INDEX idx_dominate_dst ON edges_dominate(dst);
edges_post_dominate¶
Рёбра пост-доминирования.
CREATE TABLE edges_post_dominate (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_post_dominate_src ON edges_post_dominate(src);
CREATE INDEX idx_post_dominate_dst ON edges_post_dominate(dst);
edges_cdg¶
Рёбра графа управляющих зависимостей (CRITICAL для PDG).
CREATE TABLE edges_cdg (
src BIGINT NOT NULL, -- ID узла управляющей структуры (условие/ветвление)
dst BIGINT NOT NULL -- ID зависимого узла (кода, зависящего от условия)
);
Свойства (из спецификации CPG): - Ребро CDG означает: dst зависит от src по управлению - Критически важно для построения графа зависимостей программы (PDG = DDG + CDG) - Используется для срезов программы, анализа безопасности, оптимизаций компилятора - Пример: операторы внутри блока IF зависят по управлению от условия IF
edges_binds¶
Рёбра привязки имён (связывание имён).
CREATE TABLE edges_binds (
src BIGINT NOT NULL, -- ID узла BINDING
dst BIGINT NOT NULL -- ID узла METHOD или TYPE_DECL
);
Свойства (из спецификации CPG): - Связывает узлы BINDING с их объявлениями - Используется для разрешения имён переменных и функций - Пример: оператор import связывает имя с фактическим определением
edges_binds_to¶
Обратные рёбра привязки (использование имён).
CREATE TABLE edges_binds_to (
src BIGINT NOT NULL, -- ID узла ссылки на переменную/функцию
dst BIGINT NOT NULL -- ID узла BINDING
);
Свойства (из спецификации CPG): - Обратное ребро к ребру BINDS - Связывает использование имён с их привязками - Пример: ссылка на переменную → привязка → объявление
Последовательность BINDS:
Объявление (METHOD/TYPE_DECL)
↑
BINDS
|
Узел BINDING (оператор import/using)
↑
BINDS_TO
|
Ссылка (IDENTIFIER/CALL)
edges_source_file¶
Рёбра исходного файла (сопоставление узлов с файлом).
CREATE TABLE edges_source_file (
src BIGINT NOT NULL, -- ID любого узла AST
dst BIGINT NOT NULL -- ID узла FILE
);
CREATE INDEX idx_source_file_src ON edges_source_file(src);
CREATE INDEX idx_source_file_dst ON edges_source_file(dst);
Свойства (из спецификации CPG): - Связывает узлы с их исходным файлом FILE - Создаётся автоматически на основе свойства FILENAME - НЕ ДОЛЖНО создаваться языковым модулем анализа — создаётся автоматически - Отношение один к одному: каждый узел имеет ровно один исходный файл
Назначение: - Сопоставление любого элемента кода с его исходным файлом - Навигация от FILE ко всем содержащимся элементам - Поддержка запросов и анализа на уровне файлов - Реализация функции IDE «перейти к файлу»
Пример:
Узел METHOD (id=100) → SOURCE_FILE → Узел FILE (id=1, name="main.c")
Узел CALL (id=200) → SOURCE_FILE → Узел FILE (id=1, name="main.c")
Узел TYPE_DECL (id=300) → SOURCE_FILE → Узел FILE (id=2, name="types.h")
Логика автоматического создания: 1. Модуль анализа устанавливает свойство FILENAME на узлах (METHOD, TYPE_DECL и т.д.) 2. Загрузчик CPG создаёт узлы FILE для уникальных имён файлов 3. Загрузчик CPG создаёт рёбра SOURCE_FILE от узлов к узлам FILE 4. Результат — полное сопоставление файл → код
edges_alias_of¶
Рёбра псевдонимов типов.
CREATE TABLE edges_alias_of (
src BIGINT NOT NULL, -- Узел TYPE_DECL (псевдоним)
dst BIGINT NOT NULL -- Узел TYPE (фактический тип)
);
Свойства (из спецификации CPG): - Связывает TYPE_DECL (псевдоним) с TYPE (фактическим типом) - НЕ ДОЛЖНО создаваться модулем анализа — создаётся автоматически из ALIAS_TYPE_FULL_NAME - Отношение один к одному
Назначение: - Представление псевдонимов типов (typedef в C, using, type aliases) - Поддержка разрешения псевдонимов - Анализ синонимов типов
Примеры:
// typedef в C:
typedef int Integer;
// TYPE_DECL "Integer" --ALIAS_OF--> TYPE "int"
// using в C++:
using String = std::string;
// TYPE_DECL "String" --ALIAS_OF--> TYPE "std::string"
// Псевдоним типа в Rust:
type Result<T> = std::result::Result<T, Error>;
// TYPE_DECL "Result" --ALIAS_OF--> TYPE "std::result::Result"
Примечание: Автоматически генерируется при загрузке CPG на основе свойства ALIAS_TYPE_FULL_NAME.
edges_inherits_from¶
Рёбра наследования типов.
CREATE TABLE edges_inherits_from (
src BIGINT NOT NULL, -- Узел TYPE_DECL (производный)
dst BIGINT NOT NULL -- Узел TYPE (базовый)
);
CREATE INDEX idx_inherits_from_src ON edges_inherits_from(src);
CREATE INDEX idx_inherits_from_dst ON edges_inherits_from(dst);
Свойства (из спецификации CPG): - Связывает TYPE_DECL (производный) с TYPE (базовым) - НЕ ДОЛЖНО создаваться модулем анализа — создаётся автоматически из INHERITS_FROM_TYPE_FULL_NAME - Отношение один ко многим (поддерживается множественное наследование)
Назначение: - Представление наследования классов/интерфейсов - Поддержка анализа полиморфизма - Запросы к иерархии типов - Отслеживание цепочек наследования
Примеры:
// Одиночное наследование в Java:
class Dog extends Animal implements Comparable {
...
}
// TYPE_DECL "Dog" --INHERITS_FROM--> TYPE "Animal"
// TYPE_DECL "Dog" --INHERITS_FROM--> TYPE "Comparable"
// Множественное наследование в C++:
class D : public A, public B { };
// TYPE_DECL "D" --INHERITS_FROM--> TYPE "A"
// TYPE_DECL "D" --INHERITS_FROM--> TYPE "B"
Примечание: Автоматически генерируется при загрузке CPG на основе массива INHERITS_FROM_TYPE_FULL_NAME.
edges_capture¶
Рёбра захвата замыканий.
CREATE TABLE edges_capture (
src BIGINT NOT NULL,
dst BIGINT NOT NULL,
variable_name VARCHAR
);
Свойства: - VARIABLE_NAME: Имя захваченной переменной
Свойства (из спецификации CPG): - Связывает METHOD_REF/TYPE_REF с CLOSURE_BINDING - Представляет захват переменных в замыкании/лямбде - Отношение один ко многим (замыкание может захватывать несколько переменных)
Назначение: - Отслеживание переменных, захваченных замыканиями - Поддержка анализа выхода за пределы области видимости (escape analysis) - Оптимизация замыканий - Определение времени жизни захваченных переменных
Примеры:
function outer() {
let x = 10;
let y = 20;
return function inner() {
return x + y; // захватывает x и y
};
}
// METHOD_REF "inner" --CAPTURE--> CLOSURE_BINDING для x
// METHOD_REF "inner" --CAPTURE--> CLOSURE_BINDING для y
Примечание: Ребро CAPTURE связывает замыкание с захваченными переменными.
edges_contains¶
Рёбра вложенности (структурное содержание).
CREATE TABLE edges_contains (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_contains_src ON edges_contains(src);
CREATE INDEX idx_contains_dst ON edges_contains(dst);
edges_eval_type¶
Рёбра вычисления типов (узел к типу).
CREATE TABLE edges_eval_type (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_eval_type_src ON edges_eval_type(src);
CREATE INDEX idx_eval_type_dst ON edges_eval_type(dst);
edges_tagged_by¶
Рёбра ассоциации с тегами (узел к тегу).
CREATE TABLE edges_tagged_by (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
CREATE INDEX idx_tagged_by_src ON edges_tagged_by(src);
CREATE INDEX idx_tagged_by_dst ON edges_tagged_by(dst);
edges_parameter_link¶
Рёбра связи параметров (входной к выходному параметру).
CREATE TABLE edges_parameter_link (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
edges_pdg¶
Рёбра графа программных зависимостей (CDG + зависимости по данным).
CREATE TABLE edges_pdg (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
edges_ddg¶
Рёбра графа зависимостей по данным (совместимость с CodeGraph).
CREATE TABLE edges_ddg (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
edges_vtable¶
Рёбра таблицы виртуальных методов (виртуальная диспетчеризация).
CREATE TABLE edges_vtable (
src BIGINT NOT NULL,
dst BIGINT NOT NULL
);
edges_documents¶
Рёбра от комментария к документируемому узлу.
CREATE TABLE edges_documents (
src BIGINT NOT NULL,
dst BIGINT NOT NULL,
binding_type VARCHAR
);
Свойства: - BINDING_TYPE: Способ связи комментария с узлом (например, “proximity”, “docstring”)
Представления¶
call_containment¶
Денормализованное представление вызывающий/вызываемый. Используется Python CodeGraph для запросов архитектуры, поиска и рабочих процессов.
CREATE VIEW call_containment AS
SELECT DISTINCT
caller.name AS containing_method_name,
caller.full_name AS containing_method_full_name,
callee.name AS callee_name,
callee.full_name AS callee_full_name,
caller.filename AS caller_filename,
callee.filename AS callee_filename,
nc.line_number AS call_line_number,
ec.cross_language AS cross_language,
ec.binding_type AS binding_type,
caller_file.language AS caller_language,
callee_file.language AS callee_language
FROM edges_call ec
JOIN nodes_call nc ON ec.src = nc.id
JOIN nodes_method caller ON nc.containing_method_id = caller.id
JOIN nodes_method callee ON ec.dst = callee.id
LEFT JOIN nodes_file caller_file ON caller.filename = caller_file.name
LEFT JOIN nodes_file callee_file ON callee.filename = callee_file.name;
Столбцы (11): - containing_method_name, containing_method_full_name: Вызывающий метод - callee_name, callee_full_name: Вызываемый метод - caller_filename, callee_filename: Исходные файлы - call_line_number: Строка места вызова - cross_language: Пересекает ли вызов языковую границу - binding_type: Способ разрешения вызова - caller_language, callee_language: Языки вызывающего и вызываемого
method_docstrings¶
Связь комментариев с документируемыми методами (используется для извлечения описаний функций).
CREATE VIEW method_docstrings AS
SELECT
m.id AS method_id,
m.name AS method_name,
m.full_name,
m.filename,
m.line_number AS method_line,
c.code AS docstring,
c.line_number AS comment_line
FROM edges_documents ed
JOIN nodes_comment c ON ed.src = c.id
JOIN nodes_method m ON ed.dst = m.id;
Таблицы состояния¶
Таблицы для инкрементальных обновлений, индекса FQN и отслеживания git.
cpg_fqn_index¶
Индекс быстрого разрешения символов (вдохновлён Yandex SourceCraft).
CREATE TABLE cpg_fqn_index (
fqn VARCHAR NOT NULL,
node_id BIGINT NOT NULL,
node_type VARCHAR NOT NULL,
name VARCHAR NOT NULL,
signature VARCHAR,
filename VARCHAR NOT NULL,
visibility VARCHAR DEFAULT 'public',
param_count INTEGER DEFAULT 0,
return_type VARCHAR,
PRIMARY KEY (fqn, node_type)
);
cpg_file_state¶
Отслеживание состояния файлов для инкрементальных обновлений.
CREATE TABLE cpg_file_state (
filename VARCHAR PRIMARY KEY,
hash VARCHAR NOT NULL,
ast_hash VARCHAR,
mtime BIGINT,
parsed_at BIGINT DEFAULT (epoch_ms(now())),
branch_name VARCHAR
);
cpg_git_state¶
Отслеживание последнего известного коммита git.
CREATE TABLE cpg_git_state (
id INTEGER PRIMARY KEY DEFAULT 1,
commit_hash VARCHAR NOT NULL,
branch VARCHAR,
updated_at BIGINT DEFAULT (epoch_ms(now()))
);
cpg_branch_state¶
Отслеживание состояния CPG по веткам.
CREATE TABLE cpg_branch_state (
branch_name VARCHAR PRIMARY KEY,
last_commit_sha VARCHAR(40) NOT NULL,
last_commit_timestamp BIGINT,
file_count INTEGER DEFAULT 0,
node_count INTEGER DEFAULT 0,
is_active BOOLEAN DEFAULT FALSE,
created_at BIGINT DEFAULT (epoch_ms(now())),
updated_at BIGINT DEFAULT (epoch_ms(now()))
);
cpg_submodule_state¶
Отслеживание состояния подмодулей git.
CREATE TABLE cpg_submodule_state (
submodule_path VARCHAR(4096) PRIMARY KEY,
submodule_url VARCHAR(4096),
current_commit_sha VARCHAR(40),
parent_commit_sha VARCHAR(40),
is_initialized BOOLEAN DEFAULT FALSE,
is_recursive BOOLEAN DEFAULT FALSE,
last_updated BIGINT DEFAULT (epoch_ms(now()))
);
export_progress¶
Прогресс экспорта для возобновляемого импорта.
CREATE TABLE export_progress (
entity_type VARCHAR PRIMARY KEY,
total_count BIGINT,
exported_count BIGINT,
last_offset BIGINT,
status VARCHAR,
last_updated BIGINT,
error_message VARCHAR
);
Таблицы доменов и шаблонов¶
cpg_domain_annotations¶
Структурированные доменные метаданные на уровне функций.
CREATE TABLE cpg_domain_annotations (
id BIGINT NOT NULL,
method_id BIGINT,
function_name VARCHAR NOT NULL,
annotation_type VARCHAR NOT NULL,
category VARCHAR,
value VARCHAR,
confidence FLOAT DEFAULT 1.0,
source VARCHAR DEFAULT 'domain_config',
metadata JSON
);
cpg_domain_subsystems¶
Организационная структура проекта.
CREATE TABLE cpg_domain_subsystems (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
display_name VARCHAR,
description VARCHAR,
patterns VARCHAR[],
key_files VARCHAR[],
parent_id BIGINT
);
cpg_domain_subsystem_members¶
Принадлежность методов к подсистемам.
CREATE TABLE cpg_domain_subsystem_members (
method_id BIGINT NOT NULL,
subsystem_id BIGINT NOT NULL,
confidence FLOAT DEFAULT 1.0,
source VARCHAR DEFAULT 'domain_config',
PRIMARY KEY (method_id, subsystem_id)
);
finding_evidence¶
Связь находок с узлами CPG с цепочкой доказательств по ролям.
CREATE TABLE finding_evidence (
id BIGINT NOT NULL,
finding_id BIGINT NOT NULL,
node_id BIGINT,
role VARCHAR,
description VARCHAR,
filename VARCHAR,
line_number INTEGER,
code VARCHAR
);
cpg_enrichment_state¶
Отслеживание выполненных обогащений.
CREATE TABLE cpg_enrichment_state (
enrichment_type VARCHAR NOT NULL,
source VARCHAR NOT NULL,
scope VARCHAR DEFAULT 'global',
last_computed TIMESTAMP,
version VARCHAR,
item_count INTEGER,
needs_refresh BOOLEAN DEFAULT FALSE,
PRIMARY KEY (enrichment_type, source, scope)
);
cpg_enrichment_anchors¶
Стабильная идентификация обогащённых тегов по FQN при обновлениях.
CREATE TABLE cpg_enrichment_anchors (
tag_id BIGINT NOT NULL,
anchor_fqn VARCHAR NOT NULL,
anchor_hash VARCHAR,
filename VARCHAR,
source VARCHAR,
PRIMARY KEY (tag_id)
);
cpg_pattern_results¶
Результаты поиска шаблонов (структурный поиск с учётом CPG).
CREATE TABLE cpg_pattern_results (
id BIGINT PRIMARY KEY,
rule_id VARCHAR NOT NULL,
node_id BIGINT NOT NULL,
filename VARCHAR NOT NULL,
line_number INTEGER NOT NULL,
column_number INTEGER DEFAULT 0,
code VARCHAR,
message VARCHAR,
severity VARCHAR NOT NULL,
category VARCHAR,
confidence DOUBLE DEFAULT 1.0,
match_data VARCHAR,
cpg_context VARCHAR,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
cpg_pattern_rules¶
Правила шаблонов, загруженные для сканирования.
CREATE TABLE cpg_pattern_rules (
rule_id VARCHAR PRIMARY KEY,
language VARCHAR NOT NULL,
severity VARCHAR NOT NULL,
category VARCHAR,
has_cpg BOOLEAN DEFAULT FALSE,
rule_source VARCHAR,
loaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
cpg_pattern_deps¶
Отслеживание зависимостей шаблонов для инкрементальной инвалидации.
CREATE TABLE cpg_pattern_deps (
rule_id VARCHAR NOT NULL,
filename VARCHAR NOT NULL,
dep_filename VARCHAR NOT NULL,
dep_type VARCHAR NOT NULL,
PRIMARY KEY (rule_id, filename, dep_filename, dep_type)
);
Определение графа свойств¶
Использование duckpgq для создания объединённого графа свойств с полной поддержкой схемы CPG.
КЛЮЧЕВАЯ ИДЕЯ: DuckDB PGQ не поддерживает представления (views) в вершинных таблицах (VERTEX TABLES), но мы можем использовать материализованные таблицы вместо них! Это позволяет полностью поддерживать полиморфные рёбра.
Шаг 1: Создание материализованной объединённой таблицы узлов¶
Важно: Используйте CREATE TABLE (а не CREATE VIEW), чтобы материализовать объединённый набор узлов.
-- Создание материализованной объединённой таблицы всех узлов CPG для поддержки полиморфных рёбер
DROP TABLE IF EXISTS cpg_nodes;
CREATE TABLE cpg_nodes AS
SELECT id, 'FILE' as node_type FROM nodes_file
UNION ALL SELECT id, 'NAMESPACE_BLOCK' FROM nodes_namespace_block
UNION ALL SELECT id, 'METHOD' FROM nodes_method
UNION ALL SELECT id, 'METHOD_REF' FROM nodes_method_ref
UNION ALL SELECT id, 'CALL' FROM nodes_call
UNION ALL SELECT id, 'IDENTIFIER' FROM nodes_identifier
UNION ALL SELECT id, 'FIELD_IDENTIFIER' FROM nodes_field_identifier
UNION ALL SELECT id, 'LITERAL' FROM nodes_literal
UNION ALL SELECT id, 'LOCAL' FROM nodes_local
UNION ALL SELECT id, 'PARAM' FROM nodes_param
UNION ALL SELECT id, 'PARAM_OUT' FROM nodes_param_out
UNION ALL SELECT id, 'METHOD_RETURN' FROM nodes_method_return
UNION ALL SELECT id, 'RETURN' FROM nodes_return
UNION ALL SELECT id, 'BLOCK' FROM nodes_block
UNION ALL SELECT id, 'CONTROL_STRUCTURE' FROM nodes_control_structure
UNION ALL SELECT id, 'MEMBER' FROM nodes_member
UNION ALL SELECT id, 'TYPE_DECL' FROM nodes_type_decl
UNION ALL SELECT id, 'TYPE_REF' FROM nodes_type_ref
UNION ALL SELECT id, 'TYPE_PARAM' FROM nodes_type_param
UNION ALL SELECT id, 'TYPE_ARGUMENT' FROM nodes_type_argument
UNION ALL SELECT id, 'UNKNOWN' FROM nodes_unknown
UNION ALL SELECT id, 'JUMP_TARGET' FROM nodes_jump_target
UNION ALL SELECT id, 'BINDING' FROM nodes_binding
UNION ALL SELECT id, 'CLOSURE_BINDING' FROM nodes_closure_binding
UNION ALL SELECT id, 'COMMENT' FROM nodes_comment
UNION ALL SELECT id, 'COLLECTION_DECL' FROM nodes_collection_decl;
-- Добавление первичного ключа и индексов
ALTER TABLE cpg_nodes ADD PRIMARY KEY (id);
CREATE INDEX idx_cpg_nodes_type ON cpg_nodes(node_type);
Шаг 2: Создание комплексного графа свойств¶
Полная реализация (со всеми типами рёбер, включая полиморфные):
CREATE PROPERTY GRAPH cpg
VERTEX TABLES (
-- Материализованная объединённая таблица узлов для поддержки полиморфных рёбер
cpg_nodes LABEL CPG_NODE,
-- Отдельные типизированные таблицы узлов для специфических запросов
nodes_file LABEL FILE_NODE,
nodes_namespace_block LABEL NAMESPACE_BLOCK,
nodes_method LABEL METHOD,
nodes_method_ref LABEL METHOD_REF,
nodes_call LABEL CALL_NODE,
nodes_identifier LABEL IDENTIFIER,
nodes_field_identifier LABEL FIELD_IDENTIFIER,
nodes_literal LABEL LITERAL,
nodes_local LABEL LOCAL,
nodes_param LABEL PARAM,
nodes_param_out LABEL PARAM_OUT,
nodes_method_return LABEL METHOD_RETURN,
nodes_return LABEL RETURN_NODE,
nodes_block LABEL BLOCK,
nodes_control_structure LABEL CONTROL_STRUCTURE,
nodes_member LABEL MEMBER,
nodes_type_decl LABEL TYPE_DECL,
nodes_type_ref LABEL TYPE_REF,
nodes_type_param LABEL TYPE_PARAM,
nodes_type_argument LABEL TYPE_ARGUMENT,
nodes_unknown LABEL UNKNOWN,
nodes_jump_target LABEL JUMP_TARGET,
nodes_binding LABEL BINDING,
nodes_closure_binding LABEL CLOSURE_BINDING,
nodes_comment LABEL COMMENT_NODE,
nodes_metadata LABEL METADATA
)
EDGE TABLES (
-- ========================================
-- ПОЛИМОРФНЫЕ РЁБРА (через таблицу cpg_nodes)
-- ========================================
edges_ast
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL AST,
edges_cfg
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL CFG,
edges_ref
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL REF,
edges_reaching_def
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL REACHING_DEF,
edges_argument
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL ARGUMENT,
edges_dominate
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL DOMINATE,
edges_post_dominate
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL POST_DOMINATE,
edges_cdg
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL CDG,
edges_binds
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL BINDS,
edges_binds_to
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL BINDS_TO,
-- ========================================
-- ТИПИЗИРОВАННЫЕ РЁБРА (конкретные источники/назначения)
-- ========================================
edges_call
SOURCE KEY (src) REFERENCES nodes_call (id)
DESTINATION KEY (dst) REFERENCES nodes_method (id)
LABEL CALLS,
edges_receiver
SOURCE KEY (src) REFERENCES nodes_call (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL RECEIVER,
edges_condition
SOURCE KEY (src) REFERENCES nodes_control_structure (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL CONDITION,
edges_source_file
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES nodes_file (id)
LABEL SOURCE_FILE,
edges_alias_of
SOURCE KEY (src) REFERENCES nodes_type_decl (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL ALIAS_OF,
edges_inherits_from
SOURCE KEY (src) REFERENCES nodes_type_decl (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL INHERITS_FROM,
edges_capture
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES nodes_closure_binding (id)
LABEL CAPTURE,
edges_documents
SOURCE KEY (src) REFERENCES cpg_nodes (id)
DESTINATION KEY (dst) REFERENCES cpg_nodes (id)
LABEL DOCUMENTS
);
Ключевые особенности:
- Полная поддержка схемы CPG со всеми типами рёбер
- Полиморфные рёбра (AST, CFG, REF и т.д.) через материализованную таблицу cpg_nodes
- Типизированные вершины для эффективных целевых запросов
- Совместимо с DuckDB PGQ (используются таблицы, а не представления)
- Полное соответствие спецификации CPG v1.1
Примеры запросов¶
Стандартный SQL-запрос: Найти все вызовы определённого метода¶
SELECT c.*, m.name, m.filename, m.line_number
FROM nodes_call c
JOIN edges_call ec ON c.id = ec.src
JOIN nodes_method m ON ec.dst = m.id
WHERE m.full_name = 'com.example.MyClass.myMethod:void()';
DuckDB PGQ-запрос: Найти прямые цепочки вызовов (вызывающий -> вызываемый)¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (caller:METHOD)-[:CALLS]-(call:CALL_NODE)-[:CALLS]->(callee:METHOD)
WHERE caller.name = 'main'
COLUMNS (caller.full_name AS caller_name, callee.full_name AS callee_name)
);
DuckDB PGQ-запрос: Найти методы и их дочерние узлы AST¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (m:METHOD)-[:AST]->(child:CPG_NODE)
COLUMNS (m.full_name AS method, child.id AS child_id)
);
DuckDB PGQ-запрос: Пути потока данных с использованием REACHING_DEF¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (source:CPG_NODE)-[:REACHING_DEF*1..5]->(sink:CPG_NODE)
COLUMNS (source.id, sink.id)
)
LIMIT 100;
DuckDB PGQ-запрос: Пути CFG (управление выполнением)¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (start:CPG_NODE)-[:CFG*1..3]->(end:CPG_NODE)
COLUMNS (start.id AS start_node, end.id AS end_node)
)
LIMIT 100;
DuckDB PGQ-запрос: Найти все идентификаторы и их ссылки¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (id:IDENTIFIER)-[:REF]->(decl:CPG_NODE)
COLUMNS (id.name AS identifier_name, decl.id AS declaration_id)
);
DuckDB PGQ-запрос: Иерархия типов (наследование)¶
SELECT *
FROM GRAPH_TABLE(cpg
MATCH (derived:TYPE_DECL)-[:INHERITS_FROM]->(base:CPG_NODE)
COLUMNS (derived.full_name AS derived_type, base.id AS base_type)
);
Комбинированный запрос: Методы с наибольшим количеством входящих вызовов¶
SELECT m.full_name, COUNT(*) as call_count
FROM GRAPH_TABLE(cpg
MATCH (c:CALL_NODE)-[:CALLS]->(m:METHOD)
COLUMNS (m.full_name, m.id)
)
GROUP BY m.full_name
ORDER BY call_count DESC
LIMIT 10;
Рекомендации по производительности¶
- Пакетная обработка: Используйте пакеты по 10 000 строк для операций INSERT
- Индексирование: Создавайте индексы после массовой загрузки для ускорения импорта
- Разделение на секции: Рассмотрите возможность секционирования по имени файла для крупных кодовых баз
- Сжатие: Используйте автоматическое сжатие DuckDB для столбцов типа TEXT
- Память: Настройте ограничение памяти DuckDB в зависимости от размера CPG
Версия схемы¶
- Спецификация CPG: v1.1
- DuckDB: 1.4.2+
- duckpgq: Последняя стабильная версия
- Версия схемы: 7.0 (Полное соответствие schema.go)
- Последнее обновление: 2026-02-28
Журнал изменений¶
v7.0 (2026-02-28) — Полное соответствие schema.go¶
КРУПНОЕ ОБНОВЛЕНИЕ: Все определения таблиц приведены в точное соответствие с gocpg/pkg/storage/duckdb/schema.go
Новые таблицы узлов:
- nodes_modifier — Узлы модификаторов доступа
- nodes_annotation — Аннотации и декораторы методов/классов
- nodes_type — Экземпляры типов
- nodes_jump_label — Метки переходов (goto)
- nodes_tag_v2 — Теги внешнего контекста (заменяет устаревший nodes_tag)
- nodes_finding — Результаты статического анализа
- nodes_macro — Макросы препроцессора C
- nodes_macro_param — Параметры макросов
- nodes_namespace — Индексные узлы пространств имён
- nodes_annotation_literal — Литеральные значения аннотаций
- nodes_annotation_parameter — Формальные параметры аннотаций
- nodes_annotation_parameter_assign — Присвоение параметров аннотаций
- nodes_key_value_pair — Пары ключ-значение для находок
- nodes_location — Сводка расположения в исходном коде
- nodes_config_file — Содержимое конфигурационных файлов
- nodes_import — Операторы импорта/включения
- nodes_closure_binding — Захват переменных замыканиями
Новые таблицы рёбер:
- edges_contains — Вложенность
- edges_eval_type — Вычисление типов
- edges_tagged_by — Ассоциация с тегами
- edges_parameter_link — Связи параметров
- edges_pdg — Граф программных зависимостей
- edges_ddg — Граф зависимостей по данным
- edges_vtable — Таблица виртуальных методов
- edges_documents — Связи документирования комментариями
Новые представления:
- call_containment — Денормализованное представление вызывающий/вызываемый (11 столбцов)
- method_docstrings — Связь комментариев с методами
Новые таблицы состояния/доменов/шаблонов:
- cpg_fqn_index, cpg_file_state, cpg_git_state, cpg_branch_state, cpg_submodule_state, export_progress
- cpg_domain_annotations, cpg_domain_subsystems, cpg_domain_subsystem_members
- finding_evidence, cpg_enrichment_state, cpg_enrichment_anchors
- cpg_pattern_results, cpg_pattern_rules, cpg_pattern_deps
Изменения столбцов:
- nodes_method: Добавлены is_nested, loc, parameter_count, embedding*, ast_hash
- nodes_call: Добавлены containing_method_id, callee_method_id, type_origin, type_confidence, embedding*
- nodes_param: Добавлены method_id, parent_param_id, typedef_id, struct_member_id
- nodes_method_return: Добавлен method_id
- nodes_comment: Добавлены hash, line_number_end, column_number_end, containing_method_id, comment_type, documented_node_id, binding_type
- edges_call: Добавлены cross_language, binding_type
- edges_argument: Добавлены argument_index, argument_name
- edges_capture: Добавлен variable_name
- edges_documents: Добавлен binding_type
Переименования таблиц:
- nodes_type_parameter -> nodes_type_param (с новыми столбцами: constraint_type, index, method_id, type_decl_id)
- nodes_param_out -> nodes_method_parameter_out
v6.0 (2026-02-26) — Предвычисленные метрики и флаги шаблонов¶
КРУПНОЕ ОБНОВЛЕНИЕ: Добавлены предвычисленные булевые флаги и метрики в nodes_method для быстрых запросов
Новые столбцы nodes_method:
- has_disabled_code (BOOLEAN) — обнаруживает #if 0, if false, закомментированные блоки
- has_deprecated (BOOLEAN) — обнаруживает @Deprecated, [[deprecated]]
- has_todo_fixme (BOOLEAN) — обнаруживает TODO, FIXME, HACK, XXX
- has_debug_code (BOOLEAN) — обнаруживает отладочный вывод, console.log
- is_test (BOOLEAN) — кросс-языковое определение тестовых функций (11 языков)
- is_entry_point (BOOLEAN) — определение точек входа публичного API (экспортируемые, HTTP-обработчики, main)
- cyclomatic_complexity (INTEGER) — цикломатическая сложность по Маккейбу
- fan_in (INTEGER) — количество вызывающих методов
- fan_out (INTEGER) — количество вызываемых методов
Влияние: - В 10-100 раз быстрее запросы по шаблонам по сравнению со сканированием LIKE по столбцам code/name - Кросс-языковое обнаружение тестовых файлов (pytest, JUnit, Go testing и др.) - Предвычисленные метрики обеспечивают мгновенный анализ сложности и связности - Требуется DuckDB 1.4.2+ для расширения DuckPGQ
v5.0 (2025-11-16) — полное соответствие схеме¶
КРУПНОЕ ОБНОВЛЕНИЕ: Достигнуто 100% соответствие схеме CPG со всеми оставшимися функциями
Новые типы узлов:
- nodes_unknown (UNKNOWN) — универсальный тип для неподдерживаемых конструкций AST
- nodes_jump_target (JUMP_TARGET) — метки для операторов goto/break/continue
- nodes_type_parameter (TYPE_PARAMETER) — формальные параметры шаблонов/дженериков
- nodes_type_argument (TYPE_ARGUMENT) — фактические аргументы шаблонов/дженериков
- nodes_binding (BINDING) — привязки для разрешения методов
- nodes_closure_binding (CLOSURE_BINDING) — захват переменных в замыканиях
- nodes_comment (COMMENT) — комментарии в исходном коде
Новые типы рёбер:
- edges_alias_of (ALIAS_OF) — связи псевдонимов типов
- edges_inherits_from (INHERITS_FROM) — связи наследования типов
- edges_capture (CAPTURE) — захват переменных в замыканиях
- edges_captured_by (CAPTURED_BY) — обратные связи захвата в замыканиях
Влияние: - Достигнуто 100% соответствие схеме CPG - Полное покрытие AST с использованием узлов UNKNOWN - Полная поддержка дженериков и шаблонов - Включён анализ замыканий и лямбд - Поддержка разрешения псевдонимов и наследования типов - Сохранение комментариев для документации - Полноценные возможности анализа программ
Соответствие: ~95% → 100% схеме CPG
v4.0 (2025-11-16) — поддержка пространств имён и файлов¶
КРУПНОЕ ОБНОВЛЕНИЕ: Добавлено сопоставление с файлами, поддержка пространств имён и ссылок на методы/типы
Новые типы узлов:
- nodes_file (FILE) — узлы исходных файлов для индексации по файлам
- nodes_namespace_block (NAMESPACE_BLOCK) — блоки пространств имён (C++ namespace, Java package)
- nodes_method_ref (METHOD_REF) — ссылки на методы (функции высшего порядка, указатели на функции)
- nodes_type_ref (TYPE_REF) — ссылки на типы (рефлексия, приведение типов, дженерики)
Новые типы рёбер:
- edges_source_file (SOURCE_FILE) — сопоставление узлов с файлами (создаётся автоматически из FILENAME)
Влияние: - Включена навигация по коду на уровне файлов - Поддержка анализа с учётом пространств имён - Отслеживание функций высшего порядка (колбэки, делегаты) - Поддержка рефлексии и дженериков - Полное сопоставление с исходными файлами (готово к интеграции с IDE) - Улучшен анализ межфайловых зависимостей
Соответствие: ~90% → ~95% схеме CPG
v3.0 (2025-11-16) — поддержка ООП¶
КРУПНОЕ ОБНОВЛЕНИЕ: Добавлена поддержка анализа ООП и точное сопоставление с исходным кодом
Новые типы узлов:
- nodes_field_identifier (FIELD_IDENTIFIER) — узлы доступа к полям для ООП
- nodes_member (MEMBER) — объявления полей классов/структур
Новые типы рёбер:
- edges_binds (BINDS) — рёбра привязки имён (операторы import/using)
- edges_binds_to (BINDS_TO) — обратные рёбра привязки (разрешение имён)
Новые свойства: - OFFSET, OFFSET_END: точное сопоставление по байтам (добавлено к METHOD, TYPE_DECL, IDENTIFIER, FIELD_IDENTIFIER, MEMBER) - MODIFIER: массив модификаторов доступа (добавлено к METHOD, TYPE_DECL) - CANONICAL_NAME: нормализованное имя идентификатора (добавлено к FIELD_IDENTIFIER)
Влияние: - Полная поддержка анализа ООП-кода (отслеживание доступа к полям) - Точное сопоставление с местоположением в исходном коде (на уровне байтов) - Включён анализ видимости (PUBLIC, PRIVATE, STATIC и т.д.) - Улучшено разрешение имён переменных и функций - Включён анализ псевдонимов (канонические имена)
Соответствие: ~80% → ~90% схеме CPG
v2.0 (2025-11-16) — критические обновления¶
КРУПНОЕ ОБНОВЛЕНИЕ: Добавлены критически важные компоненты для анализа PDG и SSA
Новые типы узлов:
- nodes_param_out (METHOD_PARAMETER_OUT) — выходные параметры для анализа SSA
- nodes_method_return (METHOD_RETURN) — формальный параметр возврата
Новые типы рёбер:
- edges_cdg (Control Dependence Graph) — критически важен для PDG!
Влияние: - Граф зависимостей программы (PDG) теперь полный (DDG + CDG) - Теперь возможен анализ SSA - Включено программное срезание (program slicing) - Улучшен анализ утечки данных (анализ заражения данных)
Соответствие: ~70% → ~80% схеме CPG
v1.0 (2025-11-15) — Первоначальный выпуск¶
- 11 типов узлов (METHOD, CALL, IDENTIFIER, LITERAL, LOCAL, PARAM, RETURN, BLOCK, CONTROL_STRUCTURE, TYPE_DECL, METADATA)
- 10 типов рёбер (AST, CFG, CALL, REF, REACHING_DEF, ARGUMENT, RECEIVER, CONDITION, DOMINATE, POST_DOMINATE)
Расширение: Система семантических тегов¶
Обзор¶
Система тегов расширяет CPG за счёт семантических аннотаций для методов и других элементов кода. Теги — это пользовательские расширения (не входящие в спецификацию CPG v1.1), которые позволяют выполнять семантический поиск, классификацию кода и интеллектуальный анализ.
nodes_tag_v2¶
Хранит определения тегов (семантические метки для элементов кода). Версия 2 расширена полями для интеграции с внешними системами.
CREATE TABLE nodes_tag_v2 (
id BIGINT NOT NULL,
name VARCHAR NOT NULL,
value VARCHAR,
external_source VARCHAR,
external_id VARCHAR,
external_url VARCHAR,
confidence FLOAT,
metadata JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
CREATE INDEX idx_tag_v2_name ON nodes_tag_v2(name);
CREATE INDEX idx_tag_v2_name_value ON nodes_tag_v2(name, value);
CREATE INDEX idx_tag_external ON nodes_tag_v2(external_source, external_id);
Свойства: - NAME: Идентификатор категории тега (уникальное семантическое измерение) - VALUE: Значение тега в рамках этой категории - EXTERNAL_SOURCE: Источник внешнего контекста (например, ‘jira’, ‘git’) - EXTERNAL_ID: Идентификатор во внешней системе - EXTERNAL_URL: URL ресурса во внешней системе - CONFIDENCE: Уровень уверенности (0.0 - 1.0) - METADATA: Дополнительные метаданные в формате JSON - CREATED_AT: Время создания тега - UPDATED_AT: Время последнего обновления
edges_tagged_by¶
Связывает элементы кода с их семантическими тегами.
CREATE TABLE edges_tagged_by (
src BIGINT NOT NULL, -- Идентификатор исходного узла (обычно METHOD)
dst BIGINT NOT NULL -- Идентификатор узла тега
);
CREATE INDEX idx_tagged_by_src ON edges_tagged_by(src);
CREATE INDEX idx_tagged_by_dst ON edges_tagged_by(dst);
Связь: - Источник: любой узел CPG (обычно nodes_method) - Назначение: запись в nodes_tag_v2
Категории тегов¶
| Категория | Описание | Примеры значений |
|---|---|---|
| subsystem-name | Организационная единица кода | ‘executor’, ‘planner’, ‘parser’, ‘storage’ |
| security-risk | Классификация по уровню угрозы безопасности | ‘critical’, ‘high’, ‘medium’, ‘low’ |
| taint-source | Точка входа недоверённых данных | Булева разметка |
| taint-sink | Выход, чувствительный к вопросам безопасности | Булева разметка |
| perf-hotspot | Участки кода, критичные к производительности | Булева разметка |
| allocation-heavy | Методы, интенсивно использующие память | Булева разметка |
| test-coverage | Наличие связанных тестов | Булева разметка |
| cyclomatic-complexity | Метрика сложности кода | Числовые значения (например, ‘15’, ‘25’) |
| function-purpose | Семантическое описание | Произвольный текст описания |
| entry-point | Точка входа в систему | Булева разметка |
Примеры запросов к тегам¶
-- Найти все методы с критическим уровнем угрозы безопасности
SELECT m.*
FROM nodes_method m
JOIN edges_tagged_by e ON m.id = e.src
JOIN nodes_tag_v2 t ON e.dst = t.id
WHERE t.name = 'security-risk' AND t.value = 'critical';
-- Вывести все подсистемы
SELECT DISTINCT t.value as subsystem
FROM nodes_tag_v2 t
WHERE t.name = 'subsystem-name'
ORDER BY t.value;
-- Найти методы в определённой подсистеме
SELECT m.full_name, m.filename, m.line_number
FROM nodes_method m
JOIN edges_tagged_by e ON m.id = e.src
JOIN nodes_tag_v2 t ON e.dst = t.id
WHERE t.name = 'subsystem-name' AND t.value = 'executor';
-- Найти участки с высокой сложностью
SELECT m.full_name, t.value as complexity
FROM nodes_method m
JOIN edges_tagged_by e ON m.id = e.src
JOIN nodes_tag_v2 t ON e.dst = t.id
WHERE t.name = 'cyclomatic-complexity'
AND CAST(t.value AS INTEGER) > 20
ORDER BY CAST(t.value AS INTEGER) DESC;
-- Подсчитать количество тегов по категориям
SELECT t.name, COUNT(*) as count
FROM nodes_tag_v2 t
JOIN edges_tagged_by e ON t.id = e.dst
GROUP BY t.name
ORDER BY count DESC;
Статистика по тегам¶
В текущей базе данных содержится приблизительно: - 15,68 млн тегов в рамках 98 категорий - Основные категории: subsystem-name, security-risk, function-purpose - Теги позволяют выполнять семантический поиск по коду и интеллектуальный анализ
Примечания по интеграции¶
Теги добавляются после генерации CPG с помощью:
1. Статического анализа: Запросы тегов CPG (cpg.method.tag.name(...))
2. Обогащения с помощью ИИ: Генерация описаний назначения функций с помощью LLM
3. Вычисляемых метрик: Цикломатическая сложность, полученная из анализа CFG
4. Ручной аннотации: Результаты аудита безопасности
Теги расширяют CPG без изменения основной схемы, обеспечивая совместимость со стандартными инструментами CPG и позволяя выполнять расширенный семантический анализ.
Последнее обновление: 2026-02-28