Дизайн схемы DuckDB CPG (CPG Spec v1.1)

Дизайн схемы DuckDB CPG (CPG Spec v1.1)

Содержание

Обзор

Эта схема реализует спецификацию графа свойств кода (CPG) версии 1.1 в DuckDB с использованием расширения duckpgq для эффективного выполнения запросов к графам свойств.

Основные принципы проектирования

  1. Таблицы узлов: Отдельные таблицы для каждого основного типа узлов (METHOD, CALL, IDENTIFIER и т.д.)
  2. Таблицы рёбер: Отдельные таблицы для каждого типа рёбер (AST, CFG, CALL, REF, REACHING_DEF и т.д.)
  3. Граф свойств: Использование команды CREATE PROPERTY GRAPH из duckpgq для объединённых графовых запросов
  4. Эффективное индексирование: Индексы B-дерева по полям id, full_name и другим часто используемым свойствам
  5. Пакетная обработка: Поддержка массового импорта 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);

Рёбра связи параметров (входной к выходному параметру).

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;

Рекомендации по производительности

  1. Пакетная обработка: Используйте пакеты по 10 000 строк для операций INSERT
  2. Индексирование: Создавайте индексы после массовой загрузки для ускорения импорта
  3. Разделение на секции: Рассмотрите возможность секционирования по имени файла для крупных кодовых баз
  4. Сжатие: Используйте автоматическое сжатие DuckDB для столбцов типа TEXT
  5. Память: Настройте ограничение памяти 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