[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#373605: tetex-extra: Compilation problem with listings package



severity 373605 normal
thanks

Christophe Garion <garion@supaero.fr> wrote:

> On Wed, 14 Jun 2006 17:09:19 +0200, Ralf Stubner <ralf.stubner@physik.uni-erlangen.de> said:
>
> Ralf> Thank you for the report. I am not sure that 'important' is the
> Ralf> right severity, though.
>
> Sorry, it is one of my first bug report and I am not really used to the
> classification.

No problem.  I'm setting the severity to normal;  important would be
appropriate for a problem that affects lots of users, while this seems
to be a corner case (a very strange, interesting one, though).

> Ralf> I am sorry, but without a minimal example, it is impossible to
> Ralf> debug problems like this. Weren't you asked by reportbug to
> Ralf> include one? See
> Ralf> <URL:http://www.tex.ac.uk/cgi-bin/texfaq2html?label=minxampl> and
> Ralf> <URL:http://www.minimalbeispiel.de/mini-en.html> for details.
>
> I join a "minimal" example file (11 kB gzipped). Sorry for the size, but
> if I cut parts of the body, the error does not happen anymore. 

Yes, this is really strange.  I managed to cut it down a bit further,
but I never experienced such strange behavior.  First I tried to comment
all lstlisting environments but the first, but then noticed this would
be too much work and stopped in the middle.  Instead, I tried to move
"\end{document}" up, and found that I could get rid of less than a
quarter with this procedure, without "loosing" the error message.  Then
I changed all theorem environments to "syn", removed the other
definitions, and tried to shorten it from after "\begin{document}".
This worked for a while, the point where the error occurred moved
around, but then I couldn't remove anything any more.  Strangely,
however: after this procedure I was able to remove some more content
from the end.

Ah, yes, and it must have to do with page sizes or things done at
shipout time:  At one occasion, removing the a4paper global option made
the error go away, and in the version I have now, it can be moved to a
different line when a4paper is removed.

So here comes the smaller document,

Frank

\documentclass%[a4paper]
{book}

% \usepackage{latexsym}
% \usepackage{amssymb,amsmath}

\usepackage{listings}

\newcommand{\src}[1]{\lstinline!#1!}

\lstset{language=sql, extendedchars=false, basicstyle=\ttfamily,
  commentstyle=\itshape, showstringspaces=false}

\usepackage[francais]{babel}

\newtheorem{syn}{Syntaxe}

\begin{document}

\chapter[\textsc{SQL} (\textit{Structured Query Language})]{Etude d'un langage assertionnel~: \textsc{SQL}
  (\textit{Structured Query Language})}
\label{cha:sql}

\section{Historique et presentation}
\label{sec:historique}

\begin{itemize}
\item le
\item le 
\item le langage de contrôle des donnees (DCL pour \emph{Data Control
    Language}) qui permet de restreindre l'acces des donnees.
\end{itemize}

\section{Le langage de manipulation de donnees}
\label{sec:langage-manipulation}

Le langage de manipulation de donnees permet soit d'obtenir une
information a partir d'une ou plusieurs relations, soit de mettre a
jour des tuples d'une relation. Dans le cas de l'obtention
d'information, le resultat est edite sous la forme d'un tableau.

\subsection{Bloc de qualification}
\label{sec:bloc-de-qual}

La structure de base est le bloc de qualification\footnote{\textsc{SQL}
  est un langage insensible a la casse des caracteres, que ce soit
  pour ses mots cles ou pour les noms de relations ou d'attributs.}.

Lorem ipsum set dolor sit amet, enim numquam venerit sordem.  Haque
enim nos patria lege genuit aut educavit, ut nulla quasi alimenta
exectaret a nobis.

  \begin{lstlisting}
  SELECT Ai,..., An -- colonnes et agregations
  FROM R            -- relation
  WHERE F           -- assertion
  GROUP BY A        -- regroupement
  HAVING H          -- assertion
  ORDER BY T        -- tri
  ;
  \end{lstlisting}


Les clauses \src{GROUP}, \src{ORDER} et \src{HAVING} sont
optionnelles. Nous pouvons detailler informellement la semantique des
clauses \src{FROM}, \src{WHERE} et \src{SELECT}~:
\begin{itemize}
\item \src{FROM} permet de preciser quelles sont la ou les relations
  sur lesquelles on pose la requete;
\item \src{WHERE} permet de poser une assertion qui doit etre verifiee
  par les lignes de la table solution;
\item \src{SELECT} designe les attributs des tuples qui doivent
  apparaître dans la solution.
\end{itemize}

Le bloc de qualification <<~simple~>> (i.e. ne contenant que les
clauses \src{SELECT}, \src{FROM} et \src{WHERE}) est donc une
combinaison d'une projection et d'une selection.

\begin{syn}
  le bloc de qualification se termine toujours par un <<~\src{\;}~>>.
\end{syn}

\subsection{Projection}
\label{sec:projection-1}

La syntaxe d'une projection simple est presentee dans ce qui suit.

\begin{syn}
~


~ 
\end{syn}

\begin{syn}
  La requete <<~\emph{quelle est la liste des numeros de reference et
  des types de tous les ordinateurs?}~>> s'exprime de la façon
  suivante~:

\end{syn}

Remarquons que l'on peut obtenir des tuples identiques, en particulier
si on ne selectionne pas la cle primaire parmi les colonnes de la
projection. Pour eviter cela, on peut utiliser le mot cle
\src{DISTINCT} (on voit ici apparaître le fait qu'on travaille avec
des multi-ensembles dans \textsc{SQL}).

\begin{syn}
~


~
\end{syn}

\subsection{Selection}
\label{sec:slection-1}

\begin{syn}
~


~
\end{syn}
  
Ici, <<~\src{*}~>> designe l'ensemble des colonnes de la relation $R$.
$F$ est une expression logique permettant de selectionner les
colonnes.

\subsubsection{Expression logique de selection}
\label{sec:expr-logiq-de}

L'expression logique peut contenir des constantes et des noms de
colonnes de la relation $R$. On la construit avec les operateurs
suivants~:

\begin{itemize}
\item \src{<}, \src{<=}, \src{=}, \src{>=}, \src{>}, \src{<>};
\item \src{AND}, \src{OR}, \src{NOT};
\item \src{IN}, par exemple \src{IN ('MS\_DOS', 'UNIX')};
\item \src{BETWEEN}, par exemple \src{BETWEEN 15 AND 30};
\item \src{LIKE} en utilisant un pattern et des jokers (cf. ce qui
  suit).
\end{itemize}

Les chaînes de caracteres peuvent etre comparees en utilisant
l'operateur \src{LIKE} qui permet de comparer une chaîne de caracteres
avec un pattern utilisant les symboles~:

\begin{itemize}
\item \src{\_} qui remplace n'importe quel caractere;
\item \src{\%} qui remplace n'importe quelle sequence de caracteres;
\end{itemize}

Par exemple \src{'DUPONT' LIKE 'D\%ONT} renverra \src{TRUE},
\src{'DUPONT' LIKE 'D\_\_T'} renverra \src{FALSE}, et \src{'DOIT' LIKE
  'D\_\_T} renverra \src{TRUE}. Si l'on veut utiliser les caracteres
\src{\_} ou \src{\%} dans une chaîne de caracteres, on peut utiliser
le mot cle \src{ESCAPE} suivi d'un caractere qui representera un
caractere d'echappement (par exemple \src{pourcentage LIKE '100x\%'
  ESCAPE 'x'}).

\subsubsection{La valeur \src{NULL}}
\label{sec:la-valeur-null}

La valeur \src{NULL} est une valeur qui peut etre affectee a certains
attributs lorsque~:

\begin{itemize}
\item on ne sait pas quelle est la valeur de l'attribut;
\item aucune valeur ne peut convenir pour l'attribut;
\item on ne peut pas connaître la valeur de l'attribut (par exemple un
  numero de telephone).
\end{itemize}

Il faut noter que \src{NULL} n'est pas une constante. On ne peut pas
l'utiliser explicitement comme operande dans la clause \src{WHERE}. Si
\src{NULL} apparaît dans une comparaison, on peut obtenir une valeur
de verite \src{UNKNOWN} pour l'expression consideree (qui est
consideree pour le retour de la requete comme s'il s'agissait d'une
valeur de verite \src{FALSE}).

\subsection{Entetes de colonnes}
\label{sec:entetes-de-colonnes}

L'entete des colonnes de la table resultat d'une requete est soit le
nom de l'attribut correspondant, soit une expression de <<~calcul~>>
contenant le nom d'un attribut. Pour une meilleure presentation, on
peut changer le nom des colonnes de la table resultat.

\begin{syn}
~

\end{syn}

L'entete du resultat affiche portera les noms \texttt{Nouveau nom 1}
et \texttt{Nouveau nom 2} au lieu de \texttt{col1} et
\texttt{col2}. 

\begin{syn}
  On peut demander quels sont les prix en euros des ordinateurs~:

\end{syn}

Une application importante de cette fonctionnalite est la
personnalisation par rapport a une langue donnee
(internationalisation). Un exemple classique est celui des catalogues
multilingues qui sont issues d'une unique base de donnees.

\subsection{Tris des colonnes}
\label{sec:tris-des-colonnes}

Pour fournir un resultat trie suivant certaines colonnes, il existe
une clause particuliere, la clause \src{ORDER BY}.

\begin{syn}
 ~

  
  où chaque element de la liste est un attribut suivi de \src{ASC}
  (ordre ascendant) ou \src{DESC} (ordre descendant).
\end{syn}

\begin{syn}
  La requete permettant d'editer le catalogue des ordinateurs dans
  l'ordre des prix decroissants et des capacites de memoire
  croissantes est~:

\end{syn}

\subsection{Operation de produit}
\label{sec:opration-de-produit}

Nous allons maintenant nous interesser aux operation impliquant plus
d'une relation. La premiere operation a laquelle nous allons nous
interesser est le produit de relation.

\begin{syn}
 ~


 ~
\end{syn}

Si l'on considere $t_1, \ldots , t_k$ des tuples respectifs de $R_1,
\ldots , R_k$, le tuple $(t_1, \ldots , t_k)$ sera qualifie s'il
satisfait la formule logique $F$. La table resultat sera obtenue en
effectuant une projection de $(t_1, \ldots , t_k)$ sur $A_1, \ldots,
A_p$. La requete est donc semblable a $\pi _{A_1, \ldots, A_p}
~(\sigma _{F}~(R_1 \times \ldots \times R_k))$.

Dans le cas d'attributs provenant de tables differentes et portant le
meme nom, on les distingue en les prefixant par le nom de la relation.

\begin{syn}
  La requete <<~\emph{quels sont les types, prix et constructeurs de
  la machine numero 10?}~>> s'ecrit~:

\end{syn}

\subsection{Noms d'alias}
\label{sec:noms-dalias}

Les noms d'alias sont des noms symboliques donnes a une table. Ils
sont declares dans la clause \src{FROM}. Ces noms constituent des
variables de parcours d'une table. Le type d'une variable nom d'alias
associe a une table est celui d'une ligne de cette meme table.

\begin{syn}
 ~


~
\end{syn}

On travaille toujours avec des noms de variable dans une requete. Par
defaut, si l'on ne precise pas un nom d'alias, le nom utilise est
celui de la relation. Par exemple, \src{FROM R} est en fait \src{FROM
  R AS R}.

\begin{syn}
Considerons la requete <<~\emph{quels sont les types, prix et
  constructeurs des ordinateurs de reference 10?}~>> est exprimee de
  la façon suivante~:

  
  Les variables \src{O} et \src{T} representent respectivement un
  tuple de la relation \texttt{Ordinateur} et un tuple de la relation
  \texttt{TypeOrdinateur}.
\end{syn}

\subsection{Jointures}
\label{sec:jointures-1}

On peut exprimer differents tous les types de jointures avec
\textsc{SQL} (jointure naturelle, $\theta$-jointure, jointure
externe). Nous allons les detailler rapidement dans ce qui suit.


\subsubsection{Produit cartesien}
\label{sec:produit-cartsien-1}

La forme la plus simple de jointure en \textsc{SQL} est ce que nous
avons appele le produit cartesien en algebre relationnelle.

\begin{syn}
 ~

 ~
\end{syn}

Cette expression renvoie une table equivalent au produit cartesien de
$R$ et de $S$. En cas d'attributs portant le meme nom, ils seront
prefixes par le nom de la relation.

\subsubsection{$\theta$-jointure}
\label{sec:theta-jointure-1}

La $\theta$-jointure est la forme la plus generale de
jointure. Rappelons que l'on peut la voir comme la composition d'un
produit cartesien et d'une selection.

\begin{syn}
 ~


~
\end{syn}

\src{R JOIN S ON F} etablit la $\theta$-jointure de $R$ et $S$ sur le
critere $F$ (qui est une expression logique).

Le resultat de cette expression est evidemment une relation. On peut
donc l'utiliser dans une selection. Par exemple, la requete
correspondant a l'exemple~\ref{ex:algebre-jointure} est~:


\subsubsection{Autres types de jointures}
\label{sec:autres-jointures}

Les autres jointures possibles sont~:

\begin{itemize}
\item les jointures naturelles en prefixant \src{JOIN} par
  \src{NATURAL}. Il faut bien entendu que les deux relations aient un
  attribut commun et il n'y a pas de condition \src{ON};
\item les jointures externes qui sont de trois types~:
  \begin{itemize}
  \item les jointures externes completes par \src{FULL OUTER JOIN};
  \item les jointures externes a gauche par \src{LEFT OUTER JOIN};
  \item les jointures externes a droite par \src{RIGHT OUTER JOIN}.
  \end{itemize}
\end{itemize}

\subsection{Operateurs ensemblistes}
\label{sec:oprat-ensembl-1}

Les operateurs ensemblistes s'appliquent a des ensembles dont les
donnees sont compatibles (meme type). Contrairement aux autres
operateurs, les operateurs ensemblistes conservent la structure des
relations.

Intersection, union et difference peuvent s'appliquer aux resultats de
deux \src{SELECT} qui retournent les memes colonnes ou les attributs
de meme domaine. Ces trois operateurs sont des operateurs
binaires. Ils prennent en parametre deux relations compatibles ayant
la meme structure.

\begin{syn}
 ~


~
\end{syn}

\begin{syn}
  Considerons la requete <<~\emph{quels sont les types d'ordinateurs
    compatibles a la fois avec un Micral 75 et un Mac II?}~>>. Cette
  requete s'exrprime de la façon suivante~:

  \begin{lstlisting}
    (SELECT type_comp FROM Compatibilite
     WHERE type_ref = 'Micral 75')
    INTERSECT
    (SELECT type_comp FROM Compatibilite
     WHERE type_ref = 'Mac II');
  \end{lstlisting}
\end{syn}


\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% TeX-PDF-mode: t
%%% End: 
-- 
Frank Küster
Single Molecule Spectroscopy, Protein Folding @ Inst. f. Biochemie, Univ. Zürich
Debian Developer (teTeX)

Reply to: