100% found this document useful (7 votes)
82 views

(PDF Download) Database Design and Implementation 2nd Edition - Fulll Chapter

ebook

Uploaded by

ereidakalju
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (7 votes)
82 views

(PDF Download) Database Design and Implementation 2nd Edition - Fulll Chapter

ebook

Uploaded by

ereidakalju
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 49

Download and Read online, DOWNLOAD EBOOK, [PDF EBOOK EPUB ], Ebooks

download, Read Ebook EPUB/KINDE, Download Book Format PDF

Database Design and Implementation 2nd Edition --

OR CLICK LINK
https://textbookfull.com/product/database-design-
and-implementation-2nd-edition/

Read with Our Free App Audiobook Free Format PFD EBook, Ebooks dowload PDF
with Andible trial, Real book, online, KINDLE , Download[PDF] and Read and Read
Read book Format PDF Ebook, Dowload online, Read book Format PDF Ebook,
[PDF] and Real ONLINE Dowload [PDF] and Real ONLINE
More products digital (pdf, epub, mobi) instant
download maybe you interests ...

Database Systems: Design, Implementation, and


Management 13th Edition Carlos Coronel

https://textbookfull.com/product/database-systems-design-
implementation-and-management-13th-edition-carlos-coronel/

Database Systems Design Implementation Management 12th


Edition Carlos Coronel

https://textbookfull.com/product/database-systems-design-
implementation-management-12th-edition-carlos-coronel/

Pro SQL Server Relational Database Design and


Implementation 5th Edition Louis Davidson

https://textbookfull.com/product/pro-sql-server-relational-
database-design-and-implementation-5th-edition-louis-davidson/

Database Principles: Fundamentals of Design,


Implementation, and Management 3rd Edition Carlos
Coronel

https://textbookfull.com/product/database-principles-
fundamentals-of-design-implementation-and-management-3rd-edition-
carlos-coronel/
Pro SQL Server Relational Database Design and
Implementation Sixth Edition Louis Davidson

https://textbookfull.com/product/pro-sql-server-relational-
database-design-and-implementation-sixth-edition-louis-davidson/

Pro SQL Server Relational Database Design and


Implementation: Best Practices for Scalability and
Performance Louis Davidson

https://textbookfull.com/product/pro-sql-server-relational-
database-design-and-implementation-best-practices-for-
scalability-and-performance-louis-davidson/

A Practical Guide to Database Design 2nd Edition Rex


Hogan

https://textbookfull.com/product/a-practical-guide-to-database-
design-2nd-edition-rex-hogan/

A Practical Guide to Database Design 2nd Edition Rex


Hogan

https://textbookfull.com/product/a-practical-guide-to-database-
design-2nd-edition-rex-hogan-2/

Electronic Design Automation for IC Implementation


Circuit Design and Process Technology 2nd Edition
Luciano Lavagno

https://textbookfull.com/product/electronic-design-automation-
for-ic-implementation-circuit-design-and-process-technology-2nd-
edition-luciano-lavagno/
Data-Centric Systems and Applications

Edward Sciore

Database
Design and
Implementation
Second Edition
Data-Centric Systems and Applications

Series editors
Michael J. Carey
Stefano Ceri

Editorial Board Members


Anastasia Ailamaki
Shivnath Babu
Philip A. Bernstein
Johann-Christoph Freytag
Alon Halevy
Jiawei Han
Donald Kossmann
Gerhard Weikum
Kyu-Young Whang
Jeffrey Xu Yu
Edward Sciore
Boston College
Chestnut Hill, MA, USA

ISSN 2197-9723 ISSN 2197-974X (electronic)


Data-Centric Systems and Applications
ISBN 978-3-030-33835-0 ISBN 978-3-030-33836-7 (eBook)
https://doi.org/10.1007/978-3-030-33836-7

The first edition of this book was published by John Wiley & Sons, Inc.

© Springer Nature Switzerland AG 2020


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology
now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this publication
does not imply, even in the absence of a specific statement, that such names are exempt from the relevant
protective laws and regulations and therefore free for general use.
The publisher, the authors, and the editors are safe to assume that the advice and information in this
book are believed to be true and accurate at the date of publication. Neither the publisher nor the authors or
the editors give a warranty, expressed or implied, with respect to the material contained herein or for any
errors or omissions that may have been made. The publisher remains neutral with regard to jurisdictional
claims in published maps and institutional affiliations.

This Springer imprint is published by the registered company Springer Nature Switzerland AG.
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Preface

A database system is a common, visible tool in the corporate world—employees


frequently interact directly with database systems to submit data or create reports.
Database systems are also common, but invisible, as components of software
systems. For example, consider an e-commerce website that uses a server-side
database to hold customer, product, and sales information. Or consider a GPS
navigation system that uses an embedded database to manage the road maps. In
both of these examples, the presence of the database system is hidden from the user;
the application code performs all of the database interaction.
From the point of view of a software developer, learning to use a database directly
is rather mundane, because modern database systems contain sophisticated front
ends that make the creation of queries and reports straightforward. On the other
hand, the possibility of incorporating database functionality into a software applica-
tion is exciting, because it opens up a wealth of new and unexplored opportunities.
But what does “incorporating database functionality” mean? A database system
provides many things, such as persistence, transactional support, and query
processing. Which of these features are needed, and how should they be integrated
into the software? Suppose, for example, that a programmer is asked to modify an
existing application, say to add the ability to save state, or to increase reliability, or to
improve the efficiency of file access. The programmer is faced with several archi-
tectural options. She could:
• Purchase a full-featured general-purpose database system and then modify the
application to connect to the database as a client
• Obtain a more specialized system that contains only the desired features and
whose code can be embedded directly into the application
• Write the necessary functionality herself
In order to make the proper choice, the programmer needs to understand what
each of these options entail. She needs to know not only what database systems do
but also how they do it and why.

v
vi Preface

This text examines database systems from the point of view of the software
developer. This perspective allows us to investigate why database systems are the
way they are. It is, of course, important to be able to write queries, but it is equally
important to know how they are processed. We don’t want to just use JDBC, we
want to know why the API contains the classes and methods that it does. We need a
sense of how hard is it to write a disk cache or logging facility. And what exactly is a
database driver, anyway?

Organization of the Text

The first two chapters provide a quick overview of database systems and their use.
Chapter 1 discusses the purpose and features of a database system and introduces
you to the Derby and SimpleDB systems. Chapter 2 explains how to write a database
application using Java. It presents the basics of JDBC, which is the fundamental API
for Java programs that interact with a database.
Chapters 3–11 examine the internals of a typical database engine. Each of its
chapters covers a different database component, starting with the lowest level of
abstraction (the disk and file manager) and ending with the highest (the JDBC client
interface). The chapter for each component explains the issues and considers possi-
ble design decisions. As a result, you can see exactly what services each component
provides and how it interacts with the other components in the system. By the end of
this part, you will have witnessed the gradual development of a simple but
completely functional system.
The remaining four chapters focus on efficient query processing. They examine
the sophisticated techniques and algorithms that can replace the simple design
choices described earlier. Topics include indexing, sorting, intelligent buffer
usage, and query optimization.

Text Prerequisites

This text is intended for upper-level undergraduate or beginning graduate courses in


computer science. It assumes that the reader is comfortable with basic Java pro-
gramming; for example, it uses the classes in java.util extensively, particularly
collections and maps. Advanced Java concepts (such as RMI and JDBC) are fully
explained in the text.
The material in this book is typically studied as a second course in database
systems. However, I have had success teaching it to students with no database
experience. To that end, this book assumes no prior database knowledge other
than a passing acquaintance with SQL. And students without such knowledge of
SQL will find it easy to pick up what they need.
Preface vii

The SimpleDB Software

In my experience, it is much easier for students to grasp conceptual ideas (such as


concurrency control, buffer management, and query optimization algorithms) than to
grasp how these ideas interact. Ideally, a student should write an entire database
system as part of his coursework, just as the student would write an entire compiler
in a compiler course. However, a database system is much more complex than a
compiler, so that approach is not practical. My solution was to write a simple but
fully functional database system, called SimpleDB. Students can apply their concep-
tual knowledge by examining SimpleDB code and modifying it.
SimpleDB “looks” like a commercial database system, both in its function and
structure. Functionally, it is a multiuser, transaction-oriented database server that
executes SQL statements and interacts with clients via JDBC. Structurally, it con-
tains the same basic components as a commercial system, with similar APIs. Each
component of SimpleDB has a corresponding chapter in the text, which discusses the
component’s code and the design decisions behind it.
SimpleDB is a useful educational tool because its code is small, easily readable,
and easily modifiable. It omits all unnecessary functionality, implements only a tiny
portion of SQL, and uses only the simplest (and often very impractical) algorithms.
There consequently are numerous opportunities for students to extend the system
with additional features and more efficient algorithms; many of these extensions
appear as end-of-chapter exercises.
SimpleDB can be downloaded from the http://cs.bc.edu/~sciore/simpledb.
Details on installing and using SimpleDB appear on that web page and in Chap. 1.
I welcome suggestions for improving the code, as well as reports of any bugs. You
can email me at [email protected].

End-of-Chapter Readings

This text is motivated by two questions: What functionality do database systems


provide? What algorithms and design decisions will best implement this function-
ality? Entire shelves can be filled with books that address different aspects of these
questions. Since there is no way that a single text could hope to be comprehensive, I
have chosen to present only those algorithms and techniques that most clearly
illustrate the issues involved. My overriding goal is to teach the principles behind
a technique, even if it means omitting (or reducing) discussion of the most commer-
cially viable version of it. Instead, the end of each chapter contains a “suggested
readings” section. Those sections discuss interesting ideas and research directions
that went unmentioned in the text and provide references to relevant web pages,
research articles, reference manuals, and books.
viii Preface

End-of-Chapter Exercises

The end of each chapter contains numerous exercises. Some exercises are of the
pencil-and-paper variety, designed to reinforce concepts taught in the chapter. Other
exercises suggest interesting modifications to SimpleDB, and many of them make
excellent programming projects. I have written solutions to most of the exercises. If
you are the instructor of a course using this textbook and would like a copy of the
solution manual, please email me at [email protected].
Contents

1 Database Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Why a Database System? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 The Derby Database System . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Database Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 The SimpleDB Database System . . . . . . . . . . . . . . . . . . . . . . 10
1.5 The SimpleDB Version of SQL . . . . . . . . . . . . . . . . . . . . . . . 11
1.6 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.7 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1 Basic JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Advanced JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3 Computing in Java vs. SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.4 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3 Disk and File Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.1 Persistent Data Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2 The Block-Level Interface to the Disk . . . . . . . . . . . . . . . . . . 60
3.3 The File-Level Interface to the Disk . . . . . . . . . . . . . . . . . . . . 61
3.4 The Database System and the OS . . . . . . . . . . . . . . . . . . . . . . 65
3.5 The SimpleDB File Manager . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.6 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.7 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4 Memory Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.1 Two Principles of Database Memory Management . . . . . . . . . 79
4.2 Managing Log Information . . . . . . . . . . . . . . . . . . . . . . . . . . 81

