Сценарий 04: Разработка функций

Сценарий 04: Разработка функций

Разработчик изучает существующий код для добавления новых функций.

Быстрый старт

# Выберите сценарий разработки функций
/select 04

Понимание существующего кода

Поиск связанных функций

> Найти функции, связанные с обработкой транзакций

╭─────────────── Связанный код ───────────────────────────────╮
│                                                             │
│  Функции транзакций:                                         │
│                                                             │
│  Точки входа:                                               │
│    StartTransaction()      src/backend/access/transam/xact.c │
│    CommitTransaction()     src/backend/access/transam/xact.c │
│    AbortTransaction()      src/backend/access/transam/xact.c │
│                                                             │
│  Вспомогательные функции:                                   │
│    AssignTransactionId()   src/backend/access/transam/xact.c │
│    GetCurrentTransactionId() src/backend/access/transam/xact.c │
│                                                             │
│  Связанные модули:                                          │
│    src/backend/access/heap/  - Операции с кучей              │
│    src/backend/storage/lmgr/ - Менеджер блокировок           │
│                                                             │
╰─────────────────────────────────────────────────────────────╯

Анализ цепочек вызовов

> Показать путь вызова от парсера к исполнителю

╭─────────────── Цепочка вызовов ─────────────────────────────╮
│                                                             │
│  Поток Парсер → Исполнитель:                                │
│                                                             │
│  1. pg_parse_query()                                        │
│       ↓                                                     │
│  2. pg_analyze_and_rewrite()                                │
│       ↓                                                     │
│  3. pg_plan_queries()                                       │
│       ↓                                                     │
│  4. PortalRun()                                             │
│       ↓                                                     │
│  5. ExecutorStart() → ExecutorRun() → ExecutorFinish()      │
│       ↓                                                     │
│  6. ExecProcNode() [диспетчеризация по конкретным узлам]    │
│                                                             │
╰─────────────────────────────────────────────────────────────╯

Точки интеграции

Поиск точек расширения

> Где я могу добавить новый тип узла?

╭─────────────── Точки расширения ───────────────────────────╮
│                                                            │
│  Добавление нового типа узла исполнителя:                  │
│                                                            │
│  1. Определите структуру узла в:                           │
│     src/include/nodes/execnodes.h                          │
│                                                            │
│  2. Реализуйте операции узла:                              │
│     src/backend/executor/nodeXXX.c                         │
│     - ExecInitXXX()                                        │
│     - ExecXXX()                                            │
│     - ExecEndXXX()                                         │
│                                                            │
│  3. Зарегистрируйте в диспетчере:                          │
│     src/backend/executor/execProcnode.c                    │
│     - ExecInitNode()                                       │
│     - ExecProcNode()                                       │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Понимание зависимостей

> От каких модулей зависит менеджер буферов?

╭─────────────── Зависимости ───────────────────────────────╮
│                                                           │
│  Зависимости менеджера буферов:                           │
│                                                           │
│  Верхний уровень (использует):                            │
│    - storage/smgr     (Интерфейс менеджера хранилища)     │
│    - storage/lmgr     (Менеджер блокировок)               │
│    - utils/memutils   (Контексты памяти)                  │
│                                                           │
│  Нижний уровень (используется):                           │
│    - access/heap      (Методы доступа к куче)             │
│    - access/index     (Методы доступа к индексам)         │
│    - executor/*       (Выполнение запросов)               │
│                                                           │
│  Интерфейсы:                                              │
│    - ReadBuffer()     (Основной интерфейс чтения)         │
│    - ReleaseBuffer()  (Интерфейс освобождения)            │
│                                                           │
╰───────────────────────────────────────────────────────────╯

Шаблоны кода

Поиск похожих реализаций

> Показать примеры обработки ошибок в исполнителе

╭─────────────── Шаблоны обработки ошибок ──────────────────╮
                                                           
  Распространённые шаблоны в исполнителе:                  
                                                           
  1. ereport с уровнем ERROR:                              
     ereport(ERROR,                                        
         (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),          
          errmsg("функция X не поддерживается")));          
                                                           
  2. Обработка исключений с PG_TRY:                        
     PG_TRY();                                             
     {                                                     
         /* опасная операция */                            
     }                                                     
     PG_CATCH();                                           
     {                                                     
         /* очистка */                                     
         PG_RE_THROW();                                    
     }                                                     
     PG_END_TRY();                                         
                                                           
╰───────────────────────────────────────────────────────────╯

Примеры вопросов

  • “Как работает [feature_name]?”
  • “Какие функции задействованы в [subsystem]?”
  • “Куда следует добавить код для [new_feature]?”
  • “Покажи похожие реализации для [existing_feature]”
  • “Как проходит поток данных для [operation]?”
  • “Найди точки интеграции для [component]”

Связанные сценарии