Não tivemos aula em 01/09, então hoje abrimos a disciplina e já entramos no primeiro tema.
Aqui, escrevemos o programa que executa o SQL.
SELECT e o resultadoDevemos construir um minidb, em que podemos executar um SELECT com WHERE, dentro de uma transação que volta ao ar consistente depois de levar um kill -9 no meio do commit.
Sacou? O conteúdo do semestre foi escolhido de trás para frente, a partir dessa frase.
Do texto SQL a uma árvore que o programa entende
Operadores que produzem linhas, um de cada vez
Achar a linha sem varrer a tabela inteira
Páginas em memória, páginas em disco, e o log
Vamos construir de baixo para cima, porque cada camada depende da anterior. A camada de baixo começa hoje.
Cinquenta linhas de Python.
$ python3 hello.py dados.db < demo.sql
CREATE TABLE aluno (id, matricula, nome);
OK
INSERT INTO aluno VALUES (1, 20260001, Ana);
OK 1
SELECT * FROM aluno WHERE id = 2;
2|20260002|Bruno
(1 linha)
Cria tabela, insere, filtra e guarda em disco. É um banco de dados, e é também lento, esquecido e frágil. Consertar cada um desses defeitos é um módulo do semestre.
BEGIN, COMMIT, ROLLBACKUma aula teórica e duas de laboratório por módulo.
VARCHAR livre, mapa de nulosORDER BY e agregaçãoEsses temas viram seminários em 24/11 e 26/11, sorteados em 10/11, respondendo sempre à mesma pergunta: o que precisaria mudar no minidb para ter isso?
Não estamos competindo em desempenho com o PostgreSQL. A escolha é sobre o que vocês querem aprender.
O minidb lê comandos da entrada padrão e escreve o resultado na saída padrão, em formato definido. Assim os mesmos testes valem para qualquer linguagem.
$ ./minidb dados.db < consultas.sql CREATE TABLE aluno (id INT, matricula INT); OK INSERT INTO aluno VALUES (1, 20260001); OK 1 SELECT * FROM aluno WHERE id = 1; 1|20260001 (1 linha)
NOTES.md por módulo, com um parágrafo sobre a decisão de projeto mais difícil deleSete commits gigantes, um por módulo, na véspera de cada prazo, contam a história de um trabalho que não aconteceu.
| 🧩 Módulos M1 a M7 | Dez pontos cada, do M1 ao M7 | 70 pts |
| 🎤 Defesa oral | Individual, em 01/12 e 03/12 | 20 pts |
| 📚 Seminário | Em dupla, em 24/11 ou 26/11 | 10 pts |
Cada módulo: metade pelos testes de aceitação, um terço pela qualidade do código e do histórico, o restante pelo NOTES.md.
Um agente escreve uma árvore B+ em trinta segundos, e ela até passa nos testes.
NOTES.md não sai de código que vocês não entenderam| # | Data | Dia | Conteúdo |
|---|---|---|---|
| T1 | 03/09 | Qui | Apresentação e armazenamento |
| — | 08 e 10/09 | CBSoft 2026, sem aula | |
| I1 | 15 e 17/09 | Laboratório M1. Entrega em 17/09 | |
| T2 | 22/09 | Ter | Cache de páginas |
| I2 | 24 e 29/09 | Laboratório M2. Entrega em 29/09 | |
| T3 | 01/10 | Qui | Árvore B+ |
| I3 | 06 e 08/10 | Laboratório M3. Entrega em 08/10 | |
| T4 | 13/10 | Ter | Parser e catálogo |
| I4 | 15 e 20/10 | Laboratório M4. Entrega em 20/10 | |
| T5 | 22/10 | Qui | Executor |
| I5 | 27 e 29/10 | Laboratório M5. Entrega em 29/10 |
| # | Data | Dia | Conteúdo |
|---|---|---|---|
| T6 | 03/11 | Ter | Transações |
| I6 | 05 e 10/11 | Laboratório M6. Entrega e sorteio dos seminários em 10/11 | |
| T7 | 12/11 | Qui | Recuperação |
| I7 | 17 e 19/11 | Laboratório M7. Entrega em 19/11 | |
| S1 | 24/11 | Ter | Seminários, primeira metade |
| S2 | 26/11 | Qui | Seminários, segunda metade |
| DO | 01 e 03/12 | Defesa oral individual | |
| — | 08/12 | Ter | Nossa Senhora da Conceição, sem aula |
| PF | 10/12 | Qui | Apresentações finais |
| — | 15, 17 e 22/12 | Buffer, fechamento e notas |
A camada de baixo. É por onde a gente começa a construir
Você pede 8 bytes ao disco. Quanto ele te entrega?
Quem transforma bloco em linha é o programa que vocês vão escrever.
Ler 8 bytes do disco custa quase o mesmo que ler 8 kilobytes. Por quê?
Uma página é um vetor de bytes, e nada além disso. O que dá sentido a ela é saber onde cada coisa começa.
página de 4096 bytes
+-----------+-------+-------+-------+------------------+
| cabeçalho | reg 0 | reg 1 | reg 2 | espaço livre |
+-----------+-------+-------+-------+------------------+
16 bytes 8 b 8 b 8 b
O cabeçalho diz quantos slots estão ocupados. O resto são registros, um atrás do outro.
Todo registro da tabela ocupa exatamente o mesmo número de bytes.
CREATE TABLE aluno (id INT, matricula INT);
id 4 bytes
matricula 4 bytes
registro 8 bytes, sempre o mesmo
Custa espaço, e proíbe texto de tamanho livre. Em troca, achar uma linha vira uma conta.
dados.db
+-----------+-----------+-----------+-----------+
| página 0 | página 1 | página 2 | página 3 | ...
| metadados | registros, registros, registros |
+-----------+-----------+-----------+-----------+
4096 b 4096 b 4096 b 4096 b
Heap file, do inglês, é o arquivo em que a linha nova vai para a primeira posição livre que aparecer.
Esse preço é exatamente o que a árvore B+ vai resolver, lá no M3.
Cada linha tem um endereço dentro do arquivo: o par (página, slot). É ele que o índice vai guardar, lá no M3.
Esse par tem nome. Procurem por RID, do inglês record identifier.
SELECT ctid, * FROM alguma_tabela;Arquivo contém páginas, página contém slots, e o slot guarda um registro. Escolhemos 4096 bytes para uma página cair em cima de um bloco, e não em cima de dois.
Slots crescem de uma ponta, dados da outra. Permite linha de tamanho variável.
não faremos
Um bit por coluna diz se o valor está ausente, sem gastar o espaço do campo.
não faremos
Guarda cada coluna junta, em vez de cada linha junta. Domina análise de dados.
vira seminário
Tamanho fixo custa espaço e proíbe VARCHAR livre. Ganhamos o semestre inteiro em troca.
No fim das contas, o módulo inteiro é isto:
le_pagina(n) → devolve os 4096 bytes da página n escreve_pagina(n, bytes) → grava os 4096 bytes na página n insere(registro) → acha espaço, grava, devolve o RID
O resto do semestre é construído em cima dessas três. Se elas estiverem certas, o M2 e o M3 vêm bem mais tranquilos.
Hoje vocês escrevem as duas primeiras funções do M1. Página de 4096 bytes, cabeçalho de 16, registro de 8.
escreve_pagina(n, bytes) e le_pagina(n) sobre um arquivo comum, na linguagem que a dupla escolheuNOTES.md dizendo em que byte do arquivo o registro foi pararEntrega até 15/09, junto com a escolha da linguagem e a saída do script de testes falhando por inteiro. Em 08 e 10/09 não há aula, por conta do CBSoft 2026.