ix
x Contents

4.3 The SimpleDB Log Manager . . . . . . . . . . . . . . . . . . . . . . . . . 83


4.4 Managing User Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.5 The SimpleDB Buffer Manager . . . . . . . . . . . . . . . . . . . . . . . 93
4.6 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.7 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5 Transaction Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.1 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.2 Using Transactions in SimpleDB . . . . . . . . . . . . . . . . . . . . . . 108
5.3 Recovery Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.4 Concurrency Management . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
5.5 Implementing SimpleDB Transactions . . . . . . . . . . . . . . . . . . 145
5.6 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.7 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
6 Record Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.1 Designing a Record Manager . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.2 Implementing a File of Records . . . . . . . . . . . . . . . . . . . . . . . 165
6.3 SimpleDB Record Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
6.4 SimpleDB Table Scans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
6.5 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
6.6 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
6.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
7 Metadata Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.1 The Metadata Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.2 Table Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.3 View Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
7.4 Statistical Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
7.5 Index Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
7.6 Implementing the Metadata Manager . . . . . . . . . . . . . . . . . . . 205
7.7 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
7.8 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
7.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
8 Query Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.1 Relational Algebra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.2 Scans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
8.3 Update Scans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
8.4 Implementing Scans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
8.5 Pipelined Query Processing . . . . . . . . . . . . . . . . . . . . . . . . . . 226
8.6 Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
8.7 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
8.8 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
8.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Contents xi

9 Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
9.1 Syntax Versus Semantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
9.2 Lexical Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
9.3 The SimpleDB Lexical Analyzer . . . . . . . . . . . . . . . . . . . . . . 241
9.4 Grammars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.5 Recursive-Descent Parsers . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
9.6 Adding Actions to the Parser . . . . . . . . . . . . . . . . . . . . . . . . . 250
9.7 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
9.8 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
9.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
10 Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
10.1 Verification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
10.2 The Cost of Evaluating a Query Tree . . . . . . . . . . . . . . . . . . . 268
10.3 Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
10.4 Query Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
10.5 Update Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
10.6 The SimpleDB Planner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
10.7 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
10.8 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
10.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
11 JDBC Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
11.1 The SimpleDB API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
11.2 Embedded JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
11.3 Remote Method Invocation . . . . . . . . . . . . . . . . . . . . . . . . . . 300
11.4 Implementing the Remote Interfaces . . . . . . . . . . . . . . . . . . . . 305
11.5 Implementing the JDBC Interfaces . . . . . . . . . . . . . . . . . . . . . 306
11.6 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
11.7 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
11.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
12 Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
12.1 The Value of Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
12.2 SimpleDB Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
12.3 Static Hash Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
12.4 Extendable Hash Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
12.5 B-Tree Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
12.6 Index-Aware Operator Implementations . . . . . . . . . . . . . . . . . 345
12.7 Index Update Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.8 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
12.9 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
12.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
13 Materialization and Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
13.1 The Value of Materialization . . . . . . . . . . . . . . . . . . . . . . . . . 363
13.2 Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
xii Contents

13.3 Materialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364


13.4 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
13.5 Grouping and Aggregation . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
13.6 Merge Joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
13.7 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
13.8 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
13.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
14 Effective Buffer Utilization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
14.1 Buffer Usage in Query Plans . . . . . . . . . . . . . . . . . . . . . . . . . 397
14.2 Multibuffer Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
14.3 Multibuffer Product . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
14.4 Determining Buffer Allocation . . . . . . . . . . . . . . . . . . . . . . . . 402
14.5 Implementing Multibuffer Sorting . . . . . . . . . . . . . . . . . . . . . 403
14.6 Implementing Multibuffer Product . . . . . . . . . . . . . . . . . . . . . 404
14.7 Hash Joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
14.8 Comparing the Join Algorithms . . . . . . . . . . . . . . . . . . . . . . . 412
14.9 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
14.10 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
14.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
15 Query Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
15.1 Equivalent Query Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
15.2 The Need for Query Optimization . . . . . . . . . . . . . . . . . . . . . 426
15.3 The Structure of a Query Optimizer . . . . . . . . . . . . . . . . . . . . 430
15.4 Finding the Most Promising Query Tree . . . . . . . . . . . . . . . . . 430
15.5 Finding the Most Efficient Plan . . . . . . . . . . . . . . . . . . . . . . . 440
15.6 Combining the Two Stages of Optimization . . . . . . . . . . . . . . 441
15.7 Merging Query Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
15.8 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
15.9 Suggested Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
15.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
About the Author

Edward Sciore is a recently retired associate professor in the Computer Science


Department at Boston College. He is the author of numerous research articles about
database systems, which span both theory and practice. His favorite activity, how-
ever, is to teach database courses to captive students. These teaching experiences,
accumulated over a 35-year period, are what led to the writing of this text.

xiii
Chapter 1
Database Systems

Database systems play an important role in the computer industry. Some database
systems (such as Oracle) are enormously complex and typically run on large, high-
end machines. Others (such as SQLite) are small, streamlined, and intended for the
storage of application-specific data. Despite their wide range of uses, all database
systems have similar features. This chapter examines the issues that a database
system must address and the capabilities it is expected to have. It also introduces
the Derby and SimpleDB database systems, which will be discussed in this book.

1.1 Why a Database System?

A database is a collection of data stored on a computer. The data in a database is


typically organized into records, such as employee records, medical records, sales
records, etc. Figure 1.1 depicts a database that holds information about students in a
university and the courses they have taken. This database will be used as a running
example throughout the book. The database of Fig. 1.1 contains five types of
records:
• There is a STUDENT record for each student that has attended the university.
Each record contains the student’s ID number, name, graduation year, and ID of
the student’s major department.
• There is a DEPT record for each department in the university. Each record
contains the department’s ID number and name.
• There is a COURSE record for each course offered by the university. Each record
contains the course’s ID number, title, and the ID of the department that offers it.
• There is a SECTION record for each section of a course that has ever been given.
Each record contains the section’s ID number, the year the section was offered,
the ID of the course, and the professor teaching that section.

© Springer Nature Switzerland AG 2020 1


E. Sciore, Database Design and Implementation, Data-Centric Systems and
Applications, https://doi.org/10.1007/978-3-030-33836-7_1
2 1 Database Systems

STUDENT SId SName GradYear MajorId DEPT DId DName


1 joe 2021 10 10 compsci
2 amy 2020 20 20 math
3 max 2022 10 30 drama
4 sue 2022 20
COURSE CId Title DeptId
5 bob 2020 30
12 db systems 10
6 kim 2020 20
22 compilers 10
7 art 2021 30
32 calculus 20
8 pat 2019 20
42 algebra 20
9 lee 2021 10
52 acting 30
ENROLL EId StudentId SectionId Grade 62 elocution 30
14 1 13 A
SECTION SectId CourseId Prof YearOffered
24 1 43 C
13 12 turing 2018
34 2 43 B+ 23 12 turing 2016
44 4 33 B 33 32 newton 2017
54 4 53 A 43 32 einstein 2018
64 6 53 A 53 62 brando 2017

Fig. 1.1 Some records for a university database

• There is an ENROLL record for each course taken by a student. Each record
contains the enrollment ID number, the ID numbers of the student and the section
of the course taken, and the grade the student received for the course.
Figure 1.1 is just a conceptual picture of some records. It does not indicate
anything about how the records are stored or how they are accessed. There are
many available software products, called database systems, which provide an
extensive set of features for managing records.
What does it mean to “manage” records? What features must a database system
have, and which features are optional? The following five requirements seem
fundamental:
• Databases must be persistent. Otherwise, the records would disappear as soon as
the computer is turned off.
• Databases can be shared. Many databases, such as our university database, are
intended to be shared by multiple concurrent users.
• Databases must be kept accurate. If users cannot trust the contents of a database,
it becomes useless and worthless.
• Databases can be very large. The database of Fig. 1.1 contains only 29 records,
which is ridiculously small. It is not unusual for a database to contain millions
(or even billions) of records.
• Databases must be usable. If users are not able to easily get at the data they want,
their productivity will suffer, and they will clamor for a different product.
1.1 Why a Database System? 3

Fig. 1.2 Implementing the STUDENT records in a text file

The following subsections examine the implications of these requirements. Each


requirement forces the database system to contain increasingly more features,
resulting in more complexity than you might have expected.

1.1.1 Record Storage

A common way to make a database persistent is to store its records in files. The
simplest and most straightforward approach is for a database system to store records
in text files, one file per record type; each record could be a line of text, with its
values separated by tabs. Figure 1.2 depicts the beginning of the text file for the
STUDENT records.
This approach has the advantage that a user could examine and modify the files
with a text editor. Unfortunately, the approach is too inefficient to be useful, for two
reasons.
The first reason is that large text files take too long to update. Suppose, for
example, that someone deletes Joe’s record from the STUDENT file. The database
system would have no choice but to rewrite the file beginning at Amy’s record,
moving each succeeding record to the left. Although the time required to rewrite a
small file is negligible, rewriting a 1 gigabyte file could easily take several minutes,
which is unacceptably long. A database system needs to be much more clever about
how it stores records, so that updates to the file require only small, local rewrites.
The second reason is that large text files take too long to read. Consider searching
the STUDENT file for the students in the class of 2019. The only way is to scan the file
sequentially. Sequential scanning can be very inefficient. You probably know several
in-memory data structures, such as trees and hash tables, which enable fast searching.
A database system needs to use analogous data structures to implement its files. For
example, a database system might organize the records in a file using a structure that
facilitates one particular type of search (e.g., on student name, graduation year or
major), or it might create multiple auxiliary files, each facilitating a different type of
search. These auxiliary files are called indexes and are the subject of Chap. 12.

1.1.2 Multi-user Access

When many users share a database, there is a good chance that they will be accessing
some of its data files concurrently. Concurrency is a good thing, because each user
can be served quickly without having to wait for the other users to finish. But too
4 1 Database Systems

