SQL Antipatterns Avoiding the Pitfalls of Database Programming 1st Edition Bill Karwin pdf download
SQL Antipatterns Avoiding the Pitfalls of Database Programming 1st Edition Bill Karwin pdf download
https://ebookmeta.com/product/sql-antipatterns-avoiding-the-
pitfalls-of-database-programming-1st-edition-bill-karwin/
https://ebookmeta.com/product/sql-antipatterns-volume-1-avoiding-
the-pitfalls-of-database-programming-1st-edition-bill-karwin/
https://ebookmeta.com/product/cybersecurity-myths-and-
misconceptions-avoiding-the-hazards-and-pitfalls-that-derail-
us-1st-edition-spafford/
https://ebookmeta.com/product/practical-oracle-sql-mastering-the-
full-power-of-oracle-database-1st-edition-kim-berg-hansen/
https://ebookmeta.com/product/quantum-mathematics-ii-1st-edition-
michele-correggi/
Twice Burned Steamy Instalove Firefighter Romance 1st
Edition Kelsie Calloway
https://ebookmeta.com/product/twice-burned-steamy-instalove-
firefighter-romance-1st-edition-kelsie-calloway/
https://ebookmeta.com/product/defeating-the-black-worm-1st-
edition-paul-flewitt/
https://ebookmeta.com/product/self-publishing-for-dummies-jason-
r-rich-2/
https://ebookmeta.com/product/the-surgery-first-orthognathic-
approach-with-discussion-of-occlusal-plane-altering-orthognathic-
surgery-jong-woo-choi-jang-yeol-lee/
https://ebookmeta.com/product/continuous-time-asset-pricing-
theory-a-martingale-based-approach-2nd-edition-robert-a-jarrow/
Morality Play Barry Unsworth
https://ebookmeta.com/product/morality-play-barry-unsworth/
SQL Antipatterns
Avoiding the Pitfalls of Database
Programming
by Bill Karwin
Every precaution was taken in the preparation of this book. However, the publisher
assumes no responsibility for errors or omissions, or for damages that may result from
the use of information (including program listings) contained herein.
Our Pragmatic courses, workshops, and other products can help you and your team create
better software and have more fun. For more information, as well as the latest Pragmatic
titles, please visit us at http://pragprog.com.
For the Best Reading
Experience...
We strongly recommend that you read this book with the “publisher defaults” setting
enabled for your reading device or application. Certain formats and characters may not
display correctly without this setting. Please refer to the instructions for your reader on
how to enable the publisher defaults setting.
Table of Contents
1. Introduction
Who This Book Is For
What’s in This Book
What’s Not in This Book
Conventions
Example Database
Acknowledgments
I. Logical Database Design Antipatterns
2. Jaywalking
Objective: Store Multivalue Attributes
Antipattern: Format Comma-Separated Lists
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Create an Intersection Table
3. Naive Trees
Objective: Store and Query Hierarchies
Antipattern: Always Depend on One’s Parent
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use Alternative Tree Models
4. ID Required
Objective: Establish Primary Key Conventions
Antipattern: One Size Fits All
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Tailored to Fit
5. Keyless Entry
Objective: Simplify Database Architecture
Antipattern: Leave Out the Constraints
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Declare Constraints
6. Entity-Attribute-Value
Objective: Support Variable Attributes
Antipattern: Use a Generic Attribute Table
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Model the Subtypes
7. Polymorphic Associations
Objective: Reference Multiple Parents
Antipattern: Use Dual-Purpose Foreign Key
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Simplify the Relationship
8. Multicolumn Attributes
Objective: Store Multivalue Attributes
Antipattern: Create Multiple Columns
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Create Dependent Table
9. Metadata Tribbles
Objective: Support Scalability
Antipattern: Clone Tables or Columns
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Partition and Normalize
II. Physical Database Design Antipatterns
10. Rounding Errors
Objective: Use Fractional Numbers Instead of Integers
Antipattern: Use FLOAT Data Type
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use NUMERIC Data Type
11. 31 Flavors
Objective: Restrict a Column to Specific Values
Antipattern: Specify Values in the Column Definition
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Specify Values in Data
12. Phantom Files
Objective: Store Images or Other Bulky Media
Antipattern: Assume You Must Use Files
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use BLOB Data Types As Needed
13. Index Shotgun
Objective: Optimize Performance
Antipattern: Using Indexes Without a Plan
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: MENTOR Your Indexes
III. Query Antipatterns
14. Fear of the Unknown
Objective: Distinguish Missing Values
Antipattern: Use Null as an Ordinary Value, or Vice Versa
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use Null as a Unique Value
15. Ambiguous Groups
Objective: Get Row with Greatest Value per Group
Antipattern: Reference Nongrouped Columns
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use Columns Unambiguously
16. Random Selection
Objective: Fetch a Sample Row
Antipattern: Sort Data Randomly
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: In No Particular Order…
17. Poor Man’s Search Engine
Objective: Full-Text Search
Antipattern: Pattern Matching Predicates
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Use the Right Tool for the Job
18. Spaghetti Query
Objective: Decrease SQL Queries
Antipattern: Solve a Complex Problem in One Step
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Divide and Conquer
19. Implicit Columns
Objective: Reduce Typing
Antipattern: a Shortcut That Gets You Lost
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Name Columns Explicitly
IV. Application Development Antipatterns
20. Readable Passwords
Objective: Recover or Reset Passwords
Antipattern: Store Password in Plain Text
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Store a Salted Hash of the Password
21. SQL Injection
Objective: Write Dynamic SQL Queries
Antipattern: Execute Unverified Input As Code
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Trust No One
22. Pseudokey Neat-Freak
Objective: Tidy Up the Data
Antipattern: Filling in the Corners
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Get Over It
23. See No Evil
Objective: Write Less Code
Antipattern: Making Bricks Without Straw
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Recover from Errors Gracefully
24. Diplomatic Immunity
Objective: Employ Best Practices
Antipattern: Make SQL a Second-Class Citizen
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: Establish a Big-Tent Culture of Quality
25. Magic Beans
Objective: Simplify Models in MVC
Antipattern: The Model Is an Active Record
How to Recognize the Antipattern
Legitimate Uses of the Antipattern
Solution: The Model Has an Active Record
V. Appendixes
A1. Rules of Normalization
What Does Relational Mean?
Myths About Normalization
What Is Normalization?
Common Sense
A2. Bibliography
→ Marcus Adams
Senior Software Engineer
Bill has written an engaging, useful, important, and unique book.
Software developers will certainly benefit from reading the
antipatterns and solutions described here. I immediately applied
techniques from this book and improved my applications. Fantastic
work!
→ Frederic Daoud
Author of Stripes: ...And Java Web Development Is Fun Again
and Getting Started with Apache Click
SQL Antipatterns is a must-read for software developers, who will
frequently encounter the database design choices presented in this
book. It helps development teams to understand the consequences
of their database designs and to make the best decisions possible
based on requirements, expectations, measurements, and reality.
→ Darby Felton
Cofounder, DevBots Software Development
I really like how Bill has approached this book; it shows his unique
style and sense of humor. Those things are really important when
discussing potentially dry topics. Bill has succeeded in making the
teachings accessible for developers in a good descriptive form, as
well as being easy to reference later. In short, this is an excellent
new resource for your pragmatic bookshelf!
→ Arjen Lentz
Executive Director of Open Query (http://openquery.com);
Coauthor of High Performance MySQL, Second Edition
This book is obviously the product of many years of practical
experience with SQL databases. Each topic is covered in great depth,
and the attention to detail in the book was beyond my expectations.
Although it’s not a beginner’s book, any developer with a reasonable
amount of SQL experience should find it to be a valuable reference
and would be hard-pressed not to learn something new.
→ Mike Naberezny
Partner at Maintainable Software; Coauthor of Rails for PHP
Developers
This is an excellent book for the software engineer who knows basic
SQL but finds herself needing to design SQL databases for projects
that go a little beyond the basics.
→ Liz Neely
Senior Database Programmer
Karwin’s book is full of good and practical advice, and it was
published at the right time. While many people are focusing on the
new and seemingly fancy stuff, professionals now have the chance
and the perfect book to sharpen their SQL knowledge.
→ Maik Schmidt
Author of Enterprise Recipes with Ruby and Rails and Enterprise
Integration with Ruby
Bill has captured the essence of a slew of traps that we’ve probably
all dug for ourselves at one point or another when working with SQL
— without even realizing we’re in trouble. Bill’s antipatterns range
from “I can’t believe I did that (again!)” hindsight gotchas to tricky
scenarios where the best solution may run counter to the SQL
dogma you grew up with. A good read for SQL diehards, novices,
and everyone in between.
→ Danny Thorpe
Microsoft Principal Engineer; Author of Delphi Component
Design
Chapter 1
Introduction
An expert is a person who has made all the
mistakes that can be made in a very narrow field.
Niels Bohr
I found a reference for SQL and noticed immediately that this was a
different sort of language from those that support statements like if
and while, variable assignments and expressions, and perhaps
functions. To call SELECT only one statement in that language is like
calling an engine only one part of an automobile. Both sentences are
literally true, but they certainly belie the complexity and depth of
their subjects. To support execution of that single SQL statement, I
realized I would have to develop all the code for a fully functional
relational database management system and query engine.
Diana knew that she had been sending her song out into the night
as a message to Jim in the garden. She thought of the
unacknowledged sense of comfort that Lady Elizabeth experienced
when Jim came to visit them. Without him, what would the days be?
She shuddered at the desolation it might mean to be without this
reliant, forceful friend. As it all flashed through her mind, she said:
"You have one triumphant quality, Jim. Whether it will add to
your sum of suffering or compensate for all the rest, who knows?
You have one inevitable success."
She paused, but the rustling of the tree-tops prevented either of
them from hearing Henry as he came from the pergola. Diana
moved a step nearer to Jim—Henry did not make known his
presence. Quite simply and sincerely she said:
"You will always have the love of women, Jim."
Something snapped in Jim's brain. He stood hypnotized by a
stronger force than his own will; he could not speak. Henry's voice
sounded like the cracked clang of a jarring bell in a golden silence.
"That's a dangerous gift, Jim. Professional heart-breakers ought
not to be allowed in other people's preserves."
Henry spoke quietly, but he was consumed by a mad,
unreasoning fury. Diana simply said, "Oh, I was just trying to tease
Jim about Sadie Jones."
Jim started towards the house, intending to leave Di with Henry.
"Teasing—a ruthless grilling, I call it. I've been vivisected, Henry; it's
not a pleasant experience, believe me."
But Henry, who was looking from Diana to Jim, with
unmistakable meaning, said, "You stopped at an interesting—
perhaps a critical—moment, Diana. I suppose I ought to beg your
pardon. Where lovers are involved, the husband is an intrusion,
almost an impertinence."
Jim turned and retraced his steps. Diana did not move. Their
eyes were fastened on Henry's face, now flaming with passion. All
Diana's womanhood was battling within her; her face grew tense,
her eyes like black pansies. She seemed unconscious of Jim's
presence; all her being was concentrated in the challenge of her
eyes as she let them strike back her answer.
"You are making a grave mistake, Henry. One that you will
regret as long as you live."
She could say no more; she wished to escape. Why didn't Jim
speak? She could hardly see him. An overwhelming desire to leave
both men before the sinking trembling of her body should overpower
the strength of her will, enabled her to reach the house.
The men were alone; both had watched Diana gain the
doorway. Neither seemed capable of helping her. Jim was the first to
move; he came towards Henry with a quick, resolute step. Suddenly
he became conscious of a new knowledge that checked his speech.
He could only stare at Henry, while the wild beating of his heart
tormented him. Much had been revealed to him regarding his feeling
for Diana, during the past hour. Henry was watching him furtively.
"And now, sir," he began, "I will listen to you. You have had
time to think up a plausible explanation."
For Diana and his aunt's sake he must be calm, so Jim only
answered, "I would not insult you or Diana by offering one."
The quiet scorn of Jim's apparent indifference maddened Henry.
"Oh, indeed!" He drew a chair forward. "Sit down and confront
the truth," he said, as he sat on the bench opposite. He was
trembling violently. Jim still maintained his composure. Henry's
clinched hand struck the table as he sneeringly exclaimed: "You owe
everything you are to me."
With the bitter knowledge of how much he had sacrificed for the
family, quick came Jim's reply:
"You mean everything I am not."
But Henry did not notice the truth of Jim's words. Ever since his
boyhood, when he had first abused his power as master of the
Towers, he had been irritated by the opposing point of view of his
cousin—had rebelled at Jim's success in making a place for himself
in the world without his help.
"You have lived in my house," he said, "enjoyed my bounty, and
now—damn you—"
"Don't say it—don't!"
Jim's words hit at Henry across the table like points of forked
lightning. All the pent-up feeling of years seemed concentrated in
the utterance. He was leaning far across the table, his face twitching
with disgust at Henry's suspicions. Like Diana he sickened at the
thought that Henry could believe him capable of playing so
degrading a part in Diana's life.
"Don't," he continued, "or I'll forget myself—forget the respect
we owe her—" Even as he spoke he knew that Diana was the
supreme concern of his life. That he loved her, he now realized; all
the misery that might ensue was engulfed in the supreme surrender
he made to his love, the love that unconsciously for the past months
had become part of his life. But with this knowledge came clearly
the injustice that Diana and he were being subjected to, by a mind
that could not conceive of the purity of her friendship. "You—why,
you—" he began again, then with difficulty controlled himself.
It was impossible to continue this conversation further; any
moment they might be interrupted. He could not determine the
course of his future at the moment, but he could save her the
discovery of his secret—he could save her further humiliation from
Henry.
"Henry, you must have been drinking. Go to Diana at once,
before she realizes what you said, before it is too late. Go and make
your peace with her for this outrage against her." While he spoke he
was trying to escape from the knowledge the night had brought. He
watched Henry, who in a dogged tone said:
"It's too late now. It has always been too late—with me—and
Di."
"Nonsense," Jim said.
Henry mumbled on as though he were only half aware of the
words he was speaking.
"Unless you'd intercede for me? She'd listen to you."
Jim rose. To obtain peace and dismiss from Henry's mind all
suspicion that might harm Diana was his one desire. But almost
before he was on his feet, Henry sprang up and held Jim with both
hands while he spluttered in frantic abandon:
"No, no—I couldn't trust you—I couldn't trust you."
With a quick movement Jim flung Henry off. It was useless to
expect sanity from this trembling, fanatical creature. Without a word
or look he left him, and Henry stood watching Jim's receding figure
down the alley of trees.
"And now I've driven out of her life the only interest in it, and
she will hate me for that, too."
There was only one thing for him to do—he must get to his own
quarters and send some message of excuse to his mother. He turned
into a side path. He could hear the dance music and the gayety of
the groups scattered near the pergola. Diana was there. He could
see her, pale but with perfect poise, assisting Lady Elizabeth. Even
Jim was at Lady Elizabeth's side. He envied them their control; in his
condition it would be folly for him to venture near them. As he
turned towards the house he met Bates carrying a telegram.
"I've been looking for your lordship," he said. "The message
came about half an hour ago."
He remembered Petrie ind the expected word as he tore open
the wire. It read:
CHAPTER X
In the Towers four desperate souls fought their battle, and to none
of them did the dawn bring comfort. In her room Lady Elizabeth sat
motionless before her open window, and, like Agrippina, saw the
long line of destruction that the child she had borne had brought to
her and to her house. Shortly before the end of the evening's
entertainment, she had received a message from Henry, begging to
be excused, as a matter of great importance had arisen which
prevented him from remaining with his guests.
Once she thought of venturing to go to him, as she listened to
his restless pacing above her, but fear of his displeasure and a
physical shrinking from a painful scene forced her to keep her watch
alone. To-night's confession of his use of the Fund was the gravest
of his many offences; she could not shake herself free of its grave
consequences. Along with it came the memory of the faces of Jim
and Diana as she had last seen them at midnight. The guests had
departed; Diana was entering her own apartments, while from the
landing Lady Elizabeth could see Jim below her as he started for the
garden. Both their faces were stamped with a new, vital truth which,
in its immensity, they seemed to find difficult to grasp. She recalled
the wistful, inquiring expression of Diana's look as she turned to call
her good-night to Jim. Even more vividly she recalled the answer of
his eyes. The mute, unspoken thoughts that lay there were haunting
her now with their tragic possibilities. A numb fear possessed her.
Above her, Henry's monotonous steps continued; her
imagination began to play tricks with her. The steady tread above
seemed to change into the tentative, faltering toddle of a baby boy;
she remembered that the room over her was the old nursery, now
used by Henry for his own apartment. How often she and his father
had listened and rejoiced at the stumbling efforts which they could
hear in the early morning! The terrible sympathy of a mother's
sorrowing womb, that can reach the most poignant of all human
anguish, caused her suddenly to start to her feet; a physical craving
to hold again the tiny body firm against her own, and ease this
suffering, overpowered her. She could hear the broken steps of the
long ago; she could see only the naked, mottled body of the sturdy
chap that she had so often clasped close and smothered with her
kisses. She stretched out her arms as if in search of it. The longing
to touch again the soft warm flesh of her own creation became
intense, from her wildly beating heart to the tightly contracted throat
there grew a spasm of pain that ended in a long, broken sob. She
forgot all the years of suffering, the disappointments, and to-night's
crowning tragedy of Henry's wilful treachery to her and his house.
She was the young mother again. The half shy, inquiring face of
the babe with its tight corkscrew curls, as she had seen him first
walk across the long nursery to fall into her arms at the open
doorway, was all that she could remember. Other ghosts crowded
into the room; the husband of her love-days—for Elizabeth Kerhill
had passionately loved her boy's father—stood, as he often had
stood, close behind her at the nursery door and joyed with her at
the beauty of its tiny occupant. The old wound, which nature
mercifully in the passage of years had alleviated, again ached as it
had in the first hours of her great sorrow at his death.
Suddenly the pacing above ceased. She became conscious of a
terrible anxiety to know why; she feared the stillness; the steady
beat had been an unconscious comfort. Her tired brain grew more
fanciful. Did she imagine or did she really see the pale spectre of her
husband at the farther end of the room beckoning her to follow him?
He seemed to open the door into the corridor and disappear into the
gloom. There was a slight movement from above, significant in its
abruptness; it was as though a quick decision had been made by
Henry. Down the corridor she fled, obeying a compelling instinct.
The pale mist of the first streaks of dawn was struggling through the
distant windows. She remembered a similar hurried rush to the
nursery, when the tiny, twisted body was attacked with writhing
convulsions. Quickly she sped along the hallway, around a twisted
enclosure, and up the broad staircase until she reached the nursery.
Without a pause she swung open the heavy oak door; then she
knew why the warning had come to her.
At the creaking of the door, Henry started; he was unaware that
it had remained unlocked. For a moment he stared at his mother as
though she were an apparition. He was standing near the open
drawer of a huge desk; the glint of fire-arms in it shone clear against
the flicker of the spluttering candles. He made no attempt to move.
His eyes were held by the figure at the door, but no words came
from the moving lips of Lady Elizabeth. Instinctively, both their
glances went to the open drawer with its certain means of death.
Henry turned away; he tried to close the case. Through the silent
room came the sobbed name of his childhood days.
"Ba-ba! Ba-ba!"
He felt her strong arms fasten tight around him; unresisting, he
was gathered up close against the trembling body of his mother, as
she drew him down into a big settle. He made no attempt to speak.
He heard only the name of his babyhood in his mother's moans, as
she pressed his tense face to hers, kissed the faunlike ears, while
her hands strayed, as they used to do, over the long limbs that,
relaxed, lay helpless against hers. The old nursery again held her
treasure, and mechanically the tremulous lips fell to crooning a long-
forgotten lullaby.
Gradually he slept with his head on her breast. Straight and stiff
the early shadows found her, while the bitter tears furrowed her
face, as she held her child, warm and alive, against her heart.
During the long hours of her vigil she heard distinctly the crunching
of footsteps on the gravel-walk outside as some one passed and
repassed the east wing. But she was little concerned with the world
without.
CHAPTER XI
"When Mr. Petrie comes, show him to me here," Henry gave orders
to Bates.
It was late in the afternoon and he was alone in the rose
enclosure—the library had proved too stifling. He had managed to
attend the afternoon's drill, and discharge without comment the
duties required of him by his guests. The Bishop and a great number
of visitors were still in the park. Diana, on the plea of illness, had
remained in her room, but had sent word that she would be down at
tea-time. Absorbed in his own reflections Henry hardly observed that
Jim was passing the entire day in camp with the troops. That the
farce of the day's pleasure was nearly over, was his most comforting
thought; a few hours more and the house-party would disperse. If
only Petrie would come.
"No news, good news;" over and over he tried to comfort
himself with the old saw.
Lady Elizabeth, if she had remembered, would have warned him
of the intended presentation, but the night with its torturing
memories had made her forget utterly the surprise arranged by the
Bishop and Sir John.
Henry looked at his watch—it was past four. Would Petrie never
come? He cursed the hour in which he had listened to the tempting
voice that urged him to speculate in a mine controlled by Hobbes.
He remembered the night he had finally agreed to enter into the
game, and—then, a loss here and an unexpected blow there had
disastrously crippled his resources.
Money had been necessary to protect the already invested
fortune. The Fund was under his control—Why not use it
temporarily? He used the word "borrow" to his mother, and he had
tried for weeks to ease his mind with the same word, but he knew
that the world had an ugly name for such "borrowing." Wherever he
turned he could see five blazing letters—the flaming stigma was
beginning to burn in his brain. Was there no way of protecting
himself a little longer? He closed his eyes and tried to think.
No, it would be impossible to evade the request of the
committee. To elude the young curate, Chiswick, had not been
difficult. On the plea of his devotion to the cause, he had succeeded
in controlling all the papers and accounts for the past week, but now
—a cold perspiration began to ooze over his body; it was followed by
hot flashes that tormented him like the five fantastic little demons
ever before his vision, as they twisted, contorted, shaped, and
reshaped themselves into one hideous imputation. An hour before,
he had promised to give to his secretary the keys of his desk; to put
off the auditing any longer would have aroused suspicion. His only
hope now was that perhaps the absorbing interest in the last day of
the manoeuvres would give him another twenty-four hours leeway.
If Petrie brought reassuring news he might be able to realize the
necessary amount and prevent discovery. He poured himself some
brandy. Just as he raised the glass, Bates announced:
"Mr. Petrie, my lord."
The glass slipped to the ground; Bates stooped to remove the
fragments. Johnston Petrie advanced with perfect composure and
shook Henry's trembling hand.
"Your lordship," he said. Then both men waited until Bates
disappeared towards his quarters. To Henry the moment seemed an
eternity.
They were alone, and yet neither spoke. Through Petrie's mind
ran a memory of having stood there long ago and conferred with the
late Earl, while the man before him as a boy sat on his father's knee.
He knew nothing of Henry's use of the Fund; he only knew that he
was bringing news of a big loss to his client. Henry's face as he
grasped Petrie to steady himself, told him something of the
importance attached to his report.
"Well, Petrie, well? Speak—man. Don't you see you are killing
me? Hobbes—what of Hobbes?"
Truthfully, Petrie answered: "Hobbes is a fugitive—the whole
scheme was a gigantic swindle. Every penny invested is irremediably
lost."
Almost before he had finished speaking, from the various side-
paths leading towards them came the sound of voices. Henry made
a staggering movement as though to escape towards the house, but
his way was blocked by Sadie Jones, who had gone at the Bishop's
request to fetch Diana. As Henry stared at the advancing groups he
saw himself already convicted. What was the meaning of this
unusual gathering of officers and men silently falling into lines
behind the circle of friends who surrounded him? He supported
himself by his chair. Petrie quickly realized the situation as he saw a
sergeant approaching with an open case containing the gift of the
big loving-cup. He tried to reach Henry, but Lady Elizabeth
anticipated him. She had recalled too late the demonstration
arranged to take place at tea-time. There was a moment's hush. A
little way off the servants were gathering to witness the honor
shown to their master, and the enclosure about Henry was quickly
crowded.
Henry clung to his support. He could distinguish all the faces
quite plainly, except Jim's. Where was Jim? Muffled, as though
coming from a long distance, he heard the Bishop's voice:
"My lord, I am so overwhelmed with the significance of this
delightful occasion and my own imperfections as a speaker, that I
could have wished my task to have fallen into better hands. But
when I was approached in the sacred name of charity and of that
noble cause so dear to all our hearts, the relief and succor of the
widows and orphans of the brave men who have given their lives in
the smoke of battle, I felt I ought to be sustained by your own noble
example. I will not dwell on the lofty nature of your lordship's
services to the Fund—"
Henry's impassiveness began to desert him: "Liar! liar!" shrieked
the little demons as they came in a swarm towards him. He closed
his eyes.
"In accepting this very beautiful loving-cup," droned the Bishop.
But it had gone too far. His greatest pride—his regiment, his
men, their Fund—was his greatest dishonor. Better discovery—
anything rather than this awful continuation. He swayed—Petrie
caught him; there was a moment's surprised ejaculation from the
crowd.
Lord Kerhill was ill. The heat had been intense during the
afternoon drill. It was noticed then that he was unwell—and so the
tactful excuses went from one to another as Henry was assisted by
Petrie to the library. But Lady Elizabeth, with some hurried orders to
Petrie, turned to the assembled guests.
"My lord Bishop, some one has said 'speech is but broken light
falling on the depths of the unspeakable.' This in thanks for the
great honor done our house. I am sure my son's inability to reply is
more due to your eloquent tribute than to his slight indisposition.
Won't you allow the tea to be served? Lord Kerhill will, I am sure,
join you very shortly."
Imperiously she took command of the situation, and soon the
waiting servants were dispensing tea, while the guests discussed the
beauties of the cup that lay in its velvet case, as if nothing unusual
had happened. Then quietly she made her way to Henry. She found
him alone, and motioned him to follow her into a small room
adjoining the library; it had been a prayer-closet in the past for a
devout Kerhill, but during recent years it had been used as a
smoking-den, with old sporting-prints and curious whips and spurs in
place of the prie-dieu and the crucifix. Drawing the bolt across the
oak door, Elizabeth Kerhill turned and faced her son.
"Henry, what is it?"
"The South American Security Company—a swindle. Hobbes a
fugitive—for me exposure."
Lady Elizabeth realized that if salvation were to come to him it
must be through her.
"To prevent this exposure, you must not lose your self-control.
We must think—not feel—think what we can do," she began.
And Henry answered, calmly, "I must blow my brains out."
"Dear God!" her heart prayed as she watched him. His dull
impassiveness frightened her more than any madness of rebellion;
he meant this—it was no idle boast. Had she only delayed, not
prevented, the contemplated tragedy of the night before? Tightly
she buckled on her armor of mother-love. She must fight—fight him
—the world, if necessary, but she must win. She put all the sickening
hurt and broken courage behind her. She must obtain help—from
whom? In the mean time she must distract and arouse him from this
awful apathy of resignation to his disgrace. While these thoughts
were flashing through her brain she answered:
"If—" she paused, she could not say the word. "If—that—" she
half whispered, "would cover up the shame—but it wouldn't. No; no
Earl of Kerhill must go into history as a—"
"Thief!" Henry supplied the word. It was a relief to speak it.
"You might as well say it—no one else will hesitate to do so."
His voice shook, but he still maintained his stoicism.
"You had no intention to do wrong, my poor boy, I know it, but
no one will believe that but your mother. It's my fault too in some
way, I suppose." The agonized mother's consciousness of failure in
shaping her child's character broke from her. "I'd willingly take the
blame on my shoulders if I could."