much concurrency is bad, because it can cause the database to become inaccurate.
For example, consider a travel-planning database. Suppose that two users try to
reserve a seat on a flight that has 40 seats remaining. If both users concurrently read
the same flight record, they both will see the 40 available seats. They both then
modify the record so that the flight now has 39 available seats. Oops. Two seats have
been reserved, but only one reservation has been recorded in the database.
A solution to this problem is to limit concurrency. The database system should
allow the first user to read the flight record and see the 40 available seats and then
block the second user until the first user finishes. When the second user resumes, it
will see 39 available seats and modify it to 38, as it should. In general, a database
system must be able to detect when a user is about to perform an action that conflicts
with an action of another user and then (and only then) block that user from
executing until the first user has finished.
Users also may need to undo database updates they have made. For example,
suppose that a user has searched the travel-planning database for a trip to Madrid and
found a date for which there is both an available flight and a hotel with a vacancy.
Now suppose that the user reserves the flight, but while the reservation process is
occurring, all of the hotels for that date fill up. In this case, the user may need to undo
the flight reservation and try for a different date.
An update that is undoable should not be visible to the other users of the database.
Otherwise, another user may see the update, think that the data is “real,” and make a
decision based on it. The database system must therefore provide users with the
ability to specify when their changes are permanent; the user is said to commit the
changes. Once a user commits, the changes become visible and cannot be undone.
Chapter 5 examines these issues.

1.1.3 Dealing with Catastrophe

Suppose that you are running a program that gives a pay raise to all professors, when
the database system unexpectedly crashes. After the system restarts, you realize that
some of the professors have a new salary, but others don’t. What should you do?
You can’t just rerun the program because that would give some professors a double
pay raise. Instead, you need the database system to recover gracefully from the crash,
undoing the updates of all programs that were running when the crash occurred. The
mechanism for doing so is interesting and nontrivial, and is examined in Chap. 5.

1.1.4 Memory Management

Databases need to be stored in persistent memory, such as disk drives or flash drives.
Flash drives are about 100 times faster than disk drives but are also significantly
more expensive. Typical access times are about 6 ms for disk and 60 μs for flash.
However, both of these times are orders of magnitude slower than main memory
1.1 Why a Database System? 5

(or RAM), which has access times of about 60 ns. That is, RAM is about 1000 times
faster than flash and 100,000 times faster than disk.
To see the effect of this performance difference and the consequent problems
faced by a database system, consider the following analogy. Suppose you crave a
chocolate chip cookie. There are three ways to get one: from your kitchen, at the
neighborhood grocery store, or via mail order. In this analogy, your kitchen corre-
sponds to RAM, the neighborhood store corresponds to a flash drive, and the mail
order company corresponds to a disk. Suppose that it takes 5 seconds to get the
cookie from your kitchen. Getting the cookie from the analogous store would require
5000 seconds, which is over an hour. This means going to the store, waiting in a very
long line, buying the cookie, and returning. And getting the cookie from the
analogous mail order company would require 500,000 seconds, which is over
5 days. That means ordering the cookie online and having it shipped using standard
delivery. From this point of view, flash and disk memory look terribly slow.
Wait! It gets worse. Database support for concurrency and reliability slows things
down even more. If someone else is using the data you want, then you may be forced
to wait until the data is released. In our analogy, this corresponds to arriving at the
grocery store and discovering that the cookies are sold out, forcing you to wait until
they are restocked.
In other words, a database system is faced with the following conundrum: It must
manage more data than main memory systems, using slower devices, with multiple
people fighting over access to the data, and make it completely recoverable, all the
while maintaining a reasonable response time.
A large part of the solution to this conundrum is to use caching. Whenever the
database system needs to process a record, it loads it into RAM and keeps it there for
as long as possible. Main memory will thus contain the portion of the database that is
currently in use. All reading and writing occur in RAM. This strategy has the
advantage that fast main memory is used instead of slow persistent memory but
has the disadvantage that the persistent version of the database can become out of
date. The database system needs to implement techniques for keeping the persistent
version of the database synchronized with the RAM version, even in the face of a
system crash (when the contents of RAM is destroyed). Chapter 4 considers various
caching strategies.

1.1.5 Usability

A database is not very useful if its users cannot easily extract the data they want. For
example, suppose that a user wants to know the names of all students who graduated
in 2019. In the absence of a database system, the user would be forced to write a
program to scan the student file. Figure 1.3 gives the Java code for such a program,
assuming that the file is stored as text. Note that most of the Java code deals with
decoding the file, reading each record and splitting it into an array of values to be
examined. The code to determine the desired student names (in bold) is hidden
within the uninteresting file-manipulation code.
6 1 Database Systems

public static List<String> getStudents2019() {


List<String> result = new ArrayList<>();
FileReader rdr = new FileReader("students.txt");
BufferedReader br = new BufferedReader(rdr);
String line = br.readLine();
while (line != null) {
String[] vals = line.split("\t");
String gradyear = vals[2];
if (gradyear.equals("2019"))
result.add(vals[1]);
line = br.readLine();
}
return result;
}

Fig. 1.3 Retrieving the name of students graduating in 2019

Consequently, most database systems support a query language, so that users can
easily specify their desired data. The standard query language for relational data-
bases is SQL. The code of Fig. 1.3 can be expressed by the single SQL statement:

select SName from STUDENT where GradYear = 2019

This SQL statement is much shorter and clearer than the Java program, primarily
because it specifies the values to be extracted from the file without having to specify
how to retrieve them.

1.2 The Derby Database System

Learning database concepts is much more effective if you can use a database system
to follow along interactively. Although there are a wide variety of available database
systems, I suggest that you use Derby database system because it is Java-based, free,
easy to install, and easy to use. The latest version of Derby can be downloaded from
the downloads tab at the URL db.apache.org/derby. The downloaded
distribution file unpacks to a folder containing several directories. For example,
the docs directory contains reference documentation, the demo directory contains a
sample database, and so on. The full system contains many more features than can be
covered here; the interested reader can peruse the various guides and manuals in the
docs directory.
Derby has many features that are not needed in this book. In fact, you only need to
add four files from Derby’s lib directory to your classpath: derby.jar,
derbynet.jar, derbyclient.jar, and derbytools.jar. There are
many ways to change your classpath, depending on your Java platform and operat-
ing system. I will explain how to do it using the Eclipse development platform. If
you are not familiar with Eclipse, you can download its code and documentation
1.2 The Derby Database System 7

from eclipse.org. If you use a different development platform, then you should
be able to adapt my Eclipse directions to fit your environment.
First, create an Eclipse project for Derby. Then configure its build path, as
follows. From the Properties window, select “Java Build Path.” Click on the
“Libraries” tab and then “Add External JARS,” and use the file chooser to select the
four jar files you need. That’s it.
The Derby distribution contains an application, called ij, which enables you to
create and access Derby databases. Because Derby is written completely in Java, ij
is actually the name of a Java class, located in the package org.apache.derby.
tools. You run ij by executing its class. To execute the class from Eclipse, go to
“Run Configurations” in the Run menu. Add a new configuration to your Derby
project; call it “Derby ij.” In the field for the configuration’s main class, enter “org.
apache.derby.tools.ij.” When you run the configuration, ij displays a console
window that asks for input.
Input to ij is a sequence of commands. A command is a string that ends with a
semicolon. Commands can be split over several lines of text; the ij client will not
execute a command until it encounters a line ending in a semicolon. Any SQL
statement is a legal command. In addition, ij supports commands to connect and
disconnect from a database and to exit the session.
The connect command specifies the database that ij should connect to, and
the disconnect command disconnects from it. A given session can connect and
disconnect multiple times. The exit command ends the session. Figure 1.4 shows
an example ij session. The session has two parts. In the first part, the user connects
to a new database, creates a table, inserts a record into that table, and disconnects. In
the second part, the user reconnects to that database, retrieves the inserted values,
and disconnects.
The argument to the connect command is called its connection string. The
connection string has three substrings, separated by colons. The first two substrings
are “jdbc” and “derby,” indicating that you want to connect to a Derby database
using the JDBC protocol. (JDBC is the topic of Chap. 2.) The third substring

ij> connect 'jdbc:derby:ijtest;create=true';


ij> create table T(A int, B varchar(9));
0 rows inserted/updated/deleted
ij> insert into T(A,B) values(3, 'record3');
1 row inserted/updated/deleted
ij> disconnect;
ij> connect 'jdbc:derby:ijtest';
ij> select * from T;
A |B
---------------------
3 |record3

1 row selected
ij> disconnect;
ij> exit;

Fig. 1.4 An example ij session


8 1 Database Systems

identifies the database. The string “ijtest” is the name of the database; its files will be
in a folder named “ijtest”, located in the directory from which the ij program was
launched. For example, if you ran the program from Eclipse, the database folder will
be in the project directory. The string “create ¼ true” tells Derby to create a new
database; if it is omitted (as in the second connection command), then Derby expects
to find an existing database.

1.3 Database Engines

A database application such as ij is comprised of two independent parts: the user


interface (or UI), and the code to access the database. This latter code is called the
database engine. Separating the UI from the database engine is good system design,
as it simplifies the development of the application. A well-known example of this
separation occurs in the Microsoft Access database system. It has a graphical UI that
allows a user to interact with the database by clicking the mouse and filling in values,
and an engine that handles the data storage. When the UI determines that it needs
information from the database, it constructs a request and sends it to the engine. The
engine then executes the request and sends values back to the UI.
This separation also adds flexibility to the system: an application designer can use
the same user interface with different database engines or build different user
interfaces for the same database engine. Microsoft Access provides an example of
each case. A form built using the Access UI can connect to the Access engine or any
other database engine. And the cells in an Excel spreadsheet can contain formulas
that query the Access engine.
A UI accesses a database by connecting to the desired engine and then calling
methods from the engine’s API. As an example, note that the Derby ij program is
really just a UI. Its connect command establishes a connection to the specified
database engine, and each SQL command sends the SQL statement to the engine,
retrieves the results, and displays them.
Database engines typically support multiple standard APIs. When a Java program
connects to an engine, the API of choice is called JDBC. Chapter 2 discusses JDBC
in detail and shows how to write an ij-like application using JDBC.
A connection from a UI to a database engine can be embedded or server-based. In
an embedded connection, the code for the database engine runs in the same process
as the code for the UI, which gives the UI exclusive access to the engine. An
application should use an embedded connection only when the database “belongs”
to that application and is stored on the same machine as the application. Other
applications need to use server-based connections.
In a server-based connection, the code for the database engine executes inside a
dedicated server program. This server program is always running, waiting for client
connections, and need not be on the same machine as its clients. After a client
establishes a connection with the server, the client sends JDBC requests to it and
receives responses.
1.3 Database Engines 9

A server can be connected to multiple clients simultaneously. While the server is


processing one client’s request, other clients can be sending their own requests. The
server contains a scheduler, which queues up requests waiting for service and
determines when they get executed. Each client is unaware of the other clients and
(apart from delays due to scheduling) has the pleasant illusion that the server is
dealing with it exclusively.
The ij session of Fig. 1.4 used an embedded connection. It created the database
“ijtest” on the machine that was running the session, and no server was involved. To
execute an analogous server-based ij session, two things must change: the Derby
engine must run as a server, and the connect command must be modified so that it
identifies the server.
The code for the Derby server is in the Java class NetworkServerControl,
in the package org.apache.derby.drda. To run the server from Eclipse, go to
“Run Configurations” in the Run menu. Add a new configuration to your Derby
project and call it “Derby Server.” In the field for the main class, enter “org.apache.
derby.drda.NetworkServerControl.” In the Arguments tab, enter the program argu-
ment “start -h localhost.” Each time you run the configuration, a console window
should appear indicating that the Derby server is running.
What is the purpose of the program argument “start -h localhost”? The first word
is the command “start,” which tells the class to start the server. You can stop the
server by executing the same class with the argument “shutdown” (or you can simply
terminate the process from the console window). The string “-h localhost” tells the
server to only accept requests from clients on the same machine. If you replace
“localhost” by a domain name or IP address, then the server will only accept requests
from that machine. Using the IP address “0.0.0.0” tells the server to accept requests
from anywhere.1
A connection string for a server-based connection must specify the network or IP
address of the server machine. In particular, consider the following ij connect
commands:

ij> connect 'jdbc:derby:ijtest'


ij> connect 'jdbc:derby://localhost/ijtest'
ij> connect 'jdbc:derby://cs.bc.edu/ijtest'

The first command establishes an embedded connection to the “ijtest” database.


The second command establishes a server-based connection to “ijtest” using the
server running on the machine “localhost,” that is, on the local machine. The third
command establishes a server-based connection to “ijtest” using the server running
on the machine “cs.bc.edu.”
Note how the connect string completely encapsulates the decision to use an
embedded or server-side connection. For example, consider again Fig. 1.4. You
can modify the session to use server-side connections instead of embedded ones by

1
Of course, if you allow clients to connect from anywhere, then you expose the database to hackers
and other unscrupulous users. Typically, you would either place such a server inside of a firewall,
enable Derby’s authentication mechanism, or both.
10 1 Database Systems

simply changing the connect commands. The other commands in the session are
unaffected.

1.4 The SimpleDB Database System

Derby is a sophisticated, full-featured database system. This complexity, however,


means that its source code is not readily understandable or modifiable. I wrote the
SimpleDB database system to be the opposite of Derby—its code is small, easily
readable, and easily modifiable. It omits all unnecessary functionality, implements
only a tiny portion of SQL, and uses only the simplest (and often very impractical)
algorithms. Its purpose is to give you a clear look at each component of a database
engine and how these components interact.
The latest version of SimpleDB can be downloaded from its website at the URL
cs.bc.edu/~sciore/simpledb. The downloaded file unpacks to the folder
SimpleDB_3.x; this folder contains directories simpledb, simpleclient,
and derbyclient. The simpledb folder contains code for the database engine.
Unlike Derby, this code is not packed into a jar file; instead, every file is explicit
within the folder.
To install the SimpleDB engine, you must add the simpledb folder to your
classpath. To do so using Eclipse, first, create a new project; call it “SimpleDB
Engine.” Then from the operating system, copy the subfolder of your
SimpleDB_3.x folder named “simpledb” to the src folder of the project. Finally,
refresh the project from Eclipse, using the refresh command in the File menu.
The derbyclient folder contains example programs that call the Derby
engine. Use the operating system to copy the contents of this folder (not the folder
itself) to the src folder of your Derby project, and refresh it. These client programs
will be discussed in Chap. 2.
The simpleclient folder contains example programs that call the SimpleDB
engine. You should create a new project for them; call it “SimpleDB Clients.” To
ensure that the example programs can find the SimpleDB engine code, you should
add the SimpleDB Engine project to the build path of SimpleDB Clients.
Then use the operating system to copy the contents of simpleclient into the
src directory of SimpleDB Clients.
SimpleDB supports both embedded and server-based connections. One of the
programs in the simpleclient folder is SimpleIJ, which is a simplified
version of the Derby ij program. One difference from ij is that you can only
connect once, at the beginning of the session. When you execute the program, it asks
you for a connection string. The syntax of the connection string is similar to that in
ij. For example, consider the following SimpleDB connection strings:

jdbc:simpledb:testij
jdbc:simpledb://localhost
jdbc:simpledb://cs.bc.edu
1.5 The SimpleDB Version of SQL 11

The first connection string specifies an embedded connection to the “testij”


database. Like Derby, the database will be located in the directory of the executing
program, which is the SimpleDB Clients project. Unlike Derby, SimpleDB will
create the database if it does not exist, so there is no need for an explicit
“create ¼ true” flag.
The second and third connection strings specify a server-based connection to a
SimpleDB server running on the local machine or on cs.bc.edu. Unlike Derby,
the connection string does not specify a database. The reason is that the SimpleDB
engine can handle only one database at a time, which is specified when the server is
started.
SimpleIJ repeatedly prints a prompt asking you to enter a single line of text
containing an SQL statement. Unlike Derby, the line must contain the entire
statement, and no semicolon is needed at the end. The program then executes that
statement. If the statement is a query, then the output table is displayed. If the
statement is an update command, then the number of affected records is printed. If
the statement is ill-formed, then an error message will be printed. SimpleDB
understands a very limited subset of SQL, and SimpleIJ will throw an exception
if given an SQL statement that the engine does not understand. These limitations are
described in the next section.
The SimpleDB engine can be run as a server. The main class is StartServer in the
package simpledb.server. To run the server from Eclipse, go to “Run Configura-
tions” in the Run menu. Add a new configuration to your SimpleDB Engine
project called “SimpleDB Server.” In the field for the main class, enter “simpledb.
server.StartServer.” Use the Arguments tab to enter the name of the desired database.
For convenience, the server will use the database named “studentdb” if you omit the
argument. When you run the configuration, a console window should appear indi-
cating that the SimpleDB server is running.
The SimpleDB server accepts client connections from anywhere, corresponding
to Derby’s “-h 0.0.0.0” command-line option. The only way to shut down the server
is to kill its process from the console window.

1.5 The SimpleDB Version of SQL

Derby implements nearly all of standard SQL. SimpleDB, on the other hand,
implements only a tiny subset of standard SQL and imposes restrictions not present
in the SQL standard. This section briefly indicates these restrictions. Other chapters
of the book explain them in more detail, and many end-of-chapter exercises will ask
you to implement some of the omitted features.
A query in SimpleDB consists only of select-from-where clauses in which the
select clause contains a list of field names (without the AS keyword), and the
from clause contains a list of table names (without range variables).
The terms in the optional where clause can be connected only by the boolean
operator and. Terms can only compare constants and fieldnames for equality.
12 1 Database Systems

Unlike standard SQL, there are no other comparison operators, no other boolean
operators, no arithmetic operators or built-in functions, and no parentheses. Conse-
quently, nested queries, aggregation, and computed values are not supported.
Because there are no range variables and no renaming, all field names in a query
must be disjoint. And because there are no group by or order by clauses,
grouping and sorting are not supported. Other restrictions are:
• The “” abbreviation in the select clause is not supported.
• There are no null values.
• There are no explicit joins or outer joins in the from clause.
• The union keyword is not supported.
• An insert statement takes explicit values only. That is, an insertion cannot be
specified by a query.
• An update statement can have only one assignment in the set clause.

1.6 Chapter Summary

• A database is a collection of data stored on a computer. The data in a database is


typically organized into records. A database system is software that manages the
records in a database.
• A database system must be able to handle large shared databases, storing its data
on slow persistent memory. It must provide a high-level interface to its data and
ensure data accuracy in the face of conflicting user updates and system crashes.
Database systems meet these requirements by having the following features:
– The ability to store records in a file, using a format that can be accessed more
efficiently than the file system typically allows
– Complex algorithms for indexing data in files, to support fast access
– The ability to handle concurrent accesses from multiple users over a network,
blocking users when necessary
– Support for committing and rolling back changes
– The ability to cache database records in main memory and to manage the
synchronization between the persistent and main-memory versions of the
database, restoring the database to a reasonable state if the system crashes
– A language compiler/interpreter, for translating user queries on tables to
executable code on files
– Query optimization strategies, for transforming inefficient queries into more
efficient ones
• The database engine is the component of the database system that maintains the
data. A database application is responsible for user input and output; it calls the
database engine to obtain the data it needs.
• A connection to the database engine can be either embedded or server-based. A
program having an embedded connection has exclusive access to the database
1.8 Exercises 13

engine. A program having a server-based connection shares the engine with other
concurrent programs.
• Two Java-based database systems are Derby and SimpleDB. Derby implements
the full SQL standard, whereas SimpleDB implements only a limited subset of
SQL. SimpleDB is useful because its code is easy to understand. The rest of this
book starting in Chap. 3 will examine this code in detail.

1.7 Suggested Reading

Database systems have undergone dramatic changes over the years. A good account
of these changes can be found in Chap. 6 of National Research Council (1999) and in
Haigh (2006). The Wikipedia entry at en.wikipedia.org/wiki/Data
base_management_system#History is also interesting.
The client-server paradigm is useful in numerous areas of computing, not just
databases. A general overview of the field can be found in Orfali et al. (1999).
Documentation on the various features and configuration options of the Derby server
can be found at the URL db.apache.org/derby/manuals/index.html.
Haigh, T. (2006). “A veritable bucket of facts”. Origins of the data base management
system. ACM SIGMOD Record, 35(2), 33–49.
National Research Council Committee on Innovations in Computing and Commu-
nications. (1999). Funding a revolution. National Academy Press. Available from
www.nap.edu/read/6323/chapter/8#159
Orfali, R., Harkey, D., & Edwards, J. (1999). Client/server survival guide (3rd ed.).
Wiley.

1.8 Exercises

Conceptual Exercises
1.1. Suppose that an organization needs to manage a relatively small number of
shared records (say, 100 or so).
(a) Would it make sense to use a commercial database system to manage these
records?
(b) What features of a database system would not be required?
(c) Would it be reasonable to use a spreadsheet to store these records? What are
the potential problems?
1.2. Suppose you want to store a large amount of personal data in a database. What
features of a database system wouldn’t you need?
1.3. Consider some data that you typically manage without a database system (such
as a shopping list, address book, checking account info, etc.).
Another random document with
no related content on Scribd:
« Tant qu’elle vivra, le Maure, et Sforce et les couleuvres des
Visconti seront redoutés, des neiges hyperboréennes aux rivages de
la mer Rouge, de l’Inde aux monts qui donnent passage à la mer.
Elle morte, eux et le royaume d’Insubrie tomberont en esclavage, au
grand dommage de toute l’Italie. Sans elle la suprême prudence
paraîtra aventureuse.
« Il en existera encore d’autres, portant le même nom, et qui
naîtront bien des années avant elle. L’une d’elles ornera ses beaux
cheveux de la splendide couronne de Pannonie. Une autre, après
avoir délaissé les biens terrestres, sera placée au nombre des
saintes sur la terre d’Ausonie et se verra rendre un culte et élever
des autels.
« Je me tairai sur les autres, car, comme j’ai dit, il serait trop long
de parler de toutes, bien que chacune pût faire l’objet d’un chant
héroïque et éclatant. Je passerai sous silence les Blanche, les
Lucrèce, les Constance et les autres, mères ou réparatrices de tant
d’illustres maisons qui régneront en Italie.
« Plus que toutes celles qui ont jamais existé, ta maison sera
célèbre par ses femmes, et je ne sais si elle ne le sera pas plus par
les qualités des filles, que par la haute chasteté des épouses. Sache
également à ce sujet que Merlin m’a éclairée sur ce point, pensant
que j’aurais peut-être à te le répéter. J’ai donc un vif désir de t’en
entretenir.
« Et je te parlerai d’abord de Ricciarda, modèle de courage et de
chasteté. Jeune encore, elle restera veuve et en proie aux coups de
la fortune, ce qui arrive souvent aux meilleurs. Elle verra ses fils
dépouillés du royaume paternel, errer en exil sur la terre étrangère,
laissant leurs jeunes enfants aux mains de leurs ennemis. Mais elle
finira par être amplement dédommagée de ses malheurs.
« Je ne puis me taire sur l’illustre reine de l’antique maison
d’Aragon dont je ne vois pas l’égale, pour la chasteté et la sagesse,
dans l’histoire grecque ou latine. Je n’en connais pas non plus à qui
la fortune se soit montrée plus amie, puisqu’elle sera choisie par la
Bonté divine pour être la mère de cette belle race : Alphonse,
Hippolyte et Isabelle.
« Ce sera la sage Éléonore qui viendra se greffer sur ton arbre
fortuné. Que te dirai-je de sa seconde belle-fille qui doit lui succéder
peu après, Lucrèce Borgia, dont la beauté, la vertu, le renom de
chasteté [66] et la fortune, croîtront d’heure en heure, comme la
jeune plante dans un terrain fertile ?
« Comme l’étain est à l’argent, le cuivre à l’or, le pavot des
champs à la rose, le saule pâle au laurier toujours vert, le verre peint
à la pierre précieuse, ainsi, comparées à celle que j’honore avant
qu’elle soit née, seront les plus estimées pour leur sagesse et leurs
autres vertus.
« Et par-dessus tous les grands éloges qui lui seront donnés
pendant sa vie et après sa mort, on la louera d’avoir inculqué de
nobles sentiments à Hercule et à ses autres fils, qui, par la suite,
s’illustreront sous la toge et dans les armes, car le parfum qu’on
verse dans un vase neuf ne s’en va point si facilement, qu’il soit bon
ou mauvais.
« Je ne veux pas non plus passer sous silence Renée de France,
belle-fille de la précédente, et fille de Louis XII et de l’éternelle gloire
de la Bretagne. Je vois réunies dans Renée toutes les vertus qu’ait
jamais possédées une femme, depuis que le feu échauffe, que l’eau
mouille et que le ciel tourne autour de la terre.
« J’en aurais long à te dire sur Alde de Saxe, la comtesse de
Selano, Blanche-Marie de Catalogne, la fille du roi de Sicile, la belle
Lippa de Bologne et autres. Mais si j’entreprenais de te dire les
grandes louanges qu’elles mériteront toutes, j’entrerais dans une
mer qui n’a pas de rivages. — »
Après qu’elle lui eut fait connaître, à son vif contentement, la plus
grande partie de sa postérité, elle lui répéta à plusieurs reprises
comment Roger avait été attiré dans le palais enchanté. Arrivée près
de la demeure du méchant vieillard, Mélisse s’arrêta et ne jugea pas
à propos d’aller plus loin, de peur d’être vue par Atlante.
Et elle renouvela à la jeune fille les conseils qu’elle lui avait déjà
mille fois donnés, puis elle la laissa seule. Celle-ci ne chevaucha pas
plus de deux milles, dans un étroit sentier, sans voir quelqu’un qui
ressemblait à son Roger. Deux géants, à l’aspect féroce, le serraient
de près pour lui donner la mort.
Dès que la dame voit dans un tel péril celui qui a toutes les
apparences de Roger, elle change en doute la foi qu’elle avait dans
les avis de Mélisse, et elle oublie toutes ses belles résolutions. Elle
croit que Mélisse hait Roger pour quelque nouvelle injure ou pour
des motifs qu’elle ignore, et qu’elle a ourdi cette trame inusitée pour
le faire périr de la main de celle qui l’aime.
Elle se disait : « — N’est-ce pas là Roger, que je vois toujours
avec le cœur, et qu’aujourd’hui je vois avec mes yeux ? Et si
maintenant je ne le vois pas ou si je ne le reconnais pas, comment le
verrai-je, comment le reconnaîtrai-je jamais ? Pourquoi veux-je en
croire plutôt à autrui qu’à mes propres yeux ? A défaut de mes yeux,
mon cœur me dit s’il est loin ou près. — »
Pendant qu’elle se parle ainsi, elle croit entendre la voix de
Roger qui appelle à son secours. Elle le voit en même temps
éperonner son cheval rapide et lui retenir le mors, tandis que ses
deux féroces ennemis le suivent et le chassent à toute bride. La
dame s’empresse de les suivre et arrive avec eux dans la demeure
enchantée.
Elle n’en a pas plus tôt franchi les portes, qu’elle tombe dans
l’erreur commune. Elle cherche en vain Roger de tous côtés, en
haut, en bas, au dedans et au dehors. Elle ne s’arrête ni jour ni nuit ;
et l’enchantement était si fort, et l’enchanteur avait été si habile,
qu’elle voit sans cesse Roger et lui parle sans qu’elle le reconnaisse,
ou sans que Roger la reconnaisse elle-même.
Mais laissons Bradamante, et n’ayez pas de regret de la savoir
en proie à cet enchantement. Quand il sera temps qu’elle en sorte,
je l’en ferai sortir, et Roger aussi. De même que le changement de
nourriture ranime l’appétit, ainsi il me semble que mon histoire
risquera d’autant moins d’ennuyer qui l’entendra, qu’elle sera plus
variée.
Il faut aussi que je me serve de beaucoup de fils pour tisser la
grande toile à laquelle je travaille. Qu’il ne vous déplaise donc pas
d’écouter comment, sortie de ses tentes, l’armée des Maures a pris
les armes pour défiler devant le roi Agramant, lequel, fortement
menacé par les lis d’or, l’a rassemblée pour une nouvelle revue, afin
de savoir combien elle compte de combattants.
Outre que bon nombre de cavaliers et de fantassins avaient
disparu, beaucoup de chefs manquaient, et des meilleurs, parmi les
troupes d’Espagne, de Libye et d’Éthiopie. Les divers corps de
nations erraient sans direction propre. Afin de leur donner un chef, et
de remettre de l’ordre dans chacun d’eux, tout le camp était
rassemblé pour la revue.
Pour remplacer les pertes subies dans les batailles et les conflits
sanglants, le roi d’Espagne et le roi d’Afrique avaient envoyé des
ordres chacun dans leur pays, pour en faire venir de nombreux
renforts, et ils les avaient distribués sous les différents chefs. Avec
votre agrément, seigneur, je remettrai à l’autre chant l’exposé de
cette revue.
CHANT XIV.

Argument. — L’armée des païens s’étant rassemblée, on


constate l’absence des deux troupes détruites par Roland.
Mandricard, courant sur les traces du paladin, rencontre Doralice,
fille du roi de Grenade, qui s’en va épouser Rodomont, roi de Sarze.
Il tue le cortège, emmène Doralice avec lui et en fait sa femme. Les
Maures donnent l’assaut à Paris.

Dans les nombreux assauts et les cruels conflits que l’Afrique et


l’Espagne avaient eus avec la France, le nombre était immense des
guerriers morts et abandonnés au loup, au corbeau, à l’aigle vorace.
Et bien que les Français fussent plus maltraités, ayant perdu toute la
campagne, les Sarrasins avaient à se plaindre plus encore, par suite
de la perte d’un grand nombre de leurs princes et de leurs grands
barons.
Leurs victoires avaient été si sanglantes, qu’ils n’avaient pas à
s’en réjouir. Et s’il est permis, invincible Alphonse, de comparer les
choses modernes aux choses antiques, la grande victoire dont la
gloire est votre œuvre immortelle et dont Ravenne doit pleurer
toujours, ressemble aux victoires des Sarrasins.
Les Morins et les Picards, ainsi que les forces normandes et
d’Aquitaine pliaient déjà, lorsque vous vous jetâtes au milieu des
étendards ennemis de l’Espagnol presque victorieux, ayant derrière
vous ces vaillants jeunes hommes qui, par leur courage, méritèrent
en ce jour de recevoir de vous les épées et les éperons d’or.
Ils vous secondèrent avec tant d’ardeur, vous suivant de près
dans ce grand péril, que vous fîtes s’écrouler le gland d’or, et
rompîtes le bâton jaune et vermeil. Un laurier triomphal vous est dû
pour avoir empêché le lis d’être détruit ou défloré. Une autre
couronne doit encore orner votre front, pour avoir conservé à Rome
son Fabricius.
La grande Colonne du nom romain, que vous protégeâtes et
sauvâtes d’une entière destruction, vous vaut plus d’honneur que si,
sous votre main, était tombée toute la fière milice qui engraisse les
champs de Ravenne, et toute celle qui s’enfuit, abandonnant les
bannières d’Aragon, de Castille et de Navarre, après avoir éprouvé
l’inutilité de ses épieux et de ses machines de guerre.
Cette victoire nous causa plus d’encouragement que
d’allégresse ; car notre joie fut trop troublée par la mort du capitaine
français [67] , général en chef de l’armée, et par celle de tant de chefs
illustres qui étaient passés de ce côté des froides Alpes, pour voler à
la défense des États de leurs confédérés.
Notre salut, notre vie furent assurés par cette victoire, chacun le
reconnaît, car elle arrêta les progrès de la tempête que Jupiter irrité
déchaînait sur nous. Mais nous ne pûmes nous en réjouir, ni nous
livrer à la moindre fête, en entendant les gémissements, les pleurs
d’angoisses que les veuves en robes sombres répandaient par toute
la France.
Il faut que le roi Louis envoie, à la tête de ses troupes, de
nouveaux capitaines, lesquels, pour l’honneur des fleurs de lis d’or,
châtieront les pillards et les brigands qui ont pillé les moines blancs,
noirs ou gris, violé les épouses, les filles et les mères, et jeté à terre
le Christ enfermé dans l’hostie consacrée, pour voler les ciboires
d’argent.
O malheureuse Ravenne, il eût mieux valu pour toi ne pas
résister au vainqueur et prendre exemple sur Brescia, toi qui avais
servi d’exemple à Rimini et à Faenza. Que Louis envoie le vieux et
brave Trivulce, pour enseigner à ses soldats plus de retenue et leur
faire voir que de semblables excès sont cause qu’un si grand
nombre d’entre eux ont trouvé la mort par toute l’Italie.
De même qu’aujourd’hui le roi de France a besoin d’envoyer de
nouveaux chefs à son armée, ainsi Marsile et Agramant, voulant
remettre de l’ordre dans leurs troupes, les avaient alors convoquées
dans la plaine, dès que l’hiver le leur avait permis, pour voir où il
était urgent de nommer des chefs et de donner des instructions.
Marsile d’abord, puis Agramant, firent défiler devant eux leurs
gens, troupe par troupe. Les Catalans marchent avant tous les
autres sous la bannière de Doriphèbe. Après eux viennent les
bataillons de Navarre privés de leur roi Fulvirant, qui avait reçu la
mort de la main de Renaud. Le roi d’Espagne leur a donné Isolier
pour capitaine.
Balugant conduit les gens de Léon, Grandanio ceux d’Algarve.
Le frère de Marsile, Falsiron, commande les Castillans. Ceux qui
sont venus de Malaga et de Séville suivent la bannière de
Madarasse ainsi que ceux de la mer de Gades jusqu’à la fertile
Cordoue, dont le Bétis arrose les vertes Campagnes.
Stordiland, Tesire et Baricond font défiler l’un après l’autre leurs
soldats. Le premier commande aux gens de Grenade, le second à
ceux de Lisbonne, le troisième à ceux de Majorque. Après la mort de
Larbin, son parent Tesire fut nommé roi de Lisbonne. Puis viennent
les Galiciens, dont Serpentin a été nommé chef, en remplacement
de Maricolde.
Ceux de Tolède et ceux de Calatrava, dont Sinagon portait
naguère l’étendard, ainsi que tous ceux qui boivent les eaux de la
Guadiana, sont conduits par l’audacieux Mataliste. Bianzardin
commande à ceux d’Astorga, réunis en une seule troupe à ceux de
Salamanque, de Placencia, d’Avila, de Zamora et de Palencia.
Ferragus a la conduite de ceux de Saragosse et de la cour du roi
Marsile. Tous ces gens sont bien armés et vaillants. Parmi eux sont
Malgarin, Balinverne, Malzarise et Morgant qu’un même sort avait
contraints à vivre sur une terre étrangère. Chassés de leurs
royaumes, ils avaient été recueillis à la cour de Marsile.
Font aussi partie de cette troupe, le grand bâtard de Marsile,
Follicon d’Alméria, Doricont, Bavarte, Lagarlife, Analard ; Archidant
comte de Sagonte, Lamirant, le vaillant Langhiran, Malagur fertile en
ruses, et bon nombre d’autres dont je me propose, quand il sera
temps, de montrer les exploits.
Après que l’armée d’Espagne a défilé en bon ordre devant le roi
Agramant, le roi d’Oran, presque aussi grand qu’un géant, paraît
dans la plaine à la tête de sa troupe. Celle qui vient après lui regrette
la mort de Martasin qui fut tué par Bradamante. Les soldats
s’indignent qu’une femme puisse se vanter d’avoir donné la mort au
roi des Garamantes.
La troupe de Marmonde vient la troisième. Elle a laissé Argosto
mort en Gascogne. A celle-ci, comme à la seconde, comme à la
quatrième, il manque un chef, et, quoique le roi Agramant ait peu de
capitaines, il songe cependant à leur en nommer. Il leur donne, pour
les conduire, Burald, Ormide et Arganio.
Il confie à Arganio le commandement des guerriers de Libye qui
pleuraient la mort du nègre Dudrinasse. Brunel conduit les gens de
la Tintigane ; il a le visage soucieux et les yeux baissés, car depuis
que, dans la forêt voisine du château construit par Atlante à la cime
d’un rocher, Bradamante lui avait enlevé l’anneau, il était tombé
dans la disgrâce du roi Agramant.
Et si le frère de Ferragus, Isolier, qui l’avait trouvé lié à un arbre,
n’avait pas raconté la vérité au roi, il aurait été pendu. Sur les prières
d’un grand nombre de ses chevaliers, le roi changea de résolution,
alors qu’il lui avait déjà fait mettre le lacet autour du cou. Il le lui fit
enlever, mais en lui jurant qu’à la première faute il le ferait pendre.
C’était cela qui faisait marcher Brunel le visage triste et la tête
basse. Farurant venait après lui, guidant les cavaliers et les
fantassins de la Mauritanie. Immédiatement après, s’en venait le
nouveau roi du Liban. Il avait avec lui les gens de Constantine,
Agramant lui ayant donné la couronne et le sceptre d’or que
possédait jadis Pinador.
Soridan marche à la tête des hommes d’armes de l’Hespérie, et
Dorilon avec ceux de Ceuta. Pulian précède ceux de Nasamone ; le
roi Agricalte entraîne ceux d’Amonie, Malabuferce ceux de Fezzan.
La troupe qui suit vient de Canarie et du Maroc ; elle est commandée
par Finadure. Balastre conduit ceux qui étaient auparavant sous les
ordres du roi Tardoc.
Deux escadrons, l’un de Mulga, l’autre d’Arzilla, viennent ensuite.
Le dernier a toujours son ancien chef ; le premier l’a perdu, aussi le
roi le confie à son fidèle ami Carinée. De même, Caïque reçoit le
commandement des gens d’Almansilla qu’avait Taufirion. Celui des
soldats de Gétulie est donné à Rimedont. Puis vient Balinfront, à la
tête des gens de Cosca.
Cette autre troupe est formée des gens de Bolga ; ils ont pour roi
Clarinde qui a succédé à Mirabald. Vient ensuite Baliverse, que je
veux que tu tiennes pour le plus grand ribaud de toute l’armée. Je ne
crois pas en revanche, que dans tout le camp, se déploie une
bannière qui rassemble une meilleure troupe que celle qui vient
après avec le roi Sobrin, le plus prudent des chefs sarrasins.
Ceux de Bellamarina, que conduisait primitivement Gualciotto,
ont maintenant pour chef le roi d’Alger, Rodomont de Sarse, qui
venait de ramener de nouveaux fantassins et de nouveaux cavaliers.
Pendant que le soleil se dérobait sous les nuées du grand Centaure,
aux cornes horribles et cruelles, il avait été envoyé en Afrique par
Agramant. Il en était revenu seulement depuis trois jours.
L’armée africaine n’avait pas de guerrier plus fort et plus
audacieux que celui-là. Les défenseurs de Paris le redoutaient plus
que Marsile, qu’Agramant et les chevaliers qui avaient suivi ces deux
princes en France. Plus qu’aucun autre, il faisait parade de haïr
notre Foi.
Puis viennent Prusion, roi des Alvaraches, et Dardinel, roi de
Zumara. Je ne sais si des hiboux ou des corneilles, ou d’autres
oiseaux de mauvais augure, perchés sur les toits ou croassant sur
les branches, ont prédit à ces deux guerriers leur sort funeste, mais
le ciel a fixé l’heure de leur mort à tous deux dans le combat qui doit
se livrer le jour suivant.
Il ne restait plus à défiler que ceux de Trémisen et de Noricie,
mais on n’apercevait pas leurs étendards, et l’on n’en avait pas de
nouvelles. Agramant ne savait que dire, ni que penser de ce retard,
lorsque fut enfin amené devant lui un écuyer du roi de Trémisen, qui
lui raconta tout ce qui était arrivé.
Il lui raconta qu’Alzirde, Manilard et la plus grande partie de leurs
soldats gisaient dans la poussière : « — Seigneur — lui dit-il — le
vaillant chevalier qui a occis les nôtres, aurait tué toute la troupe, si
j’avais tardé à m’enfuir ; et encore ai-je eu grand’peine à
m’échapper. Il fait des cavaliers et des piétons, ce que le loup fait
des chèvres et des moutons. — »
Peu de jours auparavant, était arrivé à l’armée du roi d’Afrique un
chevalier dont personne, dans le Ponant ou dans tout le Levant,
n’égalait la force et le courage. Le roi Agramant l’avait accueilli avec
de grands honneurs, car il était le fils et le successeur du vaillant roi
de Tartarie, Agrican. Il se nommait le féroce Mandricard.
Il s’était rendu fameux par de nombreux hauts faits, et il
remplissait de sa renommée le monde entier. Mais ce dont il
s’enorgueillissait le plus, c’était d’avoir conquis, dans un château de
la fée de Syrie, le resplendissant haubert que le troyen Hector avait
porté mille ans auparavant. Il avait couru pour l’avoir une étrange et
formidable aventure, dont le seul récit excite la peur.
Se trouvant présent lors du récit de l’écuyer du roi de Trémisen, il
avait levé son front hardi, et avait pris sur-le-champ la résolution de
suivre les traces du guerrier inconnu. Il garda soigneusement son
projet pour lui, soit qu’il n’eût d’estime pour aucun de ses
compagnons d’armes, soit qu’il craignît, en se dévoilant, qu’un autre
tentât avant lui l’entreprise.
Il demanda à l’écuyer comment était la soubreveste du chevalier.
Celui-ci répondit : « — Elle est toute noire ; l’écu est noir aussi, et il
ne porte aucun cimier. — » C’était la vérité, seigneur, car Roland, en
quittant le quartier, avait voulu que, de même que son âme était en
deuil, l’extérieur de sa mise fût de couleur sombre.
Marsile avait donné à Mandricard un destrier bai-châtain, avec
les jambes et la crinière noires. Il était né d’une jument de Frise et
d’un étalon d’Espagne. Mandricard saute sur lui tout armé et s’en va,
galopant à travers la plaine. Il jure de ne point revenir parmi les
escadrons sarrasins, avant d’avoir trouvé le champion aux armes
noires.
Il rencontra bientôt plusieurs des gens échappés des mains de
Roland, encore tout dolents de la perte, qui d’un fils, qui d’un frère
immolés à leurs yeux. La tristesse et la lâcheté de leur âme se
voyaient encore peintes sur leur figure blême ; encore sous le coup
de la peur qu’ils avaient eue, ils fuyaient, pâles, muets, affolés.
Après un court chemin, Mandricard arriva à un endroit où il eut
sous les yeux un cruel et sanglant spectacle, mais un éclatant
témoignage des merveilleuses prouesses racontées en présence du
roi d’Afrique. Il voit de toutes parts des morts ; il les retourne et
mesure leurs blessures, mû par une étrange jalousie contre le
chevalier qui avait mis tous ces gens à mort.
De même que le loup ou le mâtin, arrivés les derniers près du
bœuf laissé mort par les paysans, ne trouvent plus que les cornes,
les os et les pieds, le reste ayant été dévoré par les oiseaux et les
chiens affamés, et considèrent avec dépit le crâne où rien ne peut se
manger ; ainsi faisait le cruel Barbare sur ce champ de carnage ; il
blasphémait de colère, et montrait un vif dépit d’être venu si tard à
un si copieux festin.
Ce jour, et la moitié du suivant, il s’avança au hasard à la
recherche du chevalier noir, dont il demandait sans cesse des
nouvelles. Soudain il vit un pré couvert d’ombre, entouré d’un fleuve
profond qui laissait à peine un petit espace libre d’où l’eau s’écoulait
dans une autre direction. Ce lieu ressemblait à celui que le Tibre
entoure sous les murs d’Otricoli.
Plusieurs chevaliers, couverts de leurs armures, se tenaient à
l’endroit par où l’on pouvait entrer. Le païen demanda qui les avait
rassemblés là en si grand nombre, et pour quelle cause. Le
capitaine, frappé de l’air imposant de Mandricard, et jugeant à ses
armes ornées d’or et de pierreries d’une grande valeur, qu’il avait
affaire à un chevalier éminent, lui fit cette réponse :
« — Nous sommes envoyés par le roi de Grenade, notre maître,
pour accompagner sa fille, qu’il a mariée au roi de Sarse, bien que le
bruit n’en ait pas encore couru. Quand le soir sera venu, et que la
cigale, qui seule se fait entendre à cette heure, se sera tue, nous
conduirons la princesse à son père, au camp espagnol. Pour le
moment, elle dort. — »
Mandricard, qui méprise le monde entier, veut voir si ces gens
sauront bien ou mal défendre la dame qu’on leur a donnée à garder.
Il dit : « — D’après ce que j’ai entendu, celle-ci est belle, et je serais
aise de le savoir par moi-même. Conduis-moi vers elle, ou fais-la
venir ici, car je suis pressé d’aller ailleurs. — »
« — Tu es certes un grand fou, — » répondit le Grenadin ; mais
il n’en dit pas davantage. Le Tartare fondit sur lui, la lance basse, et
lui traversa la poitrine. La cuirasse ne put arrêter le coup, et le
malheureux tomba mort. Le fils d’Agrican retire sa lance, car il n’a
pas d’autre arme offensive.
Il ne porte ni épée ni masse ; parce que, quand il conquit les
armes ayant appartenu au troyen Hector, il se trouva que l’épée
manquait. Il jura alors — et il ne jura pas en vain — que sa main ne
toucherait à aucune épée avant qu’il eût enlevé celle de Roland.
Roland portait Durandal, qu’Almonte eut en si grande estime, et
qu’avait primitivement portée Hector.
Grande est l’audace du Tartare, qui, malgré un tel désavantage,
attaque toute cette troupe, criant : « — Qui veut me barrer le
passage ? — » Et, la lance en arrêt, il se précipite au milieu d’eux.
Les uns abaissent leur lance, les autres mettent l’épée hors du
fourreau, et de toutes parts on l’assaille. Il en tue un grand nombre
avant que sa lance ne se rompe.
Quand il la voit rompue, il prend à deux mains le tronçon qui est
resté entier, et il en assomme tant d’adversaires, que jamais on ne
vit semblable carnage. Pareil au juif Samson, qui exterminait les
Philistins avec la mâchoire qu’il avait ramassée par terre, il fend les
écus et brise les casques ; parfois, du même coup, il tue le cavalier
et le cheval.
Ces malheureux courent à l’envi à la mort ; si l’un tombe, l’autre
continue la lutte, et la façon ignoble dont ils sont tués leur paraît plus
cruelle que la mort elle-même. Ils ne peuvent supporter de se voir
enlever la vie qui leur est chère par un tronçon de lance, et de mourir
sous d’étranges coups, comme des couleuvres ou des grenouilles.
Mais, quand ils se furent aperçus que de toute façon il est
désagréable de mourir, et près des deux tiers d’entre eux étant déjà
tués, les autres commencèrent à fuir. Comme s’il les considérait
comme son propre bien, le cruel Sarrasin ne peut souffrir qu’un seul
de cette troupe en déroute s’échappe de ses mains la vie sauve.
De même que les roseaux desséchés dans les marais, ou le
chaume dans les champs dénudés, ne résistent pas longtemps au
souffle de Borée attisant le feu allumé par le prudent agriculteur,
alors que la flamme court par les sillons, crépite et crie, ainsi ces
malheureux se défendent à peine contre la fureur dont Mandricard
est enflammé.
Dès qu’il voit sans défenseur l’entrée qui a été si mal gardée, il
s’avance par le sentier fraîchement tracé dans l’herbe, guidé par les
lamentations qu’il entend, pour voir si la beauté de la dame de
Grenade mérite les éloges qu’on en fait. Il passe sur les corps des
serviteurs morts, et suit les contours du fleuve.
Il voit Doralice au milieu du pré — c’est ainsi que se nommait la
donzelle — assise au pied d’un vieux frêne sauvage ; elle se
désolait. Les pleurs, comme un ruisseau qui coule d’une source vive,
tombaient sur son beau sein, et l’on voyait sur son visage qu’elle se
lamentait sur le sort de ses compagnons autant qu’elle craignait pour
elle-même.
Sa terreur s’accrut, quand elle vit venir le chevalier souillé de
sang, l’air farouche et sombre. Ses cris montent jusqu’au ciel ; elle
tremble pour elle et pour ceux qui sont avec elle ; car, outre l’escorte
de chevaliers, la belle infante avait, pour la conduire et la servir, des
vieillards et un grand nombre de dames et de damoiselles, les plus
belles du royaume de Grenade.
Dès que le Tartare voit ce beau visage qui n’a point son pareil
dans toute l’Espagne, et qui peut dans les pleurs — que devait-ce
être quand il souriait ! — tendre les inextricables rets d’amour, il ne
sait s’il est encore sur terre ou dans le paradis. Il n’a tiré d’autre gain
de sa victoire que de devenir le captif de sa prisonnière, et il ne sait
comment cela s’est fait.
Cependant il ne saurait consentir à abandonner le fruit de ses
peines, bien que par ses pleurs elle montre, autant qu’une femme
peut le montrer, sa douleur et sa répugnance. Mais lui, espérant
changer ces pleurs en joie suprême, se décide à l’emmener. Il la fait
monter sur une blanche haquenée, et reprend son chemin.
Il rend la liberté aux dames, aux damoiselles, aux vieillards et
aux autres qui étaient venus avec la princesse de Grenade, et leur
dit doucement : « — Elle sera suffisamment accompagnée par moi.
Je lui servirai de majordome, de nourrice, d’écuyer ; bref, je
pourvoirai à tous ses besoins ; adieu donc tous. — » Ceux-ci, ne
pouvant faire de résistance, s’en furent en pleurant et en poussant
des soupirs.
Ils disaient entre eux : « — Quelle sera la douleur de son père,
quand il apprendra cette aventure ! Quelle sera la colère, la rage de
son époux, et quelle terrible vengeance il en tirera ! Ah ! pourquoi
n’est-il pas ici, où il fait si faute, pour arracher à celui-ci l’illustre fille
du roi Stordilan, avant qu’il l’ait emmenée plus loin ? — »
Le Tartare, content de l’excellente proie que lui ont value sa
fortune et sa vaillance, ne paraît plus aussi pressé qu’avant de
retrouver le chevalier à l’armure noire. Naguère il s’en allait, courant ;
maintenant, il va tranquillement, lentement, et ne songe plus qu’à
s’arrêter dans le premier endroit qu’il trouvera propice à assouvir sa
flamme amoureuse.
Entre temps, il rassure Doralice, dont le visage et les yeux sont
baignés de pleurs. Il invente une foule de choses ; il lui dit que
depuis longtemps il a entendu parler d’elle, et que s’il a quitté sa
patrie et son royaume où il était heureux et qui l’emporte sur tous les
autres en renommée et en étendue, ce n’est point pour voir
l’Espagne ou la France, mais pour admirer son beau visage.
« — Si un homme doit être aimé pour l’amour qu’il éprouve lui-
même, je mérite votre amour, car je vous aime ; si c’est pour la
naissance, qui est mieux né que moi ? Le puissant Agricant fut mon
père. Si c’est pour la richesse, qui possède plus d’États que moi ? Je
le cède en domaines à Dieu seul. Si c’est pour le courage, je crois
vous avoir prouvé aujourd’hui que je suis digne d’être aimé aussi
pour ma valeur. — »
Ces paroles, et beaucoup d’autres qu’Amour dicte à Mandricard,
vont doucement consoler le cœur de la donzelle, encore tremblante
de peur. Sa crainte se dissipe peu à peu, ainsi que la douleur dont
elle avait eu l’âme transpercée. Elle commence à écouter avec plus
de patience et de plaisir son nouvel amant.
Puis, par ses réponses de moins en moins farouches, elle se
montre affable et courtoise envers lui ; parfois même elle consent à
lever sur son visage des yeux qui ne demandent qu’à s’attendrir. Le
païen, qui d’autres fois déjà a été féru des flèches d’Amour, non
seulement espère, mais a la certitude que la belle dame ne sera pas
toujours rebelle à ses désirs.
En cette compagnie, il s’en va content et joyeux, et il voit avec
satisfaction, avec plaisir, approcher l’heure où la froide nuit invite tout
être animé à prendre du repos. S’apercevant que le soleil est déjà
bas et à moitié caché à l’horizon, il commence à chevaucher d’un
pas plus rapide, jusqu’à ce qu’enfin il entende résonner les flûtes et
les chalumeaux, et qu’il voie la fumée des villas et des chaumières.
C’étaient des habitations de pasteurs, meilleures et plus
commodes que belles. Le gardien des troupeaux fit au chevalier et à
la donzelle un accueil si courtois, qu’ils en furent enchantés. Ce n’est
pas seulement dans les villes et dans les châteaux que l’on trouve
des gens hospitaliers, mais souvent aussi dans les cabanes et les
chaumières.
Que se passa-t-il pendant la nuit entre Doralice et le fils
d’Agricant ? Je ne me hasarde pas à le raconter, et je laisse chacun
penser ce qu’il voudra. On peut croire cependant qu’ils furent tout à
fait d’accord, car ils se levèrent le lendemain plus allègres, et
Doralice rendit grâces au pasteur qui leur avait fait les honneurs de
sa maison.
Errant ainsi d’un endroit à un autre, ils arrivèrent enfin sur les
bords d’un fleuve qui descendait silencieusement vers la mer, et si
lentement qu’on n’aurait su dire s’il coulait ou si ses eaux étaient
stagnantes. Il était si clair et si limpide, que la lumière du jour
pénétrait sans obstacle jusqu’au fond. Sur sa rive, à l’ombre fraîche
et douce, ils trouvèrent deux chevaliers et une damoiselle.
Mais la haute fantaisie, qui ne me permet pas de suivre toujours
le même sentier, m’entraîne loin de là, et veut que je retourne vers
l’armée mauresque qui assourdit la terre de France de sa rumeur et
de ses cris, tout autour de la tente où le fils du roi Trojan défie le
Saint-Empire, et où Rodomont, plein d’audace, se vante de brûler
Paris et de détruire Rome la Sainte.
Le bruit étant parvenu aux oreilles d’Agramant que les Anglais
avaient déjà passé la mer, il fit appeler Marsile, le vieux roi de Garbe
et les autres capitaines. Tous conseillent de faire un suprême effort
pour prendre Paris, car on pouvait être certain qu’on ne le prendrait
jamais, si on ne parvenait à s’en rendre maître avant l’arrivée des
secours.
Déjà dans ce but on avait rassemblé de toutes parts
d’innombrables échelles, des planches, des poutres, des fascines
pour pourvoir aux besoins divers, ainsi que des bateaux et des
ponts ; il ne reste plus qu’à disposer l’ordre dans lequel seront
donnés le premier et le second assaut. Agramant veut combattre au
milieu de ceux qui doivent attaquer la ville.
Quant à l’empereur, le jour qui précède la bataille, il ordonne aux
prêtres et aux moines blancs, noirs et gris, de célébrer dans tout
Paris des offices et des messes. Ses soldats, après s’être confessés
et s’être ainsi préservés des ennemis infernaux, communient tous,
comme s’ils devaient mourir le jour suivant.
Lui-même, au milieu des barons et des paladins, des princes et
des prélats, il donne aux autres l’exemple, en entendant avec
beaucoup de piété les offices divins dans la cathédrale. Les mains
jointes et les yeux levés au ciel, il dit : « — Seigneur, bien que je
sois plein d’iniquité et un impie, ta bonté ne voudra pas que ton
peuple fidèle souffre à cause de mes fautes.
« Et, si ta volonté est que notre erreur reçoive un juste châtiment,
au moins diffères-en la punition, de façon qu’elle ne nous vienne pas
des mains de tes ennemis. Car, si nous succombons sous leurs
coups, nous qu’on a coutume d’appeler tes amis, les païens diront
que tu es sans pouvoir, puisque tu laisses périr tes serviteurs.
« Et pour un qui t’est aujourd’hui rebelle, il en naîtra cent par tout
l’univers ; de sorte que les fausses doctrines de Babel chasseront ta
loi et la feront disparaître. Défends ces nations ; ce sont elles qui ont
délivré ton sépulcre des chiens immondes, et pris si souvent la
défense de ta sainte Église et de ses vicaires.
« Je sais que nos mérites ne doivent pas peser une once en
notre faveur, et que nous ne devons point espérer de pardon de toi,
si nous considérons notre vie coupable ; mais, si tu nous favorises
du don de la grâce, notre raison sera purifiée et réconfortée. Nous
ne pouvons désespérer de ton aide, quand nous nous souvenons de
ta pitié. — »
Ainsi disait le pieux empereur, dans l’humilité et la contrition de
son cœur. Il ajouta encore d’autres prières, d’autres vœux
commandés par la grandeur du péril et en rapport avec son rang de
souverain. Sa chaleureuse supplique ne resta point sans effet, car
son bon génie, qui tient la première place parmi les anges, les prit,
déploya ses ailes vers le ciel et s’en vint les porter au Sauveur.
Une infinité d’autres prières furent également portées à Dieu par
de semblables messagers. Les âmes bienheureuses, la pitié peinte
sur le visage, se tournèrent toutes vers leur éternel amant, et lui
témoignèrent le même désir de voir accueillir la juste prière du
peuple chrétien qui implorait secours.
Alors l’ineffable Bonté, qui ne fut jamais priée en vain par un
cœur fidèle, leva ses yeux pleins de pitié, et fit signe à l’ange Michel
de venir à lui : « — Va — lui dit-elle — vers l’armée chrétienne qui
vient de débarquer en Picardie, et fais-la approcher des murs de
Paris, sans que le camp ennemi s’en aperçoive.
« Va trouver d’abord le Silence, et dis-lui de ma part de te
seconder dans cette entreprise. Il saura bien comment procéder
dans cette circonstance. Cela fait, va sur-le-champ à l’endroit où la
Discorde a son séjour. Dis-lui de prendre avec elle son brandon et
sa torche, et d’allumer le feu dans le camp des Maures ;
« Et de répandre de telles divisions, de tels conflits entre ceux
qu’on considère comme les plus vaillants, qu’ils se battent
ensemble, jusqu’à ce que les uns soient morts, les autres
prisonniers, d’autres blessés, d’autres entraînés par l’indignation
hors du camp ; de façon que leur roi puisse tirer d’eux le moins
d’aide possible. — » L’oiseau béni ne répond rien à ces paroles, et
s’envole loin du ciel.
Partout où l’ange Michel dresse son aile, les nuées se dissipent
et le ciel redevient serein. Un cercle d’or l’entoure, pareil à l’éclair
que l’on voit briller pendant la nuit. Tout en poursuivant sa route, le
messager céleste se demande où il doit descendre pour être sûr de
trouver l’ennemi de la parole, auquel il doit faire sa première
commission.
Il cherche à se rappeler les lieux où il habite, et où il a coutume
de séjourner. Enfin toutes ses pensées le portent à croire qu’il le
trouvera parmi les religieux et les moines enfermés dans les églises
et dans les monastères. Là, en effet, les discours sont tellement
interdits, que le mot silence est écrit sur la porte de l’endroit où l’on
chante les psaumes, où l’on dort, où l’on mange, et finalement à
l’entrée de toutes les cellules.
Croyant le trouver là, il agite plus vivement ses ailes dorées. Il
pense y trouver aussi la Paix, le Repos et la Charité. Mais à peine a-
t-il pénétré dans un cloître, qu’il est bien vite détrompé. Ce n’est pas
là qu’est le Silence ; on lui dit qu’il n’y habite plus, et que son nom
seul y reste inscrit.
Il n’y voit non plus ni la Piété, ni le Repos, ni l’Humilité, ni l’Amour
Divin, ni la Paix. Ils y furent autrefois, il est vrai, dans les temps
antiques. Mais ils en ont été chassés par la Gourmandise, l’Avarice,
la Colère, l’Orgueil, l’Envie, la Paresse et la Cruauté. L’ange
s’étonne d’une chose si insolite. Et comme il regarde plus
attentivement cette troupe abrutie, il voit que la Discorde est aussi
avec elle ;
La Discorde vers laquelle le père Éternel lui avait ordonné d’aller,
après qu’il aurait trouvé le Silence. Il avait pensé qu’il lui faudrait
prendre le chemin de l’Averne, car il croyait qu’elle se tenait parmi
les damnés, et voilà — qui le croirait ! — qu’il la retrouve dans ce
nouvel enfer, au milieu des saints sacrifices et des messes ! Il paraît
étrange à Michel de voir là celle qu’il ne comptait trouver qu’après un
long voyage.
Il la reconnaît à ses vêtements de mille couleurs, formés de
bandes inégales, multiples et toutes déchirées, qui, agitées par les
vents, ou entr’ouvertes par sa marche, tantôt la couvrent et tantôt la
montrent nue. Ses cheveux, noirs et gris, mêlés de filets d’or et
d’argent, sont tout en désordre. Les uns sont réunis en tresse, les
autres retenus par un galon. Une partie est éparse sur ses épaules,
l’autre dénouée sur son sein.
Elle avait les mains et la poitrine couvertes d’assignations, de
libelles, d’enquêtes, de papiers de procédure, et d’un grand tas de
gloses, de consultations et d’écrits, au moyen desquels les biens
des pauvres gens ne sont jamais en sûreté dans les villes. Devant,
derrière, à ses côtés, elle était entourée de notaires, de procureurs
et d’avocats.
Michel l’appelle à lui et lui ordonne de se transporter parmi les
plus braves des chevaliers sarrasins, et de faire en sorte de les
exciter à combattre les uns contre les autres pour leur plus grande
ruine. Puis il lui demande des nouvelles du Silence. Elle peut
facilement en avoir, puisqu’elle va deçà, delà, secouant partout ses
feux.
La Discorde lui répond : « — Je ne me souviens pas de l’avoir vu
nulle part. Je l’ai entendu nommer bien souvent, et faire son éloge
par les astucieux. Mais la Fraude, une de mes suivantes,
l’accompagne quelquefois. Je pense qu’elle saura t’en donner des
nouvelles. — » Et étendant le doigt, elle dit : « — La voilà ! — »
Cette dernière avait un visage agréable, un vêtement plein de
décence, le regard humble, la démarche grave, le parler si doux et si
modeste qu’elle ressemblait à l’ange Gabriel, disant : Ave ! Tout le
reste de sa personne était laid et hideux ; mais elle cachait ses
difformités sous un vêtement long et large, dans les plis duquel elle
portait toujours un poignard empoisonné.
L’ange lui demande quel chemin il doit prendre pour trouver le
Silence. La Fraude lui dit : « — Jadis, il habitait ordinairement parmi
les Vertus, près de saint Benoît, et non ailleurs, ou bien avec les
disciples d’Élie, et dans les abbayes nouvellement fondées. Il résida
longtemps dans les écoles, au temps de Pythagore et d’Architas.
« Après ces philosophes et ces saints, qui l’avaient retenu dans
le droit chemin, il abandonna les mœurs honnêtes qu’il avait suivies
jusque-là, pour se jeter dans des pratiques scélérates. Il commença
par fréquenter pendant la nuit, les amants, puis les voleurs, et à se
livrer à toute sorte de crimes. Longtemps il habita avec la Trahison,
et je l’ai vu naguère avec l’Homicide.
« Avec ceux qui falsifient les monnaies, il se retire dans les lieux
les plus secrets. Il change si souvent de compagnon et d’asile, que
tu le trouverais difficilement. J’espère cependant te renseigner à cet
égard. Si tu as soin d’arriver à minuit dans la demeure du Sommeil,
tu pourras sans faute l’y retrouver, car c’est là qu’il dort. — »
Bien que la Fraude ait l’habitude de tromper, ce qu’elle dit paraît
si vraisemblable, que l’ange y croit. Il s’envole sans retard du
monastère, ralentit le battement de ses ailes et calcule son chemin
de façon à arriver à temps voulu à la demeure du Sommeil, où il
savait bien trouver le Silence.

You might also like